三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

YOLO+无监督学习:攻克工业质检样本少、类别不平衡、成像不全、迭代慢四大难题

YOLO+无监督学习:攻克工业质检样本少、类别不平衡、成像不全、迭代慢四大难题

1. 项目概述:当工业质检遇上“四座大山”

在工业制造领域,尤其是涉及精密零部件、电子元器件、纺织面料或金属板材的产线上,视觉质检是保障出厂品质的关键防线。然而,理想中的全自动、高精度、零漏检的质检系统,在实际落地时往往会撞上几堵难以逾越的“高墙”。从业这些年,我和团队反复被四个核心痛点折磨:样本少、类别不平衡、成像拍不全、以及模型迭代导入慢。这“四座大山”直接导致了传统监督学习方案,尤其是依赖大量标注数据的深度学习模型(如各类YOLO变种),在真实场景中表现乏力,漏检率和误检率居高不下,最终只能沦为“演示很美好,上线就趴窝”的摆设。

最近,我们在一个液晶屏模组的缺陷检测项目中,成功实践了一套“YOLO+无监督学习”的组合拳策略,将产线的漏检率从令人头疼的8.5%直接压到了0.34%,降幅超过96%。这个成绩不是靠堆砌更昂贵的相机或更快的工控机取得的,而是通过算法策略的革新,巧妙地绕开或翻越了那四座大山。简单来说,我们的核心思路是:用YOLO这类强监督模型做“精兵”,负责攻坚已知的、有明确样本的常见缺陷;同时,引入无监督或自监督学习模型作为“哨兵”和“侦察兵”,去发现那些罕见的、未曾标注的、甚至成像不完整的异常模式。两者协同,形成了一道既有重点防御又有全域警戒的质检防线。

这套方案特别适合正在为以下问题头疼的工程师或项目负责人:你的产线每天产生海量图像,但能明确标出“坏件”的图片少之又少;缺陷类型五花八门,但像“划痕”、“污渍”这种常见缺陷只占少数,更多是各种难以归类的“奇葩”缺陷;由于工件摆放、反光、遮挡等原因,总有部分区域图像质量不佳;以及,每次发现一种新缺陷,都要重新收集数据、标注、训练、部署模型,周期长达数周,业务部门根本等不起。如果你对YOLO训练、模型部署熟悉,但苦于上述问题无法突破,那么接下来对这套组合策略的拆解,或许能给你带来新的落地思路。

2. 直面“四座大山”:问题根源与常规方案的困境

在深入我们的组合方案之前,有必要先彻底认清这“四座大山”的本质,以及为什么传统方法会失效。只有诊断清楚,才能对症下药。

2.1 第一座山:样本少(Few-Shot Learning Challenge)

在工业场景中,获取大量缺陷样本成本极高。一条成熟的生产线,良品率通常在99.9%以上,这意味着要收集1000个缺陷样本,可能需要处理数十万甚至上百万个产品。很多缺陷(如内部气泡、微裂纹)只有在特定测试环节才会暴露,无法在线实时获取。因此,我们面对的往往是“小样本”甚至“零样本”学习问题。

常规YOLO方案的困境:YOLO等监督学习模型是典型的“数据饥渴”型模型。以YOLOv8为例,官方推荐每个类别至少要有1500个实例标注。在样本稀少的情况下,模型极易过拟合,即记住了训练集中那几个有限的缺陷模样,但对形态、大小、位置稍有变化的新缺陷就“视而不见”,导致漏检。单纯的数据增强(旋转、裁剪、调色)只能缓解,无法根治,因为增强无法创造出语义上全新的缺陷模式。

2.2 第二座山:类别不平衡(Class Imbalance)

即使我们费尽力气收集到一些缺陷数据,其分布也极不均衡。例如,在PCB板检测中,“焊锡不足”可能有500个样本,“虚焊”有200个,而“铜箔翘起”这种罕见缺陷可能只有5个样本。模型在训练时会自然而然地倾向于优化主导类别的损失,忽视少数类,最终导致对稀有缺陷的召回率极低。

