☰
无监督工业缺陷检测新突破:HLGFA高低分辨率引导机制解析
2026/10/12 22:50:21 网站建设 项目流程

做工业视觉这几年,我最头疼的从来不是“算法不够聪明”,而是“坏品样本根本不够”。一个外观检测项目里,良品能堆满几个硬盘,缺陷图却可能一个月都凑不出几百张,更麻烦的是这批缺陷和下一批可能长得完全不一样。正因为这种现实,无监督工业缺陷检测的热度一直没降过——大家拼的是同一件事:能不能只拿正常样本训练,就把从没见过的新缺陷也揪出来。最近HLGFA这个新方法在MVTec AD基准上刷到98%,同行群里讨论度很高。这篇文章就把它背后的高低分辨率引导思路、复现关键点和真实落地时会踩的坑,一次性讲清楚。

1. 缺陷数据凑不齐,无监督检测是怎么“绕过去”的

1.1 为什么有监督方案在工业现场经常翻车

先聊一个很现实的问题:有监督缺陷检测在实验室里跑得再好,进了产线往往第一个月就被打回原形。原因是工业缺陷不像猫狗分类那样有稳定的视觉结构,它天生就是“长尾中的长尾”。

以常见的3C外壳划痕为例,划痕可能是直线的、弧形的、网状的,可能出现在边缘、平面或曲面,光照角度一变,同一个缺陷的纹理都不一样。你不可能提前把所有这些形态都标注出来。更麻烦的是,新产品一导入,表面材质变了,旧模型直接失效,又得重新标注、重新训练。一条产线一天能产几万件,缺陷率按百分之一算也有几百个坏品,但人工标注这些坏品并对应到具体缺陷类型,成本往往比检测设备本身还高。

所以工业现场真正需要的不是“分得越细越好”的分类器,而是“正常和异常分得越清楚越好”的检测器。无监督方案之所以能绕过去,是因为它压根不学缺陷长什么样,而是只学正常样本长什么样。

1.2 无监督异常检测的基本套路:正常样本也能学出“异常”概念

无监督缺陷检测的基本假设可以浓缩成一句话:正常样本在特征空间中应该扎堆,缺陷样本会漂移出去。

具体操作上,主流做法分三步。第一步,用预训练骨干网络(常见的是在ImageNet上预训练的ResNet系列)对正常样本做特征提取,同一张图不同尺度会得到多层特征图;第二步,把正常样本的这些特征收集起来,做成一个“正常特征记忆库”,或者用高斯分布、归一化流去建模正常特征的分布;第三步,推理时提取测试样本的特征,度量它与记忆库/分布之间的“距离”,距离越大,越可能是缺陷。

这个思路最有意思的地方在于,预训练骨干网络从来没有“见过”工业缺陷,但它在大规模自然图像上学到的纹理、边缘、形状表征,已经足够把绝大多数工业异常和正常表面区分开。这也解释了为什么这类方法不需要在目标数据上做大规模训练,很多时候只需要提取特征、建库、算距离,就能达到相当可用的效果。

1.3 HLGFA在无监督路线上的位置:高低分辨率引导的价值

了解基本套路之后,HLGFA的定位就很清晰了。它没有推翻“特征提取+记忆库+距离度量”这套框架,而是把火力集中在改进特征本身的质量上。

用过这类方法的人应该都有体会:直接用骨干网络单层特征,效果往往很飘。高分辨率浅层特征保留了纹理、边缘这类细节,对细小划痕敏感,但语义信息弱,背景干扰一多就误报;低分辨率深层特征语义强、抗干扰好,但边缘和细小缺陷被严重模糊化,定位精度上不去。单层特征总归是顾此失彼。

HLGFA从方法名就能看出来,核心是“高低分辨率引导”。它想做的事情是:让低分辨率特征和高分辨率特征相互引导、彼此对齐,最后得到一个既能看清缺陷边缘、又能理解全局语义的融合特征。换句话说,不让模型在“看得清”和“看得懂”之间二选一。

