提交 bb66f0cb 编写于 作者: 文幕地方's avatar 文幕地方

add e2e metric and lite speed

上级 43403c46
......@@ -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%。
......@@ -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)
......@@ -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
```
得到如下结果:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册