样本在计算机视觉的评价中是非常重要的概念,正样本比较好理解,是要检测的物体,负样本是不要检测的目标。这里负样本会有一些问题,首先负样本定义比较主观,其次负样本和正样本的量纲不在一个级别,那么实际算法中会把检测出的待选区域中的一部分作为正样本,一部分作为负样本,例如 Faster-RCNN 及 SSD 等。
比如检测人脸时,人脸是正样本,非人脸则是负样本,比如旁边的窗户呀红绿灯呀之类的其他东西。
需要满足 3 个条件:
负样本被检测为正样本的数量,也称误报,预测的 Bounding Box 与 Ground Truth 的 IoU 小于阈值的检测框(定位错误)或者预测的类型与标签类型不匹配(分类错误)。
正样本没被检测为负样本的数量,也称漏报,指没有检测出的 Ground Truth 区域。
是负样本且被检测出的数量,无法计算,在目标检测中,通常也不关注 TN。
交并比 (Intersection over Union,IoU) 又称交并比,计算 2 个区域的重叠比,用 2 个区域的交集除以其并集,公式如下,DR 表示检测结果,GT 表示 Ground Truth。
I
o
U
=
D
R
与
G
T
的
交
集
D
R
与
G
T
的
并
集
IoU=\frac{DR与GT的交集}{DR与GT的并集}
IoU=DR与GT的并集DR与GT的交集
以下是 IoU 的示意图:
目标检测中的 IoU 是矩形框计算,计算并集部分通过 2 个计算区域的面积减去交集部分即可,重叠情况如下图所示:
在计算重叠区域面积是在找其中计算区域的 min、max 关系。用
W
u
n
i
o
n
W_{union}
Wunion表示重叠区域宽度,用
H
u
n
i
o
n
H_{union}
Hunion表示重叠区域高度,
m
i
n
(
)
min()
min()选择传入参数中较小值,
m
a
x
(
)
max()
max()选择传入参数中较大值,通过计算得到重叠区域的宽与高,关系如下:
准确度 (Percision) 也叫查准率,是在识别出的物体中,正确的正向预测 (True Positive,TP) 所占的比率。
n
u
m
p
r
e
d
num_{pred}
numpred代表一共识别出的物体数量,例如下图 3 所示口罩人脸检测的一个效果图,图中 9 个检测框,7 个正确检测出口罩,
T
P
=
7
TP=7
TP=7,2 个未正确检测出口罩,
F
P
=
2
FP=2
FP=2,参照公式准确率为0.78。
召回率 (Recall),是正确识别出的物体占总物体数的比率。
n
u
m
s
a
m
p
l
e
num_{sample}
numsample表示一共有多少个需要检测的物体,继续参照图 3,图中一共 8 个带着口罩的目标,其中 7 个正确检测出口罩,
T
P
=
7
TP=7
TP=7,1个未检测出口罩,
F
N
=
1
FN=1
FN=1,根据计算公式,得到召回率为0.875。
Precision 与 Recall 看起来很相似,实际上这两个是“冤家”。为什么这么说呢?因为在大多数情况下,这两者有一定的互斥性。
理想状态下,模型可以检测出所有要检测的物体,并且没有误报,两个指标都是 100%,实际中不太可能出现。
模型检测出的检测框有一个分类类别和相应的置信度,在稍微复杂的场景下,并不是所有要检测的物体的置信度都很高,或者都能检测出来,也不是所有检测出的全部物体是我们所想要的目标。图 4 展示了 Precision 与 Recall 的关系,随着 Recall 的提高,Precision 值降低了。
接下来用一个例子说明 Precision 与 Recall 的关系,有一个物体检测结果,一个图里的检测出的物体按照置信度倒叙排列进行编号。
按照顺序逐个计算 Precision 及 Recall 值,相当于逐渐在降低阈值(threshold),其结果如下方表格所示。
Precision 与 Recall 单独拿出来作为评价标准都太过片面,可以设置一个较大的阈值来获取高 Precision 或者通过设置个较低的阈值来获得较高的 Recall 值。我们还是希望有一个数能够衡量性能,所以综合 Precision 和 Recall,可以得到一个 F Score,计算公式如下:
F Score 是 Precision 和 Recall 的调和平均数 (harmonic mean),B 的作用是个权重,调整 P 与 R 的比重关系。平均数很好理解,加权平均也不复杂,那“调和”是什么意思呢?调和平均数(harmonic mean)有个特点,Precision 与 Recall 其中有一个值较小,那么整体就会很小,也就是对两个数中如果有特别小的数的惩罚(penalty)比较大。
在论文中,经常可以看到用 F1 值作为评价标准之一,将 B 设置成 1,这就是 F1 Score。
平均准确度 (Average Precision,AP) 是非常流行的目标检测器 (目标检测算法模型) 的度量指标,从字面上来看 AP 是平均精准度,对于单独的追求 Precision 的数值并不能很好的衡量模型的效果,所以 AP 的计算方式并不是简单的求平均的过程。
在下图中的 Precision 呈现 ”Z“ 形状,随着 TP 增加,FP 减少。
一般定义 AP 为 PR 曲线之下的面积,公式如下:
Precision 与 Recall 的值域在 0 到 1 之间,所以 AP 的值域也是在 [0, 1] 这个范围。知道了 AP 的值域还有定义,在计算前还有个棘手的问题,这里的 P® 并不是一个具体的函数,而是根据样本进行计算,是一个数值,在图中是一个点,可以描绘成折线图。
请看图 6 中,在 Recall = 0.7 的时候,Precision 的值是多少?这样的一个问题我们是没办法简单的用插值的形式来进行求解的,同样的我们也没法用函数计算的方式去解决,所以前人就提出一种差值方法:给任意一个 Recall 值,它对应的 Precision 值就等于它最近的右侧的哪个“有值” Precision 中最大的值。
举个例子,以图 6 中的 PR 曲线,Recall = 0.7 的点, Precision 取值为 0.67,求 AP 的过程中,在计算之前,我们需要对图像中的 “Z” 部分做个“平滑”处理,如图所示:
我们将每个 Precision 值替换为该 Recall 值右侧的 Precision 值,这么说比较拗口,看图中红线部分,Precision-Recall 曲线变成了单调减小,不再是之前的 “Z” 形变化。这时候计算出的 AP 值将不太容易受到排名的微小变化的影响。公式变成如下:
Pascal VOC 2008 中设置 IoU 的阈值为0.5,在平滑处理的 PR 曲线上,图 7 中取横轴 0.2-1 的 9 等分点(0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1.0)的 Precision 的值,计算其平均值为最终 AP 的值。
上述计算有两个问题,第一个是使用 9 个采样点在精度方面会有损失。第二个是,在比较两个 AP 值较小的模型时,很难体现出两者的差别。
所以这种方法在 2009 年的 Pascal VOC 之后便不再采用了。在 Pascal VOC 2010 之后,便开始采用这种精度更高的方式。绘制出平滑后的 PR 曲线后,用积分的方式计算平滑曲线下方的面积作为最终的 AP 值,理解为经过插值的 PR 曲线与 X 轴包围的面积,这种方式也称为:AUC (Area under curve)。
上图可知,AP = A1 + A2 + A3,具体计算如下:
mAP (mean Average Precision) 是在每一个类别都计算出 AP 后再计算 AP 的平均值。