| | import cv2 |
| | import os |
| | import json |
| | from tqdm import tqdm |
| | import numpy as np |
| |
|
| | provinces = [ |
| | "皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", |
| | "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", |
| | "新", "警", "学", "O" |
| | ] |
| | alphabets = [ |
| | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', |
| | 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'O' |
| | ] |
| | ads = [ |
| | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', |
| | 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', |
| | '6', '7', '8', '9', 'O' |
| | ] |
| |
|
| |
|
| | def make_label_2020(img_dir, save_gt_folder, phase): |
| | crop_img_save_dir = os.path.join(save_gt_folder, phase, 'crop_imgs') |
| | os.makedirs(crop_img_save_dir, exist_ok=True) |
| |
|
| | f_det = open( |
| | os.path.join(save_gt_folder, phase, 'det.txt'), 'w', encoding='utf-8') |
| | f_rec = open( |
| | os.path.join(save_gt_folder, phase, 'rec.txt'), 'w', encoding='utf-8') |
| |
|
| | i = 0 |
| | for filename in tqdm(os.listdir(os.path.join(img_dir, phase))): |
| | str_list = filename.split('-') |
| | if len(str_list) < 5: |
| | continue |
| | coord_list = str_list[3].split('_') |
| | txt_list = str_list[4].split('_') |
| | boxes = [] |
| | for coord in coord_list: |
| | boxes.append([int(x) for x in coord.split("&")]) |
| | boxes = [boxes[2], boxes[3], boxes[0], boxes[1]] |
| | lp_number = provinces[int(txt_list[0])] + alphabets[int(txt_list[ |
| | 1])] + ''.join([ads[int(x)] for x in txt_list[2:]]) |
| |
|
| | |
| | det_info = [{'points': boxes, 'transcription': lp_number}] |
| | f_det.write('{}\t{}\n'.format( |
| | os.path.join("CCPD2020/ccpd_green", phase, filename), |
| | json.dumps( |
| | det_info, ensure_ascii=False))) |
| |
|
| | |
| | boxes = np.float32(boxes) |
| | img = cv2.imread(os.path.join(img_dir, phase, filename)) |
| | |
| | crop_img = get_rotate_crop_image(img, boxes) |
| | crop_img_save_filename = '{}_{}.jpg'.format(i, '_'.join(txt_list)) |
| | crop_img_save_path = os.path.join(crop_img_save_dir, |
| | crop_img_save_filename) |
| | cv2.imwrite(crop_img_save_path, crop_img) |
| | f_rec.write('{}/{}/crop_imgs/{}\t{}\n'.format( |
| | "CCPD2020/PPOCR", phase, crop_img_save_filename, lp_number)) |
| | i += 1 |
| | f_det.close() |
| | f_rec.close() |
| |
|
| |
|
| | def make_label_2019(list_dir, save_gt_folder, phase): |
| | crop_img_save_dir = os.path.join(save_gt_folder, phase, 'crop_imgs') |
| | os.makedirs(crop_img_save_dir, exist_ok=True) |
| |
|
| | f_det = open( |
| | os.path.join(save_gt_folder, phase, 'det.txt'), 'w', encoding='utf-8') |
| | f_rec = open( |
| | os.path.join(save_gt_folder, phase, 'rec.txt'), 'w', encoding='utf-8') |
| |
|
| | with open(os.path.join(list_dir, phase + ".txt"), 'r') as rf: |
| | imglist = rf.readlines() |
| |
|
| | i = 0 |
| | for idx, filename in enumerate(imglist): |
| | if idx % 1000 == 0: |
| | print("{}/{}".format(idx, len(imglist))) |
| | filename = filename.strip() |
| | str_list = filename.split('-') |
| | if len(str_list) < 5: |
| | continue |
| | coord_list = str_list[3].split('_') |
| | txt_list = str_list[4].split('_') |
| | boxes = [] |
| | for coord in coord_list: |
| | boxes.append([int(x) for x in coord.split("&")]) |
| | boxes = [boxes[2], boxes[3], boxes[0], boxes[1]] |
| | lp_number = provinces[int(txt_list[0])] + alphabets[int(txt_list[ |
| | 1])] + ''.join([ads[int(x)] for x in txt_list[2:]]) |
| |
|
| | |
| | det_info = [{'points': boxes, 'transcription': lp_number}] |
| | f_det.write('{}\t{}\n'.format( |
| | os.path.join("CCPD2019", filename), |
| | json.dumps( |
| | det_info, ensure_ascii=False))) |
| |
|
| | |
| | boxes = np.float32(boxes) |
| | imgpath = os.path.join(list_dir[:-7], filename) |
| | img = cv2.imread(imgpath) |
| | |
| | crop_img = get_rotate_crop_image(img, boxes) |
| | crop_img_save_filename = '{}_{}.jpg'.format(i, '_'.join(txt_list)) |
| | crop_img_save_path = os.path.join(crop_img_save_dir, |
| | crop_img_save_filename) |
| | cv2.imwrite(crop_img_save_path, crop_img) |
| | f_rec.write('{}/{}/crop_imgs/{}\t{}\n'.format( |
| | "CCPD2019/PPOCR", phase, crop_img_save_filename, lp_number)) |
| | i += 1 |
| | f_det.close() |
| | f_rec.close() |
| |
|
| |
|
| | def get_rotate_crop_image(img, points): |
| | ''' |
| | img_height, img_width = img.shape[0:2] |
| | left = int(np.min(points[:, 0])) |
| | right = int(np.max(points[:, 0])) |
| | top = int(np.min(points[:, 1])) |
| | bottom = int(np.max(points[:, 1])) |
| | img_crop = img[top:bottom, left:right, :].copy() |
| | points[:, 0] = points[:, 0] - left |
| | points[:, 1] = points[:, 1] - top |
| | ''' |
| | assert len(points) == 4, "shape of points must be 4*2" |
| | img_crop_width = int( |
| | max( |
| | np.linalg.norm(points[0] - points[1]), |
| | np.linalg.norm(points[2] - points[3]))) |
| | img_crop_height = int( |
| | max( |
| | np.linalg.norm(points[0] - points[3]), |
| | np.linalg.norm(points[1] - points[2]))) |
| | pts_std = np.float32([[0, 0], [img_crop_width, 0], |
| | [img_crop_width, img_crop_height], |
| | [0, img_crop_height]]) |
| | M = cv2.getPerspectiveTransform(points, pts_std) |
| | dst_img = cv2.warpPerspective( |
| | img, |
| | M, (img_crop_width, img_crop_height), |
| | borderMode=cv2.BORDER_REPLICATE, |
| | flags=cv2.INTER_CUBIC) |
| | dst_img_height, dst_img_width = dst_img.shape[0:2] |
| | if dst_img_height * 1.0 / dst_img_width >= 1.5: |
| | dst_img = np.rot90(dst_img) |
| | return dst_img |
| |
|
| |
|
| | img_dir = './CCPD2020/ccpd_green' |
| | save_gt_folder = './CCPD2020/PPOCR' |
| | |
| | for phase in ['train', 'val', 'test']: |
| | make_label_2020(img_dir, save_gt_folder, phase) |
| |
|
| | list_dir = './CCPD2019/splits/' |
| | save_gt_folder = './CCPD2019/PPOCR' |
| |
|
| | for phase in ['train', 'val', 'test']: |
| | make_label_2019(list_dir, save_gt_folder, phase) |
| |
|