diff --git a/configs/rec/multi_languages/rec_en_lite_train.yml b/configs/rec/multi_languages/rec_en_lite_train.yml index 8b08d9f788415d63028480183a52630bbe245db0..128424b4d3a5631f8237f6cd596c901990ff2277 100644 --- a/configs/rec/multi_languages/rec_en_lite_train.yml +++ b/configs/rec/multi_languages/rec_en_lite_train.yml @@ -16,7 +16,7 @@ Global: loss_type: ctc distort: false use_space_char: false - reader_yml: ./configs/rec/rec_en_reader.yml + reader_yml: ./configs/rec/multi_languages/rec_en_reader.yml pretrain_weights: checkpoints: save_inference_dir: diff --git a/configs/rec/multi_languages/rec_french_lite_train.yml b/configs/rec/multi_languages/rec_french_lite_train.yml index 49d4d3df089a4749674b47f45a97a54abe95ffa2..2cf54c427eb6a7c64f4b54b021c44013a1dc1d6a 100755 --- a/configs/rec/multi_languages/rec_french_lite_train.yml +++ b/configs/rec/multi_languages/rec_french_lite_train.yml @@ -16,7 +16,7 @@ Global: loss_type: ctc distort: true use_space_char: false - reader_yml: ./configs/rec/rec_french_reader.yml + reader_yml: ./configs/rec/multi_languages/rec_french_reader.yml pretrain_weights: checkpoints: save_inference_dir: diff --git a/configs/rec/multi_languages/rec_ger_lite_train.yml b/configs/rec/multi_languages/rec_ger_lite_train.yml index 0ccadd0ad9a91c18b998a07a7c10184893327762..beb1755b105fea9cbade9f35ceac15d380651f37 100755 --- a/configs/rec/multi_languages/rec_ger_lite_train.yml +++ b/configs/rec/multi_languages/rec_ger_lite_train.yml @@ -16,7 +16,7 @@ Global: loss_type: ctc distort: true use_space_char: false - reader_yml: ./configs/rec/rec_ger_reader.yml + reader_yml: ./configs/rec/multi_languages/rec_ger_reader.yml pretrain_weights: checkpoints: save_inference_dir: diff --git a/configs/rec/multi_languages/rec_japan_lite_train.yml b/configs/rec/multi_languages/rec_japan_lite_train.yml index 2d3b388a5c9389fc27e23a5a295f9c4c70405a36..fbbab33eadd2901d9eac93f49e737e92d9441270 100755 --- a/configs/rec/multi_languages/rec_japan_lite_train.yml +++ b/configs/rec/multi_languages/rec_japan_lite_train.yml @@ -16,7 +16,7 @@ Global: loss_type: ctc distort: true use_space_char: false - reader_yml: ./configs/rec/rec_japan_reader.yml + reader_yml: ./configs/rec/multi_languages/rec_japan_reader.yml pretrain_weights: checkpoints: save_inference_dir: diff --git a/configs/rec/multi_languages/rec_korean_lite_train.yml b/configs/rec/multi_languages/rec_korean_lite_train.yml index ad55d821c63b987150a140a5924407a259d48c66..29cc08aaefb017c690551e030a57e85ebb21e2dd 100755 --- a/configs/rec/multi_languages/rec_korean_lite_train.yml +++ b/configs/rec/multi_languages/rec_korean_lite_train.yml @@ -16,7 +16,7 @@ Global: loss_type: ctc distort: true use_space_char: false - reader_yml: ./configs/rec/rec_korean_reader.yml + reader_yml: ./configs/rec/multi_languages/rec_korean_reader.yml pretrain_weights: checkpoints: save_inference_dir: diff --git a/doc/doc_ch/inference.md b/doc/doc_ch/inference.md index 431cdb5a4a9f24cf5862c159d51be2a07e9d4047..709a07515c316cdfd60b74f0b090d4baeeb290a7 100644 --- a/doc/doc_ch/inference.md +++ b/doc/doc_ch/inference.md @@ -24,6 +24,7 @@ inference 模型(`fluid.io.save_inference_model`ä¿å˜çš„模型) - [2. 基于CTCæŸå¤±çš„识别模型推ç†](#基于CTCæŸå¤±çš„识别模型推ç†) - [3. 基于AttentionæŸå¤±çš„识别模型推ç†](#基于AttentionæŸå¤±çš„识别模型推ç†) - [4. 自定义文本识别å—典的推ç†](#自定义文本识别å—典的推ç†) + - [5. 多è¯è¨€æ¨¡åž‹çš„推ç†](#多è¯è¨€æ¨¡åž‹çš„推ç†) - [å››ã€æ–¹å‘分类模型推ç†](#æ–¹å‘识别模型推ç†) - [1. æ–¹å‘分类模型推ç†](#æ–¹å‘分类模型推ç†) @@ -305,6 +306,22 @@ dict_character = list(self.character_str) python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" --rec_model_dir="./your inference model" --rec_image_shape="3, 32, 100" --rec_char_type="en" --rec_char_dict_path="your text dict path" ``` +<a name="多è¯è¨€æ¨¡åž‹çš„推ç†"></a> +### 5. 多è¯è¨€æ¨¡åž‹çš„æŽ¨ç† +如果您需è¦é¢„测的是其他è¯è¨€æ¨¡åž‹ï¼Œåœ¨ä½¿ç”¨inference模型预测时,需è¦é€šè¿‡`--rec_char_dict_path`指定使用的å—典路径, åŒæ—¶ä¸ºäº†å¾—到æ£ç¡®çš„å¯è§†åŒ–结果, +需è¦é€šè¿‡ `--vis_font_path` 指定å¯è§†åŒ–çš„å—体路径,`doc/` 路径下有默认æ供的å°è¯ç§å—体,例如韩文识别: + +``` +python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model" --rec_char_type="korean" --rec_char_dict_path="ppocr/utils/korean_dict.txt" --vis_font_path="doc/korean.ttf" +``` + + +执行命令åŽï¼Œä¸Šå›¾çš„预测结果为: +``` text +2020-09-19 16:15:05,076-INFO: index: [205 206 38 39] +2020-09-19 16:15:05,077-INFO: word : 바탕으로 +2020-09-19 16:15:05,077-INFO: score: 0.9171358942985535 +``` <a name="æ–¹å‘分类模型推ç†"></a> ## å››ã€æ–¹å‘åˆ†ç±»æ¨¡åž‹æŽ¨ç† diff --git a/doc/doc_ch/models_list.md b/doc/doc_ch/models_list.md index 497140592ea4f4cbfe2000146b6903844f3f9872..a6d47f4fdf17ad6b954a107c46a57f55983147f9 100644 --- a/doc/doc_ch/models_list.md +++ b/doc/doc_ch/models_list.md @@ -49,10 +49,11 @@ PaddleOCRæ供的å¯ä¸‹è½½æ¨¡åž‹åŒ…括`预测模型`ã€`è®ç»ƒæ¨¡åž‹`ã€`é¢„è® #### 3. 多è¯è¨€è¯†åˆ«æ¨¡åž‹ï¼ˆæ›´å¤šè¯è¨€æŒç»æ›´æ–°ä¸...) |模型å称|模型简介|预测模型大å°|下载地å€| |-|-|-|-| -|-|法文识别|-|[预测模型]() / [è®ç»ƒæ¨¡åž‹]()| -|-|德文识别|-|[预测模型]() / [è®ç»ƒæ¨¡åž‹]()| -|-|韩文识别|-|[预测模型]() / [è®ç»ƒæ¨¡åž‹]()| -|-|日文识别|-|[预测模型]() / [è®ç»ƒæ¨¡åž‹]()| +| french_ppocr_mobile_v1.1_rec |法文识别|2.1M|[预测模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [è®ç»ƒæ¨¡åž‹](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar)| +| german_ppocr_mobile_v1.1_rec |德文识别|2.1M|[预测模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [è®ç»ƒæ¨¡åž‹](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar)| +| korean_ppocr_mobile_v1.1_rec |韩文识别|3.4M|[预测模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [è®ç»ƒæ¨¡åž‹](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar)| +| japan_ppocr_mobile_v1.1_rec |日文识别|3.7M|[预测模型](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [è®ç»ƒæ¨¡åž‹](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar)| + <a name="文本方å‘分类模型"></a> ### 三ã€æ–‡æœ¬æ–¹å‘分类模型 diff --git a/doc/doc_ch/recognition.md b/doc/doc_ch/recognition.md index 1920be56d1a05bb2f7ade944fd225e690fb484a4..0f4173bef6fbe80e1a14d993e560308a84dcd387 100644 --- a/doc/doc_ch/recognition.md +++ b/doc/doc_ch/recognition.md @@ -201,7 +201,19 @@ Optimizer: ``` **注æ„,预测/评估时的é…置文件请务必与è®ç»ƒä¸€è‡´ã€‚** +- å°è¯ç§ +PaddleOCR也æ供了多è¯è¨€çš„, `configs/rec/multi_languages` 路径下的æ供了多è¯è¨€çš„é…置文件,目å‰PaddleOCR支æŒçš„多è¯è¨€ç®—法有: + +| é…置文件 | 算法å称 | backbone | trans | seq | pred | language | +| :--------: | :-------: | :-------: | :-------: | :-----: | :-----: | :-----: | +| rec_en_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | è‹±è¯ ï½œ +| rec_french_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | æ³•è¯ ï½œ +| rec_ger_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | å¾·è¯ ï½œ +| rec_japan_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | æ—¥è¯ ï½œ +| rec_korean_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | éŸ©è¯ ï½œ + +多è¯è¨€æ¨¡åž‹è®ç»ƒæ–¹å¼ä¸Žä¸æ–‡æ¨¡åž‹ä¸€è‡´ï¼Œè®ç»ƒæ•°æ®é›†å‡ä¸º100wçš„åˆæˆæ•°æ®ï¼Œå°‘é‡çš„å—体和测试数æ®å¯ä»¥åœ¨[百度网盘]()上下载。 ### 评估 diff --git a/doc/french.ttf b/doc/french.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ab68fb197d4479b3b6dec6e85bd5cbaf433a87c5 Binary files /dev/null and b/doc/french.ttf differ diff --git a/doc/german.ttf b/doc/german.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ab68fb197d4479b3b6dec6e85bd5cbaf433a87c5 Binary files /dev/null and b/doc/german.ttf differ diff --git a/doc/imgs_words/french/1.jpg b/doc/imgs_words/french/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..077ca28e70b74ed07fa637011c80219aecc448d5 Binary files /dev/null and b/doc/imgs_words/french/1.jpg differ diff --git a/doc/imgs_words/french/2.jpg b/doc/imgs_words/french/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38a73caa621710a7eb7378603e0152ba9c14dd41 Binary files /dev/null and b/doc/imgs_words/french/2.jpg differ diff --git a/doc/imgs_words/german/1.jpg b/doc/imgs_words/german/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d26ec9ed14de65c2d27e37693ff0da133e774b94 Binary files /dev/null and b/doc/imgs_words/german/1.jpg differ diff --git a/doc/imgs_words/japan/1.jpg b/doc/imgs_words/japan/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..684879749764a1b6063da32d7910bff911e855f4 Binary files /dev/null and b/doc/imgs_words/japan/1.jpg differ diff --git a/doc/imgs_words/korean/1.jpg b/doc/imgs_words/korean/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48a89389ae880783a39a13e9b06a861b88948fba Binary files /dev/null and b/doc/imgs_words/korean/1.jpg differ diff --git a/doc/imgs_words/korean/2.jpg b/doc/imgs_words/korean/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b24f28914d574be44e147943d906f8634f149ed5 Binary files /dev/null and b/doc/imgs_words/korean/2.jpg differ diff --git a/doc/japan.ttc b/doc/japan.ttc new file mode 100644 index 0000000000000000000000000000000000000000..ad68243b968fc87b207928594c585039859b75a9 Binary files /dev/null and b/doc/japan.ttc differ diff --git a/doc/korean.ttf b/doc/korean.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e638ce37f67ff1cd9babf73387786eaeb5c52968 Binary files /dev/null and b/doc/korean.ttf differ diff --git a/tools/infer/predict_system.py b/tools/infer/predict_system.py index 3e6be234c68dcd82f0f9e844f3ad2859000cec88..29c4d7e8e35ceda3966dfcadcca5f0ae985d1bb1 100755 --- a/tools/infer/predict_system.py +++ b/tools/infer/predict_system.py @@ -133,6 +133,7 @@ def main(args): image_file_list = get_image_file_list(args.image_dir) text_sys = TextSystem(args) is_visualize = True + font_path = args.vis_font_path for image_file in image_file_list: img, flag = check_and_read_gif(image_file) if not flag: @@ -160,7 +161,7 @@ def main(args): scores = [rec_res[i][1] for i in range(len(rec_res))] draw_img = draw_ocr( - image, boxes, txts, scores, drop_score=drop_score) + image, boxes, txts, scores, drop_score=drop_score, font_path=font_path) draw_img_save = "./inference_results/" if not os.path.exists(draw_img_save): os.makedirs(draw_img_save) diff --git a/tools/infer/utility.py b/tools/infer/utility.py index e844a0ae67480e94ef1b9286d3d59e7373e75a5c..a1c7c205bdc6621d7395004bf45cb443d273d9c0 100755 --- a/tools/infer/utility.py +++ b/tools/infer/utility.py @@ -71,6 +71,10 @@ def parse_args(): type=str, default="./ppocr/utils/ppocr_keys_v1.txt") parser.add_argument("--use_space_char", type=str2bool, default=True) + parser.add_argument( + "--vis_font_path", + type=str, + default="./doc/simfang.ttf") # params for text classifier parser.add_argument("--use_angle_cls", type=str2bool, default=False) @@ -198,7 +202,7 @@ def draw_ocr(image, return image -def draw_ocr_box_txt(image, boxes, txts): +def draw_ocr_box_txt(image, boxes, txts, font_path="./doc/simfang.ttf"): h, w = image.height, image.width img_left = image.copy() img_right = Image.new('RGB', (w, h), (255, 255, 255)) @@ -225,7 +229,7 @@ def draw_ocr_box_txt(image, boxes, txts): if box_height > 2 * box_width: font_size = max(int(box_width * 0.9), 10) font = ImageFont.truetype( - "./doc/simfang.ttf", font_size, encoding="utf-8") + font_path, font_size, encoding="utf-8") cur_y = box[0][1] for c in txt: char_size = font.getsize(c) @@ -235,7 +239,7 @@ def draw_ocr_box_txt(image, boxes, txts): else: font_size = max(int(box_height * 0.8), 10) font = ImageFont.truetype( - "./doc/simfang.ttf", font_size, encoding="utf-8") + font_path, font_size, encoding="utf-8") draw_right.text( [box[0][0], box[0][1]], txt, fill=(0, 0, 0), font=font) img_left = Image.blend(image, img_left, 0.5)