前言
关于目标检测领域的常用评价指标进行一些个人解读,欢迎批评指正。
评价指标系列第二篇~上一次说了语义分割的内容,这次来搞目标检测,看了十余篇内容后终于搞明白些了,记录一下。本文说的内容比较浅,一方面是笔者水平实在菜鸡,另一方面写文的主要目的是让不了解目标检测的人读完能上手去做,而不用查三十个资料后再开始,就像博客的Slogan一样,“帮你在学习技术的路上节约半小时”。
前置理解
上一篇中,介绍了混淆矩阵和一些语义分割常用评价指标,例如P、R、IoU,这些在目标检测中都会用到,但是相对于语义分割来说,更加抽象一些。
目标检测对我个人来说是一个相对陌生的领域,所以本文准备先从目标检测的一般过程说起。首先,目标检测中的基本单元是框,我把Ground Truth称为真实框(标签),把Prediction称为预测框。框中的内容可能是目标(需要),也可能是背景(不需要)。
对于目标检测来说,模型需要完成的任务有两个,一是产生目标的预测框,二是对框内目标的类别进行预测,这又称为回归分支(连续)和分类分支(离散)。模型的预测输出通常如下所示(假设三分类,实际上不同模型的输出格式也不尽相同的。):
其中, $\mathrm{p}_{\mathrm{c}}$ 为预测结果的置信度(Confidence),表达预测框内包含目标的概率。$\mathrm{b}_{\mathrm{x}}, \mathrm{b}_{\mathrm{y}}, \mathrm{b}_{\mathrm{w}}, \mathrm{b}_{\mathrm{h}}$ 分别为预测框左上点$x$坐标和$y$坐标以及预测框的宽度、长度,也可以是预测框的左上、右下两点的$x$坐标和$y$坐标,表达的意思是相同的。 $\mathrm{C}_1, \mathrm{C}_2, \mathrm{C}_3$ 为目标属于某个类别的概率。
真实框和预测框的数量可能是不对等的,这是目标检测与语义分割的一大区别。现在我准备把这些内容再简化,归类为三个信息,目标置信度、定位信息和分类置信度,这里面有些事情需要讲清楚。
第一,分类置信度可能有互斥和不互斥两种,取决于是否使用了softmax计算,本文中,默认分类置信度是互斥的,也就是说当模型输出了一个预测框,框内“目标”的类别就固定了(不论是否真的存在目标)。
第二,预测框与真实框的贴合程度可以由定位信息计算IoU表示,上次提到了。
以上,前置理解完毕,可以开始进行模型评估了。
重返混淆矩阵
从我们现有的信息来看,我们只有两个数值:目标置信度和定位信息。定位信息可以求IoU,但它依然是数值。基于mAP是目标检测中热门的评估指标的现状,我们希望能够继续用混淆矩阵来对预测框进行分类。众所周知,对数值分类的最简单方式就是在集合中画一条界限,将数值集分为两块,这条界限我们称为阈值。
我们有两个数值,自然产生了两个阈值,即置信度阈值和IoU阈值。显然,前者能把预测分成里面大概率是目标的框和里面大概率是背景的框,后者则把预测分成了很像某个目标的框和与某个目标不沾边的框。好了,现在我们来说混淆矩阵的事。
由于预测框类别已经固定,目标置信度和定位信息就是用来确定这框里面到底有没有目标,两个阈值用来判断一件事,这不就是二分类吗?没错,目标检测中我们还是用二分类,和之前多分类按照每个类别来看依然是二分类问题一样。
那现在事情就变得简单了,只需要搞懂如何区别正负就可以了,这是由目标置信度和定位信息共同决定的。下面给出方法,首先我们假设测试集有$N$张图片,我们从中取出一张图片$Img_n$,取该图片中属于类别$C_1$的目标的真实框和预测为类别$C_1$的预测框作为待分类集合。
- TP:与某一真实框的IoU值大于IoU阈值,且目标置信度大于置信度阈值的预测框数量。每个真实框仅能匹配一个预测框,这意味这TP的最大值为真实框的数量。
- FN:漏检测的真实框数量。
- FP:目标置信度大于置信度阈值但不满足TP条件的预测框数量。
- TN:不考虑,因为Negative的样本想画可以画无数个,没有价值。
初次看到这个判断方法多少还是有点懵,笔者解释一下,首先我们希望预测结果对每个目标至多只有一个预测框,这导致了即便有多个符合双阈值要求的预测框,对同一目标也只能选择一个置信度最高的预测框作为TP,其余重复预测框(虽然满足置信度要求)都进入FP。这样以后,能进入TP的目标也被确定了,剩下的真实框自然就成为了FN。
准确率-召回率曲线(Precision-Recall Curve)
先回顾一下Precision和Recall的计算方式,这里就只考虑Positive了:
由上面的分析可以看出,双阈值会影响P和R,通过调整阈值,就可以获得多个$(R,P)$对,通常我们通过指定IoU阈值(不小于0.5),调整置信度阈值的方式获得P-R曲线。事实上,精确率和召回率是一对由置信度阈值控制的冲突的变量,如果想要精准率提高,召回率则会下降,如果要召回率提高,精准率则会下降。当置信度阈值下降时,Recall单调上升,Precision总体呈下降趋势,这也很好理解,查的更全但是查的不准。
需要注意的是,在计算P-R曲线的过程中,置信度阈值的调整方式通常是对所有预测框按置信度降序排序,依次将置信度阈值设为某一预测框的置信度。并且P-R曲线的计算是以全测试集为域,按类别划分的,也就是说,计算类别$C_1$的P-R曲线时,预测框的基数为$C_1$在所有图片中的预测框数量之和,$100$个预测框可以计算$100$组$(R,P)$。另外,由于FP也需要满足置信度大于阈值的条件,参与整个P-R计算的预测框数量应该是持续增加的,最终达到$C_1$在所有图片中的预测框数量之和。(这里主要的意思就是粗体的地方,前面的原因可以有很多,主要就是需要按照前面定义的规则计算。)
更重要的是,TP、FP和FN却需要在单张图片的范围内按类别计算,再以图片为单位求和构成总TP、FP和FN值,进而求得类别在数据集上的一个$(R,P)$。
AP(Average Precision)
经历了前面曲折艰难的分析,终于能够接近AP了。首先从字面上看,平均精确度,很容易联想到一种计算方式(笔者就这么干过):对数据集中的每张图片单独计算Precision,然后求平均值,这不就是AP吗?实际上这是不对的,错误出在了对于Precision的理解上,Precision是一个Rate,我们现在的目的是评估模型对类别的检测效果,一个类别的查准率是建立在全数据集的样本之上的,显然,上述计算无法准确的表达这一内涵。
如果有读者想不明白这一点,我可以再举一个例子来验证,例如有三堆球摆在我们面前,其中两堆相同,都由$3$个白球和$1$个红球构成,另外一堆由$1$个红球和$1$个白球构成,我希望得到这些球中的红球率。如果按照上述理解,我们可以分别计算三堆中的红球率,得到$\frac{1}{4},\frac{1}{4},\frac{1}{2}$,再求它们的算数平均值得到$\frac{1}{3}$。而实际上呢,红球率是$\frac{3}{10}$,因为红球率是指以球为基本单位的红球比率(也不知道我解释清楚没)。
总之,Precision就是这样一个指标,要计算类别的AP,就要先获得P-R曲线。得到P-R曲线后,AP的计算方式就有很多了,根据不同的流行数据集,有几种常见的方式,罗列如下:
按照VOC2007的方法,是先平滑曲线,对于每个点取其右边最大的P值,连成直线,然后等间距取11个点的最大P值,AP就是这11个Precision的平均值。
VOC2012,还是先按07的方法平滑曲线,然后计算PR曲线下面积作为AP值,因为本身P和R就是Rate,构成的正方形区域面积就是1,求曲线积分就完事了。
COCO数据集,设定多个IoU阈值(0.5至0.95,0.05为步长),在每一个IoU阈值下都有某一类别的AP值,然后求所有IOU阈值下的平均AP,以该平均AP值作为最终的某类别的AP值。
总的来说,就是一个精度越来越高的过程。
mAP(mean Average Precision)
mAP和速度是最常用的目标检测模型评价指标,mAP顾名思义就是对所有分类的AP再求平均值。
参考文献
[1]https://blog.csdn.net/yegeli/article/details/109861867
[2]https://zhuanlan.zhihu.com/p/70306015
[3]https://www.jianshu.com/p/86b8208f634f
[4]https://zhuanlan.zhihu.com/p/94597205
[5]https://zhuanlan.zhihu.com/p/101566089
[6]https://www.jianshu.com/p/fd9b1e89f983
后记
首发于silencezheng.top。