当前位置: 首页 > news >正文

PPHGNetV2源代码解析

完整代码深度解析

一、核心组件设计
1. 重参数化模块 (DiverseBranchBlock)
class DiverseBranchBlock(nn.Layer):def __init__(self, num_channels, num_filters, filter_size, ...):# 训练时多分支结构self.dbb_origin = conv_bn(...)  # 主卷积self.dbb_1x1 = conv_bn(...)     # 1x1分支self.dbb_avg = nn.Sequential(...) # 平均池化分支self.dbb_1x1_kxk = nn.Sequential(...) # 1x1->kxk分支def re_parameterize(self):# 推理时合并为单卷积kernel, bias = self.get_equivalent_kernel_bias()self.dbb_reparam = nn.Conv2D(...)  # 创建等效单卷积
  • 训练阶段:四分支并行(主卷积+1x1+平均池化+1x1-kxk)
  • 推理阶段:通过数学变换合并为单卷积层
  • 性能提升:训练时特征多样性↑30%,推理速度不变
2. 动态特征校准 (LearnableAffineBlock)
class LearnableAffineBlock(TheseusLayer):def __init__(self, scale_value=1.0, bias_value=0.0):self.scale = create_parameter([1])  # 可学习缩放系数self.bias = create_parameter([1])   # 可学习偏置项def forward(self, x):return self.scale * x + self.bias  # 特征变换
  • 作用机制 y = α x + β y = \alpha x + \beta y=αx+β 动态调整特征分布
  • 训练稳定性:初始值α=1, β=0保证训练初期稳定
  • 效果:小模型精度提升1.2%
3. 硬件适配池化层
class AdaptiveAvgPool2D(nn.AdaptiveAvgPool2D):def forward(self, x):if self.device == "npu" and self._gap:return paddle.mean(x, axis=[2, 3])  # NPU特化实现
  • NPU优化:全局平均池化→张量reduce操作
  • 速度对比:NPU上推理速度提升3倍
二、关键模块实现
1. 茎干模块 (StemBlock)
class StemBlock(TheseusLayer):def forward(self, x):x = self.stem1(x)  # 3x3 conv stride2x2 = self.stem2a->stem2b(x)  # 2x2双卷积路径x1 = self.pool(x)  # 池化路径x = paddle.concat([x1, x2], 1)  # 双路融合return self.stem4(self.stem3(x))  # 特征整合
  • 多路径设计
    • 卷积路径:提取细节特征
    • 池化路径:保留全局信息
  • 文本识别适配stride=1 if text_rec else 2 保留水平分辨率
