diff --git a/doc/simfang.ttf b/doc/simfang.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2b59eae4195d1cdbea375503c0cc34d5631cb0f9 Binary files /dev/null and b/doc/simfang.ttf differ diff --git a/tools/infer/predict_eval.py b/tools/infer/predict_eval.py index 53ee7e2dcae3a5d3cffd0d445eedfa2b179eba49..af0a5e2715d081a5c1c55ce9ea84d1984735596a 100755 --- a/tools/infer/predict_eval.py +++ b/tools/infer/predict_eval.py @@ -22,28 +22,25 @@ import numpy as np import math import time import json +import os +from PIL import Image, ImageDraw, ImageFont +from tools.infer.utility import draw_ocr +from ppocr.utils.utility import get_image_file_list if __name__ == "__main__": args = utility.parse_args() text_sys = predict_system.TextSystem(args) - image_file_list = [] - label_file_path = "./eval_perform/gt_res/test_chinese_ic15_500_4pts.txt" - img_set_path = "./eval_perform/" - with open(label_file_path, "rb") as fin: - lines = fin.readlines() - for line in lines: - substr = line.decode('utf-8').strip("\n").split("\t") - if "lsvt" in substr[0]: - continue - image_file_list.append(substr[0]) + if not os.path.exists(args.image_dir): + raise Exception("{} not exists !!".format(args.image_dir)) + image_file_list = get_image_file_list(args.image_dir) total_time_all = 0 count = 0 - save_path = "./output/predict.txt" + save_path = "./inference_output/predict.txt" fout = open(save_path, "wb") for image_name in image_file_list: - image_file = img_set_path + image_name + image_file = image_name img = cv2.imread(image_file) if img is None: logger.info("error in loading image:{}".format(image_file)) @@ -68,6 +65,20 @@ if __name__ == "__main__": "points": points, "scores": score * 1.0 }) + # draw predict box and text in image + # and save drawed image in save_path + image = Image.open(image_file) + boxes, txts, scores = [], [], [] + for dic in bbox_list: + boxes.append(dic['points']) + txts.append(dic['transcription']) + scores.append(round(dic['scores'], 3)) + new_img = draw_ocr(image, boxes, txts, scores, draw_txt=True) + draw_img_save = os.path.join( + os.path.dirname(save_path), "inference_draw", + os.path.basename(image_file)) + cv2.imwrite(draw_img_save, new_img) + # save predicted results in txt file otstr = image_name + "\t" + json.dumps(bbox_list) + "\n" fout.write(otstr.encode('utf-8')) avg_time = total_time_all / count diff --git a/tools/infer/utility.py b/tools/infer/utility.py index 6d56a99080c9fcc7dc5feade251956b28b965475..a8b0ebc001e0d9024ce7c131dc7ba376f333c626 100755 --- a/tools/infer/utility.py +++ b/tools/infer/utility.py @@ -21,6 +21,8 @@ from paddle.fluid.core import AnalysisConfig from paddle.fluid.core import create_paddle_predictor import cv2 import numpy as np +import json +from PIL import Image, ImageDraw, ImageFont def parse_args(): @@ -108,3 +110,59 @@ def draw_text_det_res(dt_boxes, img_path): cv2.polylines(src_im, [box], True, color=(255, 255, 0), thickness=2) img_name_pure = img_path.split("/")[-1] cv2.imwrite("./output/%s" % img_name_pure, src_im) + + +def draw_ocr(image, boxes, txts, scores, draw_txt): + from PIL import Image, ImageDraw, ImageFont + + w, h = image.size + img = image.copy() + draw = ImageDraw.Draw(img) + + for (box, txt) in zip(boxes, txts): + + draw.line([(box[0][0], box[0][1]), (box[1][0], box[1][1])], fill='red') + draw.line([(box[1][0], box[1][1]), (box[2][0], box[2][1])], fill='red') + draw.line([(box[2][0], box[2][1]), (box[3][0], box[3][1])], fill='red') + draw.line([(box[3][0], box[3][1]), (box[0][0], box[0][1])], fill='red') + + if draw_txt: + txt_color = (0, 0, 0) + + blank_img = np.ones(shape=[h, 800], dtype=np.int8) * 255 + blank_img = Image.fromarray(blank_img).convert("RGB") + draw_txt = ImageDraw.Draw(blank_img) + + font_size = 30 + gap = 40 if h // len(txts) >= font_size else h // len(txts) + + for i, txt in enumerate(txts): + font = ImageFont.truetype( + "/simfang.TTF", font_size, encoding="utf-8") + new_txt = str(i) + ': ' + txt + ' ' + str(scores[i]) + draw_txt.text((20, gap * (i + 1)), new_txt, txt_color, font=font) + + img = np.concatenate([np.array(img), np.array(blank_img)], axis=1) + return img + + +if __name__ == '__main__': + test_img = "./doc/test_v2" + predict_txt = "./doc/predict.txt" + f = open(predict_txt, 'r') + data = f.readlines() + img_path, anno = data[0].strip().split('\t') + img_name = os.path.basename(img_path) + img_path = os.path.join(test_img, img_name) + image = Image.open(img_path) + + data = json.loads(anno) + boxes, txts, scores = [], [], [] + for dic in data: + boxes.append(dic['points']) + txts.append(dic['transcription']) + scores.append(round(dic['scores'], 3)) + + new_img = draw_ocr(image, boxes, txts, scores, draw_txt=True) + + cv2.imwrite(img_name, new_img)