常规方案的困境:常用的技术如Focal Loss、对少数类过采样(Oversampling)或对多数类欠采样(Undersampling)有一定效果,但在极端不平衡(如1:1000)的情况下,效果有限。过采样可能导致模型对少数类的噪声过拟合,欠采样则浪费了多数类样本中的信息。最终,模型对于“铜箔翘起”这类缺陷的检测性能依然不稳定。

2.3 第三座山:拍不全(Incomplete/Defective Imaging)

工业成像环境复杂,受限于工装夹具、镜头视野、光照不均、物体反光或自身遮挡,采集到的图像可能存在局部模糊、过曝、欠曝、阴影遮挡等问题。一个缺陷可能恰好出现在图像边缘的畸变区域,或者被反光“洗白”。这导致输入模型的本身就是信息不完整的图片。

常规方案的困境:监督学习模型默认输入图像是清晰、完整的。当缺陷特征因成像问题变得不典型或残缺时,模型基于完整特征训练出的分类边界就会失效,直接判定为背景或误判为其他类别。单纯提升相机分辨率或改善打光,往往受限于成本和物理空间,无法彻底解决所有场景的成像问题。

2.4 第四座山:导入慢(Slow Model Iteration)

这是工程落地中最致命的“最后一公里”问题。生产线发现一种新型缺陷(例如,由于供应商原材料批次变化导致的新污渍类型)。从收集新样本、标注、训练模型、验证到最终部署上线,即使自动化程度很高,也至少需要几天时间。在这期间,有问题的产品可能已经流出了数百甚至上千件。

常规方案的困境:传统的“收集-标注-训练-部署”闭环周期长,响应迟钝。业务部门无法接受为了一个新增缺陷而等待漫长的模型迭代。他们需要的是一个能够快速适应新情况的系统,或者至少能在新缺陷出现时发出“异常警报”,而不是完全沉默。

注意:这四座大山并非孤立存在,它们常常相互叠加,形成复合性问题。例如,一个“拍不全”的罕见缺陷,同时面临着“样本少”和“类别不平衡”的挑战,使得任何单一方向的优化都收效甚微。

3. 组合拳策略核心:YOLO与无监督学习的角色分工

我们的解决方案放弃了追求一个“全能”的单一模型,转而采用分工协作的架构。其核心思想在于解耦“已知缺陷检测”和“未知异常发现”这两个任务

3.1 YOLO:担任“精准打击部队”

角色定位:我们使用YOLO(项目中采用YOLOv8,兼顾精度与速度)来专门处理那些我们已经明确知道、拥有一定数量标注样本的“已知常规缺陷”。例如,液晶屏模组上的点缺陷(亮/暗点)、线缺陷(划痕)、以及特定类型的Mura(斑痕)

为什么是YOLO?

  1. 成熟高效:YOLO系列经过多年发展,在目标检测任务上平衡精度与速度的能力有目共睹,部署生态成熟(ONNX, TensorRT, OpenVINO等),非常适合工业现场实时推理。
  2. 强监督优势:对于有明确标注的缺陷,监督学习能建立清晰的分类边界,定位精准,可解释性相对较强(至少我们知道它在检测什么)。
  3. 快速针对已知问题迭代:当某个已知缺陷的形态发生变化(如划痕变得更细),我们只需补充对应新样本,在原有模型基础上进行微调(Fine-tuning),迭代速度远快于训练新模型。

在这个组合中,YOLO的目标不是做到100%召回,而是确保对已知缺陷的检测达到极高的准确率(Precision)和稳定的召回率(Recall),守住质量底线。

3.2 无监督学习:担任“全域警戒哨兵”

角色定位:无监督学习模型(我们主要采用了基于重建误差的自动编码器Autoencoder和基于特征嵌入的深度单分类网络)负责处理YOLO覆盖不到的“灰色地带”。它的任务是学习正常良品(Good Parts)的特征分布,然后将任何偏离该分布的区域或整图标记为“异常”。