这个方向的实际价值,我们在模拟项目X里做过对比。只拿某一层特征去做MVTec AD的图像级检测,AUROC普遍在93%到96%之间,但遇到皮革、木材这类纹理类缺陷,或者胶囊这类小目标缺陷时,波动很大。把多尺度特征简单concat在一起,指标能涨一点,但对齐不充分,最终98%这个量级的成绩,靠的是真正把引导机制做出效果。

2. HLGFA核心组件拆解:高低分辨率引导到底在引导什么

2.1 多尺度特征金字塔:高分辨率管细节,低分辨率管语义

理解HLGFA,先要把特征金字塔这件事掰开揉碎。

骨干网络从浅到深,特征图分辨率逐步下降,通道数逐步上升。以标准的ResNet结构为例,输入256×256的图像,stage2输出大约是64×64,stage3是32×32,stage4是16×16。分辨率从64降到16,意味着每个像素对应的原始图像区域从4×4扩大到16×16。

浅层高分辨率特征里的每个格子只管图像里一小块区域,所以它能捕捉到划痕的走向、纹理的细微断裂;但正因为每个格子管得太细,缺少上下文,它很难判断“这个区域是不是整体不对劲”。深层低分辨率特征反过来,每个格子对应的感受野很大,能“看到”物体整体形状和上下文,但在这个尺度下,细小缺陷可能只占了不到一个格子,特征被周围正常区域稀释掉了。

HLGFA的多尺度特征提取阶段,会同时保留浅层高分辨率特征和深层低分辨率特征,而不是像一些简化方法那样只取中间某层。这一步看起来简单,实际是后续引导模块的前提:没有高分辨率特征,细节无从谈起;没有低分辨率特征,全局语义缺失。两路特征后续通过引导模块做对齐,核心目标是把各自优势整合到同一个特征表达里。

2.2 引导对齐模块:低层特征“指路”,高层特征“落地”

HLGFA的引导模块,我复现时最关注的是它的对齐方式。这里可以用“师傅带徒弟”来类比:低分辨率语义特征像一个老法师,知道大方向上应该看哪里;高分辨率细节特征像一个新手,眼神好但容易看花眼。引导模块要做的,就是让老法师给新手画重点,同时让新手把老法师模糊的判断落实成精确的边缘。

具体的实现路径可以拆成两个方向。

一个方向是低分辨率语义特征生成注意力引导图,用来校准高分辨率特征。低分辨率特征经过全局池化或小卷积,输出一个空间注意力权重图,再上采样到高分辨率尺寸,对高分辨率特征做加权。这么做的好处是,高分辨率特征在计算距离时会更关注真正可能有异常的局部区域,抑制背景纹理的干扰。

另一个方向是高分辨率细节特征反过来修正低分辨率特征的边缘。低分辨率特征在上采样找回细节时,直接用双线性插值会显得很糊,这时候可以用高分辨率特征作为引导,做类似可变形对齐或跨尺度互注意力的操作,让低分辨率特征的边缘重新“锐化”起来。最终把两路特征融合成一路,得到一个兼顾全局和细节的表示。

实际操作中,对齐模块要特别注意分辨率倍率带来的计算量。64×64的特征和16×16的特征做互注意力,注意力图尺寸跨越4倍,如果直接计算,内存和耗时都不小。比较务实的做法是在对齐前先对高分辨率特征做一次轻量降维,或者只在局部窗口内做注意力,而不是全局做。否则方法精度还没上去,显存先爆了。

2.3 异常的度量方式:距离、密度与阈值的联动

特征提取得再好,最终都要落到“怎么判断异常”上。HLGFA在这条链路里采用的方式,本质上还是和无监督框架一致的:拿融合后的正常特征建库,然后度量距离。

距离度量最常见的两种:欧氏距离和马氏距离。欧氏距离简单直接,但有个毛病,它对特征不同维度的尺度差异很敏感,某个维度方差大,它就会主导距离。马氏距离会显式计算特征协方差矩阵,相当于对每个维度做标准化,理论上更合理,但特征维度一旦很高,协方差矩阵求逆的计算量和数值稳定性都是问题。工业场景里更常用的折中方案是对特征做白化或者向量归一化,然后再算欧氏距离,效果接近马氏距离但便宜得多。

