# Copyright (c) OpenMMLab. All rights reserved. import argparse import os import os.path as osp import xml.etree.ElementTree as ET import cv2 from mmocr.utils.fileio import list_to_file def parse_args(): parser = argparse.ArgumentParser( description='Generate testset of svt by cropping box image.') parser.add_argument( 'root_path', help='Root dir path of svt, where test.xml in,' 'for example, "data/mixture/svt/svt1/"') parser.add_argument( '--resize', action='store_true', help='Whether resize cropped image to certain size.') parser.add_argument('--height', default=32, help='Resize height.') parser.add_argument('--width', default=100, help='Resize width.') args = parser.parse_args() return args def main(): args = parse_args() root_path = args.root_path # inputs src_label_file = osp.join(root_path, 'test.xml') if not osp.exists(src_label_file): raise Exception( f'{src_label_file} not exists, please check and try again.') src_image_root = root_path # outputs dst_label_file = osp.join(root_path, 'test_label.txt') dst_image_root = osp.join(root_path, 'image') os.makedirs(dst_image_root, exist_ok=True) tree = ET.parse(src_label_file) root = tree.getroot() index = 1 lines = [] total_img_num = len(root) i = 1 for image_node in root.findall('image'): image_name = image_node.find('imageName').text print(f'[{i}/{total_img_num}] Process image: {image_name}') i += 1 lexicon = image_node.find('lex').text.lower() lexicon_list = lexicon.split(',') lex_size = len(lexicon_list) src_img = cv2.imread(osp.join(src_image_root, image_name)) for rectangle in image_node.find('taggedRectangles'): x = int(rectangle.get('x')) y = int(rectangle.get('y')) w = int(rectangle.get('width')) h = int(rectangle.get('height')) rb, re = max(0, y), max(0, y + h) cb, ce = max(0, x), max(0, x + w) dst_img = src_img[rb:re, cb:ce] text_label = rectangle.find('tag').text.lower() if args.resize: dst_img = cv2.resize(dst_img, (args.width, args.height)) dst_img_name = f'img_{index:04}' + '.jpg' index += 1 dst_img_path = osp.join(dst_image_root, dst_img_name) cv2.imwrite(dst_img_path, dst_img) lines.append(f'{osp.basename(dst_image_root)}/{dst_img_name} ' f'{text_label} {lex_size} {lexicon}') list_to_file(dst_label_file, lines) print(f'Finish to generate svt testset, ' f'with label file {dst_label_file}') if __name__ == '__main__': main()