PaddleOCR 中的 DRRG 任意形状文本检测算法:原理、CTW1500 复现与训练部署实战
PaddleOCR 中的 DRRG 任意形状文本检测算法原理、CTW1500 复现与训练部署实战【免费下载链接】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/PaddleOCRDRRGDeep Relational Reasoning Graph Network是面向任意形状文本检测的图神经网络方法通过将文本行建模为文本组件 关系图来精准刻画弯曲、倾斜文本的拓扑结构。本文以 PaddleOCR 仓库中的 DRRG 算法文档 为主体结合 det_r50_drrg_ctw.yml 配置文件及检测头、损失函数、后处理等源码实现完整讲解该算法在 PaddleOCR 中的原理、数据准备、模型训练、评估与推理部署全流程帮助你直接复现 CTW1500 上的 Hmean 85.18% 结果并理解其组件检测 关系推理的底层机制。1. 算法简介DRRG 是 2020 年 CVPR 论文《Deep Relational Reasoning Graph Network for Arbitrary Shape Text Detection》提出的任意形状文本检测算法论文作者为 Zhang Shi-Xue、Zhu Xiaobin、Hou Jie-Bo、Liu Chang、Yang Chun、Wang Hongfa、Yin Xu-Cheng。在 CTW1500 文本检测公开数据集上PaddleOCR 对 DRRG 的复现效果如下模型骨干网络配置文件precisionrecallHmean下载链接DRRGResNet50_vdconfigs/det/det_r50_drrg_ctw.yml89.92%80.91%85.18%官方提供训练模型1.1 DRRG 的核心思想与传统像素分割 后处理聚类的检测范式不同DRRG 将文本行看作由若干**文本组件text components**构成的整体文本组件文本行中的每个字符或字符片段被抽象为一个带有位置、高度、宽度和方向属性的四边形组件是图上的节点node局部图Local Graphs以每个组件为中心通过 k 近邻kNN等方式与其邻近组件建立连接构成包含节点特征、邻接矩阵的局部图图卷积网络GCN推理用 GCN 判断组件两两之间是否属于同一条文本行即边是否存在从而把组件间是否相连转化为二分类的链接预测问题图传播与后处理在预测出的边集合上做图传播、连通分量聚类最终把同一簇内的组件拼接成完整的文本行边界boundary。这一机制使得 DRRG 天然适合处理弯曲、环形、任意方向排布的文本是 PaddleOCR 中面向任意形状arbitrary shape文本检测的代表算法之一。2. PaddleOCR 中的 DRRG 实现结构从源码结构看DRRG 在 PaddleOCR 中由以下模块协同完成所有路径均位于仓库根目录下阶段实现文件说明数据标签生成ppocr/data/imaug/drrg_targets.pyDRRGTargets生成文本区域掩码、中心区域掩码及组件属性等训练目标检测头ppocr/modeling/heads/det_drrg_head.pyDRRGHead1x1 卷积输出预测图 局部图构建 GCN 推理图构建训练ppocr/modeling/heads/local_graph.pyLocalGraphs训练阶段基于真值组件构建局部图图构建推理ppocr/modeling/heads/proposal_local_graph.pyProposalLocalGraphs推理阶段基于预测组件提议局部图图卷积ppocr/modeling/heads/gcn.pyGCN对局部图节点特征做图卷积输出边的二分类预测损失函数ppocr/losses/det_drrg_loss.pyDRRGLoss组合文本区域、中心区域、几何属性与 GCN 多路损失后处理ppocr/postprocess/drrg_postprocess.pyDRRGPostprocess图传播、连通分量聚类、边界重建评测指标ppocr/metrics/det_metric.pyDetFCEMetric以 hmean 为主指标的多阈值检测评测2.1 DRRGHead6 通道预测图与图推理从 det_drrg_head.py 的源码看DRRGHead 的核心逻辑为通过一个1x1卷积out_conv将 Neck 输出的特征图压缩为6 通道预测图pred_maps依次对应文本区域text region预测中心区域center region预测sin 方向图sin mapcos 方向图cos map上高度图top height map下高度图bot height map将 Neck 特征与pred_maps沿通道拼接paddle.concat后训练阶段交给LocalGraphs、推理阶段交给ProposalLocalGraphs构建局部图局部图的节点特征由RoIAlignRotated旋转兴趣区域对齐实现位于 ppocr/ext_op/roi_align_rotated采样 120 维几何特征node_geo_feat_len120组成再送入GCNGCN 输出经过softmax得到该边属于同一文本行的概率据此生成(edges, scores, text_comps)边索引对、边得分、以及格式为(x1,y1,x2,y2,x3,y3,x4,y4,score)的文本组件。从源码还可以看到DRRGHead的默认超参数包括k_at_hops(8, 4)每跳邻居数、num_adjacent_linkages3相邻连接数、pooling_output_size(4, 3)ROI 池化输出尺寸、nms_thr0.3、min_width8.0、max_width24.0、comp_shrink_ratio1.03、comp_ratio0.4、comp_score_thr0.3、center_region_area_thr50、local_graph_thr0.7等均可在配置文件中按需覆盖。2.2 DRRGLoss多路损失联合监督det_drrg_loss.py 中的DRRGLoss由六路损失求和得到loss_text文本区域预测的平衡二分类交叉熵balance BCE实现中通过ohem_ratio3.0控制正负样本比例在线困难样本挖掘思想loss_center中心区域 BCE正样本部分在文本掩码内计算负样本部分权重为 0.5loss_height上下高度图的 smooth-L1并用log(gt_height 1)加权loss_sin/loss_cos方向图sin/cos的 smooth-L1loss_gcnGCN 链接预测的交叉熵监督组件对是否属于同一文本行。在实现中预测的 sin/cos 会先通过scale sqrt(1 / (sin² cos² 1e-8))归一化保证方向向量为单位向量体现了数值稳定性上的细节处理。2.3 DRRGPostprocess从边到文本行边界drrg_postprocess.py 中的DRRGPostprocess按以下流水线把 GCN 输出的边集合还原为文本行graph_propagation对每条边按组件中心距超过edge_len_thr50.0的边置零合并重复边取两次得分均值并构建无向图节点Node类与得分字典connected_components以link_thr配置文件中为 0.8为阈值在图节点上做连通分量聚类只有得分不低于阈值的边才被视为有效连接clusters2labels把聚类结果映射为每个组件的标签remove_single剔除只含单个组件的孤立簇噪声抑制comps2boundaries对每个簇内组件取中心点序列通过min_connect_path求最短连接路径取上下边缘均值生成 top/bottom 边线并用fix_corner修正端点最终输出形如[x1,y1,x2,y2,...,score]的多边形边界resize_boundary依据shape_list中的缩放因子把边界还原到原图尺寸。3. 环境配置开始训练前请先参考 《运行环境准备》 配置 PaddleOCR 运行环境包括安装 PaddlePaddle 框架、安装 PaddleOCR 及其依赖并参考 《项目克隆》 克隆项目代码到本地。由于 DRRG 在标签生成阶段需要对文本组件做四边形 NMS见 drrg_targets.py 中generate_comp_attribs对lanms的调用通过check_install(lanms, lanms-neo)检查安装训练前还需确保安装了lanms-neo依赖包pip install lanms-neo此外DRRG 在训练/推理中依赖自定义算子RoIAlignRotated旋转 RoI 对齐其源码位于 ppocr/ext_op/roi_align_rotated属于 PaddleOCR 扩展算子请按仓库说明完成编译或使用预编译版本。4. 数据集准备DRRG 模型使用CTW1500文本检测公开数据集训练得到该数据集包含大量弯曲文本行标注与 DRRG 的目标场景高度契合。数据集的下载与标注格式说明可参考 ocr_datasets 数据集文档。下载并解压后需要把数据整理为 PaddleOCR 检测训练的标准布局。以仓库默认配置为例CTW1500 数据应组织为train_data/ctw1500/ ├── imgs/ # 训练与测试图片 │ ├── training.txt # 训练标注文件 │ └── test.txt # 测试标注文件每行标注格式为图片路径 [文本框多边形坐标..., 文本内容, 是否忽略]。training.txt与test.txt的路径分别由配置文件中Train.dataset.label_file_list与Eval.dataset.label_file_list指定。5. 模型训练PaddleOCR 对代码进行了模块化设计训练不同的检测模型只需要更换配置文件即可DRRG 的训练配置为 configs/det/det_r50_drrg_ctw.yml。5.1 配置文件详解该配置文件的关键部分如下已按原配置完整展开Global: use_gpu: true epoch_num: 1200 # 训练总轮数 log_smooth_window: 20 print_batch_step: 5 # 每 5 步打印一次日志 save_model_dir: ./output/det_r50_drrg_ctw/ save_epoch_step: 100 # 每 100 轮保存一次模型 eval_batch_step: [37800, 1260] # 每 1260 次迭代评估一次首次在 37800 次后 cal_metric_during_train: False pretrained_model: ./pretrain_models/ResNet50_vd_ssld_pretrained.pdparams checkpoints: # 断点续训时填写模型路径 save_inference_dir: use_visualdl: False infer_img: doc/imgs_en/img_10.jpg save_res_path: ./output/det_drrg/predicts_drrg.txt Architecture: model_type: det algorithm: DRRG Transform: Backbone: name: ResNet_vd # 骨干网络 ResNet50_vd layers: 50 Neck: name: FPN_UNet # FPN-UNet 特征融合 in_channels: [256, 512, 1024, 2048] out_channels: 32 Head: name: DRRGHead in_channels: 32 text_region_thr: 0.3 # 文本区域得分阈值 center_region_thr: 0.4 # 中心区域得分阈值 Loss: name: DRRGLoss Optimizer: name: Momentum momentum: 0.9 lr: name: DecayLearningRate # 衰减学习率 learning_rate: 0.028 epochs: 1200 factor: 0.9 end_lr: 0.0000001 weight_decay: 0.0001 PostProcess: name: DRRGPostprocess link_thr: 0.8 # 边连接得分阈值连通分量聚类用 Metric: name: DetFCEMetric main_indicator: hmean # 主指标为 Hmean训练数据增强与标签生成流水线Train.dataset.transforms完整配置为Train: dataset: name: SimpleDataSet data_dir: ./train_data/ctw1500/imgs/ label_file_list: - ./train_data/ctw1500/imgs/training.txt transforms: - DecodeImage: # 读取图片 img_mode: BGR channel_first: False ignore_orientation: True - DetLabelEncode: # 解析检测标注 - ColorJitter: # 颜色抖动增强 brightness: 0.12549019607843137 saturation: 0.5 - RandomScaling: # 随机缩放 - RandomCropFlip: # 随机裁剪翻转 crop_ratio: 0.5 - RandomCropPolyInstances: # 多边形实例随机裁剪 crop_ratio: 0.8 min_side_ratio: 0.3 - RandomRotatePolyInstances: # 多边形实例随机旋转 rotate_ratio: 0.5 max_angle: 60 pad_with_fixed_color: False - SquareResizePad: # 方形 resize padding target_size: 800 pad_ratio: 0.6 - IaaAugment: # imgaug 增强 augmenter_args: - { type: Fliplr, args: { p: 0.5 } } - DRRGTargets: # DRRG 专属标签生成核心 - 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, gt_text_mask, gt_center_region_mask, gt_mask, gt_top_height_map, gt_bot_height_map, gt_sin_map, gt_cos_map, gt_comp_attribs] loader: shuffle: True drop_last: False batch_size_per_card: 4 # 单卡 batch size num_workers: 8其中DRRGTargets是 DRRG 独有的标签生成算子实现见 ppocr/data/imaug/drrg_targets.py它会从多边形标注中依次生成gt_text_mask文本区域掩码多边形填充gt_center_region_mask文本中心区域掩码由上下边线按center_region_shrink_ratio0.3收缩后填充gt_top_height_map/gt_bot_height_map中心区域内每个像素到上/下边线的距离图gt_sin_map/gt_cos_map中心区域内像素对应的方向sin/cos θ图θ 为上顶点指向下顶点的向量与 (1,0) 的夹角gt_comp_attribs文本组件属性(num_comps, x, y, h, w, cos, sin, comp_label)组件中心沿中心线采样生成宽度按comp_w_h_ratio0.3计算并裁剪到[min_width8, max_width24]随后通过jitter_comp_attribs加入抖动增强数量不足num_min_comps9时用generate_rand_comp_attribs在背景中随机补充最多保留num_max_comps600个组件并 padding 对齐。KeepKeys中的keep_keys顺序即 dataloader 返回顺序DRRGHead 在训练时取targets[7]即gt_comp_attribs作为图构建输入DRRGLoss 取labels[1:8]作为监督目标两者在配置中的字段顺序必须一致改动时需特别注意。5.2 启动训练下载好 CTW1500 数据与 ResNet50_vd 预训练模型后使用如下命令启动单机单卡训练python3 tools/train.py -c configs/det/det_r50_drrg_ctw.yml预训练模型路径已在配置文件的Global.pretrained_model中指定./pretrain_models/ResNet50_vd_ssld_pretrained.pdparams也可以在命令行覆盖python3 tools/train.py -c configs/det/det_r50_drrg_ctw.yml \ -o Global.pretrained_model./pretrain_models/ResNet50_vd_ssld_pretrained.pdparams多卡训练时通过-o Global.use_gputrue与--gpus参数指定使用的 GPU ID例如--gpus 0,1,2,3单卡 batch size 保持配置中的 4总 batch 随卡数线性放大学习率可相应调整。5.3 断点训练若训练中断可通过Global.checkpoints指定已保存的模型进行断点续训python3 tools/train.py -c configs/det/det_r50_drrg_ctw.yml \ -o Global.checkpoints./output/det_r50_drrg_ctw/latest5.4 更换 Backbone由于配置中 Backbone 名称与预训练模型路径相互独立只需替换Architecture.Backbone配置并下载对应预训练模型即可尝试其他骨干网络如 MobileNetV3、ResNet18_vd 等具体预训练模型选择方法可参考 文本检测训练教程。6. 模型评估训练完成后或使用官方提供的训练模型使用 tools/eval.py 评估模型在 CTW1500 测试集上的指标python3 tools/eval.py -c configs/det/det_r50_drrg_ctw.yml \ -o Global.checkpoints./output/det_r50_drrg_ctw/best_accuracy评估使用DetFCEMetric实现见 ppocr/metrics/det_metric.py它对预测多边形与真值多边形做 IoU 匹配在 0.3~0.9 多个得分阈值下分别统计 precision、recall并汇总出主指标hmean与配置中Metric.main_indicator: hmean对应。DRRG 在 CTW1500 上的官方复现结果为 precision 89.92%、recall 80.91%、Hmean 85.18%。评估阶段配置Eval.dataset与训练略有差异其完整内容为Eval: dataset: name: SimpleDataSet data_dir: ./train_data/ctw1500/imgs/ label_file_list: - ./train_data/ctw1500/imgs/test.txt transforms: - DecodeImage: img_mode: BGR channel_first: False ignore_orientation: True - DetLabelEncode: - DetResizeForTest: # 测试时按最短边 640 缩放 limit_type: min limit_side_len: 640 - NormalizeImage: scale: 1./255. mean: [0.485, 0.456, 0.406] std: [0.229, 0.224, 0.225] order: hwc - Pad: - ToCHWImage: - KeepKeys: keep_keys: [image, shape, polys, ignore_tags] loader: shuffle: False drop_last: False batch_size_per_card: 1 # 必须为 1 num_workers: 2需要特别注意的是DRRG 评估时batch_size_per_card必须为 1配置注释中已标明 must be 1因为 DRRG 的图构建与后处理面向单张图片进行多 batch 会破坏组件图的语义。7. 模型预测与推理部署7.1 Python 推理使用 tools/infer_det.py 对单张图片执行检测预测python3 tools/infer_det.py -c configs/det/det_r50_drrg_ctw.yml \ -o Global.infer_img./doc/imgs_en/img_10.jpg预测结果检测框/边界点及得分会按配置写入Global.save_res_path指定的文件默认./output/det_drrg/predicts_drrg.txt。部署限制说明由于 DRRG 模型前向运行时需要多次将张量转换为 Numpy 数据进行图构建与后处理运算例如ProposalLocalGraphs中的 NMS、邻接矩阵构建等见 det_drrg_head.py 的single_test与 drrg_postprocess.py因此DRRG 的动态图转静态图模型导出为 inference 模型暂未支持这直接影响了下述多种部署方式。7.2 C 推理暂未支持。7.3 Serving 服务化部署暂未支持。7.4 更多推理部署暂未支持。以上部署形态均依赖静态图 inference 模型导出受限于 DRRG 前向过程中的 Numpy 运算PaddleOCR 当前版本未提供对应支持如需在 Python 脚本中批量推理可基于 tools/infer_det.py 的流程自行封装。8. 源码阅读指引如需深入理解 DRRG 的实现细节可按以下路径阅读源码训练入口tools/train.py评估入口tools/eval.py单图推理入口tools/infer_det.py数据标签生成ppocr/data/imaug/drrg_targets.pyDRRGTargets含中心线重采样、组件采样、抖动与随机补充组件检测头与图构建ppocr/modeling/heads/det_drrg_head.pyDRRGHead、ppocr/modeling/heads/local_graph.pyLocalGraphs含邻接矩阵对称归一化normalize_adjacent_matrix与旋转 RoI 特征采样、ppocr/modeling/heads/proposal_local_graph.pyProposalLocalGraphs图卷积网络ppocr/modeling/heads/gcn.pyGCN损失函数ppocr/losses/det_drrg_loss.pyDRRGLoss平衡 BCE smooth-L1 GCN 交叉熵后处理ppocr/postprocess/drrg_postprocess.pyDRRGPostprocess图传播 → 连通分量 → 边界重建评测指标ppocr/metrics/det_metric.pyDetFCEMetric自定义算子ppocr/ext_op/roi_align_rotated旋转 RoI 对齐。以上模块在 DRRGHead 的forward中形成完整调用链out_conv输出 6 通道预测图 → 与 Neck 特征拼接 →LocalGraphs训练或ProposalLocalGraphs推理构建局部图 →GCN推理边分类 → 损失训练或后处理推理。9. FAQQ1DRRG 与其他检测算法如 DB、PSE的主要区别是什么DRRG 采用组件 图推理范式通过 GCN 学习组件间的连接关系对弯曲、任意形状文本的边界刻画能力更强而 DB、PSE 等基于像素分割的方法通常需要额外的后处理如阈值二值化、渐进式扩展来恢复文本实例。DRRG 也因此前向流程更复杂、依赖RoIAlignRotated与 Numpy 运算。Q2训练时提示缺少 lanms 相关模块怎么办DRRGTargets 在组件 NMS 阶段依赖lanms通过lanms-neo提供请先执行pip install lanms-neo安装后再训练。Q3为什么 DRRG 评估时 batch_size 必须为 1DRRG 的图构建与后处理面向单张图片进行ProposalLocalGraphs、DRRGPostprocess均按单图组件集处理多 batch 会导致组件图跨图串扰因此配置中强制batch_size_per_card: 1。Q4为什么 DRRG 不能导出 inference 模型进行 C/Serving 部署DRRG 前向过程中存在多次张量到 Numpy 的转换及自定义图运算动态图转静态图暂未支持因此 C 推理、Serving 服务化部署及其他依赖静态图的部署方式目前均不可用。10. 引用inproceedings{zhang2020deep, title{Deep relational reasoning graph network for arbitrary shape text detection}, author{Zhang, Shi-Xue and Zhu, Xiaobin and Hou, Jie-Bo and Liu, Chang and Yang, Chun and Wang, Hongfa and Yin, Xu-Cheng}, booktitle{Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, pages{9699--9708}, year{2020} }【免费下载链接】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),仅供参考