PaddlePaddle / PaddleOCR

Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)
https://paddlepaddle.github.io/PaddleOCR/
Apache License 2.0
43.9k stars 7.8k forks source link

识别模型自训练后在python下预测验证比C++下好很多,同样输出的识别模型(自训练)和检测模型(官方自带) #2900

Closed mybrew closed 3 years ago

mybrew commented 3 years ago

你好,现在遇到个问题,识别模型是在官方模型基础上加图片样本训练出来的。 Global: algorithm: CRNN use_gpu: true epoch_num: 150 log_smooth_window: 20 print_batch_step: 10 save_model_dir: ./output/rec_CRNN save_epoch_step: 3 eval_batch_step: 2000 train_batch_size_per_card: 1 test_batch_size_per_card: 1 image_shape: [3, 32, 320] max_text_length: 25 character_type: ch character_dict_path: ./ppocr/utils/ppocr_keys_v1.txt loss_type: ctc distort: true use_space_char: true reader_yml: ./configs/rec/rec_chinese_reader.yml pretrain_weights: ./pretrain_models/ch_ppocr_server_v1.1_rec_pre/best_accuracy checkpoints:

训练之后,转换为识别模型输出 python tools/export_model.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml -o Global.checkpoints=./output/rec_CRNN/best_accuracy Global.save_inference_dir=./inference/ch_rec_r34_vd_crnn_enhance

单张图做预测 python tools/infer/predict_system.py --image_dir="./doc/imgs/LL.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/ch_rec_r34_vd_crnn_enhance/" --use_angle_cls=False --use_space_char=True 效果和训练的是一致的。

同样的图,同样的检测和识别模型在C++下运行,结果却不如python下运行结果,python下识别一行,在c++下会识别为两行。 C++下配置可改动貌似不多,

det config

max_side_len 960 det_db_thresh 0.5 det_db_box_thresh 0.3 det_db_unclip_ratio 1.6 det_model_dir ./PaddleOCR/inference/det_db

cls config

use_angle_cls 0 cls_model_dir ./PaddleOCR/inference/cls cls_thresh 0.9

rec config

rec_model_dir ./PaddleOCR/inference/ch_rec_r34_vd_crnn_enhance char_list_file ./PaddleOCR/ppocr_keys_v1.txt

请问如何修改,可以使得C++下调用PYTHON训练出来的模型和python下预测结果基本一致? python下有个设定 image_shape: [3, 32, 320],c++下需要同样处理吗?如果需要,请问怎么处理它?

谢谢。

lydyc commented 3 years ago

同问,python下识别准确率很高,C++下识别准确率就不行,使用2.0版本。

LDOUBLEV commented 3 years ago

训练之后,转换为识别模型输出 python tools/export_model.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml -o Global.checkpoints=./output/rec_CRNN/best_accuracy Global.save_inference_dir=./inference/ch_rec_r34_vd_crnn_enhance

首先确保代码是最新的release/2.1 分支代码;另外,python预测是用的inference model预测还是 trained model预测的;

可以发一张测试图片在comment里

LDOUBLEV commented 3 years ago

@lydyc @mybrew

mybrew commented 3 years ago

你好,python预测用的是自己训练后,通过export_model转换出来的模型文件(2个文件)。 20210510162355

LDOUBLEV commented 3 years ago

我用你的图和ch_ppocr_mobile 模型对比了python,和C++结果,差别没那么大; python image

C++: image

你用的哪个分支的代码?更新代码试一下呢?

mybrew commented 3 years ago

我用你的图和ch_ppocr_mobile 模型对比了python,和C++结果,差别没那么大; python image

C++: image

你用的哪个分支的代码?更新代码试一下呢?

你好,我用的是V1.1。谢谢你的回复,我尝试更新下版本再看看。如果我修改了image_shape: [3, 32, 320]这个配置,在C++那边需要对应改哪部分代码或者配置呢?

LDOUBLEV commented 3 years ago

1.1的代码是静态图的,需要更新develop分支的代码,2.1的是动态图的,不通用,这个注意下

C++ 的识别预处理python预处理;预测的时候对识别模型的shape没有很严格的限制,只限制了高度必须要是32,image_shape: [3, 32, 320]这个是针对训练,为了组batch要把多个图resize到同一个shape

LDOUBLEV commented 3 years ago

如果tools/infer/predict_system.py 运行得到的结果是对的话,C++也问题不大,你可以着重检查下C++ 图像预处理和后处理是否和python一致;建议先更新代码到最新develop分支代码试试

mybrew commented 3 years ago

如果tools/infer/predict_system.py 运行得到的结果是对的话,C++也问题不大,你可以着重检查下C++ 图像预处理和后处理是否和python一致;建议先更新代码到最新develop分支代码试试

谢谢你的解答。