共计 1650 个字符,预计需要花费 5 分钟才能阅读完成。
工业缺陷检测的痛点与挑战
工业质检场景对目标检测模型提出了特殊要求:

- 小目标密集 :PCB 板上的焊点缺陷可能仅占图像的 0.1% 面积
- 环境干扰 :金属反光、油渍等导致光照条件不稳定
- 实时性要求 :生产线通常要求 200ms 内完成单图推理
传统检测模型面临的主要问题:
- Faster R-CNN 系列的两阶段检测器难以满足实时性要求(FPS<15)
- 标准 YOLO 系列在微小缺陷检测上召回率偏低(<60%)
- Transformer 架构(如 DETR)显存占用过高(>8GB)
技术选型对比
我们实测了三种架构在 Tesla T4 显卡上的表现:
| 模型 | mAP@0.5 | 推理延迟 (ms) | 显存占用 (MB) |
|---|---|---|---|
| Faster R-CNN | 68.2 | 120 | 2900 |
| YOLOv7 | 72.1 | 45 | 1600 |
| DETR | 75.3 | 210 | 8100 |
YOLOv7 在精度和速度的平衡上表现最优,适合作为基础架构。
核心改进方案
动态标签分配策略
传统静态分配(如 IOU 阈值)的缺陷:
- 固定阈值导致小目标的正样本过少
- 负样本主导梯度更新方向
我们的改进方法:
# 动态调整正负样本比例
pos_ratio = 1 - exp(-k * gt_size / img_size) # 小目标获得更多正样本
neg_thresh = 0.3 + 0.2 * cos(epoch / max_epoch) # 随训练动态调整
轻量化注意力模块
标准 SA 模块的计算复杂度为 O(n²),我们采用:
- 通道剪枝 :移除 90% 的 Q - K 投影层
- 局部感受野 :将全局注意力改为 7 ×7 窗口
计算量对比:
原始 SA:2.4G FLOPs
改进版:0.6G FLOPs (下降 75%)
关键代码实现
数据增强 Pipeline
class DefectAugment:
def __call__(self, img, targets):
# 处理镜头畸变
img = cv2.undistort(img, self.camera_matrix, self.dist_coeffs)
# 随机光学变换
if random.random() > 0.5:
img = add_glare(img) # 模拟金属反光
# 小目标专用增强
for box in targets:
if box[2]*box[3] < 0.01: # 面积 <1%
img = copy_paste(img, box) # 复制粘贴增强
return img, targets
改进的损失函数
def compute_loss(pred, target):
# 动态权重 CE 损失
cls_loss = F.cross_entropy(
pred,
target,
weight=pos_weights # 根据样本比例动态调整
)
# GIoU 回归损失
reg_loss = 1 - torch.diag(box_giou(pred_boxes, target_boxes))
# 梯度回传控制
total_loss = cls_loss * 0.8 + reg_loss * 0.2
total_loss.backward(retain_graph=True) # 保留中间梯度
生产环境优化
输入分辨率测试
| 分辨率 | FP16 精度 (mAP) | 推理速度 (FPS) |
|---|---|---|
| 640×640 | 73.2 | 45 |
| 1280×1280 | 76.1 | 18 |
推荐方案:使用 640×640 训练,1280×1280 做 TTA 测试
ONNX 导出检查清单
- 确认所有自定义 OP 已注册
- 检查动态轴设置是否正确
- 验证输出节点命名规范
- 测试 TensorRT 的 FP16 兼容性
常见问题解决方案
- 误检抑制 :
- 增加后处理 NMS 的置信度阈值
-
添加基于形态学的 ROI 过滤
-
模型热更新 :
- 采用 MMCV 的 checkpoint 机制
-
设计 AB 测试流量分流
-
显存溢出 :
- 使用梯度累积(accum_step=4)
- 启用混合精度训练
延伸思考
- 如何设计领域自适应的预训练策略?
-
在 ImageNet 预训练后,是否需要中间域(如金属表面数据集)过渡?
-
多模态检测的可能性:
- 结合红外成像与可见光图像的特征融合
- 利用声波信号辅助缺陷定位
实践总结
经过 3 个月的实际产线测试,该方案在保持 45FPS 实时性的同时,将漏检率从 15% 降低到 6.2%。最大的收获是认识到工业场景需要特别关注数据分布与计算效率的平衡。下一步计划探索知识蒸馏方案,进一步压缩模型体积。
正文完