它能解决哪些大山?

  1. 样本少/零样本:无监督模型只需要大量正常品的图像进行训练,完全不需要缺陷样本。这完美解决了缺陷样本稀缺的问题。
  2. 类别不平衡:因为它不区分缺陷类别,只判断“正常”与“异常”,所以根本不存在类别不平衡问题。无论是常见划痕还是罕见气泡,只要偏离正常模式,都会被标记。
  3. 拍不全的异常:即使缺陷因成像问题特征不明显,但只要该区域的图像模式与正常品有统计意义上的差异,重建误差或特征距离就会增大,从而被捕捉到。它对特征残缺的容忍度更高。
  4. 导入慢(应对新缺陷):当生产线上出现一种从未见过的新缺陷时,YOLO会失效(因为它不认识),但无监督模型有很大概率会将其判定为“异常”,从而触发警报。这为人工复检和后续样本收集赢得了时间,实现了对未知缺陷的快速响应。

工作流程简述

  1. 离线训练阶段:用数万张确认过的良品图像,训练一个无监督异常检测模型,让它学会“良品应该长什么样”。
  2. 在线推理阶段:产线图像同时输入YOLO模型和无监督模型。
    • YOLO输出其检测到的已知缺陷框。
    • 无监督模型输出一个“异常分数”热力图或一个整图的异常分数。
  3. 决策融合
    • 如果YOLO检测到高置信度的已知缺陷,直接判定为NG。
    • 如果YOLO未检出,但无监督模型给出的异常分数超过预设阈值,则判定为“疑似异常”,触发报警,交由人工复检或流入更高精度的复判工位。
    • 两者均无报警,则判定为OK。

这套机制相当于为质检系统加装了一个高灵敏度的“异常传感器”,极大地降低了因模型认知盲区导致的漏检。

4. 实操详解:从数据准备到模型部署的全链路

下面,我将以液晶屏模组检测项目为例,拆解关键步骤和实操要点。

4.1 第一阶段:数据工程与YOLO模型打磨

即使有无监督模型兜底,一个精准的YOLO模型仍是效率的保障。我们的目标是让YOLO在已知缺陷上尽可能可靠。

步骤1:小样本下的YOLO数据策略

  • 高质量标注是关键:样本少,意味着每一个标注都极其珍贵。我们使用LabelImg或CVAT,确保标注框紧贴缺陷边缘,特别是对于细长划痕、小点缺陷,标注精度直接影响模型学习效果。
  • 针对性增强:摒弃通用的随机增强。针对“划痕”,我们侧重仿射变换(小角度旋转、剪切)和亮度对比度微调,模拟不同角度和光照下的形态。针对“点缺陷”,侧重添加高斯噪声和模拟局部模糊,增强模型鲁棒性。使用Albumentations库可以方便地定制增强管道。
  • 利用无监督模型辅助挖掘:在项目初期,我们用一批历史数据(包含未知的缺陷品)跑无监督模型,将高异常分数的样本挑出来,人工进行复审和标注。这能高效地从“未标注数据矿”中挖掘出潜在的正样本,缓解样本短缺。

步骤2:解决类别不平衡的训练技巧

  • 损失函数选择:我们放弃了标准的交叉熵损失,为YOLOv8的分类头换上了Focal Loss。Focal Loss通过降低易分类样本的权重,让模型在训练时更关注难分的、稀有的缺陷样本。在YOLO中,这通常需要修改模型定义文件(*.yaml)和训练脚本。
  • 采样策略:采用Class-Balanced Sampling。在构建每个训练批次(Batch)时,确保稀有类别有一定概率被采样到。这需要在数据加载器(Dataloader)层面进行定制,而不是简单地对数据集过采样。
  • 一个关键参数weight_decay(权重衰减)。对于小样本不平衡数据,我们倾向于使用更小的weight_decay(如1e-5甚至更小),以防止模型过早地陷入对主要类别的过拟合,保留一定的模型容量来学习稀有特征。

步骤3:模型训练与验证

  • 验证集构造:必须确保验证集包含所有类别的缺陷,尤其是稀有类别至少要有几个样本,否则验证指标会严重失真。
  • 监控关键指标:除了看整体的mAP,更要关注每个类别的AP(Average Precision),特别是稀有缺陷的召回率(Recall)。我们设置了一个硬性标准:任何已知缺陷类别的召回率在验证集上不得低于85%。
  • 早停策略:耐心设置早停(Early Stopping)。小样本训练容易波动,早停的耐心(patience)可以设大一些(如50个epoch),避免在性能未稳定时提前停止。

4.2 第二阶段:构建无监督异常检测“哨兵”

