PaddleOCR 定制超轻量 OCR 模型实战:检测模型训练、识别模型训练与两阶段串联推理全流程指南
【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR
本文基于 PaddleOCR v2.x 系列的
customize技术博客整理并深化。要打造一套属于自己的定制化超轻量 OCR 模型,只需完成三步:训练文本检测模型、训练文本识别模型,然后将两者预测结果串联成完整的端到端文字识别系统。读完本文,你将掌握检测/识别模型的训练命令与配置要点,理解检测与识别模型自由组合的串联推理原理,并能在单张图片或图片目录上直接跑通全流程推理与可视化。
一、整体流程:三步打造定制化超轻量 OCR 模型
在 PaddleOCR 中,定制一套超轻量 OCR 模型的过程可以拆解为三个明确步骤:
- 训练文本检测模型(Text Detection):定位图片中文字区域的位置;
- 训练文本识别模型(Text Recognition):把检测出的文字区域裁剪出来,识别其具体内容;
- 串联两个模型的预测结果(Concatenate Predictions):将任意训练好的检测模型与任意识别模型组合为一个两阶段文字识别系统,输出文字位置与识别文本。
这套思路与 PaddleOCR 经典的"检测 + 方向分类(可选)+ 识别"三段式推理架构一脉相承,其中方向分类环节(angle classifier)属于可选增强项,在纯"检测 + 识别"的最小定制方案中并不强制要求。下面按步骤逐一展开。
二、STEP 1:训练文本检测模型
PaddleOCR 提供两种文本检测算法:EAST与DB(Differentiable Binarization)。两者都支持MobileNetV3与ResNet50_vd两种骨干网络,你只需要按需选择对应的配置文件即可开始训练。
例如,使用 MobileNetV3 作为骨干网络训练 DB 检测模型,直接执行:
python3 tools/train.py -c configs/det/det_mv3_db.yml 2>&1 | tee det_db.log命令说明:
tools/train.py是 PaddleOCR 统一的训练入口脚本;-c参数指定配置文件路径;2>&1 | tee det_db.log将训练日志同时输出到屏幕与det_db.log文件,方便后续查看训练曲线与排错。
2.1 检测配置核心参数解析(以 det_mv3_db.yml 为例)
当前仓库中对应的真实配置文件为 configs/det/det_mv3_db.yml,其关键配置项可划分为六大板块:
Global(全局训练策略)
| 参数 | 默认值 | 说明 |
|---|---|---|
epoch_num | 1200 | 总训练轮数 |
save_epoch_step | 1200 | 每 N 轮保存一次模型 |
eval_batch_step | [0, 2000] | 每 2000 次迭代执行一次评估 |
cal_metric_during_train | False | 训练过程中是否计算指标 |
pretrained_model | ./pretrain_models/MobileNetV3_large_x0_5_pretrained | 预训练模型路径,强烈建议加载以加速收敛 |
save_model_dir | ./output/db_mv3/ | 模型保存目录 |
Architecture(网络结构)
algorithm: DB:指定检测算法为 DB;Backbone.name: MobileNetV3,scale: 0.5,model_name: large:选用 MobileNetV3-large 且宽度系数 0.5 的超轻量骨干网络;Neck.name: DBFPN,out_channels: 256:特征金字塔融合;Head.name: DBHead,k: 50:DB 可微分二值化头,k为二值化阈值放大系数。
Loss(损失函数):DBLoss,开启balance_loss,主损失DiceLoss,alpha: 5、beta: 10为概率图与阈值图损失的权重,ohem_ratio: 3为在线难例挖掘比例。
Optimizer(优化器):Adam,学习率 0.001,L2 正则。
PostProcess(后处理):DBPostProcess,其中thresh: 0.3为二值化阈值、box_thresh: 0.6为检测框置信度阈值、unclip_ratio: 1.5为文本框扩张比例,这三个参数直接决定检测框的召回与精度,是调优时最常触碰的旋钮。
Metric(评估指标):DetMetric,main_indicator: hmean,即以检测常用的 F1(hmean)作为主指标。
Train / Eval(数据与加载器):训练集使用SimpleDataSet配合DetLabelEncode编码标签,训练阶段包含IaaAugment数据增强、EastRandomCropData随机裁剪(640×640)、MakeBorderMap与MakeShrinkMap生成 DB 所需的阈值图与收缩图;评估阶段则采用DetResizeForTest(736×1280)与NormalizeImage标准化。训练 batch size 为 16,num_workers: 8。
注意:训练前需按 PaddleOCR 要求准备 ICDAR2015 格式的数据集(图片目录 + 标签文件),并将
data_dir与label_file_list指向你自己的数据路径。
2.2 数据准备与完整训练教程
关于数据标注、数据集组织格式、断点续训(checkpoints)与模型评估、预测的完整细节,请参阅仓库内文档 Text detection model training/evaluation/prediction。
三、STEP 2:训练文本识别模型
PaddleOCR 提供四种文本识别算法:CRNN、Rosetta、STAR-Net与RARE。它们都支持MobileNetV3与ResNet34_vd两种骨干网络,按需选择对应配置文件即可开始训练。
例如,训练一个以 MobileNetV3 为骨干网络的 CRNN 中文识别模型:
python3 tools/train.py -c configs/rec/rec_chinese_lite_train.yml 2>&1 | tee rec_ch_lite.log说明:上述命令中的
rec_chinese_lite_train.yml是 PaddleOCR v2.x 早期版本的配置文件名;在当前仓库中,对应配置已演进为 configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml,训练时请以仓库内实际存在的配置文件为准。
3.1 识别配置核心参数解析
以当前仓库的rec_chinese_lite_train_v2.0.yml为例,关键配置如下:
Global(全局策略)
epoch_num: 500:训练 500 轮;character_dict_path: ppocr/utils/ppocr_keys_v1.txt:字符字典路径,该字典位于仓库 ppocr/utils/ppocr_keys_v1.txt,决定了模型能够识别的字符集合(含中英文与常见符号);max_text_length: 25:单行文本最大长度;use_space_char: True:是否使用空格字符;save_model_dir: ./output/rec_chinese_lite_v2.0:模型保存目录。
Architecture(网络结构)
algorithm: CRNN:识别算法为 CRNN;Backbone.name: MobileNetV3,scale: 0.5,model_name: small:超轻量 MobileNetV3-small 骨干;Neck.name: SequenceEncoder,encoder_type: rnn,hidden_size: 48:序列编码器采用 RNN(双向 LSTM);Head.name: CTCHead:识别头使用 CTC 解码,无需字符级对齐标注。
Loss(损失函数):CTCLoss,配合 CTCHead 使用。
Optimizer(优化器):Adam,学习率 0.001,采用Cosine余弦退火学习率调度,warmup_epoch: 5,L2 正则系数0.00001。
PostProcess:CTCLabelDecode,负责把 CTC 输出解码为文本序列。
Metric:RecMetric,main_indicator: acc,以字符/整行识别准确率为主指标。
Train / Eval(数据与加载器):训练阶段包含RecAug识别数据增强,RecResizeImg将图片统一缩放至[3, 32, 320](通道数×高×宽);标签通过CTCLabelEncode编码。训练 batch size 为 256。
3.2 数据准备与完整训练教程
关于识别数据集的制作(训练列表train_list.txt、验证列表val_list.txt的格式)、标签文件组织与训练评估细节,请参阅仓库内文档 Text recognition model training/evaluation/prediction。
四、STEP 3:串联检测与识别模型进行预测
训练完成后,PaddleOCR 提供了检测模型与识别模型的串联工具,可以将任意训练好的检测模型与任意识别模型连接成一个两阶段文字识别系统。
4.1 预测时的四个主要阶段
输入图片经过串联系统后,依次经历四个核心阶段:
- 文本检测(Text Detection):检测模型定位图片中所有文本区域,输出文本框坐标;
- 文本矫正(Text Rectification):根据检测框对原始图片进行旋转、裁剪,得到规整的单行文本切片;
- 文本识别(Text Recognition):识别模型逐一切片识别文本内容;
- 分数过滤(Score Filtering):根据识别置信度过滤低质量结果,最终输出文本位置与识别结果;同时可选择开启可视化,将结果绘制到原图上。
这一流程在源码 tools/infer/predict_system.py 的TextSystem类中有完整实现:__call__方法先调用self.text_detector得到文本框dt_boxes,再经get_rotate_crop_image(quad 框)或get_minarea_rect_crop完成文本矫正裁剪,随后送入self.text_recognizer识别,最后通过score >= self.drop_score的过滤条件筛掉低置信度结果;如果开启use_angle_cls,还会在识别前插入方向分类器对旋转文本进行矫正。此外,sorted_boxes函数还会对文本框按"从上到下、从左到右"排序,保证输出顺序符合阅读习惯。
4.2 串联推理命令与核心参数
执行预测时,需要指定以下三个核心参数:
| 参数 | 作用 |
|---|---|
--image_dir | 指定单张图片路径或图片文件夹路径 |
--det_model_dir | 指定检测模型路径 |
--rec_model_dir | 指定识别模型路径 |
典型命令如下:
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/det/" --rec_model_dir="./inference/rec/"可视化结果默认保存到./inference_results文件夹(可通过--draw_img_save_dir调整),同时会在结果目录生成system_results.txt,按图片名 + 制表符 + JSON的格式输出每个文本框的transcription(识别文本)与points(四点坐标)。
4.3 进阶参数与多进程推理
从 predict_system.py 的main函数与TextSystem.__call__可以看到,串联系统还支持以下实用能力:
- PDF/GIF 输入:通过
check_and_read自动识别 PDF 与 GIF 文件,--page_num可控制 PDF 的识别页数; - 多进程加速:
--use_mp配合--total_process_num可启动多进程并行推理,图片列表通过process_id与total_process_num切分给各进程; - Warmup 预热:
--warmup参数会在正式推理前用随机图预热 10 次,稳定首轮推理耗时; - 裁剪结果导出:
--save_crop_res可将每个识别切片单独保存,便于人工质检; - 置信度过滤:
--drop_score为过滤阈值,低于该分数的检测框与识别结果将被丢弃。
关于检测与识别串联推理的更多参数说明(如--rec_image_shape需与模型版本匹配:PP-OCRv2 及更早模型使用3,32,320,PP-OCRv3 默认3,48,320),可直接查阅上述 tools/infer/predict_system.py 源码实现。
五、小结:从零到一的定制化超轻量 OCR 落地路径
回顾整个定制流程:
- 训练检测模型:用
tools/train.py -c configs/det/det_mv3_db.yml训练 DB 检测模型(MobileNetV3 骨干),关注box_thresh、unclip_ratio等后处理参数与hmean评估指标; - 训练识别模型:用
tools/train.py -c configs/rec/rec_chinese_lite_train_v2.0.yml训练 CRNN 识别模型(MobileNetV3-small + CTCHead),关注character_dict_path字典覆盖范围与acc评估指标; - 串联推理:用
tools/infer/predict_system.py将训练好的检测与识别模型自由组合,通过--image_dir、--det_model_dir、--rec_model_dir三个参数即可完成整图文字识别与可视化。
整套方案的核心优势在于"自由组合":任意检测模型与任意识别模型均可无缝拼接,配合超轻量骨干网络(MobileNetV3 系列),可以在保持轻量的前提下获得接近实用的识别效果,非常适合快速搭建面向特定场景(如票据、卡证、单行文本)的定制化 OCR 系统。若希望进一步了解推理部署参数、模型导出与更多使用技巧,可继续阅读仓库docs/version2.x/ppocr目录下的相关技术博客与推理文档。
【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考