共计 2587 个字符,预计需要花费 7 分钟才能阅读完成。
工业质检场景的典型痛点
在工业质检的实际场景中,我们主要面临以下几个挑战:

- 光照条件不稳定 :工厂环境的光照会随时间和位置变化,导致同一产品在不同时间拍摄的图像差异很大。
- 小目标检测困难 :很多缺陷如划痕、污点的尺寸可能只有几个像素,传统方法容易漏检。
- 产线抖动带来的模糊 :高速运转的产线会导致图像模糊,影响特征提取。
- 金属反光干扰 :特别是对于金属制品,反光会形成伪缺陷特征。
- 类不平衡问题 :正常样本远多于缺陷样本,导致模型偏向多数类。
21 人工智能视觉组的技术方案
多任务联合训练框架
我们采用多任务学习来提升模型泛化能力:
- 主任务是缺陷分类(正常 / 缺陷)
- 辅助任务包括缺陷定位和缺陷类型识别
- 共享骨干网络提取通用特征,各任务有独立的分支
这种设计可以让模型学习到更鲁棒的特征表示,实验表明相比单任务模型,mAP 提升了 8.3%。
基于注意力机制的特征融合模块
针对小目标检测问题,我们设计了多尺度特征金字塔网络:
- 从骨干网络不同阶段提取特征图(P2-P5)
- 使用注意力门控机制动态融合各层特征
- 在浅层特征(P2)中保留高频细节用于小目标检测
- 在深层特征(P5)中利用语义信息减少误检
动态自适应推理管线
为平衡精度和速度,我们实现动态推理:
- 第一级使用轻量级网络快速筛选疑似区域
- 第二级对候选区域用高精度模型细粒度分析
- 根据硬件资源动态调整两级模型的计算预算
关键代码实现
数据增强 Pipeline
# 处理类不平衡的定制数据增强
transform = transforms.Compose([
transforms.RandomApply([transforms.ColorJitter(0.4, 0.4, 0.4, 0.1)],
p=0.8 # 80% 概率应用色彩抖动
),
transforms.RandomGrayscale(p=0.2),
transforms.RandomApply([GaussianBlur(kernel_size=23)],
p=0.5 # 模拟产线模糊
),
# 针对少数类的过采样
ClassBalanceSampler(
labels,
oversample_thresh=0.1 # 对占比 <10% 的类别过采样
)
])
改进的 Focal Loss 实现
class DynamicFocalLoss(nn.Module):
def __init__(self, alpha=0.25, gamma=2.0, dynamic=True):
"""
alpha: 初始类别权重
gamma: 困难样本聚焦参数
dynamic: 是否启用自适应调整
"""
super().__init__()
self.alpha = alpha
self.gamma = gamma
self.dynamic = dynamic
def forward(self, preds, targets):
# 计算基础交叉熵
bce_loss = F.binary_cross_entropy_with_logits(preds, targets, reduction='none')
# Focal 项
pt = torch.exp(-bce_loss)
focal_term = (1-pt)**self.gamma
# 动态调整 alpha
if self.dynamic:
self.alpha = 1 - targets.float().mean() # 自动适应类别分布
loss = self.alpha * focal_term * bce_loss
return loss.mean()
ONNX 导出注意事项
# 导出前必须替换自定义 OP
def replace_custom_ops(model):
"""替换模型中 ONNX 不支持的算子"""
for name, module in model.named_modules():
if isinstance(module, DynamicAttention):
# 用标准 MultiHeadAttention 替代
new_module = nn.MultiheadAttention(...)
setattr(model, name, new_module)
# 导出 ONNX
torch.onnx.export(
model,
dummy_input,
"model.onnx",
opset_version=12, # 必须 >=11
input_names=["input"],
output_names=["output"],
dynamic_axes={"input": {0: "batch"},
"output": {0: "batch"}
}
)
性能对比
我们在内部数据集上的测试结果:
| 指标 | 基线模型 | 优化模型 | 提升幅度 |
|---|---|---|---|
| mAP@0.5 | 76.2% | 87.5% | +11.3% |
| 小目标 Recall | 62.1% | 78.4% | +16.3% |
| 推理延迟 (1080Ti) | 45ms | 38ms | -15.6% |
产线部署避坑指南
模型量化策略选择
- 训练后动态量化 :最简单但精度损失大(约 3 -5% mAP 下降)
- 量化感知训练 :需要重新训练,但精度损失小(<1% mAP 下降)
- 混合精度量化 :对敏感层保持 FP16,其他层 INT8
我们的经验:对 ResNet 骨干使用量化感知训练,对检测头保持 FP16。
金属反光处理技巧
- 偏振光成像 :在硬件端使用偏振滤镜
- 多光源合成 :从不同角度拍摄后取最小值融合
- 频域滤波 :在傅里叶域抑制高频反光成分
代码示例:
def remove_glare(img):
"""基于 Retinex 的去反光算法"""
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
# 对亮度通道做自适应直方图均衡
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
l = clahe.apply(l)
return cv2.cvtColor(cv2.merge((l,a,b)), cv2.COLOR_LAB2BGR)
持续学习防遗忘
- EWC(Elastic Weight Consolidation):对重要参数施加正则约束
- 记忆回放 :保留少量旧数据与新数据混合训练
- 知识蒸馏 :用旧模型指导新模型学习
开放性问题
对于柔性物体(如布料、橡胶)的缺陷检测,传统刚性物体的方法面临新挑战:
1. 形变导致特征不稳定
2. 表面纹理复杂干扰缺陷识别
3. 缺陷边界模糊
可能的解决方向:
– 基于物理的形变建模
– 利用材料力学特性设计专用特征
– 结合触觉传感器的多模态检测
欢迎大家在评论区分享自己的实践经验。
正文完
发表至: 未分类
近一天内