我们对比了两种主流无监督方法,并最终采用了混合架构。

方案A:基于重建的自动编码器(AE)

  • 原理:训练一个编码器-解码器网络,学习将正常图像压缩再重建。训练完成后,输入一张图,模型会试图将其重建为“正常模样”。如果输入本身是正常的,重建误差小;如果输入包含缺陷(异常),模型无法很好重建,误差就大。
  • 我们的实操
    1. 网络结构:我们使用了稍深的编码器(如ResNet18作为编码器主干),解码器采用对称的转置卷积层。关键在于瓶颈层(Bottleneck)的维度不能太小,否则会丢失太多细节,导致对细微缺陷不敏感;也不能太大,否则模型可能记住图像细节,连缺陷也一起“重建”了。我们通过实验确定了256维的瓶颈是一个较好的平衡点。
    2. 损失函数:采用结合像素级MSE损失感知损失(Perceptual Loss)。MSE保证像素对齐,感知损失(使用预训练VGG网络的中间层特征)保证语义相似性,这样对结构性缺陷更敏感。
    3. 推理与阈值确定:计算重建图像与输入图像的差异图(Diff Map),取差异图的均值或最大值作为异常分数。阈值的确定是核心:我们在一个纯良品的验证集上计算异常分数的分布,取分布的99.5%分位数作为初始阈值。上线后,再根据误报(False Positive)情况微调。

方案B:基于特征嵌入的深度单分类(例如,使用预训练网络)

  • 原理:利用在ImageNet等大数据集上预训练好的CNN(如EfficientNet),提取正常图像的特征向量。在特征空间中,所有正常品的特征会聚集在一起。计算新图像特征与这个“正常簇”中心(或所有正常特征)的距离(如马氏距离、余弦距离),距离越大,异常可能性越高。
  • 我们的实操
    1. 特征提取:我们选用EfficientNet-B0的倒数第二层(全局池化层之前)的输出作为特征。这个特征兼具高层语义和一定的空间信息。
    2. 正常特征建模:收集数万张良品,提取特征。我们采用多元高斯分布来建模这个高维特征空间。计算所有良品特征的均值向量μ和协方差矩阵Σ。
    3. 异常分数计算:对于新图像,提取特征x,计算其马氏距离:D = sqrt((x - μ)^T * Σ^(-1) * (x - μ))。这个距离就是异常分数。
    4. 优势:这种方法计算速度快,对纹理、颜色等全局异常敏感。但对局部小缺陷的敏感性不如基于重建的方法。

最终方案:混合模型决策我们同时部署了AE和特征嵌入模型。对于一张待测图像:

  1. AE输出一个像素级异常热力图和分数S_ae
  2. 特征嵌入模型输出一个全局异常分数S_feat
  3. 融合策略:S_final = α * S_ae + (1-α) * S_feat。其中α是权重,我们根据验证集调优为0.7。
  4. 如果S_final > 阈值T,则判定为“全局异常”。同时,如果AE的热力图中存在连续区域的像素级异常值超过另一个局部阈值,即使S_final不高,也输出一个“局部异常区域”提示框,供人工重点查看。

这种混合方式兼顾了对局部细微缺陷和全局模式异常的检测能力。

4.3 第三阶段:工程部署与性能优化

将两个模型部署到产线工控机(通常配备NVIDIA Jetson AGX Orin或RTX 3060级别的GPU)上,需要解决实时性问题。

  • 模型轻量化
    • YOLOv8:使用官方导出的-s(small)或-n(nano)版本,并导出为TensorRT引擎,获得数倍的推理加速。
    • AE模型:对编码器和解码器进行通道剪枝(Channel Pruning),在精度损失可控(<1%)的情况下,将模型大小压缩了40%。
    • 特征提取模型:固定EfficientNet-B0的权重,仅用于前向传播,本身已足够高效。
  • 流水线并行:我们设计了一个简单的流水线。线程1负责图像预处理和运行YOLO;线程2负责运行无监督模型(AE和特征提取)。两个线程异步执行,最后在主线程进行结果融合。这充分利用了多核CPU和GPU的并发能力。
  • 阈值动态调整(可选):我们开发了一个简单的在线学习模块。当人工复检确认了无监督模型报警的样本确实是缺陷时,将该样本加入一个缓存池,并微调异常分数的阈值,使系统对该类异常变得更敏感。

