共计 1761 个字符,预计需要花费 5 分钟才能阅读完成。
工业质检的痛点与 Anomalib 的优势
在工业质检场景中,我们常常遇到三大难题:

- 数据稀缺:实际产线能收集到的缺陷样本往往不足正样本的 1%,且缺陷形态差异大
- 泛化困难:公开预训练模型(如 Cityscapes 数据集)对金属划痕、纺织瑕疵等特定缺陷表现不佳
- 细节丢失:传统 Unet 在检测微米级缺陷时,边界 IoU 常低于 0.3
通过对比实验发现,Anomalib 在以下方面表现突出:
- 小样本适应:Padim 算法仅需 15-20 张正常样本即可建立基准分布
- 注意力机制:其特有的
Mahalanobis Attention模块对表面纹理变化敏感 - 轻量部署:量化后模型体积可压缩至原版的 1 /4
数据准备实战技巧
标注格式转换
工业数据通常使用 Labelme 或 CVAT 标注,需转换为 COCO 格式后再处理。关键脚本如下:
# 转换 LabelmeJSON 到 COCO 格式
import json
from pycocotools.coco import COCO
def convert(labelme_json):
coco = {
"images": [{
"id": img_count,
"file_name": Path(json_file).stem + ".png",
"height": img.shape[0],
"width": img.shape[1]
}],
"annotations": [{
"id": ann_count,
"image_id": img_count,
"category_id": 1, # 工业缺陷通常单类别
"segmentation": [], # 填充多边形坐标
"area": cv2.contourArea(np.array(shape['points']))
}]
}
with open('train.json', 'w') as f:
json.dump(coco, f)
数据增强策略
针对工业图像特点,推荐使用 Albumentations 组合:
aug = Compose([RandomGamma(gamma_limit=(80,120), p=0.5), # 模拟光照变化
GridDistortion(num_steps=5, distort_limit=0.3, p=0.3), # 弹性形变
CoarseDropout(max_holes=8, max_height=32, max_width=32, p=0.5) # 模拟遮挡
], additional_targets={'mask': 'mask'})
模型配置关键参数
在 model.yaml 中需要特别关注:
model:
name: padim
backbone: wide_resnet50_2 # 平衡精度与速度
layers:
- layer1
- layer2
- layer3 # 多尺度特征提取
trainer:
max_epochs: 100
precision: 16-mixed # 混合精度训练
check_val_every_n_epoch: 5
训练中的常见陷阱
- 通道数问题:
-
工业相机可能输出灰度图,需在数据加载时统一扩展为 3 通道
image = cv2.cvtColor(gray_img, cv2.COLOR_GRAY2RGB) -
数据泄漏:
- 避免在增强前划分验证集,否则可能引入相似样本
-
建议先整体增强再按 8:2 随机分割
-
梯度爆炸:
- 启用混合精度时添加梯度裁剪
trainer = pl.Trainer(gradient_clip_val=0.5)
性能优化对比
在 NEU Surface Defect 数据集上的测试结果:
| 方法 | F1-score | 推理时延(ms) |
|---|---|---|
| Padim | 0.89 | 45 |
| PatchCore | 0.85 | 62 |
| 传统阈值分割 | 0.52 | 15 |
部署优化建议
-
使用 TensorRT 加速:
trtexec --onnx=model.onnx --saveEngine=model.plan -
动态量化示例:
model = quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8)
开放探索方向
- 不同归一化策略的影响:
- LayerNorm vs BatchNorm 在微小缺陷检测中的差异
-
尝试 InstanceNorm 处理纹理变化
-
多模态融合:
- 结合红外图像与可见光通道
- 时间序列分析连续帧变化
在实际项目中,我们发现调整特征层的 temperature 参数(默认 1.0)对金属表面检测特别有效,建议在 0.7-1.3 范围内网格搜索。
正文完
