无监督工业缺陷检测新突破:HLGFA高低分辨率引导机制解析

发布时间:2026/10/12 22:50:45
无监督工业缺陷检测新突破:HLGFA高低分辨率引导机制解析
做工业视觉这几年我最头疼的从来不是“算法不够聪明”而是“坏品样本根本不够”。一个外观检测项目里良品能堆满几个硬盘缺陷图却可能一个月都凑不出几百张更麻烦的是这批缺陷和下一批可能长得完全不一样。正因为这种现实无监督工业缺陷检测的热度一直没降过——大家拼的是同一件事能不能只拿正常样本训练就把从没见过的新缺陷也揪出来。最近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×64stage3是32×32stage4是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]), modebilinear, align_cornersFalse)。第二种是在骨干网络层面就把各stage的输出对齐到统一尺寸比如都上采样到输入图像的1/4分辨率再做后续引导计算。第二种做法更省心因为后续所有模块都工作在固定分辨率上不容易出错。还有一个容易被忽略的细节是align_corners这个参数。不同的设置会改变插值坐标映射方式尤其在偶数到奇数尺寸变化时偏差虽然只有一两个像素但在缺陷检测这种对边缘敏感的任务里可能直接造成热力图偏移。建议在项目初始化时就把所有插值统一成同一套参数不要这个模块用align_cornersTrue另一个模块用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上复现到什么水平都不要直接拿榜单参数硬套自己的产线数据。建议先拿二三十张现场正常图快速建一个最小可用版本跑通上面提到的阈值校准和热力图输出链路再逐步优化。无监督缺陷检测的好处本来就是轻量启动别等项目全做完了才拿到现场验证。