ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PaddleOCR 模型微调实战指南:基于 PP-OCRv3 的文本检测与识别 Fine-tune 全流程

PaddleOCR 模型微调实战指南:基于 PP-OCRv3 的文本检测与识别 Fine-tune 全流程 PaddleOCR 模型微调实战指南基于 PP-OCRv3 的文本检测与识别 Fine-tune 全流程【免费下载链接】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/PaddleOCRPaddleOCR 开箱即用的 PP-OCR 系列模型在通用场景下表现出色但面对票据、证件、快递单、工牌等垂直场景时直接推理往往难以达到理想精度。本文以 PaddleOCR 官方微调指南docs/version2.x/ppocr/model_train/finetune.en.md为骨架完整讲解文本检测与文本识别模型的微调方法从数据量底线与标注规范、预训练模型选择到学习率与 batch size 的线性缩放、GTC 蒸馏策略的取舍再到推理阶段的 DB 后处理参数调优。读完本文你将掌握一套可复现、可落地的垂直场景 OCR 精度提升方案。本文的核心结论可浓缩为五点预训练模型泛化能力更强少量真实数据检测 ≥500 张、识别 ≥5000 张即可大幅提升垂直场景效果微调时混入通用真实场景数据可进一步提升精度与泛化性检测任务中增大预测图尺寸可改善小字区域检测微调时必须按总 batch size 线性调整学习率。1. 为什么需要微调背景与意义PaddleOCR 提供的 PP-OCR 系列模型在通用场景中性能优秀能解决大多数检测与识别问题。但在垂直场景如特定票据、业务表单、专业文档中字符分布、版式、字体与通用语料差异显著直接使用预训练模型往往精度不足。通过微调Fine-tune可以在已有预训练权重的基础上用少量业务数据继续训练从而获得更高精度的专属模型。微调的核心收益来源于三个事实预训练模型泛化能力更强PP-OCR 预训练模型在海量通用数据上训练其主干特征提取能力远强于随机初始化微调只需少量数据即可快速收敛少量真实数据即可见效文本检测场景建议至少准备 500 张标注数据文本识别场景建议至少 5000 条数据即可显著改善垂直场景效果数据配比决定上限微调时在训练集中加入通用真实场景数据如 LSVT、RCTW、MTWI 等可以同时提升精度与泛化性能。2. 文本检测模型微调2.1 数据集准备与标注数据量建议至少准备500 张文本检测数据用于微调。标注规范采用单行文本标注格式标注的检测框应与实际语义内容保持一致。以火车票场景为例姓与名之间可能相隔较远但语义上属于同一个检测字段此时整个姓名需要被标注为一个检测框。这一规范直接决定模型对语义完整文本行的感知能力。2.2 模型选择检测任务推荐使用PP-OCRv3 移动端检测模型配置文件PP-OCRv3_mobile_det.yml预训练模型ch_PP-OCRv3_det_distill_train.tarPP-OCRv3 检测蒸馏训练产物其精度与泛化能力是目前可用的最佳预训练模型之一。需要注意上述预训练包解压后必须使用其中的student.pdparams文件作为预训练模型即只使用蒸馏框架中的学生模型而不是整个蒸馏模型。从源码看该配置文件的主干为MobileNetV3scale 0.5颈部为RSEFPNout_channels 96头部为DBHeadk 50算法为 DBDifferentiable Binarization对应配置详见 PP-OCRv3_mobile_det.yml。更多 PP-OCR 系列模型可参考 PP-OCR 系列模型库。2.3 训练超参数pretrained_model、learning_rate 与 batch_size微调时最重要的三个超参数是预训练模型路径pretrained_model、learning_rate与batch_size。官方推荐的关键配置片段如下Global: pretrained_model: ./ch_PP-OCRv3_det_distill_train/student.pdparams # 预训练模型路径 Optimizer: lr: name: Cosine learning_rate: 0.001 # 学习率 warmup_epoch: 2 regularizer: name: L2 factor: 0 Train: loader: shuffle: True drop_last: False batch_size_per_card: 8 # 单卡 batch size num_workers: 4其中pretrained_model必须显式指向解压后的student.pdparams文件路径。学习率必须按总 batch size 线性缩放。PaddleOCR 提供的默认配置面向8 卡训练总 batch size 为8 × 8 64且不加载预训练模型。实际微调场景需要将学习率与总 batch size 线性对齐官方给出两个典型示例单卡、单卡 batch_size8总 batch_size8建议学习率调整到约1e-4单卡、显存受限只能 batch_size4总 batch_size4建议学习率调整到约5e-5。从源码验证检测默认配置的优化器为Adambeta1 0.9、beta2 0.999学习率策略为Cosinelearning_rate 0.001、warmup_epoch 2L2 正则因子为5e-05见 PP-OCRv3_mobile_det.yml。其中warmup_epoch会被乘以每 epoch 的 step 数换算成 warmup 步数后接入学习率调度实现细节见 ppocr/optimizer/learning_rate.py。2.4 预测超参数小字区域检测调优模型导出与推理阶段可以进一步调整预测图像尺度来改善小面积文字的检测效果。DBNet 推理相关超参数如下超参数类型默认值含义det_db_threshfloat0.3DB 输出的概率图中得分大于该阈值的像素视为文本像素det_db_box_threshfloat0.6检测结果框内所有像素的平均得分大于该阈值时才判定为文本区域det_db_unclip_ratiofloat1.5Vatti clipping的扩张系数用于向外扩张文本区域max_batch_sizeint10batch sizeuse_dilationboolFalse是否对分割结果进行膨胀以获得更好的检测结果det_db_score_modestrfastDB 检测结果得分计算方式支持fast与slow。fast基于多边形外接矩形框内所有像素计算平均分slow基于原始多边形内所有像素计算平均分速度更慢但更准确这些参数在推理工具中均有对应命令行选项默认值与上表一致见 tools/infer/utility.py实际解析后会写入 DB 后处理参数见 tools/infer/predict_det.py。从后处理源码看score_mode仅允许fast/slow两个取值见 ppocr/postprocess/db_postprocess.pyuse_dilationTrue时会构造[[1,1],[1,1]]的膨胀核作用于分割结果db_postprocess.pydet_db_unclip_ratio通过poly.area * unclip_ratio / poly.length计算扩张距离db_postprocess.py。小字检测调优技巧将det_limit_side_len默认 960见 tools/infer/utility.py调大可以让模型在更大分辨率的输入图上推理小字区域在概率图中的响应更充分检测效果随之提升。推理方法的完整说明可参考 Paddle Inference 文档。3. 文本识别模型微调3.1 数据集数量、分布、合成与通用数据混入数据量若不修改词典建议至少准备5000 条文本识别数据用于微调若修改词典不推荐则需要更多数据。数据分布训练数据分布应尽量与实测场景一致。若实际场景包含大量短文本训练数据中也应多包含短文本若实际场景对空格识别效果要求高则训练数据中应多包含带空格的文本。数据合成当出现某些特定字符识别错误时建议针对性地生成一批该字符数据集加入原数据集并使用小学习率微调。原数据集与新增数据集的配比建议为10:1 至 5:1避免单一场景数据过多导致过拟合同时尽量平衡语料词频保证常见词的出现频率不会过低。合成工具可使用 TextRenderer合成语料应尽量来源于真实使用场景并在贴近真实场景的基础上保持字体与背景的丰富度这有助于提升模型效果。通用中英文数据训练时可向训练集混入通用真实数据例如不修改词典的微调场景推荐加入 LSVT、RCTW、MTWI 等真实数据以进一步提升模型泛化性能。3.2 模型选择与 GTC 策略移除识别任务推荐使用PP-OCRv3 移动端识别模型配置文件PP-OCRv3_mobile_rec_distillation.yml预训练模型ch_PP-OCRv3_rec_train.tar解压后使用其中best_accuracy.pdparams精度与泛化能力是目前可用的最佳预训练模型之一。关键注意点PP-OCRv3 使用了GTCGuide CTC策略即 CTC 分支之外还带有 SAR 分支。SAR 分支参数量大当训练数据为简单场景时模型容易过拟合导致微调效果变差。官方建议移除 GTC 策略将模型结构配置修改为纯 CTC 结构Architecture: model_type: rec algorithm: SVTR Transform: Backbone: name: MobileNetV1Enhance scale: 0.5 last_conv_stride: [1, 2] last_pool_type: avg Neck: name: SequenceEncoder encoder_type: svtr dims: 64 depth: 2 hidden_dims: 120 use_guide: False Head: name: CTCHead fc_decay: 0.00001 Loss: name: CTCLoss Train: dataset: ...... transforms: # 移除 RecConAug # - RecConAug: # prob: 0.5 # ext_data_num: 2 # image_shape: [48, 320, 3] # max_text_length: *max_text_length - RecAug: # 修改编码方式 - CTCLabelEncode: - KeepKeys: keep_keys: - image - label - length ... Eval: dataset: ... transforms: ... - CTCLabelEncode: - KeepKeys: keep_keys: - image - label - length ...对照蒸馏训练配置可以发现原配置中Neck使用use_guide: True、Head为包含 CTCHead 与 SARHead 的MultiHead损失为CombinedLossDML Distance CTC SAR 的组合见 PP-OCRv3_mobile_rec_distillation.yml。微调时移除 SAR 分支与 GTC 相关变换RecConAug、MultiLabelEncode改为CTCLabelEncode可显著降低简单场景下的过拟合风险。3.3 训练超参数与多数据集混合采样与检测任务类似识别微调最核心的超参数同样是pretrained_model、learning_rate与batch_sizeGlobal: pretrained_model: # 预训练模型路径 Optimizer: lr: name: Piecewise decay_epochs : [700, 800] values : [0.001, 0.0001] # 学习率 warmup_epoch: 5 regularizer: name: L2 factor: 0 Train: dataset: name: SimpleDataSet data_dir: ./train_data/ label_file_list: - ./train_data/train_list.txt ratio_list: [1.0] # 采样比例默认 [1.0] loader: shuffle: True drop_last: False batch_size_per_card: 128 # 单卡 batch size num_workers: 8首先需要将pretrained_model指定为第 3.2 节解压得到的ch_PP-OCRv3_rec_train/best_accuracy.pdparams文件路径。学习率线性缩放同样适用。默认配置面向 8 卡训练总 batch size 为8 × 128 1024且不加载预训练模型实际场景需线性调整单卡、单卡 batch_size128总 batch_size128加载预训练模型时建议学习率调整到约[1e-4, 2e-5]Piecewise 策略需设置两个值下同单卡、显存受限只能 batch_size64总 batch_size64加载预训练模型时建议学习率调整到约[5e-5, 1e-5]。从源码验证识别默认配置同样使用Adam优化器学习率策略为Piecewisedecay_epochs [700]、values [0.0005, 0.00005]、warmup_epoch 5见 PP-OCRv3_mobile_rec_distillation.yml。Piecewise会将decay_epochs乘以每 epoch step 数转换为 boundary 步数实现见 ppocr/optimizer/learning_rate.py。多数据集混合采样若混入通用真实场景数据建议每个 epoch 内垂直场景数据与通用场景数据量保持在1:1左右。例如垂直场景识别数据 1 万条标签文件vertical.txt通用场景识别数据 10 万条标签文件general.txt则配置如下Train: dataset: name: SimpleDataSet data_dir: ./train_data/ label_file_list: - vertical.txt - general.txt ratio_list: [1.0, 0.1]这样每个 epoch 中vertical.txt以 1.0 采样比例全量参与1 万条general.txt按 0.1 比例采样10 万 × 0.1 1 万条两者最终比例为 1:1。3.4 训练迭代优化badcase 驱动训练不是一蹴而就的。完成一个阶段的训练与评估后建议在真实场景中收集并分析当前模型的badcase错误样本有针对性地调整训练数据配比或进一步补充合成数据通过多轮训练迭代持续优化模型效果。关于自定义词典的说明若训练时修改了自定义词典由于全连接层FC最后一层参数无法加载训练初期出现acc0属于正常现象无需担心——加载预训练模型仍然能显著加速模型收敛。4. 微调训练的源码级链路验证为了让读者对微调机制有更底层的理解这里补充训练与推理的源码佐证预训练权重加载训练入口 tools/train.py 调用load_model(config, model, optimizer, ...)在 ppocr/utils/save_load.py 中Global.pretrained_model会被读取并在无checkpoints续训时通过load_pretrained_params加载预训练权重save_load.py。因此微调只需在配置中填写pretrained_model路径即可生效。训练启动方式配置好数据集与超参数后运行python tools/train.py -c 配置文件路径即可开始微调评估则使用tools/eval.py。数据加载、模型构建、损失与优化器装配的完整流程均收敛于 tools/train.py。检测推理参数--det_db_thresh、--det_db_box_thresh、--det_db_unclip_ratio、--use_dilation、--det_db_score_mode、--det_limit_side_len等均通过命令行注入 DB 后处理tools/infer/predict_det.py与 2.4 节参数表一一对应。5. 小结PaddleOCR 的微调方案可以概括为一条清晰的操作路径准备足量且分布贴近真实场景的数据 → 选择 PP-OCRv3 蒸馏预训练模型检测用 student.pdparams识别用 best_accuracy.pdparams→ 按总 batch size 线性缩放学习率 → 识别任务按需移除 GTC 策略并混入 1:1 通用数据 → 迭代分析 badcase 优化数据配比 → 推理阶段调整图像尺度与 DB 后处理参数。按照本文的方法使用检测 ≥500 张、识别 ≥5000 张的真实数据即可在垂直场景中获得显著的精度提升合理混入通用真实数据则能在保证精度的同时维持模型的泛化能力最终获得一套适用于自身业务场景的高精度文本检测与识别模型。【免费下载链接】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),仅供参考
返回列表