PaddleOCR将训练好的模型应用于生产识别

上节中我们使用自己的业务数据进行迁移学习训练得到了训练模型【PaddleOCR训练自定义书法汉字数据集】,该模型只适合数据训练并不适合生产使用,生产使用需要将训练模型转换为精简后的识别模型。

步骤

1.转换模型
2.通过PaddleOCR加载自定义模型
3.遇到的问题

1.转换模型

我们训练好的模型会出现在制定目录下,文件包括 :
best_accuracy:历史精度最高的一次参数模型
iter_epoch_xx:某一轮训练的模型
latest:最后一次训练的参数模型

一般来说我们会采用精读最高的best_accuracy模型进行转化,转化模型运行以下脚本即可

#保存模型
# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.save_inference_dir参数设置转换的模型将保存的地址。

python3 tools/export_model.py -c configs/rec/PP-OCRv3/my_ch_PP-OCRv3_rec.yml -o Global.pretrained_model=./train/train_model/rec/rec_ppocr_v3/latest  Global.save_inference_dir=./train/train_model/infer/my_PP-OCRv3_rec/

转化成功后将得到三个文件(文件别改名称,除非你想修改paddleocr的源码),分别为
inference.pdiparams:精简后的参数
inference.pdiparams.info:参数信息
inference.pdmodel:网络模型

得到转化后的模型需要进行一次测试,查看转换后的模型是否可用,这里随便找一张图片来验证下即可

#image_dir 图片地址
#rec_model_dir 转化后模型地址
#rec_image_shape:格式化图片大小
python3 tools/infer/predict_rec.py --image_dir="/Users/fplei/Work/Study/paddle/PaddleOCR/train/train_data/rec1/org_img/一_259.jpg" --rec_model_dir="/Users/fplei/Work/Study/paddle/PaddleOCR/train/train_model/infer/my_PP-OCRv3_rec" --rec_image_shape="3, 32, 32"

#输出结果如下:
(paddle_env) fplei:PaddleOCR fplei$ python3 tools/infer/predict_rec.py --image_dir="xx/paddle/PaddleOCR/train/train_data/rec1/org_img/一_259.jpg" --rec_model_dir="xxx/paddle/PaddleOCR/train/train_model/infer/my_PP-OCRv3_rec" --rec_image_shape="3, 32, 32" --rec_char_dict_path="xxx/paddle/PaddleOCR/ppocr/utils/ppocr_keys_v1.txt"
E0717 22:54:33.328843 455181824 analysis_config.cc:95] Please compile with gpu to EnableGpu()
[2022/07/17 22:54:33] ppocr INFO: In PP-OCRv3, rec_image_shape parameter defaults to '3, 48, 320', if you are using recognition model with PP-OCRv2 or an older version, please set --rec_image_shape='3,32,320
[2022/07/17 22:54:33] ppocr INFO: Predicts of /Users/fplei/Work/Study/paddle/PaddleOCR/train/train_data/rec1/org_img/一_259.jpg
:('一', 0.9955724477767944)

准确率可达99%,其实该模型是我基于上次训练的模型后续加了另外一批不同尺寸的数据进行训练最终得到一个比较不错的准确率。

2.通过PaddleOCR加载自定义模型
转换后的模型在精度测试没有问题的情况下可以用于生产,识别模型部署生产共有3种方法
1. 直接在服务器下载PaddleOCR源码,通过源码运行
2.pip安装PaddleOCR SDK进行调用
3.基于PaddleServing的服务部署

前面2种都是基于跨平台调用,通过运行脚本,并获取输出来达到使用目的,唯一的区别是通过SDK的编写的脚本不需要下载项目源码,这里直接使用SDK方式

from paddleocr import PaddleOCR, draw_ocr

#创建OCR实例
#use_angle_cls:是否识别方向
#use_mp:是否使用多线程
#lang:语言
#rec_image_shape:图片大小(很重要)
#rec_char_dict_path:字典路径
#rec_model_dir:识别模型目录
#cls_model_dir:方向识别模型目录(非必须)
ocr = PaddleOCR(use_angle_cls=True,use_mp=True,
                lang="ch",
                rec_image_shape="3,32,32",
                rec_char_dict_path="/xxx/PaddleOCR/ppocr/utils/ppocr_keys_v1.txt",
                rec_model_dir="/xxx/PaddleOCR/train/train_model/infer/my_PP-OCRv3_rec",
                cls_model_dir="/xxx/PaddleOCR/train/train_model/cls/ch_ppocr_mobile_v2.0_cls_infer")

#图片地址
img_path = '/xxx/PaddleOCR/train/train_data/rec/org_img/二_327.jpg'
#调用sdk识别
result = ocr.ocr(img_path, det=False)
for line in result:
    print(line)

#输出结果
--> ('二', 0.996241569519043)

基于PaddleServing的服务部署
详细:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/deploy/pdserving/README_CN.md

3.遇到的问题
1)转换后的模型与训练模型准确率相差非常大
官方给的解释如下:

当前问题表现为:使用训练完的模型直接测试结果较好,但是转换为inference model后,预测结果不一致;出现这个问题一般是两个原因:

预处理函数设置的不一致
后处理参数不一致 repo中config.yml文件的前后处理参数和inference预测默认的超参数有不一致的地方,建议排查下训练模型预测和inference预测的前后处理, 参考issue。

这里经过排查发现,开始未指定【rec_image_shape】参数导致识别正确率低下的主要原因,这也正是符合官方描述,应用网络模型将图片宽高固定在32个像素,但是不指定的话默认是 32*128,因此转换后会导致识别率低下。