小缺陷细分类怎么做得更准?把 YOLO 检测拆成“先找位置、再认类型“两级
小缺陷细分类怎么做得更准把 YOLO 检测拆成先找位置、再认类型两级系列第 8 篇检出率 100%模型却回答不了这是哪种缺陷好不容易训出能分类的模型分数又低又飘阈值根本定不下去——做工业缺陷检测的人大概率都卡在这个检出容易、认类难的坎上。而更深一层的约束是新品上线时样本总量看着有一两百张摊到每个缺陷类别却只有十几二十个框——对高精度工业识别来说没有试错的余量。这篇讲我们把 YOLO 板材缺陷检测拆成一级单类检测 二级裁剪分类两级结构的过程为什么拆、拆开之后每级怎么训、以及前后对比的真实数字一级 mAP50 0.995、二级 Top1 91.7%同一缺陷框上两级置信度 0.9。适合做工业视觉、缺陷类别外观相似、每类样本量不多并且在意模型分数可不可靠的人。一、背景检出好做认对类型难而真正的约束是样本少我们的场景是板材缺陷检测产线整板图 2048×1536缺陷三类缺齿、裂纹、木料原因。这个项目的起点很典型——新品上线攒下的标注样本只有 126 张整图、54 个缺陷框但研发阶段就要拿出能上线试跑的模型。样本少的时候技术路线的容错率很低一步走偏模型就废。先看缺陷在图里的实际大小建议大家都先跑一遍这个统计它基本决定了后面的技术路线。统计脚本很简单就二十行# 统计每个类别的标注框数量、中位尺寸、占图比例——样本情况一目了然fromcollectionsimportdefaultdictimportstatisticsasst per_classdefaultdict(list)# label - [(w, h, w/img_w, h/img_h)]forimginimages:# images: 每张图的标注列表像素 xywh和图片宽高forainimg[annotations]:per_class[a[label]].append((a[w],a[h],a[w]/img[width],a[h]/img[height]))forlabel,boxesinper_class.items():ws[b[0]forbinboxes]print(f{label}:{len(boxes)}框, 中位宽{st.median(ws):.0f}px, f占图宽{st.median([b[2]forbinboxes])*100:.1f}%)我们的统计结果类别标注框数量框中位尺寸占整图宽/高缺齿20173×71 px8.4% / 4.6%裂纹12153×208 px7.0% / 13.3%木料原因22159×128 px7.7% / 6.7%两个特点框小训练缩到 imgsz 后只剩几十像素在 stride8 的特征层上只有几×几个特征点每类样本少十几到二十几个框。而这三类在外观上又确实相似——都是板材表面的一条暗纹或缺口。最初我们用一个模型直出位置 类型标注里本来就带细类标签。模型能用但用起来有个不舒服的地方它给出的置信度偏低同一个缺陷分数总在 0.8 出头晃。对产线来说分数高低不只是好看——它是放行/拦截的阈值依据分数低且飘阈值就没法定。二、思路让每级只做一件事级联方案就是把任务拆开整板图 → 一级检测模型单类只回答是不是缺陷 → 检出的框裁剪下来外扩 20%→ 二级分类模型缺齿/裂纹/木料原因/ok → 输出缺陷类型 两级各自的置信度拆开之后每级的训练都变得更从容一级把所有缺陷样本合在一起只学定位。样本量对于是什么可能不够对于在哪是够的——合并后定位信号满格二级看的是放大的裁剪图。173×71 的框在整图里是个小不点crop 出来缩放到 224×224有效像素翻了好几倍细粒度特征缺一块的几何形状 vs 连续裂缝纹理才露得出来多一个 ok 类吸收误报。一级阈值可以压低保召回误报框交给二级判 ok 拦下——这是级联独有的缓冲层直训模型没有这层工程成本也低二级分类模型训练一轮不到一分钟检测模型要十几分钟清洗标注、补负样本的迭代都很快。三、效果分数和置信度都更好了两边都是正式训练的模型yolov8n 系150 epochs 检测 / 100 epochs 分类同一份 test 集14 张整图、5 个 GT 缺陷框、同一套评估协议conf0.25IoU≥0.5 匹配各跑三次结果完全一致。训练指标对比一级检测单类二级分类直训多类检测主指标mAP500.995/ 召回 0.99Top191.7%mAP50 0.828 / 召回 0.83单类检测把任务做窄之后指标明显更饱满——0.995 对 0.828差距就摆在验证集上。同一缺陷框上的置信度对比5 个 GT 框逐一列出GT 类别直训模型框置信度级联一级检出置信度级联二级分类置信度木料原因0.9180.9700.978裂纹0.9210.9680.999缺齿0.8480.9380.973裂纹0.8200.9070.993缺齿0.9250.9360.942两点观察级联一级的检出置信度系统性更高每个框都比直训模型高 0.05~0.09。定位任务单独学模型的底气确实更足级联的输出更可读两个分数各司其职——检出分管信不信这里有缺陷分类分管信不信是这个类型。阈值可以分别调排查问题时知道该修哪一级检出率两边都是 5/5100%这一点直训模型同样出色——级联带来的提升主要体现在分数质量和结构上而不是检出能力。四、二级分类器要正经训一个反面教材级联方案的命门在二级。这里必须交代我们踩过的坑第一版二级分类器是用 130 张 crop 快速训出来的验证版40 秒跑完它在 test 集上木料原因和缺齿判得准但裂纹两个全错而且错的时候置信度高达 0.99——裂纹的训练 crop 只有 12 张模型学成了凡是细纹都是木料原因还特别自信。教训有两条二级模型虽然训练快但每类样本太少时它会自信地错——分类模型对样本量的敏感度不比检测低级联的好处是这个问题暴露得很清楚一级检出率 100% 没漏损失全部定位在二级。修起来也直接补裂纹样本重训二级即可检测模型不用动什么时候不需要这么拆公允地交代边界缺陷占图比例大20% 以上、外观差异一眼能分直训多类一条链路更简单别过度设计每类样本充足几百框以上直训的分类头饿不着级联有误差传递一级漏掉的二级救不回来所以一级阈值宁低勿高误报交给二级的 ok 类我们的直训模型本身也训得不错检出率同样是 100%如果你的直训模型置信度已经够用级联的收益就没那么明显一句话框小、类像、样本少拆两级更从容反之直训够用。诚实交代局限test 集只有 5 个 GT 框绝对数值别外推文章的观点主要建立在同一框上置信度逐框对比和训练指标差上这两者是结构性观察二级分类器目前是够用但未毕业的状态裂纹在补数据中后续数字会在系列文章里更新两边模型的数据划分方式略有差异直训用按比例随机分严格程度上打折但置信度对比是同一批图同一批框的逐框对照这个结论不受影响小结检出和细分类是两种难度的任务小缺陷样本少的场景拆开训练每级的指标都更饱满一级 mAP50 0.995 vs 直训多类 0.828级联输出的两个置信度各自可读、分别可调——这对定阈值和排障都很关键crop 放大让二级分类器看到数倍的像素这是细粒度识别质量提升的直接来源二级分类器要正经训样本太少的类会自信地错宁可补数据重训也别凑合ok 负样本类是级联独有的误报缓冲层怎么造、造多少下一篇细讲。FAQQtest 集只有 5 个框置信度对比就下结论靠谱吗问得对单靠 5 个框不够。我们的依据是三件事互相印证训练指标差0.995 vs 0.828各自验证集、5 个框逐框置信度对比方向一致、无一例外、以及产线上更多图的试用观察直训分数偏低的感受在所有批次上都成立。如果只有其中一条我们也不敢写这篇。Q置信度差 0.05~0.09 听着不多值得多维护一个模型吗值不值看你要不要用阈值做自动拦截。我们的场景要拦截线定高了直训模型 0.82 那些框会漏定低了误报又进来。级联把拦截依据拆成两个分数后一级阈值只管漏不漏可以压到 0.25 保召回误报交给二级的 ok 类兜——这 0.05 的差距换来的其实是阈值策略能成立了。如果你的场景只是人工复核辅助不卡自动阈值那确实不必拆。Q二级为什么不再加大输入尺寸或加训试过方向的边界很清楚分类输入 224 对 crop缺陷本体 100~300px已经够再加大收益递减训练轮次上二级在 100 epochs 内 val 准确率早就平了继续训 val loss 反而上升过拟合信号我们的第一版就是这么翻的车。二级的瓶颈是样本量不是训练强度——裂纹只有 12 张 crop 时怎么调参都不如补数据。Q整个级联从数据到模型额外花了多少成本如实算二级数据集是从已有检测标注自动裁出来的126 张整图 → 54 张缺陷 crop 76 张 ok crop零新增标注二级训练 100 epochs 实测 40 秒推理端多一个 3MB 的小模型。真正的成本是概念上的——你要想清楚两级各自的阈值和失败模式这个省不掉。Q一级检出置信度更高会不会是单类任务变简单的假象是变简单了这正是目的。单类检测的 0.9 置信度回答的是是不是缺陷——这个问题本来就该回答得干脆。细分类的区分度没有丢而是挪给了二级在放大 crop 上做。关键是最终给业务的两级分数都没有塌一级 0.91~0.97、二级判对时 0.97这比直训把两件事压成一个 0.85 上下的分数好用。技术栈FastAPI · SQLite · Vue 3 · ultralytics本系列共 64 篇1~6 为平台搭建篇7 起为 2.0 应用篇系列第 1~6 篇见「yolo训练管理」目录平台搭建踩坑教训 / 选型 / 训练进程管理 / 数据一致性 / Windows 打包 / 方法论系列第 7 篇大图切片训练——框处理策略演进2.0 开篇系列第 8 篇小缺陷细分类——两级级联的结构本篇系列第 9 篇新品缺陷检测冷启动——每类十几个样本的迭代打法系列第 10 篇级联上线实操——阈值、误报兜底与监控有问题欢迎评论区交流。