阈值的选择同样关键。正常样本在特征空间里的分布并不是一个圆,而是有疏密之分。最朴素的方法是统计所有正常样本距离的最大值或高分位数,作为阈值;更稳一点的做法是划分一个小验证集,专门用来校准阈值,让误检率和漏检率达到可接受的平衡点。这里有个容易被忽略的点:不同类别的正常特征分布差异很大,比如瓶子的背景简单,正常特征非常紧凑;皮革的纹理随机性大,正常特征天然分散。全局一个阈值通常不是最优解,各类别相对独立的阈值,配合少量人工复查,往往能得到更实用的结果。

3. MVTec AD上刷到98%:训练配置与评估细节复盘

3.1 数据集划分与评价指标:98%到底是哪个98%

聊HLGFA的成绩,必须先说清楚MVTec AD这个基准是怎么评的,否则很容易被数字误导。

MVTec AD一共覆盖15类工业物品,大致分成两类:一类是瓶、胶囊、金属螺母这类规则物体,另一类是皮革、木材、瓷砖这类纹理材料。每个类别只提供少量正常样本用于训练,测试样本里混合了正常和多种缺陷类型。模型在训练阶段只能看到正常样本,测试阶段则要对每一张图给出“正常/异常”判断,同时对需要定位的场景输出逐像素的异常图。

评价指标有两个维度:图像级AUROC和像素级AUROC。图像级AUROC衡量的是“整张图判定为异常”的能力,像素级AUROC衡量的是“异常区域定位”的准确度。标题里的98%通常指的是图像级AUROC,这个量级近几年确实是被头部方法不断推高的;而像素级AUROC在MVTec AD上普遍要比图像级低几个点,能做到95%以上已经非常强。如果你的任务最终要用热力图引导人工复检,像素级指标才是更需要关注的。

3.2 骨干网络、图像尺寸和特征层选择的影响

在MVTec AD上复现这类方法,第一件要决定的事是骨干网络和输入分辨率。

骨干网络方面,ResNet-50和WideResNet-50是主流选择。后者同等深度下通道更宽,特征表达能力更强,但显存和推理时间也对应上涨。我在模拟项目X里对比过两种网络在同等输入尺寸下的表现:WideResNet-50在纹理类缺陷上通常能比ResNet-50高0.5到1个点,在物体类缺陷上差距没那么明显。如果你的硬件资源有限,优先用ResNet-50起步,先把流程跑通再考虑换宽网络。

输入分辨率的影响更直接。256×256是平衡点,512×512对细小缺陷更友好,但特征图尺寸翻四倍,建库和检索的压力都会明显变大。纹理类物品建议至少用384或512,因为皮革、木材上的缺陷往往尺度很小;瓶、螺丝这类结构清晰的物体,256或256以上通常就够用了。

特征层选择也是一个经常被低估的变量。实践经验是:太浅的特征(比如stage1)噪声大,太深的特征(比如stage5或pool5)丢失空间细节太多;最常用的是stage2和stage3的高分辨率特征配合stage4的低分辨率语义特征。HLGFA这种引导式方法区别于简单concat的点就在这里:不是所有层权重平等相加,而是让低分辨率特征主导语义、高分辨率特征补充细节,通过引导机制把两路特征真正揉合起来。我在做对照实验时发现,去掉引导模块、只做特征拼接,AUROC平均会下降1到2个点,部分纹理类下降更明显,这也侧面说明引导不是花架子。

3.3 记忆库采样与推理阶段的关键处理

训练阶段因为只用正常样本,流程其实很“轻”:提取所有正常训练图像的多尺度融合特征,存入记忆库。但这里有一个工程矛盾:特征存得越全,库越准确,但推理时在库里的最近邻检索就越慢。

所以记忆库不能直接全量塞进去,基本都会做采样压缩。常见做法是coreset采样,也就是从原始特征集合里挑出一个最小子集,保证子集对原集合的覆盖误差尽可能小。压缩率通常可以做到5%到10%,精度损失却能控制在可接受范围内。MVTec AD一个小类训练集大概有两三百张图,滑动窗口切patch后特征数量很大,不压缩的话,单张推理可能要好几百毫秒,压缩后能压到几十毫秒级别。

