《深入浅出OCR》实战:基于PGNet的端到端识别

⚠️本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。
💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 704932595 |💜个人简介 : 掘金签约作者、百度飞桨PPDE、领航团团长、开源特训营导师、CSDN、阿里云社区人工智能领域博客专家、新星计划计算机视觉方向导师等,专注大数据与人工智能知识分享。

💻文章目录

《深入浅出OCR》前言知识(二):深度学习基础总结 (✨文末深度学习总结导图)

《深入浅出OCR》前言知识(一):机器学习基础总结 (✨文末机器学习总结导图)

《深入浅出OCR》第一章:OCR技术导论

《深入浅出OCR》第二章:OCR技术发展与分类

《深入浅出OCR》第三章:OCR文字检测


《深入浅出OCR》项目实战:基于PGNet的端到端识别

💻本篇导读:在上一章【《深入浅出OCR》第五章:端到端文字识别】,本人着重介绍端到端识别算法的发展、分类及各自领域经典算法,为了进一步熟悉端到端识别流程,本次作者将以基于PGNet的端到端识别实战为例,全面对端到端识别技术流程进行解读,方便学习者快速上手实战。

一、项目简介:

本项目采用目前主流的端到端识别算法PGNet进行OCR实战,以开源的百度飞桨PaddleOCR为框架,结合数据增强及模型微调,采用ResNet_vd50模型作为骨干网络,进行训练及预测,并且可自己更改其他网络。本人将本次实战流程大致分为环境安装、检测模型与构建、训练与预测及模型导出等部分。

二、数据集介绍:

本次项目数据集以icdar15为例,数据集样例如下。本文参照其标注格式进行检测模型的训练、评估与测试。

注:官方数据~/train_data/icdar2015/text_localization 有两个文件夹和两个文件,分别是:

bash 复制代码
~/train_data/icdar2015/text_localization 
  └─ icdar_c4_train_imgs/         icdar数据集的训练数据
  └─ ch4_test_images/             icdar数据集的测试数据
  └─ train_icdar2015_label.txt    icdar数据集的训练标注
  └─ test_icdar2015_label.txt     icdar数据集的测试标注

官方提供的标注文件格式为:

lua 复制代码
" 图像文件名                    json.dumps编码的图像标注信息"
ch4_test_images/img_61.jpg    [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]], ...}]

json.dumps编码前的图像标注信息是包含多个字典的list,字典中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> p o i n t s points </math>points表示文本框的四个点的坐标(x, y),从左上角的点开始顺时针排列。 <math xmlns="http://www.w3.org/1998/Math/MathML"> t r a n s c r i p t i o n transcription </math>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

3.4 数据集

下载并解压数据集

本次基于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 复制代码
rgb/img11.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 表示当前文本框的文字内容。

四、PGNet模型介绍

PGNet是一种端到端任意形状的文本检测识别器框架,不需要字符级别的标注,NMS操作以及ROI操作,并提出预测文本行内的阅读顺序模块和基于图的修正模块来提升文本识别效果,其识别精度和运行速度超过SOTA

论文连接:arxiv.org/pdf/1911.08...

项目链接:github.com/WenmuZhou/D...

PGNet算法原理图如下所示:

输入图像经过特征提取送入四个分支,分别是:文本边缘偏移量预测TBO模块,文本中心线预测TCL模块,文本方向偏移量预测TDO模块,以及文本字符分类图预测TCC模块。 其中TBO以及TCL的输出经过后处理后可以得到文本的检测结果,TCL、TDO、TCC负责文本识别。

4.1 模型拆分解读

本项目模型采用文字识别经典CRNN模型(CNN+RNN+CTC),其中部分模型代码经过PaddleOCR源码改编,完成识别模型的搭建、训练、评估和预测过程。训练时可以手动更改config配置文件(数据训练、加载、评估验证等参数),默认采用优化器采用Adam,使用CTC损失函数。本项目采用ResNet34作为骨干网络。

根据上述模型解读,DBNet主要分为以下三部分

  1. Backbone网络,负责提取图像的特征
  2. FPN网络,特征金字塔结构增强特征
  3. 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 模型训练流程:

  1. 需要修改端到端识别配置文件configs/e2e/e2e_r50_vd_pg.yml中Train和Eval数据集的图片路径data_dir和标签路径label_file_list

  2. 根据修改后的配置文件,输入以下命令就可以开始训练,训练命令如下,可分为单卡和多卡训练。

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点等。针对数据集标注注意事项,标注点尽可能分布均匀(相邻标注点间隔距离均匀一致),同时标注点从左上角开始,按顺时针顺序依次编写。

八、总结:

  1. 针对后续改进,可自行根据骨干网络结构、参数学习率、Batchsize等进行参数调整,提升端到端识别效果.

  2. 后续继续对数据进行增强操作或结合更多相关数据集进行预训练,增加模型的泛化性。

  3. 可以尝试不同场景识别效果,尤其是中文场景下端到端识别。

本篇总结: 本篇主要介绍《深入浅出OCR》实战:基于PGNet的端到端识别,本篇主要对端到端识别PGNet算法进行解读,配合PaddleOCR算法实现端到端算法实战。尽可能详细介绍代码及项目流程,如有错误请指正,后续本人也将介绍更多实战项目,欢迎大家交流学习。

参考资料PaddleOCR官方教程

相关推荐
JxWang0519 小时前
pandas计算某列每行带有分隔符的数据中包含特定值的次数
人工智能
能源系统预测和优化研究19 小时前
创新点解读:基于非线性二次分解的Ridge-RF-XGBoost时间序列预测(附代码实现)
人工智能·深度学习·算法
执笔论英雄19 小时前
【RL】ROLL下载模型流程
人工智能·算法·机器学习
لا معنى له19 小时前
目标分割介绍及最新模型----学习笔记
人工智能·笔记·深度学习·学习·机器学习·计算机视觉
carver w19 小时前
one-hot编码
人工智能
邮一朵向日葵20 小时前
企查查开放平台MCP:为AI智能体注入精准商业数据,驱动智能决策新时代
大数据·人工智能
沃达德软件20 小时前
智能警务视频侦查系统
大数据·人工智能·数据挖掘·数据分析·实时音视频·视频编解码
说私域20 小时前
链动2+1模式AI智能名片S2B2C商城小程序中电商直播的应用机制与价值创新研究
人工智能·小程序
北邮刘老师20 小时前
【智能体互联协议解析】身份码-智能体的身份证号
网络·人工智能·大模型·智能体·智能体互联网
Wulida00999120 小时前
【目标检测】基于改进YOLOv13-C3k2-DWR的铲斗定位系统研究
人工智能·yolo·目标检测