共计 1849 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
工业缺陷检测是质量管控的重要环节,但实际落地面临两大核心挑战:

- 数据不均衡问题:正常样本占绝大多数,缺陷样本可能仅占 1% 甚至更少,导致模型容易偏向预测为正常类别
- 标注成本高昂:每个缺陷需要专业人员标注精确位置和类型,一条产线每天产生数万张图像,全标注不现实
传统监督学习方法(如 Faster R-CNN)在这种场景下效果有限,而 Anomalib 提供的半监督框架只需少量正常样本即可训练,完美契合工业需求。
技术方案
1. 框架选择
Anomalib 支持多种前沿算法,根据我们的实验对比:
- PaDiM:适合纹理类缺陷(如布料瑕疵),利用预训练 CNN 特征构建高斯分布
- PatchCore:对结构性缺陷更敏感(如零件缺失),通过内存库保存代表性特征
2. 数据准备
工业数据需转换为 MVTec 标准格式(官方示例结构如下):
dataset/
├── train/
│ ├── good/ # 仅放正常样本
│ │ ├── img1.png
│ │ └── ...
├── test/
│ ├── good/
│ ├── defect_type1/
│ └── ...
└── ground_truth/ # 掩码目录(可选)
3. 模型微调
关键技巧:
- 特征层冻结:保持 backbone(如 ResNet)的前几层权重固定,仅微调深层
- 学习率分层:骨干网络使用更低学习率(通常 1e-5),新加层用 1e-3
代码实现
数据加载示例
# 数据增强配置
train_transform = A.Compose([A.Resize(256, 256),
A.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
A.HorizontalFlip(p=0.5) # 仅对正常样本增强
])
# 自定义数据集类
class MVTecDataset(Dataset):
def __init__(self, root_dir, transform=None):
self.image_paths = [p for p in Path(root_dir).rglob('*.png')
if 'good' in str(p)
]
self.transform = transform
def __getitem__(self, idx):
img = cv2.imread(str(self.image_paths[idx]))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
if self.transform:
img = self.transform(image=img)['image']
return img
关键配置(config.yaml)
model:
name: padim
backbone: resnet18
layers: [layer1, layer2, layer3] # 提取特征层级
data:
init_size: 256
target_size: 224
optimization:
batch_size: 32
lr: 1e-4
避坑指南
1. 小样本增强策略
- 对正常样本使用 几何变换(旋转 / 翻转)
- 避免使用色彩扰动,可能破坏工业图像的色度特征
2. 显存优化
当遇到 CUDA out of memory 时:
- 启用梯度累积
# 每 4 个 batch 更新一次参数 for i, batch in enumerate(dataloader): loss = model(batch) loss.backward() if (i+1) % 4 == 0: optimizer.step() optimizer.zero_grad()
3. 损失函数选择
推荐使用 Focal Loss 应对类别不平衡:
criterion = FocalLoss(alpha=0.75, gamma=2)
性能优化
1. Backbone 对比
| 模型 | 参数量 | 推理速度(FPS) | AUC |
|---|---|---|---|
| ResNet18 | 11M | 85 | 0.912 |
| WideResNet50 | 68M | 32 | 0.934 |
2. ONNX 导出要点
torch.onnx.export(
model,
dummy_input,
"model.onnx",
opset_version=11, # 必须≥11
dynamic_axes={'input': {0: 'batch'}},
input_names=['input'],
output_names=['anomaly_map']
)
开放性问题
在动态光照环境下(如金属件反光),现有方法容易出现误检。可能的解决方向:
- 在数据预处理阶段增加 光照归一化(如 Retinex 算法)
- 使用多光谱摄像头采集额外通道信息
- 设计对光照鲁棒的特征提取模块
期待与各位同行探讨更多工业场景的实战经验!
正文完
