PaddleOCR模型训练详解

PaddleOCR文本检测-模型训练配置文件

1. Global(全局配置)

字段 含义
model_name: PP-OCRv5_server_det 任务名称,仅用于日志/保存路径等标识。
debug: false 关闭调试信息。
use_gpu: true 强制使用 GPU 训练。
epoch_num: &epoch_num 500 训练 500 个 epoch;&epoch_num 是 YAML 锚点,后文可用 *epoch_num 引用。
log_smooth_window: 20 日志中 loss 取最近 20 个 batch 的滑动平均。
print_batch_step: 10 每 10 个 batch 打印一次 log。
save_model_dir: ./output/PP-OCRv5_server_det 训练过程中保存 checkpoints 的根目录。
save_epoch_step: 10 每 10 个 epoch 保存一次 checkpoint。
eval_batch_step: [0, 1500] 训练到第 0 个 batch 就开始第一次验证,此后每 1500 个 batch 再验证一次。
cal_metric_during_train: false 训练 forward 时不立即算指标,节省显存。
checkpoints: 当需要从某个 checkpoint 继续训练时填写路径;这里留空表示从头训练。
pretrained_model: <url...> 预训练权重。
save_inference_dir: null 训练完成后若需要导出 inference 模型,可填目录;null 表示不导出。
use_visualdl: false 不使用 VisualDL 可视化。
infer_img: doc/imgs_en/img_10.jpg 单张图快速推理时的默认图片。
save_res_path: ./checkpoints/det_db/predicts_db.txt 推理结果保存路径。
distributed: true 开启多卡分布式训练(需 paddle.distributed.launch 启动)。

2. Architecture(网络结构)

字段 含义
model_type: det 任务类型:检测(det)。
algorithm: DB 检测算法:Differentiable Binarization。
Transform: null 未使用额外变换模块。
Backbone.name: PPHGNetV2_B4 主干网络,PPHGNetV2_B4 是飞桨自研轻量级网络。
Backbone.det: True 打开检测任务的特定结构开关。
Neck.name: LKPAN 颈部网络,LKPAN = Large Kernel PAN。
Neck.out_channels: 256 LKPAN 输出通道数。
Neck.intracl: true 启用 Intra-channel CL(通道内上下文增强)。
Head.name: PFHeadLocal 检测头,PFHeadLocal 表示局部感知预测头。
Head.k: 50 每个像素取最近的 50 个轮廓点做预测。
Head.mode: "large" 使用 large 模式,对应高分辨率场景。

3. Loss(损失函数)

字段 含义
name: DBLoss DB 论文的复合损失。
balance_loss: true 正负样本平衡。
main_loss_type: DiceLoss 主损失为 Dice Loss。
alpha: 5, beta: 10 控制 shrink map 与 threshold map 损失的权重。
ohem_ratio: 3 OHEM 时负样本/正样本 ≈ 3:1。

4. Optimizer(优化器)

字段 含义
name: Adam 使用 Adam。
beta1 / beta2 Adam 默认 0.9 / 0.999。
lr.name: Cosine 余弦退火学习率。
lr.learning_rate: 0.001 基础 lr,对应 8×8=64 卡总 batch_size 时的经验值;若你 batch_size 不同需线性缩放。
lr.warmup_epoch: 2 前 2 个 epoch 线性 warmup。
regularizer.name: L2, factor: 1e-6 权重衰减 1e-6。

5. PostProcess(后处理)

字段 含义
name: DBPostProcess DB 官方后处理。
thresh: 0.3 二值化阈值。
box_thresh: 0.6 文本框 score 阈值。
max_candidates: 1000 单图最多输出 1000 个框。
unclip_ratio: 1.5 轮廓外扩比例。

6. Metric(评估指标)

字段 含义
name: DetMetric 检测指标:precision / recall / hmean。
main_indicator: hmean 以 hmean 作为 early-stop / best-checkpoint 的依据。

7. Train(训练阶段数据与增强)

字段 含义
dataset.name: SimpleDataSet 飞桨统一格式检测数据集。
data_dir / label_file_list 图片根目录 + 训练标注 txt。
ratio_list: [1.0] 目前仅用 1 份训练集。
Transforms 列表
DecodeImage 读图,BGR 格式。
DetLabelEncode 把标注解析为多边形。
CopyPaste 随机 copy-paste 增强。
IaaAugment Albumentations-style 增强:翻转、±10°旋转、0.5~3 倍尺度缩放。
EastRandomCropData 随机 crop 出 640×640 的小图。
MakeBorderMap 为 threshold map 生成训练目标。
MakeShrinkMap 为 shrink map 生成训练目标。
NormalizeImage ImageNet 归一化。
ToCHWImage HWC→CHW。
KeepKeys 指定网络输入的 key 顺序。
loader.batch_size_per_card: 8 单卡 batch=8,总 batch = 8 × GPU 数。
loader.num_workers: 8 每个卡 8 个子进程加载数据。

8. Eval(验证阶段)

