PaddleOCR 模型训练实战指南:超参调优、数据构建与垂类微调全解析
【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR
本文以 PaddleOCR 官方训练文档(docs/version2.x/ppstructure/model_train/training.md)为骨架,系统讲解 PP-OCR 模型训练必须掌握的核心概念:配置文件机制、学习率与正则化等超参数的调优策略、检测/识别/端到端三大评估指标体系,以及如何在垂类场景中准备数据并 Fine-tune 模型。读完本文,你将能够独立读懂 PaddleOCR 训练配置、理解训练日志与指标含义,并针对自己的业务数据制定一套可落地的模型优化方案。
1. 训练总览:配置文件驱动的训练流程
PaddleOCR 使用 YAML 配置文件统一管理网络训练与评估的全部参数。在配置文件中,可以设置组建模型(Architecture)、优化器(Optimizer)、损失函数(Loss)、模型前后处理(PostProcess)等各类参数,PaddleOCR 从配置文件中读取这些参数,进而组建出完整的训练流程,完成模型训练。当需要对模型进行优化时,只需修改配置文件中的参数即可,使用简单且方便修改。
从源码看,训练入口 tools/train.py 完整地演示了这条“配置文件驱动”的流水线:
- 通过
program.preprocess(is_train=True)解析-c指定的 YAML 配置文件与-o覆盖参数; - 依次调用
build_dataloader(数据)、build_post_process(后处理)、build_model(网络)、build_loss(损失)、build_optimizer(优化器与学习率)等工厂函数; - 进入
program.train()循环完成训练、评估与模型保存。
因此,PaddleOCR 的模型调优本质上就是“配置文件调优”。完整的配置文件字段说明可参考 配置文件内容与生成,其中以rec_chinese_lite_train_v2.0.yml为例,逐项列出了Global、Optimizer、Architecture、Loss、PostProcess、Metric、Dataset各段落的字段含义与默认值。例如Global.eval_batch_step支持2000(每 2000 次迭代评估一次)与[1000, 2000](从 1000 次迭代开始,每 2000 次评估一次)两种写法;Global.pretrained_model用于指定预训练模型路径;Global.checkpoints用于中断后加载参数继续训练。
2. 训练核心超参数与调优策略
模型训练过程中需要手动调整一些超参数,帮助模型以最小的代价获得最优指标。不同的数据量可能需要不同的超参,当希望在自己的数据上 finetune 或对模型效果调优时,以下几个参数调整策略可供参考。
2.1 学习率(Learning Rate)
学习率是训练神经网络的重要超参数之一,它代表在每一次迭代中梯度向损失函数最优解移动的步长。学习率过大会导致损失震荡不收敛,过小则收敛缓慢甚至陷入局部最优。PaddleOCR 提供了多种学习率更新策略,通过修改配置文件中Optimizer.lr段落即可切换。
以分段常数衰减(Piecewise)为例:
Optimizer: ... lr: name: Piecewise decay_epochs : [700, 800] values : [0.001, 0.0001] warmup_epoch: 5Piecewise代表分段常数衰减,在不同的学习阶段指定不同的学习率,在每段内学习率相同:本例在第 700 个 epoch 前学习率保持 0.001,700~800 epoch 之间降至 0.0001;warmup_epoch: 5代表在前 5 个 epoch 中,学习率将从 0 逐渐线性增加到基础学习率,帮助模型在训练初期平稳起步。
PaddleOCR 的全部学习率策略实现在 ppocr/optimizer/learning_rate.py,从源码结构看,除Piecewise外还封装了多种衰减策略:
| 策略名 | 实现类 | 说明 |
|---|---|---|
Piecewise | 分段常数衰减 | decay_epochs指定衰减节点(内部按step_each_epoch * decay_epochs换算为 step 边界),values指定各段学习率 |
Cosine | 余弦退火 | T_max = step_each_epoch * epochs,学习率按余弦曲线平滑下降 |
Linear | 多项式线性衰减 | 配合end_lr、power控制衰减终点与曲线形状 |
Step | 阶梯衰减 | 每隔step_size个 step 学习率乘以gamma |
MultiStepDecay | 多阶梯衰减 | 通过milestones指定多个衰减节点 |
OneCycle | OneCycle 策略 | anneal_strategy支持cos/linear,three_phase控制是否使用三阶段 |
LinearWarmupCosine | 线性预热 + 余弦退火 | warmup_steps控制预热步数,min_lr控制学习率下限 |
CyclicalCosine/TwoStepCosine | 周期/两段式余弦 | 适合长时间训练与二次调优场景 |
Const | 恒定学习率 | 不衰减,仅支持预热 |
几乎所有策略在warmup_epoch > 0时都会在底层套用lr.LinearWarmup,将学习率从 0(或start_lr)线性抬升至目标值。这也是 PP-OCR 系列模型配置中普遍保留warmup_epoch的原因。
2.2 正则化(Regularization)
正则化可以有效避免算法过拟合,PaddleOCR 中提供了 L1、L2 正则方法,二者也是目前最常用的正则化方法:L1 正则化向目标函数添加正则化项,以减少参数的绝对值总和,倾向于得到稀疏权重;L2 正则化添加的正则化项目的在于减少参数平方的总和,倾向于约束权重整体不过大。配置方法如下:
Optimizer: ... regularizer: name: L2 factor: 2.0e-05factor即正则化系数(weight decay 系数)。从实现源码 ppocr/optimizer/regularizer.py 看,PaddleOCR 提供了L1Decay、L2Decay与CosineL2Decay三种正则化实现:L1Decay内部映射到paddle.regularizer.L1Decay(coeff),L2Decay返回浮点系数交给优化器,而CosineL2Decay则参考 EfficientNetV2 的设计,按余弦曲线在训练过程中将 weight decay 系数从factor退火到end_factor,避免对小型模型过度正则化。
在实际配置中,factor的典型取值范围在1e-5~1e-4量级。例如 configs/det/det_mv3_db.yml 中检测模型默认factor: 0,而 configs/rec/PP-OCRv3/en_PP-OCRv3_mobile_rec.yml 中识别模型默认factor: 3.0e-05。当模型过拟合(训练集精度远高于验证集)时,适当调大该系数通常有效。
2.3 评估指标(Metric)
PaddleOCR 按任务阶段采用不同的评估指标,理解这些指标是解读训练日志、判断模型是否收敛的前提。
(1)检测阶段:先按照检测框和标注框的 IOU 进行评估,IOU 大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。由此衍生出两个指标:
- 检测准确率(Precision):正确的检测框个数在全部检测框中的占比,主要是判断“检测得准不准”的指标(多检出的误报会拉低该值);
- 检测召回率(Recall):正确的检测框个数在全部标注框中的占比,主要是判断“有没有漏检”的指标(漏检越多该值越低)。
实际训练中 PaddleOCR 通常以Hmean(Precision 与 Recall 的调和平均,即 F-Score)作为检测模型的主指标,对应 configs/det/det_mv3_db.yml 中Metric.main_indicator: hmean的设置。
(2)识别阶段:采用字符识别准确率(acc),即正确识别的文本行占标注文本行数量的比例,且只有整行文本全部识别正确才算正确识别。从 ppocr/metrics/rec_metric.py 的RecMetric实现可以看到,其逐行比较预测文本与标注文本是否完全相等来累计correct_num,同时用 Levenshtein 归一化编辑距离(norm_edit_dis)辅助衡量部分识别正确的情况;ignore_space与is_filter参数则分别控制是否忽略空格、是否仅保留字母数字进行比对。识别模型配置中Metric.main_indicator: acc即对应此指标。
(3)端到端统计:
- 端到端召回率:准确检测并正确识别的文本行在全部标注文本行中的占比;
- 端到端准确率:准确检测并正确识别的文本行在检测到的文本行数量中的占比;
- “准确检测”的标准是检测框与标注框的 IOU 大于某个阈值,“正确识别”则要求检测框中的文本与标注文本完全相同。
3. 训练数据与垂类场景
3.1 开源模型的训练数据构成
目前开源的 PaddleOCR 模型,其数据集与量级如下(均为公开或合成数据):
- 检测:
- 英文数据集:ICDAR2015;
- 中文数据集:LSVT 街景数据集训练数据约 3 万张图片。
- 识别:
- 英文数据集:MJSynth 和 SynthText 合成数据,数据量达千万级;
- 中文数据集:LSVT 街景数据集根据真值将图 crop 出来并进行位置校准,共 30 万张图像;此外基于 LSVT 语料合成数据 500 万张;
- 小语种数据集:使用不同语料和字体,分别生成 100 万张合成数据集,并使用 ICDAR-MLT 作为验证集。
其中公开数据集均为开源数据,可自行搜索下载,也可参考 公开数据集汇总(涵盖检测、识别、端到端、表格、KIE 等常用公开数据集);合成数据暂不开源,用户可使用开源合成工具自行合成,可参考的合成工具包括 text_renderer、SynthText、TextRecognitionDataGenerator、StyleText 等。
3.2 垂类场景:两条可选路径
PaddleOCR 主要聚焦通用 OCR,如果有垂类需求(如火车票、快递单、证件、票据等特定版式):
- 可以用 PaddleOCR + 垂类数据自己训练微调模型,获得定制化的精度;
- 如果缺少带标注的数据,或不想投入研发成本,建议直接调用开放的 API,开放的 API 覆盖了目前比较常见的一些垂类场景。
两种路径的选择取决于业务对精度、数据可得性与成本的综合考量。
3.3 自己构建数据集的经验
在构建数据集时,以下经验可供参考:
(1)训练集的数据量
- 检测任务需要的数据相对较少:在 PaddleOCR 预训练模型的基础上 Fine-tune,一般 500 张即可达到不错的效果;
- 识别任务区分语言:英文场景一般需要几十万数据可达到不错的效果,中文则需要几百万甚至更多。
(2)当训练数据量少时,可以通过以下三种方式获取更多数据
- 人工采集更多的训练数据:最直接也最有效的方式;
- 基于 PIL 和 opencv 的基本图像处理或变换:例如使用 PIL 中的
ImageFont、Image、ImageDraw三个模块将文字写到背景中,使用 opencv 的旋转仿射变换、高斯滤波等做样本扩充; - 利用数据生成算法合成数据:例如 pix2pix 或 StyleText 等算法。
更系统的微调数据组织方式可参考 模型微调:检测任务建议至少准备 500 张标注数据(标注框建议与语义内容一致,例如火车票中姓氏与名字即使离得较远,也应整体标注为一个检测框);识别任务在不更换字典的前提下建议至少准备 5000 张,且数据分布(文本长度、是否含空格等)尽量与实测场景一致。
4. 训练常见问题(FAQ)
Q:训练 CRNN 识别模型时,如何选择合适的网络输入 shape?
A:一般高度采用 32,最长宽度的选择有两种方法: (1)统计训练样本图像的宽高比分布,最大宽高比的选取考虑满足 80% 的训练样本; (2)统计训练样本文字数目,最长字符数目的选取考虑满足 80% 的训练样本,然后中文字符长宽比近似认为是 1,英文认为是 3:1,据此预估一个最长宽度。
Q:识别训练时,训练集精度已经到达 90 了,但验证集精度一直在 70,涨不上去怎么办?
A:训练集精度 90、测试集 70 多,基本可以判断是过拟合,有两个可尝试的方法: (1)加入更多的增广方式,或调大增广 prob 的概率(默认 0.4),相关实现位于 ppocr/data/imaug/rec_img_aug.py; (2)调大系统的 L2 decay 值,即增大Optimizer.regularizer.factor系数(如从3.0e-05逐步调大)。
Q:识别模型训练时,loss 能正常下降,但 acc 一直为 0?
A:识别模型训练初期 acc 为 0 是正常现象,多训练一段时间指标就会上来。此外需要注意:如果在训练时修改了自定义字典,由于最后一层 FC 的参数无法从预训练模型中加载,训练初期 acc=0 同样属于正常情况,加载预训练模型依然可以加快模型收敛(详见 模型微调)。
5. 深入实践:结合配置与源码的调优路径
在理解上述概念后,可以按以下路径将理论落地到实际训练中:
- 读懂一份真实配置:以 configs/det/det_mv3_db.yml 为模板,对照
Global(训练总览:epoch 数、日志打印间隔、模型保存路径、评估间隔等)、Architecture(Transform→Backbone→Neck→Head 四段式组网)、Loss、Optimizer、PostProcess、Metric、Train/Eval(数据集与 DataLoader)各段落逐项理解参数含义; - 选择合适的优化器:
Optimizer.name支持Adam、Momentum、RMSProp、AdamW等,实现位于 ppocr/optimizer/optimizer.py,PP-OCR 系列默认使用Adam(beta1: 0.9、beta2: 0.999); - 组合学习率与正则化:微调场景通常建议学习率比从零训练低一个量级,并配合
warmup_epoch预热;若出现过拟合再逐步调大regularizer.factor; - 以指标为准迭代:检测看
hmean,识别看acc与norm_edit_dis,围绕验证集指标反复调整数据配比与超参。
完整的检测、识别模型训练教程以及文本方向分类器训练、知识蒸馏等进阶内容,可继续阅读以下文档:
- 文本检测模型训练(含断点训练、更换 Backbone、混合精度、分布式训练、评估预测与模型导出)
- 文本识别模型训练(含数据格式、字典、多语言训练与识别推理)
- 文本方向分类器训练
- 知识蒸馏
【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考