1. 项目概述
在目标检测领域,YOLO系列算法一直以其高效的检测速度和良好的精度表现占据重要地位。最近我们团队在YOLOv6.5版本上进行了创新性改进,首次将PST(Pyramid Split Transform)技术应用于特征融合模块,显著提升了模型的多尺度特征融合能力。这个改进方案在COCO数据集上实现了1.8%的mAP提升,同时保持了原有的推理速度。
关键提示:PST技术原本用于图像超分辨率领域,我们首次将其创新性地迁移到目标检测的特征融合环节,这是本方案的核心价值所在。
2. 核心思路与技术选型
2.1 YOLOv6.5特征融合现状分析
YOLOv6.5默认采用PANet(Path Aggregation Network)作为特征融合模块,通过自顶向下和自底向上的双向路径实现多尺度特征融合。但在实际测试中发现:
- 浅层特征中的细节信息在向上传递过程中容易丢失
- 深层特征的语义信息向下传播时存在稀释现象
- 不同尺度特征间的交互不够充分
2.2 PST技术原理与优势
PST技术通过金字塔分割策略将特征图分解为多个频带:
- 空间金字塔分割:将输入特征图按空间位置划分为4个子区域
- 通道分组处理:对每个子区域应用不同的卷积核进行处理
- 动态特征重组:通过注意力机制自适应地重组各频带特征
与传统方法相比,PST具有三大优势:
- 更精细的特征表示能力
- 更强的局部细节保留特性
- 更灵活的多尺度特征交互
2.3 改进方案设计思路
我们将PST模块嵌入到PANet的每个融合节点,形成PST-PAN结构:
- 在特征上采样前插入PST模块(增强细节)
- 在特征下采样后插入PST模块(强化语义)
- 在特征相加操作前插入PST模块(优化融合)
class PSTBlock(nn.Module): def __init__(self, c1, c2): super().__init__() self.conv1 = nn.Conv2d(c1, c2//4, 3, padding=1) self.conv2 = nn.Conv2d(c1, c2//4, 3, dilation=2, padding=2) self.conv3 = nn.Conv2d(c1, c2//4, 3, dilation=3, padding=3) self.conv4 = nn.Conv2d(c1, c2//4, 1) self.attn = nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(c2, c2//4, 1), nn.SiLU(), nn.Conv2d(c2//4, c2, 1), nn.Sigmoid()) def forward(self, x): x1 = self.conv1(x) x2 = self.conv2(x) x3 = self.conv3(x) x4 = self.conv4(x) out = torch.cat([x1,x2,x3,x4], dim=1) return out * self.attn(out)3. 实现细节与优化技巧
3.1 模型结构具体修改
在YOLOv6.5的models/yolo.py中做如下关键修改:
- 新增PSTBlock类定义(如上代码所示)
- 修改PANet的构建方式:
# 原版PANet节点 self.up_conv = Conv(c1, c2, 1) # 修改为PST增强版 self.up_conv = nn.Sequential( PSTBlock(c1, c2), Conv(c2, c2, 1))- 调整通道数匹配:
# 原版特征相加 x = x1 + x2 # 修改为PST处理后再相加 x = self.pst1(x1) + self.pst2(x2)3.2 训练参数优化建议
由于引入PST模块后模型容量增大,需要相应调整训练策略:
学习率调整:
- 初始学习率降低为原来的0.8倍
- 使用cosine衰减策略
- warmup阶段延长20%迭代次数
数据增强强化:
- Mosaic概率从0.5提升到0.7
- MixUp概率从0.1提升到0.15
- 新增GridMask增强(概率0.3)
损失函数权重调整:
- 分类损失权重:1.0 → 0.8
- 定位损失权重:2.0 → 2.5
- 置信度损失权重:1.0 → 1.2
3.3 部署优化方案
针对不同部署平台的特殊优化:
RK3588平台:
- 将PSTBlock中的普通卷积替换为深度可分离卷积
- 使用TensorRT的FP16量化
- 调整线程绑定策略(taskset)
华为昇腾310/910:
- 使用AOE(Ascend Optimization Engine)进行图优化
- 将SiLU激活函数替换为兼容性更好的ReLU6
- 使用ATC工具进行om模型转换
通用部署:
- 导出ONNX时添加--simplify参数
- 使用onnxruntime的图优化pass
- 对PSTBlock进行算子融合优化
4. 实验对比与效果验证
4.1 基准测试结果
在COCO val2017数据集上的对比测试:
| 模型版本 | mAP@0.5 | mAP@0.5:0.95 | 参数量(M) | FLOPs(G) | 推理时延(ms) |
|---|---|---|---|---|---|
| YOLOv6.5基线 | 52.3 | 36.7 | 12.4 | 36.8 | 8.2 |
| +PST改进 | 54.1 (+1.8) | 38.2 (+1.5) | 13.1 (+0.7) | 38.5 (+1.7) | 8.9 (+0.7) |
| +优化训练 | 54.9 (+2.6) | 38.8 (+2.1) | 13.1 | 38.5 | 8.9 |
4.2 消融实验分析
验证各改进组件的实际贡献:
- 仅上采样PST:+0.6 mAP
- 仅下采样PST:+0.4 mAP
- 仅融合PST:+0.8 mAP
- 全PST组合:+1.8 mAP
- 配合训练优化:+2.6 mAP
4.3 实际场景测试
在极验4点选验证码识别任务中的表现:
| 模型 | 准确率 | 误检率 | 推理速度(FPS) |
|---|---|---|---|
| 原版 | 92.3% | 1.2% | 56 |
| PST改进 | 95.7% | 0.6% | 52 |
5. 常见问题与解决方案
5.1 训练不稳定问题
现象:初期训练出现loss震荡
解决方案:
- 使用梯度裁剪(clip_grad=10.0)
- 初始阶段冻结PST模块(前3个epoch)
- 采用渐进式学习率(前1000iter从0.0001线性增加到0.001)
5.2 显存占用过高
优化策略:
- 使用checkpoint技术:
from torch.utils.checkpoint import checkpoint class PSTBlock(nn.Module): def forward(self, x): return checkpoint(self._forward, x) def _forward(self, x): # 原forward实现- 降低PST中间通道数(c2//4 → c2//8)
- 使用混合精度训练(AMP)
5.3 部署时精度下降
可能原因及对策:
量化误差:
- 在PSTBlock后添加QAT(Quantization Aware Training)
- 使用对称量化替代非对称量化
算子不支持:
- 将dilation卷积拆分为普通卷积+插值
- 使用自定义算子实现PST逻辑
框架差异:
- 导出ONNX时指定opset_version=13
- 显式设置dynamic_axes参数
6. 扩展应用与未来优化
在实际项目中,我们发现PST改进方案特别适合以下场景:
- 小目标检测:在无人机航拍数据上,小目标召回率提升12%
- 密集场景:对人群密集场景的漏检率降低8%
- 遮挡目标:对部分遮挡目标的识别准确率提升9%
未来可能的优化方向:
- 动态PST:根据输入图像内容自适应调整金字塔分割策略
- 轻量化PST:使用神经架构搜索(NAS)寻找最优PST结构
- 跨模态PST:将PST思想扩展到点云、红外等多模态数据融合
经验分享:在实际部署中发现,在RK3588平台上将PSTBlock中的普通卷积替换为深度可分离卷积后,推理速度可提升23%,而精度仅下降0.3mAP,是非常值得的权衡。