文章目录

  • 前言
  • 一、IoU和TP、FP、TN、FN的概念
  • IoU(Intersection over Union):
  • TP、FP、TN、FN
  • 二、Precision和Recall
  • 1.Precision
  • 2.Recall
  • 三、AP(P-R曲线下的面积)
  • 四、map的计算



前言

如何评估一个训练好模型的好坏,是目标检测中一个很重要的因素,如常见的TP、FP、AP、PR、map等,这些概念很容易混淆,搞了两天才搞明白,写一篇博客总结一下,方便以后复习。



一、IoU和TP、FP、TN、FN的概念

IoU(Intersection over Union):

IoU是一种测量在特定数据集中检测相应物体准确度的一个标准。

计算公式为:

目标检测kitti用哪个 目标检测tp_目标检测kitti用哪个


目标检测kitti用哪个 目标检测tp_模型预测_02

目标检测kitti用哪个 目标检测tp_目标检测kitti用哪个_03


两个框交域和并域的比值就是交并比。

TP、FP、TN、FN

TP:被正确分类为正样本的数量;实际是正样本,也被模型分类为正样本
FP:被错误分类为正样本的数量;实际是负样本,但被模型分类为正样本
TN:被正确分类为负样本的数量;实际是负样本,也被模型分类为负样本
FN:被错误分类为负样本的数量;实际是正样本,但被模型分类为负样本

举个例子,比如下面这张图:

目标检测kitti用哪个 目标检测tp_深度学习_04

红色是预测框,绿色是真实框。
假设阈值为0.5,意思就是预测框与真实框的IoU大于等于0.5时认为检测到目标了。
TP是IoU>0.5的检测框数量(在同一真实框下只计算一次),图中的框①。
FP是IoU<=0.5的检测框数量,图中的框②。
FN是没有被检测到的框数量,图中的框③。


二、Precision和Recall

1.Precision

计算公式:

P = TP / (TP + FP)

Precision是针对预测结果而言的,含义是在预测结果中,有多少预测框预测正确了。
但是光靠一个Precision指标是有缺陷的,比如在下面这种情况中:

目标检测kitti用哪个 目标检测tp_模型预测_05

在预测结果中,预测正确的目标有一个,预测错误的目标有0个,所以TP=1,FP=0,则P=1,但是图中除了①,②③④⑤都没有检测出来,所以单靠一个Precision指标肯定是不行的。

2.Recall


计算公式:

R = TP / (TP + FN)
Recall是针对原样本而言的,含义是在所有真实目标中,模型预测正确目标的比例。
但是单靠Recall来判断模型预测结果好坏也不行,比如下面这种情况:

目标检测kitti用哪个 目标检测tp_目标检测kitti用哪个_06


此时目标都没有漏检,TP=5,FN=0,R=1,但是检测效果并不好。因此我们需要用Precision和Recall共同来评判我们模型的好坏,也就是AP。

三、AP(P-R曲线下的面积)

这里推荐b站一位up的视频,讲的非常详细 对于以下三张猫的图片,分别对每张图片进行统计,并存入一个表格中,这个表格是按照置信度降序排序的:

目标检测kitti用哪个 目标检测tp_目标检测kitti用哪个_07


此时真实框有两个,所有num_ob=2(num_ob是累加起来的),当IoU大于等于0.5时,认为检测到了目标。

目标检测kitti用哪个 目标检测tp_目标检测kitti用哪个_08


目标检测kitti用哪个 目标检测tp_机器学习_09


此时num_ob=3,这张图片只有一个真实框,所以num_ob+=1,

目标检测kitti用哪个 目标检测tp_模型预测_10


目标检测kitti用哪个 目标检测tp_目标检测kitti用哪个_11


目标检测kitti用哪个 目标检测tp_机器学习_12


最后得到左边的一张表格,先从第一个元素开始计算Precision和Recall,一次累加一个元素,直到表格中所以元素计算完成为止。

目标检测kitti用哪个 目标检测tp_深度学习_13

目标检测kitti用哪个 目标检测tp_目标检测kitti用哪个_14


此时我们会得到右边的一张表格,按照这个表格,我们就可以绘制P-R曲线了,在绘制前需要删除一些Recall重复的数据,如图中的第五和第六个数据。

目标检测kitti用哪个 目标检测tp_机器学习_15


AP = (当前点的Recall值 - 上一个点的Recall值)x 当前点以及后面所有Precision值最大的点

目标检测kitti用哪个 目标检测tp_模型预测_16

四、map的计算

上面的0.6694就是猫所对应的AP值,采用这个方法,我们可以计算出所有类别所对应的AP值,再除以类别的个数,就得到了map。