点击上方蓝字关注我们
关注获取更多计算机视觉与深度学习知识
基于CLIP—图文对齐的语义先验
CLIP的核心优势在于它通过图文预训练建立了视觉特征与语义概念的对应关系。在零样本缺陷检测中,这个特性可以被巧妙地利用。
实现逻辑:
- 使用CLIP的Vision Transformer作为图像编码器,提取图像的patch特征图
- 同时利用CLIP的文本编码器,构造两类文本描述:"a good product"和"a defective product with anomaly"
- 关键在于:将图像的分类特征token(CLS token)与patch特征图进行联合推理
具体做法:
- 输入图像通过Vision Transformer,得到[CLS]特征(代表全局语义)和patch特征网格(代表局部细节)
- [CLS]特征与文本特征进行相似度计算,得到初步的异常倾向判断
- 更重要的是,将[CLS]特征作为“查询”,与每个patch特征做交叉注意力,定位哪些patch与全局“正常语义”不一致
- 最终输出:异常分数(0-1标量)+ 异常分割热力图
基于CLIP实现的,五分钟急速换型,任意样本,4张图即可检测 - 演示
这种方法天然带有语义理解能力,适合那些“缺陷可以用文字描述”的场景(如划痕、污渍、缺角)。缺点是CLIP训练时主要以自然图像为主,工业图像的分布差异需要调整提示词来弥补
基于DINO—自监督特征的比对
DINO(self-distillation with no labels)是一个自监督训练的Vision Transformer,它的特点是:同一个物体的不同视角、不同变形,在特征空间中会保持相似。换句话说,DINO对物体内部的“正常变化”很鲁棒,但对“异常区域”很敏感。
实现逻辑:
- 不依赖任何标签,DINO已经学会了什么是“物体的内在结构”
- 核心假设:正常样本的图像块之间,特征应该是相似的;而缺陷区域的特征会明显偏离正常分布
具体做法:
- 收集一批正常的参考图像(比如10-20张无缺陷的样本),用DINO ViT提取它们的patch特征,构建一个特征库
- 对测试图像,同样提取patch特征
- 对于测试图像中的每个patch,在参考特征库中寻找最近邻匹配
- 计算匹配距离——距离大的位置,就是潜在的异常区域
- 输出:异常分割mask + 整图的异常分数(可通过对mask区域取平均得到)
特点:DINO的优势在于它对纹理和结构的表征非常细致,特别是对于规则纹理、重复图案的工业品(如布料、PCB板、金属表面),效果往往很好。完全不需要训练,只需要10-20张正常参考图即可工作。
PatchCore的DINO增强版
PatchCore原本是一个基于ImageNet预训练ResNet的特征提取方法,但引入DINO后可以显著提升性能,尤其是在纹理型缺陷上。
核心改进:
- 特征提取器替换:将原始PatchCore用的ResNet backbone替换为DINO ViT(推荐ViT-S/16或ViT-B/16)
- 特征聚合策略保留:核心仍然是coreset sampling + 最近邻搜索,但特征空间的维度更高、更结构化
具体做法:
- 使用DINO ViT提取正常样本的patch特征,每个patch特征可以来自多个Transformer层的拼接(例如layer 9和layer 11的特征)
- 应用贪心coreset采样,在保持特征覆盖度的前提下压缩特征库大小,降低推理时的计算开销
- 异常检测:对测试图像每个patch,计算其在coreset特征库中的最近邻距离
- 高维相似度比较的关键改进——因为DINO特征的维度通常比ResNet高(768维 vs 256维),直接用欧氏距离可能产生维度灾难,建议使用余弦相似度或经过PCA降维后再计算欧氏距离
- 对距离矩阵进行高斯平滑,得到最终的异常分割mask
为什么DINO比ResNet更好:
- DINO的自监督训练使得特征对物体内部的语义一致性更敏感
- 多层特征融合可以同时捕获局部纹理信息和更全局的结构信息
- 在MVTec AD等工业基准上,DINO版PatchCore通常比原始PatchCore提高3-5个百分点的AUROC
结论
对于大多数工业场景,建议从方法三(DINO+PatchCore)开始尝试,因为它综合了DINO的特征表达能力和PatchCore成熟的检测框架,且对异常召回率和定位精度都表现均衡。如果希望模型能理解“这是什么类型的缺陷”,再引入CLIP的思路作为补充。
三种方法都无需训练,唯一的成本是推理时的特征提取和最近邻搜索,在现代GPU上处理一张图通常在50-200ms之间。