字段 含义
dataset/label_file_list 验证集标注 txt。
DetResizeForTest 验证时按原图长边不超过 2560 进行等比例缩放(默认逻辑)。
其余 transforms 与训练阶段一致,但不做随机增强。
batch_size_per_card: 1 验证时单卡 batch=1,避免大图显存爆炸。
num_workers: 2 验证数据加载进程数。

9. profiler_options: null

未开启 Paddle Profiler 性能分析。


使用建议

1、GPU 显存不足
可把 batch_size_per_card 从 8 调到 4,或把 EastRandomCropData.size 降到 [512,512]

2、学习率
若只用 1-2 张卡,需把 learning_rate 线性减小(例如单卡设 0.001/8 ≈ 0.000125)。

模型训练中日志输出内容详解

模型训练中单次step的日志

ppocr INFO: epoch: [1/500], global_step: 10, lr: 0.000090, loss: 1.843800, loss_shrink_maps: 0.954784, loss_threshold_maps: 0.559544, loss_binary_maps: 0.191454, loss_cbn: 0.191454, avg_reader_cost: 0.07927 s, avg_batch_cost: 0.40427 s, avg_samples: 4.0, ips: 9.89442 samples/s, eta: 1:24:09, max_mem_reserved: 6279 MB, max_mem_allocated: 5350 MB

这段日志是 PaddleOCR 文本检测模型训练过程中的一次 step 日志输出,发生在 第 1 个 epoch、第 10 个 global_step 时。

以下是详细解释:

字段 含义
epoch: [1/500] 当前是第 1 个 epoch,总共训练 500 个 epoch。
global_step: 10 从训练开始累计的第 10 个 batch。
lr: 0.000090 当前学习率(warmup 阶段,还没升到预设的 0.001)。
loss: 1.843800 总损失,是下面各项损失的加权和。
loss_shrink_maps: 0.954784 收缩图(shrink map)的 Dice Loss,用于学习文字区域核心区域。
loss_threshold_maps: 0.559544 阈值图(threshold map)的 L1 Loss,用于学习二值化阈值。
loss_binary_maps: 0.191454 二值图(binary map)的 Dice Loss,用于学习最终二值化结果。
loss_cbn: 0.191454 loss_binary_maps 相同,可能是兼容旧版本的字段名。
性能相关字段 含义
avg_reader_cost: 0.07927 s 每 batch 数据读取平均耗时(79ms)。
avg_batch_cost: 0.40427 s 每 batch 总耗时(包括前向+反向+优化器更新)。
avg_samples: 4.0 每 batch 实际样本数(你设的是 batch_size_per_card: 4)。
ips: 9.89442 samples/s 当前实际吞吐 ≈ 10 张图/秒。
eta: 1:24:09 预计剩余训练时间 1 小时 24 分 9 秒(基于当前速度)。
max_mem_reserved: 6279 MB GPU 显存最大预留量(PyTorch/Paddle 显存池)。
max_mem_allocated: 5350 MB GPU 显存实际使用量。

结论

  • 训练已正常启动,GPU 显存占用 ≈ 5.3 GB,无 OOM。
  • 数据加载耗时占比不高(79 ms vs 404 ms),说明数据 pipeline 合理。
  • 吞吐 10 img/s,如果 GPU 利用率低,可考虑:
    • 增大 batch_size_per_card
    • 提高 num_workers
    • 开启 AMP (--amp_level=O2) 加速。

训练完成后的模型评估结果日志

ppocr INFO: best metric, hmean: 0.7633587786259542, is_float16: False, precision: 0.78125, recall: 0.746268656716418, fps: 30.84728874632143, best_epoch: 60

这段日志是 训练完成后的“最佳模型”评估结果,记录了在 验证集 上表现最好的那次 epoch(这里是第 60 个 epoch)的检测性能指标。逐项解释如下:

字段 含义
best metric 说明这是到目前为止 最好的综合指标 的一行日志。
hmean: 0.7633587786259542 F-score(H-mean),即 Precision 与 Recall 的调和平均数,是检测任务的核心评价指标,越高越好。这里约为 **76.34%**。
is_float16: False 表示 未启用 FP16 混合精度 推理(即使用 FP32)。
precision: 0.78125 精确率 ≈ 78.13%,即预测为文本的框中有 78.13% 是正确的。
recall: 0.746268656716418 召回率 ≈ 74.63%,即所有真实文本框中有 74.63% 被成功检测到。
fps: 30.84728874632143 推理速度,约 30.85 帧/秒(基于验证集单张图测试)。
best_epoch: 60 第 60 个 epoch 时达到上述最佳成绩。

结论

  • 当前模型在验证集上取得 H-mean ≈ 76.3% 的效果,属于 中等偏上的检测精度(具体好坏取决于数据集难度)。
  • Precision > Recall 说明模型更“保守”,漏检略多于误检。
  • 推理速度 30.85 FPS,可满足实时场景(≥25 FPS)。
  • 若需要更高精度,可继续训练(尚未到 500 epoch),或尝试数据增强、更大 backbone、FP16 推理提速。