5. 避坑指南与效果复盘

5.1 实操中踩过的“坑”与解决方案

  1. 坑:无监督模型对背景变化过于敏感。

    • 现象:产线换班时,灯光亮度有轻微调整,或者相机位置有毫米级偏移,导致无监督模型大面积误报。
    • 解决:在训练无监督模型时,必须将背景干扰纳入“正常”范畴。我们的做法是:采集不同时段、不同灯光条件下、允许有轻微位置波动的良品图像作为训练集。更高级的做法是使用图像配准(Registration)技术,先将所有图像对齐到标准模板,再提取ROI区域进行训练,彻底排除背景干扰。
  2. 坑:YOLO与无监督模型结果冲突。

    • 现象:YOLO自信地检出一个“划痕”,但无监督模型认为该区域异常分数很低(正常)。
    • 解决:建立置信度仲裁机制。YOLO的检测框带有置信度conf_yolo。我们设定一个高阈值Th_high(如0.9)和一个低阈值Th_low(如0.3)。若conf_yolo > Th_high,则无论无监督结果如何,都判为NG(相信YOLO)。若conf_yolo < Th_low,则主要参考无监督结果。若处于中间区间,则触发“不确定”标志,交由后续工位处理或保存样本供模型迭代。
  3. 坑:无监督模型的阈值难以“一刀切”。

    • 现象:不同产品型号、不同检测工位的正常波动范围不同,使用同一个全局阈值,要么漏检,要么误报满天飞。
    • 解决为每个产品型号、每个工位独立训练一个无监督模型,并独立设定阈值。虽然增加了维护成本,但这是保证精度的必要代价。可以通过自动化脚本管理这些模型的加载和切换。

5.2 项目效果数据复盘

在我们液晶屏模组的项目中,上线组合系统后,进行了为期一个月的跟踪统计:

  • 漏检率:从原先纯YOLO方案的8.5%降至0.34%。其中,YOLO单独贡献了约2%的漏检(主要是新出现的、未标注的缺陷类型),无监督模型拦截了剩余的约6.16%的漏检。
  • 误检率:由于无监督模型的引入,整体误检率从1.2%上升至2.5%。但通过上述的阈值调优和仲裁机制,我们将误检导致的停机率控制在了可接受的范围内。更重要的是,所有误检样本都被系统记录并归类,用于后续迭代优化无监督模型。
  • 响应新缺陷速度:在项目期间,产线出现了一种新的“网状纹”缺陷(供应商油墨问题)。在没有任何该缺陷样本的情况下,系统在首次出现时就通过无监督模型产生了高异常分数报警,实现了“当日发现,当日预警”。我们随后收集了报警样本,仅用20张新标注图片对YOLO模型进行了微调,就在第二天将此类缺陷纳入了YOLO的已知检测范围。

5.3 关于“导入慢”大山的具体缓解

组合拳策略对“导入慢”问题的解决是分层的:

  1. 即时响应层(无监督模型):对于全新未知缺陷,实现分钟级甚至秒级响应(报警),无需重新训练模型。
  2. 快速迭代层(YOLO微调):当新缺陷被确认并积累少量样本(几十张)后,对现有YOLO模型进行微调,通常在几小时内即可完成训练和验证,部署更新也很快。
  3. 定期优化层(无监督模型再训练):定期(如每月)将积累的确认缺陷样本(作为异常样本)和新的良品样本加入,对无监督模型进行增量再训练,使其对已认知的异常模式逐渐“脱敏”,从而降低未来的误报,同时保持对新异常的敏感度。这个周期可以拉得较长。

这套组合策略,本质上是将一个僵化的、周期漫长的“模型驱动检测”系统,转变为一个具有弹性感知和持续进化能力的“数据驱动质检”系统。它承认工业现场的复杂性和不确定性,不追求一劳永逸的完美模型,而是通过架构设计,让系统能够在运行中不断学习和适应。对于深陷“四座大山”困扰的工业视觉工程师来说,这条“YOLO+无监督”的路径,或许是一条值得探索的务实突围之路。

← 返回列表