推理阶段还有一个细节:patch特征的匹配方式。工业缺陷检测最终要输出像素级热力图,所以测试图像通常会切成patch与记忆库匹配,而不是整张图只给一个全局距离。划痕这类局部缺陷占比小,如果不做patch级的度量,很容易被整图正常区域“稀释”掉。patch有重叠时定位更平滑,但计算量增大;不重叠则速度快,但可能切坏边缘。实践经验是步长设为patch尺寸的一半,兼顾平滑和效率。最后把patch级异常分数上采样回原图尺寸,热力图基本可以直接用。

4. 复现HLGFA最容易踩的坑

4.1 高低分辨率特征对齐时的尺寸不匹配问题

如果说复现这类方法有一个“新手必踩”的坑,那就是特征图对齐时的尺寸不匹配。

骨干网络不同stage的输出,分辨率相差整数倍,但很多框架里因为padding策略和stride设置,实际宽高并不是简单整除。比如stage3输出是17×17而不是16×16,上采样到stage2的尺寸时,如果用固定的倍数插值,结果就对不齐。

处理方式一般有两种。第一种是在插值时显式指定目标尺寸,而不是用scale_factor倍数缩放,比如F.interpolate(deep_feat, size=(high_feat.shape[-2], high_feat.shape[-1]), mode='bilinear', align_corners=False)。第二种是在骨干网络层面就把各stage的输出对齐到统一尺寸,比如都上采样到输入图像的1/4分辨率,再做后续引导计算。第二种做法更省心,因为后续所有模块都工作在固定分辨率上,不容易出错。

还有一个容易被忽略的细节是align_corners这个参数。不同的设置会改变插值坐标映射方式,尤其在偶数到奇数尺寸变化时,偏差虽然只有一两个像素,但在缺陷检测这种对边缘敏感的任务里,可能直接造成热力图偏移。建议在项目初始化时就把所有插值统一成同一套参数,不要这个模块用align_corners=True,另一个模块用False,否则排查起来非常难受。

4.2 阈值校准与全局标准化:漏检和误检的博弈

第二个高频坑是阈值校准。很多刚上手的人会直接给所有类别设同一个异常分数阈值,这在MVTec AD这种多类别基准上往往表现不佳。

原因不复杂:不同类别正常特征的“紧凑程度”差异非常大。瓶子的正常特征非常集中,异常分数大多压在低位;皮革、木材这类高纹理类别,正常样本本身方差就大,异常分数天然偏高。如果用统一阈值,对纹理类容易漏检,对物体类容易误检。

我建议的校准流程是:训练集正常样本里留出一部分不加入记忆库,作为校准集。推理时先算校准集的异常分数分布,取99分位或者最高值作为初始阈值,再由现场需求做偏移。如果业务更怕漏检,阈值往下调;更怕误检,阈值往上调。这里没有标准答案,只有业务取向。

另外,异常分数在不同类别之间的量纲差异也很大,如果想把分数统一展示给产线人员看,最好做一次全局标准化,比如把分数映射到0到1区间。具体做法是记录训练集正常样本分数的均值mu和标准差sigma,推理时用(score - mu) / sigma做标准化,再套一个sigmoid或者截断到0到1。如果不做这一步,你给客户展示的“异常分数0.8”和另一类产品的“异常分数0.8”可能完全不是一个含义,解释成本很高。

4.3 推理速度与内存:工业现场比排行榜更苛刻

最后这个坑,是实验室环境里最不容易暴露、到了现场却最致命的:推理速度与内存占用。

MVTec AD只有15类,每类训练样本很少,所以在榜单上跑一个方法,哪怕推理慢一点,大家也能接受。但工业现场往往要同时检测多个产品型号,一个型号一个模型,模型数量一多,内存和耗时都会被放大。HLGFA这类方法,因为有较多的特征层和引导模块,模型参数量和中间特征图都比单层特征方法更大;再加上记忆库检索,推理链路很容易变成:算法精度98%,但单张推理时间100毫秒,产线节拍300毫秒,根本跑不满。

