3. 混淆矩阵详解:TP、FP、FN、TN的计算

聊缺陷检测,绕不开一个东西——混淆矩阵。

说白了,它就是一张表。把你的检测结果和真实情况放在一起,看看你到底对了多少、错了多少。我刚开始做视觉工程师那会儿,觉得这东西太基础了,不就是四个格子嘛。后来真上了产线,才发现这四个格子背后全是坑。

3.1 四个基本量的定义

先明确一下概念。假设我们检测一个产品,判断它“有缺陷”还是“无缺陷”。

缩写 全称 通俗解释 我自己的理解
TP True Positive 有缺陷,被正确检出 抓对了,该报警的报了
FP False Positive 无缺陷,被误报为有缺陷 虚警,好产品被冤枉了
FN False Negative 有缺陷,但没检出来 漏检,坏产品溜过去了
TN True Negative 无缺陷,正确判定为无缺陷 正常通过,啥事没有
一个小技巧: 我习惯把“Positive”理解为“模型认为有缺陷”,“Negative”理解为“模型认为无缺陷”。True/False 表示这个判断对不对。这样记,永远不会乱。

3.2 怎么算?一个例子走通

假设我们检测了100个产品。人工复判后,真实情况是:20个有缺陷,80个无缺陷。

我们的算法跑下来,结果是这样的:

  • 算法报了25个“有缺陷”
  • 其中,有15个是真的有缺陷,10个是误报
  • 真实有缺陷的20个里,有5个没报出来

来,我们填一下这个矩阵:

真实:有缺陷 真实:无缺陷
预测:有缺陷 TP = 15 FP = 10
预测:无缺陷 FN = 5 TN = 70

验证一下:

  • 真实有缺陷 = TP + FN = 15 + 5 = 20 ✅
  • 真实无缺陷 = FP + TN = 10 + 70 = 80 ✅
  • 总样本 = 15 + 10 + 5 + 70 = 100 ✅
核心检查点: 每次算完,一定要用“真实总数”和“预测总数”交叉验证。我见过太多人把TP和FP搞反,一错全错。

3.3 从混淆矩阵推导核心指标

有了这四个数,我们能算出一堆指标。每个指标看问题的角度不一样。

3.3.1 准确率(Accuracy)

最直观的指标:所有判断中,对了多少?

Accuracy = (TP + TN) / (TP + TN + FP + FN)

上面例子:Accuracy = (15 + 70) / 100 = 85%。

但是! 我踩过这个坑。如果缺陷率只有1%,你全部判“无缺陷”,准确率也有99%。这指标在样本不平衡时,就是个骗子。

3.3.2 精确率(Precision)

关注的是:你报的“有缺陷”里,有多少是真的?

Precision = TP / (TP + FP)

上面例子:Precision = 15 / (15 + 10) = 60%。

说白了,这就是误检率的反面。精确率低,说明FP太多,产线上天天响假警报,操作员会疯的。

3.3.3 召回率(Recall / TPR)

关注的是:真实有缺陷的,你抓出来多少?

Recall = TP / (TP + FN)

上面例子:Recall = 15 / (15 + 5) = 75%。

这就是漏检率的反面。召回率低,说明FN太多,坏产品流出去了。这在汽车、医疗行业是要命的事。

3.3.4 特异度(Specificity)

关注的是:真实无缺陷的,你放过了多少?

Specificity = TN / (TN + FP)

上面例子:Specificity = 70 / (70 + 10) = 87.5%。

这个指标在缺陷检测里用得少,但在医学影像里很常见。我一般只看Precision和Recall。

3.3.5 F1分数

精确率和召回率的调和平均。当你想同时控制误检和漏检时,就看它。

F1 = 2 * (Precision * Recall) / (Precision + Recall)

上面例子:F1 = 2 * (0.6 * 0.75) / (0.6 + 0.75) ≈ 66.7%。

避坑指南: 我曾经在一个项目中,只盯着Accuracy看,模型调到99.2%,觉得稳了。结果上线第一天,FP把产线堵死了。后来我才明白,在缺陷检测里,Precision和Recall才是亲爹。

3.4 知识体系:混淆矩阵与指标关系图

下面这张图,把混淆矩阵和各个指标的关系画清楚了。我每次做项目汇报,都会在PPT里放一张类似的图,老板一看就懂。

混淆矩阵与核心指标关系图 预测:有缺陷 TP (真阳性) 预测:有缺陷 FP (假阳性) 预测:无缺陷 FN (假阴性) 预测:无缺陷 TN (真阴性) 真实: 有缺陷 真实: 无缺陷 Precision TP/(TP+FP) Recall TP/(TP+FN) Specificity TN/(TN+FP) Accuracy (TP+TN)/总数 指标选择建议 • 缺陷率低(<5%):优先看 Precision 和 Recall,别信 Accuracy • 误检容忍度低(如产线):优先优化 Precision(减少 FP) • 漏检容忍度低(如安全件):优先优化 Recall(减少 FN) • 想综合评估:看 F1 Score,它是 Precision 和 Recall 的调和平均

3.5 实际项目中的选择策略

指标不是越多越好。我一般这样选:

场景 首要指标 次要指标 原因
产线终检(漏检致命) Recall Precision 宁可误报,不能漏放
产线预检(误报致命) Precision Recall 误报太多,产线停摆
样本均衡的实验室测试 Accuracy F1 正负样本差不多,准确率有意义
模型调参对比 F1 Score Precision/Recall 单一指标,方便横向比较
我的习惯: 每次调完模型,先看混淆矩阵的四个数,再算指标。不要只看一个数字就下结论。矩阵里的分布,比任何单一指标都诚实。

3.6 常见错误与避坑

  • 把TP和FP搞反: 记住,TP是“你对了”,FP是“你错了”。我刚开始也经常搞混,后来在代码里加了中文注释才改过来。
  • 只看Accuracy: 缺陷率1%时,Accuracy 99% 可能全是废的。一定要看混淆矩阵的分布。
  • 忽略TN: 虽然TN不影响Precision和Recall,但算Accuracy和Specificity时要用到。别漏了。
  • 样本不平衡时盲目优化: 我曾经在一个项目里,缺陷率只有0.5%,拼命调Recall,结果Precision掉到10%以下,产线天天误报。后来加了样本权重才平衡过来。