共计 1458 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
工业缺陷检测是计算机视觉领域的一个重要应用场景,但在实际落地过程中常常会遇到以下挑战:

- 正负样本极度不均衡。正常情况下 99% 的样本都是正常样本,缺陷样本占比极少。
- 传统监督学习方法需要大量标注好的缺陷样本,但工业场景中获取这些样本成本高昂。
- 通用的预训练模型在特定工业场景下泛化性能往往不够理想。
技术方案
Anomalib 库提供了一套基于 PyTorch Lightning 的解决方案,特别适合处理这类问题。我们主要采用以下技术路线:
- PatchCore 模型:通过预训练的卷积神经网络提取多尺度特征,无需微调即可获得不错的特征表示。
- Memory Bank 机制:仅需少量正常样本就能构建特征库,有效解决小样本问题。
- Gaussian Mixture Model:替代传统的固定阈值分割,能更好地适应不同场景的异常评分分布。
代码实现
1. 安装环境
pip install anomalib torch lightning
2. 自定义数据集 DataModule
from anomalib.data import AnomalibDataModule
class CustomDataModule(AnomalibDataModule):
def __init__(self, root_dir, batch_size=32):
super().__init__(batch_size=batch_size)
self.root_dir = root_dir
def setup(self, stage=None):
# 实现数据集加载逻辑
self.train_data = ...
self.test_data = ...
3. 模型训练
from anomalib.models import Patchcore
from anomalib.engine import Engine
model = Patchcore(
backbone="wide_resnet50_2",
layers=["layer2", "layer3"],
pre_trained=True
)
data_module = CustomDataModule("/path/to/dataset")
engine = Engine(max_epochs=50)
engine.fit(model, data_module)
避坑指南
处理非 RGB 图像
对于 X 光片等单通道图像,需要特别注意通道适配:
- 在数据预处理时增加通道维度
- 使用
torch.repeat复制为 3 通道
# 单通道转 3 通道示例
if image.ndim == 2:
image = image.unsqueeze(0).repeat(3, 1, 1)
显存优化
当遇到显存不足时,可以通过梯度累积解决:
engine = Engine(
max_epochs=50,
accumulate_grad_batches=4 # 每 4 个 batch 更新一次梯度
)
评估指标选择
- AUROC:适用于样本极度不均衡的情况
- F1-score:需要设置合理的阈值
实践建议
- 从少量正常样本开始,逐步增加数据量
- 尝试不同的 backbone 网络(ResNet, EfficientNet 等)
- 使用 t -SNE 可视化特征空间分布
完整的 Colab 实践代码可以参考:Anomalib 自定义数据集示例
扩展阅读
- Anomalib 官方文档
- 《Few-shot Anomaly Detection》论文
- 工业缺陷检测数据集(MVTec, DAGM 等)
通过这套方案,我们在多个工业项目中将缺陷检测准确率提升了 30% 以上,同时大大降低了标注成本。希望这篇实践指南能帮助你快速上手 Anomalib,解决实际的工业检测问题。
正文完