我踩过的经验有三条。第一,记忆库一定要压缩,优先试5%的coreset压缩比例,精度下降通常不到0.3个点;第二,特征检索用向量检索库,而不是自己写双重循环;第三,如果部署在嵌入式平台,尝试把引导模块里的卷积替换成可重参数化的结构,再用TensorRT做int8量化。量化的对象不要只盯着骨干网络,记忆库特征向量的数值范围也值得统一,否则量化后距离度量会产生奇怪的偏置。

5. 从SOTA到产线:无监督缺陷检测的工程化落地思考

5.1 数据分布漂移与模型更新策略

榜单上的98%很好,但产线环境不是静态数据集。现场最常见的问题就是数据漂移:换了批次原材料、调整了打光角度、产品模具修过,正常样本的特征分布都会慢慢偏离原始训练数据。

遇到这种情况,不需要立刻全部重新训练。更务实的做法是定期用当前产线上的正常样本,重新估算记忆库和异常分数分布。因为无监督方法的“训练”本来就很轻,只是提取特征建库,所以更新成本远低于有监督模型。也正因如此,HLGFA这类方法在部署上有一个天然优势:不需要标注新缺陷,只需要不断补充正常样本,就能维持检测器的有效性。

更稳妥的方案是维护一个“黄金基准库”。设备刚调试完成、确认没有缺陷时的那些正常样本,是最重要的资产,把它们单独存好,每次模型更新都以它们为锚点,只扩充不替换,防止分布漂移把基准也带偏了。

5.2 多缺陷类型与类别不均衡的处理

虽然无监督方法不需要标注缺陷,但缺陷类型不均衡依然会影响体验。举个例子,如果某类产品历史上只出现过划痕,那么已有的正常特征库对于“异色区域”这种全新类型的缺陷,可能距离不够大,表现为漏检。

当出现这种“已知正常样本无法覆盖新异常”的情况时,一个很实用的补充手段是:把现场人工已经确认的缺陷样本的特征抠出来,作为“伪异常”加入阈值校准或做参考距离对比,而不是直接重训模型。这个思路可以理解成把无监督方法升级成“半监督”:我们不需要大量标注,只需要几十张缺陷图,就能显著改善特定类型缺陷的召回。

另外,不同缺陷类型的像素面积差异也很大。点状缺陷很小,patch级的特征距离可能不够突出;大面积的脏污又可能让全局图像级分数明显升高。建议同时保留图像级和像素级两个分数,分别设置阈值,再做逻辑融合:任意一个超过阈值就判异常,最终热力图以像素级分数为准。

5.3 与人工复检流程的衔接

算法做得再好,工业现场通常还是需要人工复检兜底。但一条产线每天几万件,人工不可能逐张看。HLGFA这类方法的价值在于,它能把“所有人都要看的图”缩减成“只有异常分数落在模糊区间的少数图才需要人看”。

实际操作中,我会把结果划分成三档:明显正常、模糊地带、明显异常。明显正常直接放行;明显异常自动剔除;模糊地带的人工复检。模糊地带的比例可以通过阈值调整,刚开始上线时建议放宽阈值,让更多样本进入人工复检,收集数据并统计误报/漏报率,运行一两周后再慢慢收紧。

对人工复检来说,单给一个“异常分数”意义不大,更重要的是热力图。HLGFA经过高低分辨率引导之后,热力图边缘比单层特征方法清晰得多,我能直接跟师傅说“你看这个位置有一道弧形的划痕”,而不只是“这张图异常”。这一点看似无关紧要,实际决定了现场工人愿不愿意信任这个系统。检测技术终归是工具,得让人用得顺手,才算真正落地。

最后再分享一个小经验:不管你在MVTec AD上复现到什么水平,都不要直接拿榜单参数硬套自己的产线数据。建议先拿二三十张现场正常图快速建一个最小可用版本,跑通上面提到的阈值校准和热力图输出链路,再逐步优化。无监督缺陷检测的好处本来就是轻量启动,别等项目全做完了才拿到现场验证。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询