AOI 实战第五篇:c_broken 漏检严重,V4 迭代背后的权衡

过杀下降 vs 漏检上升,工业检测的两难选择


开头:过杀太严重,客户投诉

你有没有过这种经历?

模型精度 99%,但误杀率太高------正常芯片被判定为缺陷,客户投诉不断。你降低阈值,误杀下降了,但漏检又上来了。

过杀和漏检,永远是跷跷板。

AOI 项目的芯片缺陷分类从 V1 迭代到 V4,核心目标就是「降低过杀」。V4 的 a_chip 误杀率大幅下降,但 c_broken 漏检率从 94% 降到了 47%。

不是因为迭代有多难------而是因为「过杀 vs 漏检」的权衡没有标准答案。


一、过杀 vs 漏检

复制代码
过杀(False Positive):
  正常芯片被判定为缺陷
  后果:返工成本增加,客户投诉

漏检(False Negative):
  缺陷芯片被漏掉
  后果:缺陷产品流出,质量事故

权衡:
  降低过杀 -> 漏检上升
  降低漏检 -> 过杀上升

工业场景的选择

复制代码
安全关键(汽车/医疗):宁可过杀,不可漏检
消费电子:平衡过杀和漏检
AOI 项目:降低过杀优先(a_chip 误杀严重)

二、V1 到 V4 的迭代历史

各版本对比

版本 整体准确率 c_broken 召回 a_chip 误杀 变化
V1 98.11% - 严重 基线
V2 98.65% - 改善 +0.54%
V3 98.97% 94% 改善 +0.32%
V4 98.77% 47% 大幅改善 -0.20%

V4 的核心变化

复制代码
V3 -> V4:
  过杀下降:a_chip 误杀大幅改善
  漏检上升:c_broken 召回从 94% 降到 47%

原因:
  V4 加了 hard 样本增强(把容易误判的 a_chip 样本增强后回灌训练)
  模型学到了「不要把 a_chip 误判为 c_broken」
  但同时也学到了「不要把 c_broken 判定为缺陷」

三、AOI 项目的缺陷分类

数据集

数据集 图片数 用途
train_sets/v3 基线 V3 训练
train_sets/v4_cbroken_safe 1,450 V4 训练
train_sets/v4_finetune_no_extra 同 V4,移除 extra hard 对照组

训练配置

python 复制代码
# V4 训练
model = YOLO("runs/train/defect_cls_v3/weights/last.pt")  # 从 V3 续训
model.train(
    data="train_sets/v4_cbroken_safe",
    epochs=50,
    batch=128,
    imgsz=224,
    amp=False,
    cos_lr=True,
)

V4 vs 对照组

复制代码
V4(加了 extra hard 样本):
  整体准确率:98.77%
  c_broken 召回:47%

对照组(移除 extra hard 样本):
  整体准确率:98.77%
  c_broken 召回:47%

结论:extra hard 样本对 V4 精度无显著影响

四、V4 过杀下降的原因

hard 样本增强

复制代码
V4 加了 hard 样本增强:
  1. 识别容易误判的 a_chip 样本
  2. 对这些样本做增强(翻转/旋转/缩放)
  3. 把增强后的样本回灌训练集
  4. 模型学到:这些样本是 a_chip,不是 c_broken

效果:
  a_chip 误杀大幅下降
  但 c_broken 漏检也上升了

为什么漏检会上升?

复制代码
模型学到的决策边界:
  V3:c_broken 的边界较宽(容易误判 a_chip 为 c_broken)
  V4:c_broken 的边界较窄(不容易误判 a_chip 为 c_broken)

代价:
  V4 的 c_broken 边界太窄,真正的 c_broken 也被漏掉了

五、避坑指南

坑1:只看整体准确率

现象 :整体准确率 99%,但 c_broken 漏检严重。

原因 :c_broken 样本太少,整体准确率被 a_chip 拉高。

解法:看各类别的召回率,不能只看整体准确率。

坑2:不看混淆矩阵

现象 :不知道哪些类被混淆了。

解法:看混淆矩阵,了解 c_broken 被误判为什么。

坑3:V4 和 V3 混淆

现象 :V4 的 ONNX 文件和 V3 的混淆。

解法:版本化管理,每个版本有独立的文件名。

坑4:hard 样本增强过拟合

现象 :hard 样本增强后,模型过拟合。

解法:控制 hard 样本数量,不要太多。

坑5:不看召回率

现象 :只看准确率,不看召回率。

解法:重点关注 c_broken 的召回率(漏检率)。


AOI 项目优秀实践

  • 版本化迭代:V1->V2->V3->V4,每个版本有独立目录
  • hard 样本增强:V4 加了 hard 样本增强,降低过杀
  • 对照组实验:V4 vs 对照组,验证 extra hard 样本的效果

AOI 项目可改进之处

  • 缺少产线误杀统计:没有量化产线上的误杀率
  • 缺少 c_broken 漏检后果评估:没有评估漏检的质量风险
  • 缺少 A/B 测试框架:没有系统对比不同版本的产线表现

结尾

说回那个「过杀太严重,客户投诉」的故事。

后来我迭代了 4 个版本,V4 的 a_chip 误杀率大幅下降。但 c_broken 漏检率从 94% 降到了 47%。这是一个权衡:降低过杀的代价是漏检上升。

不是因为迭代有多难------而是因为「过杀 vs 漏检」的权衡没有标准答案。


翻翻你的项目:

  1. 你的模型过杀严重吗?漏检严重吗?
  2. 你看的是整体准确率还是各类别召回率?
  3. 你有版本化管理吗?V3 和 V4 的 ONNX 文件会混淆吗?

评论区说说你的缺陷分类是怎么权衡过杀和漏检的。


觉得有用?

收藏这篇,下次缺陷分类时翻出来对照。转发给你团队里那个天天被过杀折磨的同事。


下期预告:

.onnx 到 C++ 的最后一公里。

opset / IR / FP16 / dynamic batch,导出参数一个都不能错。

下一篇,我们聊 ONNX 导出与兼容性------「导出参数的正确姿势」。


本文是《AOI 芯片焊盘缺陷检测实战》系列第五篇。

相关推荐
m0_734571764 小时前
深入理解C++ 析构函数<一>基本概念
开发语言·c++
FL16238631294 小时前
字母手势识别分割数据集labelme格式366张26类别
深度学习
滕州市燕猫虎计算机科技工作室个体工商户4 小时前
Java面试题汇总
java·开发语言
孙启超4 小时前
【AI开发之Rust】第 3 课:字符串与复合类型 —— 数据怎么放
开发语言·人工智能·后端·rust·llm·transformer
t-think5 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
cpp_learners5 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
君顾15 小时前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
AIFQuant5 小时前
Python实时外汇行情接入实战:WebSocket与REST K线查询
开发语言·python·websocket