diff --git "a/applications/\350\275\246\347\211\214\350\257\206\345\210\253.md" "b/applications/\350\275\246\347\211\214\350\257\206\345\210\253.md" index 2abb9c6f7a3190521d6ca66b101a89ac11fcff5b..91a48d2641a810159f83b924f0f5c287fe47cc95 100644 --- "a/applications/\350\275\246\347\211\214\350\257\206\345\210\253.md" +++ "b/applications/\350\275\246\347\211\214\350\257\206\345\210\253.md" @@ -609,6 +609,148 @@ python tools/infer/predict_system.py \ ![](https://ai-studio-static-online.cdn.bcebos.com/76b6a0939c2c4cf49039b6563c4b28e241e11285d7464e799e81c58c0f7707a7) +### 4.4 计算End2End指标 + +端到端指标可通过 [PaddleOCR内置脚本](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/tools/end2end/readme.md) 进行计算,具体步骤如下: + +1. 导出模型 + +通过如下命令进行模型的导出。注意,量化模型导出时,需要配置eval数据集 + +```bash +# 检测模型 + +# 预训练模型 +python tools/export_model.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml -o \ + Global.pretrained_model=models/ch_PP-OCRv3_det_distill_train/student.pdparams \ + Global.save_inference_dir=output/ch_PP-OCRv3_det_distill_train/infer + +# 非量化模型 +python tools/export_model.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml -o \ + Global.pretrained_model=output/CCPD/det/best_accuracy.pdparams \ + Global.save_inference_dir=output/CCPD/det/infer + +# 量化模型 +python deploy/slim/quantization/export_model.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml -o \ + Global.pretrained_model=output/CCPD/det_quant/best_accuracy.pdparams \ + Global.save_inference_dir=output/CCPD/det_quant/infer \ + Eval.dataset.data_dir=/home/aistudio/data/CCPD2020/ccpd_green \ + Eval.dataset.label_file_list=[/home/aistudio/data/CCPD2020/PPOCR/test/det.txt] \ + Eval.loader.num_workers=0 + +# 识别模型 + +# 预训练模型 +python tools/export_model.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml -o \ + Global.pretrained_model=models/ch_PP-OCRv3_rec_train/student.pdparams \ + Global.save_inference_dir=output/ch_PP-OCRv3_rec_train/infer + +# 非量化模型 +python tools/export_model.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml -o \ + Global.pretrained_model=output/CCPD/rec/best_accuracy.pdparams \ + Global.save_inference_dir=output/CCPD/rec/infer + +# 量化模型 +python deploy/slim/quantization/export_model.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml -o \ + Global.pretrained_model=output/CCPD/rec_quant/best_accuracy.pdparams \ + Global.save_inference_dir=output/CCPD/rec_quant/infer \ + Eval.dataset.data_dir=/home/aistudio/data/CCPD2020/PPOCR \ + Eval.dataset.label_file_list=[/home/aistudio/data/CCPD2020/PPOCR/test/rec.txt] +``` + +2. 用导出的模型对测试集进行预测 + +此处,分别使用PP-OCRv3预训练模型,fintune模型和量化模型对测试集的所有图像进行预测,命令如下: + +```bash +# PP-OCRv3中英文超轻量检测预训练模型,PP-OCRv3中英文超轻量识别预训练模型 +python3 tools/infer/predict_system.py --det_model_dir=output/ch_PP-OCRv3_det_distill_train/infer --rec_model_dir=output/ch_PP-OCRv3_rec_train/infer --image_dir=/home/aistudio/data/CCPD2020/ccpd_green/test/ --draw_img_save_dir=infer/pretrain + +# PP-OCRv3中英文超轻量检测预训练模型,PP-OCRv3中英文超轻量识别预训练模型+后处理去掉多识别的`·` +python3 tools/infer/predict_system.py --det_model_dir=output/ch_PP-OCRv3_det_distill_train/infer --rec_model_dir=output/ch_PP-OCRv3_rec_train/infer --image_dir=/home/aistudio/data/CCPD2020/ccpd_green/test/ --draw_img_save_dir=infer/post + +# PP-OCRv3中英文超轻量检测预训练模型+finetune,PP-OCRv3中英文超轻量识别预训练模型+finetune +python3 tools/infer/predict_system.py --det_model_dir=output/CCPD/det/infer --rec_model_dir=output/CCPD/rec/infer --image_dir=/home/aistudio/data/CCPD2020/ccpd_green/test/ --draw_img_save_dir=infer/finetune + +# PP-OCRv3中英文超轻量检测预训练模型finetune+量化,PP-OCRv3中英文超轻量识别预训练模型finetune+量化 结果转换和评估 +python3 tools/infer/predict_system.py --det_model_dir=output/CCPD/det_quant/infer --rec_model_dir=output/CCPD/rec_quant/infer --image_dir=/home/aistudio/data/CCPD2020/ccpd_green/test/ --draw_img_save_dir=infer/quant +``` + +3. 转换label并计算指标 + +将gt和上一步保存的预测结果转换为端对端评测需要的数据格式,并根据转换后的数据进行端到端指标计算 + +```bash +python3 tools/end2end/convert_ppocr_label.py --mode=gt --label_path=/home/aistudio/data/CCPD2020/PPOCR/test/det.txt --save_folder=end2end/gt + +# PP-OCRv3中英文超轻量检测预训练模型,PP-OCRv3中英文超轻量识别预训练模型 结果转换和评估 +python3 tools/end2end/convert_ppocr_label.py --mode=pred --label_path=infer/pretrain/system_results.txt --save_folder=end2end/pretrain +python3 tools/end2end/eval_end2end.py end2end/gt end2end/pretrain + +# PP-OCRv3中英文超轻量检测预训练模型,PP-OCRv3中英文超轻量识别预训练模型+后处理去掉多识别的`·` 结果转换和评估 +python3 tools/end2end/convert_ppocr_label.py --mode=pred --label_path=infer/post/system_results.txt --save_folder=end2end/post +python3 tools/end2end/eval_end2end.py end2end/gt end2end/post + +# PP-OCRv3中英文超轻量检测预训练模型finetune,PP-OCRv3中英文超轻量识别预训练模型finetune 结果转换和评估 +python3 tools/end2end/convert_ppocr_label.py --mode=pred --label_path=infer/finetune/system_results.txt --save_folder=end2end/finetune +python3 tools/end2end/eval_end2end.py end2end/gt end2end/finetune + +# PP-OCRv3中英文超轻量检测预训练模型finetune+量化,PP-OCRv3中英文超轻量识别预训练模型finetune+量化 结果转换和评估 +python3 tools/end2end/convert_ppocr_label.py --mode=pred --label_path=infer/quant/system_results.txt --save_folder=end2end/quant +python3 tools/end2end/eval_end2end.py end2end/gt end2end/quant +``` + +日志如下: +```bash +The convert label saved in end2end/gt +The convert label saved in end2end/pretrain +start testing... +hit, dt_count, gt_count 2 5988 5006 +character_acc: 70.42% +avg_edit_dist_field: 2.37 +avg_edit_dist_img: 2.37 +precision: 0.03% +recall: 0.04% +fmeasure: 0.04% +The convert label saved in end2end/post +start testing... +hit, dt_count, gt_count 4224 5988 5006 +character_acc: 81.59% +avg_edit_dist_field: 1.47 +avg_edit_dist_img: 1.47 +precision: 70.54% +recall: 84.38% +fmeasure: 76.84% +The convert label saved in end2end/finetune +start testing... +hit, dt_count, gt_count 4286 4898 5006 +character_acc: 94.16% +avg_edit_dist_field: 0.47 +avg_edit_dist_img: 0.47 +precision: 87.51% +recall: 85.62% +fmeasure: 86.55% +The convert label saved in end2end/quant +start testing... +hit, dt_count, gt_count 4349 4951 5006 +character_acc: 94.13% +avg_edit_dist_field: 0.47 +avg_edit_dist_img: 0.47 +precision: 87.84% +recall: 86.88% +fmeasure: 87.36% +``` + +各个方案端到端指标如下: + +|det|rec|fmeasure| +|---|---|---| +|PP-OCRv3中英文超轻量检测预训练模型|PP-OCRv3中英文超轻量识别预训练模型|0.04%| +|PP-OCRv3中英文超轻量检测预训练模型|PP-OCRv3中英文超轻量识别预训练模型+后处理去掉多识别的`·`|76.84%| +|PP-OCRv3中英文超轻量检测预训练模型+finetune|PP-OCRv3中英文超轻量识别预训练模型+finetune|86.55%| +|PP-OCRv3中英文超轻量检测预训练模型+finetune+量化|PP-OCRv3中英文超轻量识别预训练模型+finetune+量化|87.36%| + +从结果中可以看到对预训练模型不做修改,只根据场景下的具体情况进行后处理的修改就能大幅提升端到端指标到76.84%,在CCPD数据集上进行finetune后指标进一步提升到86.55%, 在经过量化训练之后,由于检测模型的recall变高,指标进一步提升到87.36%。 ### 4.4 实验总结 @@ -616,24 +758,35 @@ python tools/infer/predict_system.py \ - 检测 -|方案|hmeans| 模型大小 |预测速度(lite)| -|---|---|------|---| -|PP-OCRv3中英文超轻量检测预训练模型直接预测|76.12%|2.5M| -|PP-OCRv3中英文超轻量检测预训练模型 fine-tune|99%| 2.5M || -|PP-OCRv3中英文超轻量检测预训练模型 fine-tune+量化|98.91%| 1M || +|方案|hmeans| 模型大小 | 预测速度(lite) | +|---|---|------|------------| +|PP-OCRv3中英文超轻量检测预训练模型直接预测|76.12%|2.5M| 233ms | +|PP-OCRv3中英文超轻量检测预训练模型 fine-tune|99%| 2.5M | 233ms | +|PP-OCRv3中英文超轻量检测预训练模型 fine-tune+量化|98.91%| 1M | 189ms | - 识别 -|方案| acc | 模型大小 |预测速度(lite)| -|---|--------|-------|---| -|PP-OCRv3中英文超轻量识别预训练模型直接预测| 0% |10.3M|| -|PP-OCRv3中英文超轻量识别预训练模型直接预测+后处理去掉多识别的`·`| 90.97% |10.3M|| -|PP-OCRv3中英文超轻量识别预训练模型 fine-tune| 94.54% | 10.3M || -|PP-OCRv3中英文超轻量识别预训练模型 fine-tune + 量化| 94.4% | 4.8M || +|方案| acc | 模型大小 | 预测速度(lite) | +|---|--------|-------|------------| +|PP-OCRv3中英文超轻量识别预训练模型直接预测| 0% |10.3M| 4.2ms | +|PP-OCRv3中英文超轻量识别预训练模型直接预测+后处理去掉多识别的`·`| 90.97% |10.3M| 4.2ms | +|PP-OCRv3中英文超轻量识别预训练模型 fine-tune| 94.54% | 10.3M | 4,2ms | +|PP-OCRv3中英文超轻量识别预训练模型 fine-tune + 量化| 94.4% | 4.8M | 1.8ms | -- 结论 +- 端到端指标如下: + +|det|rec|fmeasure|模型大小|预测速度(lite) | +|---|---|---|---|---| +|PP-OCRv3中英文超轻量检测预训练模型|PP-OCRv3中英文超轻量识别预训练模型|0.04%|12.8M|298ms| +|PP-OCRv3中英文超轻量检测预训练模型|PP-OCRv3中英文超轻量识别预训练模型+后处理去掉多识别的`·`|76.84%|12.8M|298ms| +|PP-OCRv3中英文超轻量检测预训练模型+finetune|PP-OCRv3中英文超轻量识别预训练模型+finetune|86.55%|12.8M|298ms| +|PP-OCRv3中英文超轻量检测预训练模型+finetune+量化|PP-OCRv3中英文超轻量识别预训练模型+finetune+量化|87.36%|5.8M|224ms| + +*结论* PP-OCRv3的检测模型在未经过fine-tune的情况下,在车牌数据集上也有一定的精度,经过finetune后能够极大的提升检测效果,精度达到99%。在使用量化训练后检测模型的精度几乎无损,并且模型大小压缩60%。 PP-OCRv3的识别模型在未经过fine-tune的情况下,在车牌数据集上精度为0,但是经过分析可以知道,模型大部分字符都预测正确,但是会多预测一个特殊字符,去掉这个特殊字符后,精度达到90%。PP-OCRv3识别模型在经过finetune后识别精度进一步提升,达到94.4%。在使用量化训练后识别模型大小压缩53%,但是由于数据量多少,带来了1%的精度损失。 + +从端到端结果中可以看到对预训练模型不做修改,只根据场景下的具体情况进行后处理的修改就能大幅提升端到端指标到76.84%,在CCPD数据集上进行finetune后指标进一步提升到86.55%, 在经过量化训练之后,由于检测模型的recall变高,指标进一步提升到87.36%并且模型大小降低54%。 diff --git a/tools/end2end/convert_ppocr_label.py b/tools/end2end/convert_ppocr_label.py index 8084cac785125f23885399931f98531326b6fb20..c64b9ed168113879182262b609bea692fcb73165 100644 --- a/tools/end2end/convert_ppocr_label.py +++ b/tools/end2end/convert_ppocr_label.py @@ -85,10 +85,16 @@ def convert_label(label_dir, mode="gt", save_dir="./save_results/"): print("The convert label saved in {}".format(save_dir)) -if __name__ == "__main__": +def parse_args(): + import argparse + parser = argparse.ArgumentParser(description="args") + parser.add_argument("--label_path", type=str, required=True) + parser.add_argument("--save_folder", type=str, required=True) + parser.add_argument("--mode", type=str, default=False) + args = parser.parse_args() + return args - ppocr_label_gt = "/paddle/Datasets/chinese/test_set/Label_refine_310_V2.txt" - convert_label(ppocr_label_gt, "gt", "./save_gt_310_V2/") - ppocr_label_gt = "./infer_results/ch_PPOCRV2_infer.txt" - convert_label(ppocr_label_gt_en, "pred", "./save_PPOCRV2_infer/") +if __name__ == "__main__": + args = parse_args() + convert_label(args.label_path, args.mode, args.save_folder) diff --git a/tools/end2end/readme.md b/tools/end2end/readme.md index 69da06dcdabc92c0b6f1831341e592e674ea7473..636ee764aef35a551f729cce20c16357ddf4f495 100644 --- a/tools/end2end/readme.md +++ b/tools/end2end/readme.md @@ -23,19 +23,13 @@ all-sum-510/00224225.jpg [{"transcription": "超赞", "points": [[8.0, 48 **步骤二:** 将步骤一保存的数据转换为端对端评测需要的数据格式: -修改 `tools/convert_ppocr_label.py`中的代码,convert_label函数中设置输入标签路径,Mode,保存标签路径等,对预测数据的GTlabel和预测结果的label格式进行转换。 -``` -ppocr_label_gt = "gt_label.txt" -convert_label(ppocr_label_gt, "gt", "./save_gt_label/") +修改 `tools/end2end/convert_ppocr_label.py`中的代码,convert_label函数中设置输入标签路径,Mode,保存标签路径等,对预测数据的GTlabel和预测结果的label格式进行转换。 -ppocr_label_gt = "./ch_PP-OCRv2_results/system_results.txt" -convert_label(ppocr_label_gt_en, "pred", "./save_PPOCRV2_infer/") ``` +python3 tools/end2end/convert_ppocr_label.py --mode=gt --label_path=path/to/label_txt --save_folder=save_gt_label -运行`convert_ppocr_label.py`: -``` -python3 tools/convert_ppocr_label.py +python3 tools/end2end/convert_ppocr_label.py --mode=pred --label_path=path/to/pred_txt --save_folder=save_PPOCRV2_infer ``` 得到如下结果: