2. 混淆矩阵详解:TP、FP、FN、TN 的定义与作用

聊 mAP 之前,咱们得先把一个最基础的工具搞明白——混淆矩阵。

说实话,我刚开始做检测的时候,觉得这东西就是个统计表,没啥技术含量。后来有一次模型在某个类别上 mAP 突然掉了 10 个点,我对着日志看了半天没头绪。最后画了个混淆矩阵,一眼就发现问题了——模型把「行人」和「自行车」搞混了,而且 FN 多得离谱。嗯,从那以后,我每轮实验必看混淆矩阵。

2.1 四个核心概念:TP、FP、FN、TN

先别急着背定义。咱们用一个场景来理解。

假设你在做行人检测。一张图里实际有 5 个行人,你的模型画了 6 个框。那这 6 个框里,哪些是对的?哪些是错的?

这里就需要一个判断标准:IoU(交并比)。通常我们设 IoU ≥ 0.5 就算检测正确。

术语 全称 通俗理解 检测场景举例
TP True Positive 预测为正,实际也是正 框到了行人,且 IoU ≥ 0.5
FP False Positive 预测为正,实际是负 框到了背景,或者 IoU < 0.5
FN False Negative 预测为负,实际是正 漏掉了一个行人,没框出来
TN True Negative 预测为负,实际也是负 背景区域,模型也没框

关键点:在目标检测中,TN 几乎用不到。因为背景区域太多了,统计 TN 没有意义。我们真正关心的是 TP、FP、FN 这三个值。

2.2 如何从预测结果构建混淆矩阵

构建过程其实不复杂。我习惯分三步走:

  1. 匹配预测框和真实框:计算每个预测框和每个真实框的 IoU。
  2. 按 IoU 阈值判定:比如 IoU ≥ 0.5 就算匹配成功。
  3. 统计计数:匹配上的算 TP,没匹配上的预测框算 FP,没被匹配的真实框算 FN。

举个例子,假设一张图里有 3 个真实框(GT1、GT2、GT3),模型预测了 4 个框(P1、P2、P3、P4)。

预测框 匹配的真实框 IoU 判定结果
P1 GT1 0.85 TP
P2 GT2 0.72 TP
P3 GT3 0.91 TP
P4 无 — FP

这里 GT1、GT2、GT3 都被匹配到了,所以 FN = 0。但如果某个真实框没被任何预测框匹配上,那它就算 FN。

我的小技巧:写代码的时候,我习惯用 torchvision.ops.box_iou() 一次性算完所有 IoU,然后用匈牙利算法做最优匹配。这样能避免一个真实框被多个预测框重复匹配的问题。

2.3 混淆矩阵在 mAP 计算中的作用

mAP 的全称是 mean Average Precision。说白了,它就是在不同置信度阈值下,算出一堆 Precision 和 Recall,然后求平均。

而 Precision 和 Recall 的计算,完全依赖混淆矩阵里的 TP、FP、FN:

  • Precision = TP / (TP + FP) —— 你预测的所有框里,有多少是真正对的。
  • Recall = TP / (TP + FN) —— 所有真实目标里,你找出来了多少。

你想想看,如果没有混淆矩阵,这两个指标根本算不出来。所以混淆矩阵是 mAP 的基石,一点不夸张。

我举个例子,假设模型在某个类别上:

  • TP = 80
  • FP = 20
  • FN = 20

那么 Precision = 80 / (80 + 20) = 0.8,Recall = 80 / (80 + 20) = 0.8。

如果模型为了提升 Recall,疯狂输出框,FP 涨到 80,那 Precision 就会掉到 0.5。这就是 Precision 和 Recall 的 trade-off。

避坑提醒:我曾经遇到过一个情况,模型在验证集上 mAP 很高,但实际部署效果很差。后来排查发现,是因为验证集的标注质量有问题,很多真实框没标全,导致 FN 被低估,Recall 虚高。所以,混淆矩阵的质量,取决于标注的质量。数据没洗干净,mAP 再高也是假的。

2.4 混淆矩阵的可视化与解读

光看数字不够直观。我习惯把混淆矩阵画出来,尤其是多类别检测的时候。

下面这张图展示了一个 3 类检测任务的混淆矩阵结构:

多类别混淆矩阵结构图 真实类别 行人 自行车 汽车 预测类别 行人 自行车 汽车 85 5 2 3 72 8 1 4 90 FN 8 17 5 如何解读: • 对角线(绿色)= TP,越大越好 • 非对角线(红色)= FP,越小越好 • 右侧(橙色)= FN,越小越好 • 如果某个类别 FP 很高,说明模型容易误检 • 如果某个类别 FN 很高,说明模型容易漏检

从这张图里,你能快速看出:

  • 「自行车」类别的 FN 有 17 个,说明漏检比较严重。
  • 「自行车」被误检为「汽车」有 8 次,说明这两个类别特征比较接近。

这种信息,光看 mAP 数字是看不出来的。所以我每次调模型,第一件事就是看混淆矩阵,找到模型最弱的类别,然后针对性优化。

2.5 小结

混淆矩阵不是个花架子。它是你理解模型行为的窗口。TP、FP、FN 这三个值,直接决定了 Precision 和 Recall,进而决定了 mAP。

我个人建议,每次训练完模型,别急着看 mAP,先画个混淆矩阵。花 5 分钟看看哪些类别容易混、哪些类别漏检多,比盯着一个数字瞎猜有用得多。