PPHGNetV2源代码解析

完整代码深度解析

一、核心组件设计
1. 重参数化模块 (DiverseBranchBlock)
python 复制代码
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)
python 复制代码
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. 硬件适配池化层
python 复制代码
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)
python 复制代码
class StemBlock(TheseusLayer):
    def forward(self, x):
        x = self.stem1(x)  # 3x3 conv stride2
        x2 = 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)
python 复制代码
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)
python 复制代码
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)
python 复制代码
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配置对比
python 复制代码
# 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专用配置
python 复制代码
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大型配置
python 复制代码
# 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(%)
B2 5.4 48 86.5
B4 4.9 41 88.9
B6 9.8 68 89.2
  • 最优性价比:比B2精度↑2.4%,速度↑15%;比B6速度↑40%仅损失0.3%精度
2. 文本检测优势
python 复制代码
# 检测任务配置
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. 多任务适配能力
python 复制代码
# 识别任务特化
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. 任务驱动架构

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

    python 复制代码
    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小时
相关推荐
互联网杂货铺1 小时前
完美搭建appium自动化环境
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
Gyoku Mint1 小时前
机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你
人工智能·python·算法·机器学习·pandas·ai编程·matplotlib
莱茵菜苗2 小时前
Python打卡训练营day46——2025.06.06
开发语言·python
爱学习的小道长2 小时前
Python 构建法律DeepSeek RAG
开发语言·python
luojiaao2 小时前
【Python工具开发】k3q_arxml 简单但是非常好用的arxml编辑器,可以称为arxml杀手包
开发语言·python·编辑器
英英_2 小时前
视频爬虫的Python库
开发语言·python·音视频
猛犸MAMMOTH2 小时前
Python打卡第46天
开发语言·python·机器学习
多多*3 小时前
微服务网关SpringCloudGateway+SaToken鉴权
linux·开发语言·redis·python·sql·log4j·bootstrap
梓仁沐白3 小时前
【Kotlin】协程
开发语言·python·kotlin
Java Fans3 小时前
在WPF项目中集成Python:Python.NET深度实战指南
python·.net·wpf