⚠️本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。
💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 704932595 |💜个人简介 : 掘金签约作者、百度飞桨PPDE、领航团团长、开源特训营导师、CSDN、阿里云社区人工智能领域博客专家、新星计划计算机视觉方向导师等,专注大数据与人工智能知识分享。
💻文章目录
《深入浅出OCR》前言知识(二):深度学习基础总结 (✨文末深度学习总结导图)
《深入浅出OCR》前言知识(一):机器学习基础总结 (✨文末机器学习总结导图)
《深入浅出OCR》项目实战:基于PGNet的端到端识别
💻本篇导读:在上一章【《深入浅出OCR》第五章:端到端文字识别】,本人着重介绍端到端识别算法的发展、分类及各自领域经典算法,为了进一步熟悉端到端识别流程,本次作者将以基于PGNet的端到端识别实战为例,全面对端到端识别技术流程进行解读,方便学习者快速上手实战。
一、项目简介:
本项目采用目前主流的端到端识别算法PGNet进行OCR实战,以开源的百度飞桨PaddleOCR为框架,结合数据增强及模型微调,采用ResNet_vd50模型作为骨干网络,进行训练及预测,并且可自己更改其他网络。本人将本次实战流程大致分为环境安装、检测模型与构建、训练与预测及模型导出等部分。
二、数据集介绍:
本次基于PGNet的端到端识别实战以totaltext数据集为例,进行端到端预训练模型测试、重新训练、评估与测试等。
下载并解压数据集
首先需要下载totaltext 数据集解压到PaddleOCR/train_data/目录,文件结构如下:
/PaddleOCR/train_data/total_text/train/
|- rgb/ # total_text数据集的训练数据
|- img11.jpg
| ...
|- train.txt # total_text数据集的训练标注
格式介绍
其中train.txt标注文件格式如下,文件名和标注信息中间用”t”分隔:
img12.jpg [{"transcription": "ASRAMA", "points": [[214.0, 325.0], [235.0, 308.0], [259.0, 296.0], [286.0, 291.0], [313.0, 295.0], [338.0, 305.0], [362.0, 320.0], [349.0, 347.0], [330.0, 337.0], [310.0, 329.0], [290.0, 324.0], [269.0, 328.0], [249.0, 336.0], [231.0, 346.0]]}, {...}]
注:上述格式为PaddleOCR训练数据格式,json.dumps编码前的图像标注信息是包含多个字典的list,其中
points
表示文本框的四个点的坐标(x, y),从左上到右上到右下再到左下;transcription
表示当前文本框的文字内容。
三、框架介绍与环境安装
3.1 PaddleOCR框架
PaddleOCR框架介绍: 链接
PaddleOCR是一款超轻量、中英文识别模型,支持各类设备上进行部署,本次使用如下图所示的端到端识别PGNet算法。
3.2 项目环境克隆
同之前的项目实战一样,本次项目环境也需要先克隆PaddleOCR项目,具体命令:
cd ~/work && git clone -b develop <https://gitee.com/paddlepaddle/PaddleOCR.git>
3.3 安装PaddleOCR环境
其次,需要安装PaddleOCR项目提供环境文件requirements.txt,具体命令:
!pip install -r ./requirements.txt && python setup.py install
3.4 数据集
四、PGNet模型介绍
PGNet是一种端到端任意形状的文本检测识别器框架,不需要字符级别的标注,NMS操作以及ROI操作,并提出预测文本行内的阅读顺序模块和基于图的修正模块来提升文本识别效果,其识别精度和运行速度超过SOTA
项目链接:paddleocr.bj.bcebos.com/dygraph_v2.…
模型解压:
经过tar命令解压上述文件后文件结构如下:
├── e2e_server_pgnetA_infer
│ ├── inference.pdiparams
│ ├── inference.pdiparams.info
│ └── inference.pdmodel
5.2 模型预测
5.2.1 预测单张图像
python3 tools/infer/predict_e2e.py --e2e_algorithm="PGNet" --image_dir="./doc/imgs_en/img623.jpg" --e2e_model_dir="./inference/e2e_server_pgnetA_infer/" --e2e_pgnet_valid_set="totaltext"
5.2.2 预测文件夹内多个图像
python3 tools/infer/predict_e2e.py --e2e_algorithm="PGNet" --image_dir="./doc/imgs_en/" --e2e_model_dir="./inference/e2e_server_pgnetA_infer/" --e2e_pgnet_valid_set="totaltext"
5.2.3 CPU预测
设置use_gpu参数为False
python3 tools/infer/predict_e2e.py --e2e_algorithm="PGNet" --image_dir="./doc/imgs_en/img623.jpg" --e2e_model_dir="./inference/e2e_server_pgnetA_infer/" --e2e_pgnet_valid_set="totaltext" --use_gpu=False
六、训练与预测
6.1 模型训练流程:
-
需要修改端到端识别配置文件
configs/e2e/e2e_r50_vd_pg.yml
中Train和Eval数据集的图片路径data_dir
和标签路径label_file_list
。 -
根据修改后的配置文件,输入以下命令就可以开始训练,训练命令如下,可分为单卡和多卡训练。
# 单机单卡训练 e2e 模型
python3 tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.pretrained_model=./pretrain_models/train_step1/best_accuracy Global.load_static_weights=False
# 单机多卡训练,通过 --gpus 参数设置使用的GPU ID
python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.pretrained_model=./pretrain_models/train_step1/best_accuracy Global.load_static_weights=False
断点训练
若训练程序因某种原因中断,希望加载训练中断的模型恢复训练,可通过指定Global.checkpoints指定要加载的模型路径,命令如下,也可直接修改配置文件:
python3 tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.checkpoints=./your/trained/model
6.2 导出模型
通过export_model.py导出模型,设置配置文件及导出路径。
将训练好的模型转换成inference模型命令如下:
!python tools/export_model.py
-c configs/det/det_mv3_db.yml
-o Global.pretrained_model=./output/db_mv3/best_accuracy
Global.save_inference_dir=./inference/db_mv3/
6.3 预测结果
对于弯曲文本样例, PGNet端到端模型推理,需要设置参数--e2e_algorithm="PGNet"
,同时,还需要增加参数--e2e_pgnet_valid_set="totaltext"
,修改模型路径,可以执行如下命令:
python3 tools/infer/predict_e2e.py --e2e_algorithm="PGNet" --image_dir="./doc/imgs_en/img623.jpg" --e2e_model_dir="./inference/e2e/" --e2e_pgnet_valid_set="totaltext"
测试单张图片效果如下:,
端到端识别评估指标:
- 端对端召回率:准确检测并正确识别文本行在全部标注文本行的占比;
- 端到端准确率:准确检测并正确识别文本行在检测到的文本行数量的占比;
- 准确检测的标准是检测框与标注框的IOU大于某个阈值,正确识别的检测框中的文本与标注的文本相同。
七、问题汇总
问:PGNet相比于两阶段OCR算法在准确率上有哪些优势?
pgnet是端到端算法,检测识别一步到位,不用分开训练模型,同时支持弯曲文本识别,相比两阶段OCR如db+crnn的应用相对成熟,在常规非弯曲文本达到较好识别效果,但是在中文上的效果还没有充分验证。
问: 端到端算法PGNet提供了两种后处理方式,两者区别是什么?
两种后处理的区别主要在于速度的推理,config中PostProcess有fast/slow两种模式,slow模式的后处理速度慢,精度相对较高,fast模式的后处理速度快,精度也在可接受的范围之内。建议使用速度快的后处理方式。
问:针对PGNet的训练集的文本框标注有具体要求吗?
PGNet支持多点标注,如4点、8点、14点等。针对数据集标注注意事项,标注点尽可能分布均匀(相邻标注点间隔距离均匀一致),同时标注点从左上角开始,按顺时针顺序依次编写。
八、总结:
-
针对后续改进,可自行根据骨干网络结构、参数学习率、Batchsize等进行参数调整,提升端到端识别效果.
-
后续继续对数据进行增强操作或结合更多相关数据集进行预训练,增加模型的泛化性。
-
可以尝试不同场景识别效果,尤其是中文场景下端到端识别。
本篇总结: 本篇主要介绍《深入浅出OCR》实战:基于PGNet的端到端识别,本篇主要对端到端识别PGNet算法进行解读,配合PaddleOCR算法实现端到端算法实战。尽可能详细介绍代码及项目流程,如有错误请指正,后续本人也将介绍更多实战项目,欢迎大家交流学习。
参考资料:
PaddleOCR官方教程