《深入浅出OCR》项目实战:基于PGNet的端到端识别
💻本篇导读:在上一章【《深入浅出OCR》第五章:端到端文字识别】,本人着重介绍端到端识别算法的发展、分类及各自领域经典算法,为了进一步熟悉端到端识别流程,本次作者将以基于PGNet的端到端识别实战为例,全面对端到端识别技术流程进行解读,方便学习者快速上手实战。
一、项目简介:
本项目采用目前主流的端到端识别算法PGNet进行OCR实战,以开源的百度飞桨PaddleOCR为框架,结合数据增强及模型微调,采用ResNet_vd50模型作为骨干网络,进行训练及预测,并且可自己更改其他网络。本人将本次实战流程大致分为环境安装、检测模型与构建、训练与预测及模型导出等部分。
二、数据集介绍:
本次基于PGNet的端到端识别实战以totaltext数据集为例,进行端到端预训练模型测试、重新训练、评估与测试等。
下载并解压数据集
首先需要下载totaltext 数据集解压到PaddleOCR/train_data/目录,文件结构如下:
bash复制代码/PaddleOCR/train_data/total_text/train/
|- rgb/ # total_text数据集的训练数据
|- img11.jpg
| ...
|- train.txt # total_text数据集的训练标注
格式介绍
其中train.txt标注文件格式如下,文件名和标注信息中间用"\t"分隔:
css
复制代码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项目,具体命令:
bash
复制代码cd ~/work && git clone -b develop <https://gitee.com/paddlepaddle/PaddleOCR.git>
3.3 安装PaddleOCR环境
其次,需要安装PaddleOCR项目提供环境文件requirements.txt,具体命令:
arduino
复制代码!pip install -r ./requirements.txt && python setup.py install
😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓
![](https://img-blog.csdnimg.cn/img_convert/1d6bcbf54d8cf674f244795860b8ce88.png)
四、PGNet模型介绍
PGNet是一种端到端任意形状的文本检测识别器框架,不需要字符级别的标注,NMS操作以及ROI操作,并提出预测文本行内的阅读顺序模块和基于图的修正模块来提升文本识别效果,其识别精度和运行速度超过SOTA
PGNet算法原理图如下所示:
输入图像经过特征提取送入四个分支,分别是:文本边缘偏移量预测TBO模块,文本中心线预测TCL模块,文本方向偏移量预测TDO模块,以及文本字符分类图预测TCC模块。 其中TBO以及TCL的输出经过后处理后可以得到文本的检测结果,TCL、TDO、TCC负责文本识别。
4.1 模型拆分解读
本项目模型采用文字识别经典CRNN模型(CNN+RNN+CTC),其中部分模型代码经过PaddleOCR源码改编,完成识别模型的搭建、训练、评估和预测过程。训练时可以手动更改config配置文件(数据训练、加载、评估验证等参数),默认采用优化器采用Adam,使用CTC损失函数。本项目采用ResNet34作为骨干网络。
根据上述模型解读,DBNet主要分为以下三部分
- Backbone网络,负责提取图像的特征
- FPN网络,特征金字塔结构增强特征
- Head网络,计算文本区域概率图
总体来说,输入的图像经过网络Backbone和FPN提取特征,提取后的特征级联在一起,得到原图四分之一大小的特征,然后利用卷积层分别得到文本区域预测概率图和阈值图,进而通过DB的后处理得到文本包围曲线。
因此,需要从以上三个方面来依次构建DBNet文本检测网络模型。 在上述环境安装后,本项目使用PaddleOCR分别实现上述三个网络模块,并完成完整的网络构建。
4.2 Backbone选择与构建
本次实战我们采用ResNet_vd50
网络结构作为backbone进行特征提取,PaddleOCR通过将训练参数统一为配置文件进行训练,具体位置在PaddleOCR/configs/e2e中,添加训练配置文件e2e_r50_vd_pg.yml
,其源码可参考ppocr文件夹下的各部分文件进行查看。
python复制代码Global:
use_gpu: True
epoch_num: 600
log_smooth_window: 20
print_batch_step: 10
save_model_dir: ./output/pgnet_r50_vd_totaltext/
save_epoch_step: 10
# evaluation is run every 0 iterationss after the 1000th iteration
eval_batch_step: [ 0, 1000 ]
cal_metric_during_train: False
pretrained_model:
checkpoints:
save_inference_dir:
use_visualdl: False
infer_img:
valid_set: totaltext # two mode: totaltext valid curved words, partvgg valid non-curved words
save_res_path: ./output/pgnet_r50_vd_totaltext/predicts_pgnet.txt
character_dict_path: ppocr/utils/ic15_dict.txt
character_type: EN
max_text_length: 50 # 最长序列长度
max_text_nums: 30 # the max seq nums in a pic
tcl_len: 64
Architecture:
model_type: e2e
algorithm: PGNet
Transform:
Backbone:
name: ResNet
layers: 50
Neck:
name: PGFPN
Head:
name: PGHead
Loss:
name: PGLoss #损失使用PGLoss
tcl_bs: 64
max_text_length: 50 # the same as Global: max_text_length
max_text_nums: 30 # the same as Global:max_text_nums
pad_num: 36 # the length of dict for pad
Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
lr:
learning_rate: 0.001
regularizer:
name: 'L2'
factor: 0
PostProcess:
name: PGPostProcess
score_thresh: 0.5
mode: fast # 后处理选择fast 或 slow 方式
Metric:
name: E2EMetric
mode: A # two ways for eval, A: label from txt, B: label from gt_mat
gt_mat_dir: ./train_data/total_text/gt # the dir of gt_mat
character_dict_path: ppocr/utils/ic15_dict.txt
main_indicator: f_score_e2e
Train:
dataset:
name: PGDataSet
data_dir: ./train_data/total_text/train
label_file_list: [./train_data/total_text/train/train.txt]
ratio_list: [1.0]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- E2ELabelEncodeTrain:
- PGProcessTrain:
batch_size: 14 # same as loader: batch_size_per_card
min_crop_size: 24
min_text_size: 4
max_text_size: 512
- KeepKeys:
keep_keys: [ 'images', 'tcl_maps', 'tcl_label_maps', 'border_maps','direction_maps', 'training_masks', 'label_list', 'pos_list', 'pos_mask' ] # dataloader will return list in this order
loader:
shuffle: True
drop_last: True
batch_size_per_card: 14
num_workers: 16
Eval:
dataset:
name: PGDataSet
data_dir: ./train_data/total_text/test
label_file_list: [./train_data/total_text/test/test.txt]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- E2ELabelEncodeTest:
- E2EResizeForTest:
max_side_len: 768
- NormalizeImage:
scale: 1./255.
mean: [ 0.485, 0.456, 0.406 ]
std: [ 0.229, 0.224, 0.225 ]
order: 'hwc'
- ToCHWImage:
- KeepKeys:
keep_keys: [ 'image', 'shape', 'polys', 'texts', 'ignore_tags', 'img_id']
loader:
shuffle: False
drop_last: False
batch_size_per_card: 1 # must be 1
num_workers: 2
4.3 参数解读参考:
PGNet配置文件参数解读参考之前的下表表格,其他重要参数在配置文件中已注明。
Parameter | Description | Default value |
---|---|---|
use_gpu | 是否启用GPU | TRUE |
gpu_mem | GPU memory size used for initialization | 8000M |
image_dir | The images path or folder path for predicting when used by the command line | |
det_algorithm | 选择的检测算法类型 | DB |
det_model_dir | 文本检测推理模型文件夹。 参数传递有两种方式:None:自动将内置模型下载到 /root/.paddleocr/det ; 自己转换的推理模型的路径,模型和params文件必须包含在模型路径中 | None |
det_max_side_len | 图像长边的最大尺寸。 当长边超过这个值时,长边会调整到这个大小,短边会按比例缩放 | 960 |
det_db_thresh | Binarization threshold value of DB output map | 0.3 |
det_db_box_thresh | The threshold value of the DB output box. Boxes score lower than this value will be discarded | 0.5 |
det_db_unclip_ratio | The expanded ratio of DB output box | 2 |
det_east_score_thresh | Binarization threshold value of EAST output map | 0.8 |
det_east_cover_thresh | The threshold value of the EAST output box. Boxes score lower than this value will be discarded | 0.1 |
det_east_nms_thresh | The NMS threshold value of EAST model output box | 0.2 |
rec_algorithm | 选择的识别算法类型 | CRNN(卷积循环神经网络) |
rec_model_dir | 文本识别推理模型文件夹。 参数传递有两种方式:None:自动将内置模型下载到 /root/.paddleocr/rec ; 自己转换的推理模型的路径,模型和params文件必须包含在模型路径中 | None |
rec_image_shape | 图像形状识别算法 | “3,32,320” |
rec_batch_num | When performing recognition, the batchsize of forward images | 30 |
max_text_length | 识别算法可以识别的最大文本长度 | 25 |
rec_char_dict_path | the alphabet path which needs to be modified to your own path when rec_model_Name use mode 2 | ./ppocr/utils/ppocr_keys_v1.txt |
use_space_char | 是否识别空格 | TRUE |
drop_score | 按分数过滤输出(来自识别模型),低于此分数的将不返回 | 0.5 |
use_angle_cls | 是否加载分类模型 | FALSE |
cls_model_dir | 分类推理模型文件夹。 参数传递有两种方式:None:自动下载内置模型到 /root/.paddleocr/cls ; 自己转换的推理模型的路径,模型和params文件必须包含在模型路径中 | None |
cls_image_shape | 图像形状分类算法 | “3,48,192” |
label_list | label list of classification algorithm | [‘0’,‘180’] |
cls_batch_num | When performing classification, the batchsize of forward images | 30 |
enable_mkldnn | 是否启用 mkldnn | FALSE |
use_zero_copy_run | Whether to forward by zero_copy_run | FALSE |
lang | 支持语言,目前只支持中文(ch)、English(en)、French(french)、German(german)、Korean(korean)、Japanese(japan) | ch |
det | ppocr.ocr 函数执行时启用检测 | TRUE |
rec | ppocr.ocr func exec 时启用识别 | TRUE |
cls | Enable classification when ppocr.ocr func exec((Use use_angle_cls in command line mode to control whether to start classification in the forward direction) | FALSE |
show_log | Whether to print log | FALSE |
type | Perform ocr or table structuring, 取值在 [‘ocr’,‘structure’] | ocr |
ocr_version | OCR型号版本号,目前模型支持列表如下:PP-OCRv3支持中英文检测、识别、多语言识别、方向分类器模型;PP-OCRv2支持中文检测识别模型;PP-OCR支持中文检测、识别 和方向分类器、多语言识别模型 | PP-OCRv3 |
五、模型测试
5.1 预模型下载
PaddleOCR已提供PGNet预训练模型,请自行下载并解压,如下图所示。
PGNet预训练模型下载:
paddleocr.bj.bcebos.com/dygraph_v2.…
模型解压:
经过tar命令解压上述文件后文件结构如下:
复制代码├── e2e_server_pgnetA_infer
│ ├── inference.pdiparams
│ ├── inference.pdiparams.info
│ └── inference.pdmodel
5.2 模型预测
5.2.1 预测单张图像
ini
复制代码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 预测文件夹内多个图像
ini
复制代码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
ini
复制代码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
。 - 根据修改后的配置文件,输入以下命令就可以开始训练,训练命令如下,可分为单卡和多卡训练。
bash复制代码 # 单机单卡训练 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指定要加载的模型路径,命令如下,也可直接修改配置文件:
bash
复制代码python3 tools/train.py -c configs/e2e/e2e_r50_vd_pg.yml -o Global.checkpoints=./your/trained/model
6.2 导出模型
通过export_model.py导出模型,设置配置文件及导出路径。
将训练好的模型转换成inference模型命令如下:
pyhton复制代码!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"
,修改模型路径,可以执行如下命令:
ini
复制代码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等进行参数调整,提升端到端识别效果.
- 后续继续对数据进行增强操作或结合更多相关数据集进行预训练,增加模型的泛化性。
- 可以尝试不同场景识别效果,尤其是中文场景下端到端识别。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
![](https://img-blog.csdnimg.cn/img_convert/f42796fa01fa5e8d05325b50d4d22d17.png)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
![](https://img-blog.csdnimg.cn/img_convert/f42796fa01fa5e8d05325b50d4d22d17.png)