我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

小样本工业缺陷检测落地实战:从训练到漏检控制全流程

小样本工业缺陷检测落地实战:从训练到漏检控制全流程 零检出难小样本难两件事放一起更难。我先说一个我实际见过的场景:某五金件表面质检项目良品样本攒了12万张缺陷样本一共827张分布在一道划痕、压伤、脏污、砂眼四个类别里其中砂眼只有76张。甲方要求两星期内跑通流程漏检率在一个月后的产线抽检中不能高于千分之五。没有专门的数据团队标注员是车间抽调的质检员。这个背景几乎就是现在大多数想做工业视觉质检的工厂的真实写照——不是不想用深度学习是数据给不起错检又承担不起。这篇文章就围绕一个核心问题展开在缺陷样本极其有限、产线节拍又不允许反复试错的情况下怎样把一个缺陷检测模型真正落地上线。内容按我的实操顺序来写先讲小样本为什么是常态而不是例外再拆解四条能走通的小样本训练路径然后重点讲漏检控制这件事怎么从“口号”变成具体工程手段最后给一套我整理过的完整落地流程和踩坑记录。适合正在做产线视觉方案的朋友也适合刚开始从通用CV转向工业检测的算法工程师。1. 为什么小样本才是工业缺陷检测的常态而不是特定项目的偶发情况很多做通用视觉的人刚接触工业项目时最不适应的就是数据量级。在公开数据集上类别动辄上千每类几千张图是常态在产线上情况完全反过来。良品图要多少有多少缺陷图挤牙膏一样凑不出几百张。这不是某一个工厂数据管理水平的问题而是工业场景的结构性矛盾搞懂这个矛盾后面所有决策才有依据。1.1 缺陷本质上是稀有事件采集成本被良品率稀释产线真实缺陷率通常在0.5%到2%之间。这意味着什么呢假设一条产线一天生产一万件产品其中合格品九千八百件以上真实的缺陷产品可能就五六十件。相机可以每秒拍好几张图数据总量从来不缺唯独缺陷那一类需要连续开机好几天才能攒出一小撮。更要命的是缺陷的种类不是均匀分布的。长尾效应在工业缺陷里体现得极为极端常见的划痕占比可能过半而某些关键缺陷比如内部裂纹、特定位置的砂眼可能一周也遇不到一次。我在一个注塑件项目里统计过某型号壳体表面有一处冷料痕缺陷两个月只出现过29次还不够训一个像样的分类器。打光也一样影响数据有效性。车间光照条件会随白天黑夜、季节、甚至相邻产线开关而变化。同一个缺陷在上午九点的光线下和下午三点的光线下图像特征差异可能比不同缺陷之间的差异还大。所以“小样本”从来不是单纯的个数少而是在环境变化和类别多样性共同作用下模型能覆盖的缺陷模式太少。1.2 小样本的本质不是“图片少”而是分布覆盖不全我习惯用一个类比来解释小样本问题缺陷样本就像是地图上的坐标点。如果地图上只有十几个点你要规划一条从A到B的路线大概率会绕远甚至掉沟里。说要“多采集数据”当然没错但在时间和项目节奏约束下更现实的问题是怎么用已有的几十上百个点把地图上可能是路的地方都猜个八九不离十。这就是为什么纯数据路数在小样本场景下会失效。光做旋转、翻转、平移这类几何增广本质是在已有的坐标点上反复画圈覆盖不了那些你根本没见过的新形态。真正有用的增广得能把一个划痕样本通过变化生成出“看起来像换个位置、换种宽度、换种反光”的新样本这就牵扯到后文要讲的域内增广和合成策略。另外必须意识到小样本场景下模型很容易“背答案”。传统分类器只要记住了训练集里那76张砂眼图的纹理细节在训练集上的表现几乎可以接近完美但这毫无意义。测试集一旦出现光照偏移、位置偏移、尺度变化模型就原形毕露。所以整个训练策略的设计始终要围绕“如何让模型学习缺陷的语义共性而不是记忆图片噪声”展开。1.3 漏检控制为什么是小样本场景下真正的胜负手很多项目死掉不是因为模型准确率不够高而是因为漏了一件要命的缺陷被客户端投诉到停产。这是工业质检和通用CV最本质的差别通用CV里90%的准确率是产品亮点工业产线上0.5%的漏检就是客诉、返工、甚至丢客户。工业缺陷检测里漏检和误检的成本不对称性非常强。漏检意味着缺陷产品流出到达客户端装配线才发现问题导致整批退货和品牌信誉损失误检意味着把良品判成次品虽然也要返工、补料、停线但至少是内部成本。所以工业界普遍采用“重漏检轻误检”的原则。但注意这绝不意味着可以无底线牺牲误检率。误检率过高会导致产线工位天天爆红灯作业员对系统失去信任最后干脆把报警当噪音忽略掉反而失去整个系统存在的意义。从算法工程角度说小样本训练已经很难了但漏检控制是一种独立于模型精度的工程能力。它包含阈值校准、不确定性估计、人工复检兜底、运行监控等多个环节。在很多实际项目里模型精度提升1个点带来的收益远不如阈值策略和兜底机制做好带来的收益大。这一点我后文会展开讲。2. 小样本训练的四条实战路径数据策略、预训练、损失函数与异常检测改造前面铺垫了问题本质现在讲实际操作。我的经验是可以走通的路有四条它们不是互斥的一般项目要组合使用。我把每条路径的原理、适用场景、需要注意的坑都列出来。2.1 域内增广与缺陷样本合成把有限的缺陷变出“新厂子新线”的感觉先说增广。常规几何增广旋转、镜像、裁剪是基础但在小样本缺陷检测中作用有限原因前文说过这些操作不增加缺陷形态的多样性。真正对工业缺陷更有效的是以下几类亮度与对比度扰动模拟不同时段、不同光源、不同曝光下同一缺陷的表现。范围一般控制在亮度乘以0.5到1.5倍、对比度乘以0.7到1.3倍太小没效果太大则破坏纹理结构。弹性形变与局部扰动模拟同一缺陷在不同压力、不同材质应力下的形变。具体做法是通过网格扰动对局部区域做平滑的非线性形变。注意扰动幅度不能太大否则会破坏缺陷边缘的清晰度甚至把良品纹理扭曲成伪缺陷。噪声叠加加高斯噪声或椒盐噪声模拟相机传感器噪声。安全范围内的加噪可以提升模型对低照度环境下的鲁棒性。背景迁移把缺陷区域从原始图上抠出来粘贴到不同良品表面背景上。这能有效解决“缺陷总是出现在同一个位置”导致的定位过拟合问题。但工作量较大需要缺陷分割标注。实践中可以只对少量样本做把背景换成5到10种不同良品图效果就出得来。合成方法更进阶一些常见的是用渲染或生成模型。比如用一个简单的程序化纹理生成器在金属表面模拟划痕的线性轨迹和深浅变化或者用生成对抗网络/扩散模型对已有缺陷样本进行外观迁移。这类方法在小样本场景下能显著扩充边界形态的覆盖但需要防范一个陷阱合成样本太“干净”和真实产线图像分布差距过大会造成“虚拟集上表现好实线上崩盘”。我给出一个经验性配置基础几何增广只保留镜像和轻微旋转最大15度重点放在亮度对比度扰动和弹性形变上两类各占增广后样本的40%左右再留20%做背景迁移。这样训练出来的模型对环境和位姿变化最敏感而不是对着“同一张图的旋转版本”过拟合。2.2 预训练与自监督策略别急着用ImageNet权重先看看自己的图长什么样小样本训练几乎必然要依赖预训练。但这里有个工业场景特有的大坑用ImageNet分类预训练权重做表面缺陷检测效果往往很一般。原因很简单ImageNet里大量是自然物体猫、狗、车、场景它们的边缘、纹理、颜色结构跟金属表面划痕、注塑件纹理完全不是一个分布。模型在ImageNet上学习的特征是“这是什么物体”而工业缺陷检测要的是“这个表面的局部区域有没有不寻常的纹理变化”本质区别很大。更好的路线是自监督预训练具体来说两种比较实用基于对比学习的预训练SimCLR、BYOL不需要标注只需要产线良品图就可以训练。让模型学习“同一张图的不同增强版本应该拉近不同图的增强版本应该推远”。这样学出来的特征对于表面纹理这种高重复性结构非常敏感。良品图有几千张甚至几万张完全够用。基于掩码重建的预训练MAE将图像随机遮挡一部分然后训练模型重建被遮挡区域。配合工业图像周期性纹理织物、金属拉丝、电路板走线这种方式能学到很强的局部纹理规则性而缺陷本质就是对这种规则性的破坏。我实操下来自监督预训练对后面分类头或异常分数的提升大概在5到10个点的AUC左右远比在ImageNet权重上微调的收益大。成本是多花一天训练时间在现代GPU上三五万张良品让ResNet-50级别的backbone做10到15个epoch的对比例子半天能跑完非常划算。需要注意自监督预训练最好直接用产线自己的良品图不要用网上下载的各种表面纹理集。每个工厂的材质、工艺、抛光程度都不一样预训练数据越贴近实际部署环境特征越有效。2.3 损失函数与模型结构的针对性设计让模型把注意力放在“异常”上当可用缺陷样本有限时损失函数的设计可以在不增加数据的情况下显著提升效果。以下几点是小样本缺陷检测的经典方案Focal Loss专门解决正负样本极端不平衡。核心思想是调制系数让模型更关注那些难分类的样本通常是容易混淆成良品的缺陷。它在缺陷检测上的价值比通用分类领域更大因为它直接抑制了“大比例负样本”带来的学习偏向。度量学习三元组损失Triplet Loss如果目标是让同类缺陷特征接近、不同类特征远离但缺陷类别内差异较大的情况下容易对类别平衡敏感。缺陷类别多且每类样本极少时度量学习能学到一个更稳健的特征空间。操作上用预训练backbone提取特征以anchor-positive-negative三元组训练重点关注最难区分的负样本对比如外观类似的良品纹理。把任务改写成异常检测我越来越推荐这个思路就是放弃“多分类”框架改为训练“仅用良品图”的异常检测模型。代表方法是PatchCore、CFA以及各类基于特征库的方法。它的好处非常直观不需要任何缺陷标注只需要大量良品图这个工业界多得是。部署时模型输出的是一张“异常热图”超过阈值的区域即为缺陷。这种方法天然适配小样本场景因为它的核心假设是“见过的东西都是正常没见过的东西是异常”。在这三种方法中我个人最推荐“异常检测改写后置分类器”的组合先用PatchCore类方法筛出缺陷区域再用一个极小的分类网络比如三层卷积加全连接对检出的缺陷区域进行缺陷类型归类。这样既绕开了缺陷样本不足的问题又保住了下游工艺需要对缺陷分类的需求。2.4 模型规模与数据量的匹配不是越大的模型越准而是越复杂的模型越容易崩小样本数据约束下模型规模的选择容易被忽视。一个ResNet-152在六万张图、每类只有几百张样本的情况下大概率比ResNet-18表现更差。因为参数量大了正则化压力激增在数据量不够时模型只能走捷径——记住训练样本泛化能力基本为零。我的经验公式可训练参数量大致在百万级对应几千到几万张训练图片的小样本场景。ResNet-18、EfficientNet-B0、MobileNetV3这类轻量backbone是安全选择。如果硬件允许用ResNet-50做自监督预训练后的特征提取器之后只训练一个线性层或小全连接头即可。这其实呼应了deep learning的一个规律当数据不足时采用“预训练特征浅层分类头”的方式比端到端微调整个大模型稳得多。大模型的收益需要在充足数据下才能兑现小样本场景下限制模型容量本身就是一种正则化手段。3. 漏检控制的三个抓手阈值校准、不确定性兜底和类别差异化模型训出来了训练集上看着不错接下来才是真正的硬仗控制漏检。很多人以为漏检控制就是“把置信度阈值调低一点”事情没那么简单阈值调低了误检会爆炸产线根本跑不动。漏检控制是一套系统工程至少要从三个层面叠加实现。3.1 阈值校准不要迷信默认0.5要用验证集去找业务目标对应的阈值绝大多数深度学习框架默认把输出概率0.5当作正负类判定边界。但对于工业缺陷检测0.5几乎肯定不是最优的。缺陷类稀少时模型输出的概率分布整体偏低正常的缺陷样本可能只有0.3到0.6的置信度而大部分良品的输出在0.01到0.2之间。在0.5的阈值下漏检率会非常高。正确做法是在验证集上把模型对所有验证样本输出的置信度计算出来然后绘制ROC曲线或精确率-召回率曲线。根据业务目标比如漏检率要低于1%找到对应的阈值点。这个阈值搜索虽然简单但影响极大。我几乎在每个项目里都要做这一步阈值调整带来的漏检率下降通常能比模型结构改进带来更多收益。操作上可以直接写一段阈值扫描脚本import numpy as np from sklearn.metrics import confusion_matrix def search_threshold(scores, labels, target_false_negative_rate0.005): thresholds np.linspace(0.01, 0.99, 200) best_th 0.5 best_far 1.0 # 误检率 for th in thresholds: preds (scores th).astype(int) tn, fp, fn, tp confusion_matrix(labels, preds).ravel() fnr fn / (fn tp 1e-8) # 漏检率 far fp / (fp tn 1e-8) # 误检率 if fnr target_false_negative_rate: if far best_far: best_far far best_th th return best_th, best_far # 输入模型在验证集上对所有样本的scores和真实标签 labels注意一种常见错误在训练集上做阈值搜索。训练集已经被模型见过了概率分布失真得到的阈值几乎不可用。阈值搜索必须在完全没参与训练和微调的独立验证集上进行。另一种情况它们也常见如果验证集规模不大每个缺陷类别只有二三十张直接搜出来的阈值会很不稳定。变通做法是使用置信区间方法选取多个阈值并做交叉验证取“在所有fold上都满足漏检约束”的最高阈值这样更稳健。3.2 不确定性度量与人工复检兜底让机器承认自己不知道小样本训练出来的模型最大的风险不是“它判断错了”而是“它不知道自己判断错了”。因此漏检控制的第二条抓手是引入不确定性估计配合人工复检兜底把系统从“机器做最终决定”改成“机器提建议人做关键决定 ”。实践中能直接用的不确定性方案MC-Dropout蒙特卡洛Dropout推理时打开Dropout多次前向比如10次计算输出概率的均值和标准差。如果多次结果的方差很大说明模型对该样本缺乏信心需要转人工复检。这个方法改造成本极低只需要在预测函数里加循环。测试时增广TTA对同一输入做多次不同的增广如不同亮度、小角度旋转看预测一致性。把多次预测的平均值作为最终输出。TTA在工业检测中很有效因为增广模拟了实际环境的微小变化一致性高的样本通常更加可信。置信度直接兜底最简单的方案设置一个“不确定区间”。比如模型输出概率低于0.9的样本不直接判为良品或缺陷而是送去人工复检工位。这个区间设置得越小自动判定的占比越高但漏检风险越大区间越大复检工作量越大但系统整体可靠度越高。我强烈建议所有产线方案在设计之初就预留人工复检工位哪怕只是流水线旁边一个屏幕加一个脚踏开关。其核心逻辑是小样本模型注定有看不清的边界这些边界区域交由人对总体验收负责比让模型硬着头皮判断来得更可靠。用人力兜底模型不确定性是整个工业视觉项目中性价比最高的安全垫。3.3 类别差异化阈值不同缺陷的漏检代价不一样阈值就应该不一样如果在项目里把缺陷当成一个大类处理那阈值校准只需要一个数。但现实中缺陷类型多样漏检代价完全不同。比如某电子元件的微裂纹可能导致整个模组报废而一道外观刮花可能只影响观感不影响功能。这两种缺陷不能共用同一个阈值。这里就需要做类别级别的阈值定义。实现上可以有两种思路在多分类输出上为每个缺陷类别单独设置判定阈值模型输出为各类别概率当某类的概率超过对应阈值时才报缺陷。功能件类别阈值可以放得很低宁误检不放过外观件阈值可以放高一些减少产线噪音。在异常检测框架下按缺陷类型训练独立的子模型或调整不同类别的分位点PatchCore输出一个异常分数对不同缺陷类型分别计算它们在良品特征库中的距离分布分位点。分位点低的类型更容易检出适合功能件分位点高的类型更难检出适合对外观件。小样本下配置类别差异化阈值时要注意一个风险缺陷类别如果样本太少单独统计的阈值很不稳定。我举个例子某类别只有25个缺陷样本其中一个样本的特征特别典型阈值被拉得很低结果导致大量误报。应对方式是对样本量少于50的类别优先采用全局阈值兜底不要单独设类别阈值类别样本量上去之后再拆分会更稳妥。4. 一套能落地的全流程从需求定义到上线监控的完整链路方法论讲得再多最终都要落到流程里。这是我在多个项目里打磨过的一套完整链路覆盖从需求确认到上线后监控的每个环节。每个环节都标注了容易忽略的关键点。4.1 第一阶段需求定义与技术指标确认很多项目从开始就注定失败因为需求没有量化。甲方说“我要检测划痕”但没说清楚划痕多长算划痕、多深算缺陷、在哪个区域出现算问题。算法工程师如果不在这一阶段把标准锁死后面验收阶段就是无休止的扯皮。需求确认阶段至少要做三件事收集并确认缺陷样例把甲方提供的缺陷样品、图片编号归档和工艺工程师逐条确认每种缺陷的定义边界。发现两批相同名字的“划痕”在外观差异很大时优先考虑它们是不是两种类型的缺陷不要混在一起训练。定义验收指标明确漏检率、误检率、单件检测时间的量化目标。漏检率怎么测误检率怎么算检测节拍满足与否都要写上。有一说一别低估产线对节拍的要求算法推理时间加IO耗时经常超过产线的预期。画定系统边界检测单一面还是多面要不要分拣联动脏污算不算缺陷光照环境是否可控这些边界问题直接影响后续的数据采集和模型设计。4.2 第二阶段数据采集与标注规范这个阶段通常要占整个项目40%的时间但也是绝大多数人想压缩的阶段。我反复跟新团队强调工业缺陷检测项目里数据工作永远是最重要的模型都是后话。数据采集的核心原则是“覆盖环境变化”。连续采集一周以上涵盖不同的班次、时段、温度和光源照度同一个缺陷尽量采集多个角度、多个距离的图片如果是运动中的物体还要注意动态模糊的影响。标注则要做到由经验丰富的老质检员主导标注不要相信随便拉一个实习生就能标好缺陷类别多人标注后做一致性检查不一致的样本单独讨论不强行合并如果有“可疑但不确认”的样本单独建一个目录不参与训练留给验证阶段观察标注缺陷区域最好用分割掩码方式即使最终只做分类级输出因为掩码可以作为额外的定位监督帮助模型学到缺陷的形态特征。如果实在没精力做分割标注至少用矩形框框出缺陷区域比只给图片级标签要好得多。4.3 第三阶段基线模型与快速验证数据整理好后不要一上来就优化模型先快速跑通一个基线。我的习惯是用自监督预训练的backbone 线性分类头或者直接用PatchCore套件跑一个异常检测基线。花一两天时间得到一个大致的精度数据。基线数据有两个核心用途。第一它决定了后续优化方向如果基线就差一两个点调整阈值和增加增广就够了不需要动模型结构如果基线离目标差得远就需要在数据层面做更多补齐而不是继续堆模型。第二它是团队内部同步预期的重要工具避免后面每个人对“模型能到什么水平”预期不一致。小样本场景下我通常把30%的缺陷样本留作测试集70%用于训练/验证。注意划分时要按缺陷类别分层保证每个类别在测试集里都有代表样本。测试集在调试过程中绝对不许看只看验证集结果调参最后上线前用一次测试集做最终断言。4.4 第四阶段模型迭代与过拟合检查基线上来后进入迭代阶段。这阶段最关键的纪律是每一步改动都在验证集上评估发现验证集指标没提升就要大胆舍弃。很多人舍不得自己花时间调过的结构结果在打磨一条死路上浪费更多时间。工程化思维是时间成本比算法复杂度敏感得多该放弃就放弃。同时要密切关注训练集和验证集之间的差距。如果训练集准确率99%而验证集只有85%说明过拟合非常严重。这时先不加模型复杂度而是优先增强数据多样性、加正则化、降低模型容量、采用更激进的 dropout。记住我前面提过的原则小样本下模型容量和过拟合是首先需要正视的问题。4.5 第五阶段硬件适配与上线部署模型训练完毕不是项目的结束甚至不是项目的中点。硬件适配和部署往往是大量问题的聚集地。产线常用部署环境有两类一类是GPU工控机比如带 RTX 3060 或更高端的另一类是 Jetson 等嵌入式设备。工控机方案开发便捷但成本高嵌入式方案便宜但推理优化比较烦琐。部署阶段必须验证的核心问题是推理时延是否满足产线节拍。建议模型导出后用 TensorRT 或 ONNX Runtime 做量化或优化再在目标设备上实测端到端时延。有些坑主要就在这里GPU上跑得很好Jetson上因为没有适配TensorRT推理时间直接翻倍甚至翻三倍产线节拍根本扛不住。另外要留意画幅大小640x640的图像在边缘设备上推理时间可能达到100到200毫秒如果节拍要求短于200毫秒就要考虑减小输入尺寸或调整相机视野。数据也是部署环节的大问题。线上推理图像要不要保存保存周期多长这影响后续的样本回流和模型迭代。如果没有存图模型出了任何问题都没法事后分析如果全部存存储成本又上去了。我的建议是良品图随机抽取保存缺陷图即模型判为异常的全部保存这样既能支撑后续优化也控制了存储量。4.6 第六阶段上线后的监控与迭代闭环模型上线不等于结束而是另一个循环的开始。产线环境的漂移常常在几天到几周内发生换了批材料、调整了工艺参数、光源老化都会导致模型表现下滑。不做监控这些问题只能等到客户投诉才能暴露。监控体系至少要覆盖三级抽检验证对已判为良品的物品按比例抽检比如2%线下人工复核。这是直接测算实际漏检率的唯一途径。误报统计统计每天模型报警但人工确认为良品的数量。误报率突然上升往往意味着某个来源的干扰比如润滑油污痕、包装碎屑乱入出现了。误报变化比漏检变化更容易先被察觉。特征分布监控定期对近期图像特征做分布统计比如重建误差、异常分数的均值方差一旦出现显著偏移就触发告警。监控数据还要回流到训练集。我每个项目都会留一个“难例库”专门放漏检和误报的图片。定期每个月或每季度把难例库加进训练集重新微调模型。这套循环看起来朴素但长期效果比任何花哨的算法都实在。5. 实测中踩过的那些坑一致性、干扰帧和标注偏差的排查过程完美流程不存在任何项目都会踩坑。这里挑三个我亲历过的坑讲讲完整排查链路不是直接给结论而是带着读者走一遍思考过程这样换个场景也能复用。5.1 坑一打光不一致导致验证集成绩良好上线后漏检率飙升某次金属表面项目实验室做验证集评估时漏检率1.2%感觉没问题。上线跑了半天后漏检抽检突然飙到4%。重新拉了现场图片分析发现一个现象产线早上9点前太阳会斜射到车间窗户在金属表面产生一条高光带缺陷正好落进高光区域时对比度几乎为零。实验室里用的是环形光源没有太阳光干扰当然测不出问题。排查过程是这样展开的先把当天线上判为良品的图片按小时分段统计每个时段图像的亮度直方图发现9点前后的平均亮度明显偏高。再把该时段的漏检图片在模型中跑一次输出置信度确实很低。最后定位到高光区域反光导致缺陷不可见。解决方式是做了两个措施物理层面加遮光帘消除太阳光干扰算法层面在训练集的增广配置里加入高光模拟在一块区域把亮度拉高、对比度压低让模型对局部过曝区域更鲁棒。这个坑给我一个深刻教训——数据采集和增广必须结合真实的产线环境而不是实验室的理想条件。5.2 坑二缺陷与正常纹理差异过小模型“记住”了背景而没学到缺陷另一个记忆深刻的坑某纺织物表面项目缺陷是极细的断纱密集的纹理让模型很难找到异常区域。在验证集上表现尚可但一旦换一个批次的布料模型性能立刻劣化。观察发现模型偏执地把“深色背景下的深色异常”视为正常因为训练集里的断纱样本大多出现在浅色背景上模型学到的根本不是断纱本身的特征而是“浅色背景暗线区域”的组合。排查时我是这样做的把模型最后一层卷积的特征图可视化发现激活值集中在背景纹理的边缘而不是断纱位置。也就是说模型把背景纹理结构当成了主要特征。这说明训练数据里断纱的多样性不够背景类型太少导致模型走了捷径。修复办法是在增强阶段大幅增加背景迁移把断纱缺陷区域从原始背景中抠出来贴到不同颜色、不同纹理密度的背景上。仅这一项改动就把换批次的性能下降幅度压低了大约60%。它还给我一个很重要的启示在复现类缺陷检测中背景多样性往往比缺陷样本数量更重要因为模型最容易学习的特征是“背景和缺陷的联合分布”而不是缺陷本身的语义。5.3 坑三标注主观差异导致标签噪声模型在矛盾样本上反复纠结标注偏差在小样本条件下造成的伤害比大样本下严重得多。某注塑件项目里老质检员A认为“轻微缩水”算缺陷质检员B认为“只要不影响装配就算良品”。同一个图像两人给了相反标签模型的loss在两种标签之间反复横跳训练不收敛。排查过程是从训练曲线的抖动开始的。正常分类的训练loss应该是平缓下降然后趋于稳定那次却出现了周期性反弹。我把训练集里的标签和原始图片逐张检查发现大概8%的样本存在标注冲突进一步翻看标注记录发现冲突样本高度集中在“轻微缩水”这一类别上而两位质检员的标注标准不一致。解决方式很朴素把冲突样本全部拎出来拉上甲方工艺负责人一起开个会针对每个争议样本讨论并给出最终定义。同时修正标注规范中关于缩水的描述加入“不影响装配的前提下允许轻微缩水”的量化标准比如缩水深度不超过0.03mm。后续训练曲线很快就平稳了。这件事也让我养成一个习惯标注阶段就要求至少两人独立标注然后计算一致性系数如果不达标项目不要急着进入训练阶段先把标准问题解决掉。写在最后的心得做了几年工业视觉项目我最大的感受是小样本缺陷检测这个领域出活的关键不在模型而在流程控制。网上能搜到各种网络结构、训练技巧但真正决定一个项目能不能落地的是你对数据的理解、对产线环境的敬畏、以及对漏检这个指标的工程化拆解。深度学习只是这条流水线上的一环数据策略、阈值校准、人工兜底和监控闭环哪个做得不好模型再强也白搭。最后再分享一个小习惯我从第一个项目开始就积累“漏检样本集”每一条线上漏检的图都按日期、班次、缺陷类别、现场环境四要素归档。三个月后回看这些样本你会发现自己对“什么样的缺陷是最难检出的”有了远比任何论文都深刻的理解。这份理解是支撑你在下一个项目里做出更好判断的真正底气。
返回列表