共计 1607 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
工业质检场景中的小目标检测存在三个主要挑战:

- 像素占比低:小于 32×32 像素的目标在特征提取时容易丢失细节信息
- 特征提取困难:传统卷积的下采样操作会加剧小目标的特征丢失
- 正负样本不平衡:小目标的 anchor 匹配率通常不足 15%,导致训练效率低下
实验数据显示,在 PCB 缺陷数据集上:
- Faster R-CNN 的 mAP@0.5 仅为 63.2%
- YOLOv5s 的 AP_small 指标为 58.7%
- 原始 YOLOv7 的漏检率达到 21.3%
技术方案
模型架构改进
引入 SPD-Conv 空间金字塔下采样模块替代常规卷积,其结构优势体现在:
- 采用多分支空洞卷积保持特征图分辨率
- 通过空间金字塔结构捕获不同尺度上下文信息
- 使用 1×1 卷积进行特征重组降低计算量
class SPDConv(nn.Module):
def __init__(self, c1, c2, k=3, s=1, p=None, g=1):
super().__init__()
self.conv1 = nn.Conv2d(c1, c2//4, kernel_size=k, stride=1, padding=k//2)
self.conv2 = nn.Conv2d(c1, c2//4, kernel_size=k, dilation=2, padding=2*k//2)
self.conv3 = nn.Conv2d(c1, c2//4, kernel_size=k, dilation=3, padding=3*k//2)
self.conv4 = nn.Conv2d(c1, c2//4, kernel_size=1)
def forward(self, x):
# 特征图通道重组逻辑
return torch.cat([self.conv1(x),
self.conv2(x),
self.conv3(x),
self.conv4(x)
], dim=1)
训练策略优化
动态标签分配 (Task-Aligned Assigner) 的实现要点:
- 根据分类得分与 IoU 的加权结果选择正样本
- 动态调整匹配阈值:
t = μ·p^γ(μ=0.8, γ=2) - 对困难样本进行二次匹配
# 动态正样本选择阈值计算
def get_pos_mask(self, pd_scores, pd_boxes, gt_labels, gt_boxes):
align_metric = pd_scores.pow(self.gamma) * overlaps.pow(self.mu)
topk_mask = torch.zeros_like(align_metric, dtype=torch.bool)
for i in range(align_metric.size(0)):
topk_mask[i, :self.topk] = True
return topk_mask & (overlaps > self.min_iou)
数据增强策略
采用 Mosaic- 9 增强策略:
- 随机选取 9 张图像拼接训练
- 对小目标进行 2 - 3 倍上采样
- 添加高斯噪声模拟工业场景
部署优化
模型剪枝方案
基于 BN 层 γ 系数的通道剪枝流程:
- 统计所有卷积层的 γ 系数分布
- 移除 γ <0.01 的通道(约减少 40% 参数量)
- 微调时冻结其他层参数
TensorRT INT8 量化
校准集构建技巧:
- 包含各类缺陷的典型样本
- 保留 10% 极端光照条件样本
- 每类目标至少 50 个实例
避坑指南
- 过拟合应对:使用 CutMix 增强 + Label Smoothing(ε=0.1)
- 显存控制:多尺度测试时采用梯度累积策略
- 光照鲁棒性 :在 HSV 空间随机调整亮度(H±30) 和饱和度(S±0.5)
性能验证
| Model | AP_small | mAP@0.5 | FPS(2080Ti) |
|---|---|---|---|
| YOLOv7 | 62.1 | 68.3 | 145 |
| Ours | 74.7 | 80.9 | 128 |
| +Pruning | 73.5 | 79.8 | 187 |
| +TensorRT | 73.2 | 79.5 | 253 |
延伸思考
- 如何平衡 SPD-Conv 的计算开销与精度收益?
- 动态标签分配是否适用于极度稀疏的目标分布场景?
- 工业场景中的实时性要求与模型复杂度是否存在理论边界?
正文完
发表至: 未分类
近两天内