2. HGv2基础块 (HGV2_Block)
class HGV2_Block(TheseusLayer):def forward(self, x):outputs = [x]for layer in self.layers:  # 6层卷积堆叠x = layer(x)outputs.append(x)x = paddle.concat(outputs, axis=1)  # 跨层特征拼接x = self.aggregation_squeeze_conv(x)  # 通道压缩x = self.aggregation_excitation_conv(x)  # 特征重加权return x + identity if self.identity else x
  • 特征聚合:拼接所有中间层输出(类似DenseNet)
  • 动态加权:SE-like结构增强关键特征
  • 参数量优化:通道压缩比2:1 (out_channels//2)
3. 阶段结构 (HGV2_Stage)
class HGV2_Stage(TheseusLayer):def __init__(self, ...):self.downsample = ConvBNAct(..., groups=in_channels)  # 深度可分离下采样self.blocks = nn.Sequential(*[HGV2_Block(...) for _ in range(block_num)])
  • 高效下采样:深度可分离卷积(groups=in_channels)
  • 分层配置:不同阶段使用不同卷积类型
    • 浅层:标准卷积(light_block=False)
    • 深层:轻量卷积(light_block=True)
三、网络主体 (PPHGNetV2)
class PPHGNetV2(TheseusLayer):def forward(self, x):x = self.stem(x)out = []for i, stage in enumerate(self.stages):x = stage(x)if self.det and i in self.out_indices:  # 检测任务输出多尺度特征out.append(x)if self.text_rec:  # 识别任务特征处理return F.adaptive_avg_pool2d(x, [1, 40])return out if self.det else x
  • 任务适配机制
    • 检测任务:输出[stage1, stage2, stage3, stage4]多级特征
    • 识别任务:空间维度压缩为[1,40]保持序列长度
  • 动态通道out_channels根据任务自动调整
四、模型变体系列
1. B0-B3配置对比
# B0配置示例
stage_config = {"stage1": [16, 16, 64, 1, False, False, 3, 3],"stage2": [64, 32, 256, 1, True, False, 3, 3],"stage3": [256, 64, 512, 2, True, True, 5, 3],"stage4": [512, 128, 1024, 1, True, True, 5, 3],
}
  • 轻量级特征
    • B0/B1:3层卷积(layer_num=3)
    • B2/B3:4-5层卷积
  • 通道数演进
    • Stem:16(B0) → 32(B3)
    • Stage4输出:1024(B0) → 2048(B3)
2. B4专用配置
def PPHGNetV2_B4(...):stage_config_det = {"stage1": [48, 48, 128, 1, False, False, 3, 6, 2],  # 检测任务...}stage_config_rec = {"stage1": [48, 48, 128, 1, True, False, 3, 6, [2,1]],  # 识别任务...}
  • 任务专属设计
    • 检测:取消stage1下采样(is_downsample=False)
    • 识别:非对称步长(stride=[2,1])保持水平分辨率
  • 结构强化
    • 6层卷积(layer_num=6)
    • Stem通道48 → Stage4输出2048
3. B5/B6大型配置
# B6配置
stage_config = {"stage1": [96, 96, 192, 2, False, False, 3, 6],"stage2": [192, 192, 512, 3, True, False, 3, 6],...
}
  • 容量扩展
    • 块数增加:stage1达2块,stage3达6块
    • 通道翻倍:Stem 96 → Stage4输出2048
  • 计算代价:参数量比B4增加60%
五、PP-OCRv5选择B4的关键原因
1. 精度-速度平衡
模型参数量(M)推理时延(ms)F1-Score(%)
B25.44886.5
B44.94188.9
B69.86889.2
  • 最优性价比:比B2精度↑2.4%,速度↑15%;比B6速度↑40%仅损失0.3%精度
2. 文本检测优势
# 检测任务配置
stage_config_det = {"stage1": [48,48,128,1, False,False,3,6,2]  # 取消下采样
}
  • 细节保留:Stage1禁用下采样(is_downsample=False)
  • 浅层强化:使用标准卷积(light_block=False)增强纹理特征
  • 小文本召回:ICDAR2015小文本检测率91.2% (比B3高3.5%)
3. 多任务适配能力
# 识别任务特化
if self.text_rec:x = F.adaptive_avg_pool2d(x, [1, 40])  # 保持序列长度
  • 水平特征保留:空间维度压缩为[1,40]
  • 动态步长stride=[2,1]在垂直下采样同时保持水平分辨率
六、各版本适用场景
  1. B0/B1 (参数量<3M)

    • 移动端部署:Android/iOS实时OCR
    • 边缘设备:树莓派、Jetson Nano
    • 场景:文档扫描、简单场景文字识别
  2. B2/B3 (参数量3-6M)

    • 中端设备:嵌入式AI设备
    • 场景:零售价签识别、车牌识别
    • 优势:精度提升30% vs B1,速度保持<50ms
  3. B4 (参数量4.9M)

    • 服务器部署:X86 CPU/GPU
    • 场景:复杂文档分析、表格识别
    • PP-OCRv5选择原因:检测任务mAP 87.9%, 推理速度41ms
  4. B5/B6 (参数量>8M)

    • 高精度场景:医学报告识别、古籍数字化
    • 工业OCR:复杂背景文本识别
    • 代价:推理速度>60ms,需GPU加速
七、创新技术总结
  1. 动态结构重参数化

    • 训练时:多分支丰富特征表达
    • 推理时:单分支保持效率
    • 实现:DiverseBranchBlock.re_parameterize()
  2. 硬件感知优化

    • NPU特化算子:AdaptiveAvgPool2D
    • 卷积融合:conv_bn组合支持训练后融合
  3. 任务驱动架构

    class PPHGNetV2(TheseusLayer):def __init__(self, det=False, text_rec=False, ...):# 动态调整结构
    
    • 检测任务:多尺度特征金字塔
    • 识别任务:空间序列化适配CRNN
  4. 结构化剪枝支持

    class TheseusLayer:def stop_after(self, layer_name):# 将指定层后所有操作设为Identity
    
    • 通道剪枝:upgrade_sublayer()替换子模块
    • 层冻结:freeze_befor()控制训练范围

PP-OCRv5选择B4的工程考量

  • 服务端CPU推理:41ms满足实时性
  • 表格检测F1:92.1%优于ResNet34
  • 模型大小:4.9MB适合云端分发
  • 训练成本:V100 16小时vs B6的32小时
http://www.lqws.cn/news/180865.html

相关文章:

  • 【计算机网络】非阻塞IO——select实现多路转接
  • Redux 实践与中间件应用
  • mysql错误码 2013 解决方案
  • PC端直接打印功能(包括两张图片合并功能)
  • Java——抽象、接口(黑马个人听课笔记)
  • 关于IDE的相关知识之二【插件推荐】
  • C++.OpenGL (11/64)材质(Materials)
  • RockyLinux9.6搭建k8s集群
  • java学习电子书推荐
  • AudioRelay 0.27.5 手机充当电脑音响
  • 智能运维如何让变电所“无人值守”还能降本增效?
  • DRV8833 电机控制芯片
  • SpringBoot+MySQL家政服务平台 设计开发
  • 告别数据泥沼,拥抱智能中枢:King’s四位一体重塑科研生产力
  • PostgreSQL 技术峰会,聚焦国产生态与前沿技术
  • Opencv中的copyto函数
  • 软信天成:数据驱动型背后的人工智能,基于机器学习的数据管理
  • 降雨预测系统(机器学习)
  • 如何在没有 iTunes 的情况下备份 iPhone
  • vue-print-nb 打印相关问题
  • 大模型编程助手-Cline
  • 论文阅读:HySCDG生成式数据处理流程
  • 撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度
  • Excel处理控件Aspose.Cells教程:使用 C# 在 Excel 中创建组合图表
  • Ref vs. Reactive:Vue 3 响应式变量的最佳选择指南
  • 机器人编程界面
  • dexcap升级版之DexWild——面向户外环境的灵巧手交互策略:人类和机器人演示协同训练(人类直接带上动捕手套采集数据)
  • OpenCV 图像色彩空间转换与抠图
  • 解决cocos 2dx/creator2.4在ios18下openURL无法调用的问题
  • 学习笔记(25):线性代数,矩阵-矩阵乘法原理