Recall, Precision & AP
https://sanchom.wordpress.com/2011/09/01/precision-recall/讲的比较清楚,习惯英文同学可直接阅读。
基本概念
关于TP、TN、FP、FN
True positives(TP): 真-正例
True negatives(TN):真-反例
False positives(FP):假-正例
False negatives(FN):假反例
关于目标检测中的recall和precision计算示意。左图来自于:https://blog.csdn.net/weixin_44791964/article/details/102414522,有图来自于:https://en.wikipedia.org/wiki/Precision_and_recall。
可结合上两图进行理解:根据真实标签是正样本、负样本有两种情况;根据检测到结果是正例、反例也有两种结果,因此组合是 2 × 2 = 4 2\times2=4 2×2=4种。每次检索结果为图中的圆圈,圆外为筛选掉样本。
Recall和Precision
理解:(relevant:相关的,可理解为GT;retrieved:检索到的)
- recall表示的是正样本中有多少被检测出来;
- precision表示检测到的样本中有多少是正样本。
案例说明
假设是要正确的从含有飞机和天鹅图片集中检索到飞机:
如上所示,左边是所有的样本。在一次检索中,共检索了4张图片(和阈值设置有关),其中3张是真-正样本(确实是飞机),1张假-正样本(是天鹅但是被检索认为是飞机)。
则:
p
r
e
c
i
s
i
o
n
=
t
p
t
p
+
f
p
=
3
3
+
1
=
75
%
r
e
c
a
l
l
=
t
p
t
p
+
f
n
=
3
3
+
2
=
60
%
precision = \frac{tp}{tp+fp}=\frac{3}{3+1}=75\%\\ recall=\frac{tp}{tp+fn}=\frac{3}{3+2}=60\%
precision=tp+fptp=3+13=75%recall=tp+fntp=3+23=60%
即precision是本次检索结果中检测到的正样本占检测所有样本的比例。分子、分母都是变化的。
而recall相对而言不仅和本次检测相关,还和全局信息相关。即分母是确定的,分子不同导致结果不同。
此时再理解一下上面的TP、TN、FP、FN:
True positives: Airplane images that your system correctly retrieved(3,检测到的图片中真-正样本数,将飞机确实是飞机)
True negatives: Geese images that your system correctly did not retrieve(4,没有被检测到样本中真-负样本数,剩下图片中的天鹅)
False positives: Geese images that your system incorrectly retrieved, believing them to be airplanes(1,检测到的样本中的假-正样本,即将天鹅误分为飞机)
False negatives: Airplane images that your system did incorrectly did not retrieve, believing them to be geese(2,没有被检测到的样本中的真-正样本)
Adjusting the threshold
调整阈值得到不同的检测结果。
根据这一段我们可以解释一些信息:
- 其实每次仍会对所有目标进行检索(检测),但是最终根据设置的阈值只会得到部分结果。例如上图所示,在每一次中会对10张图片都进行检测,然后(根据置信度)进行排序,然后根据排序结果不同得到本次检测结果的不同。
以下得到不同的检测结果:
**其实也就是说,两个数据——recall和precision并不会有必然的变化关系。**随着阈值的降低,precision可能是波动的,但是recall值持续增大的(分子逐渐变大)。
自己作图进行理解
参考最开始的图进行理解。
- 浅绿色+浅蓝色是所有的数据,包括正样本和负样本;
- 然后假设每次检索/检测得到的结果由虚线红框表示。即每次都是对全部样本进行检测,但是因为设置的阈值不同,所示检索到的结果也是不一样的,即红框(大小)在动态变化;
- 随着设置不同的阈值,则这个框会在整个空间内移动,这样就会得到不同的recall和precision,也就是说即使数据本身没有变化,但是检测过程变了。
Precision-recall curves
根据上面的分析,其实假设这个模型训练的很好的话,则期望每次对结果进行排名,都会是正确类别在前,而错误类别在后,这样预期结果是:recall会增大(分母不变,分子逐渐变大),但是precision期望在一定程度内不变(没检测到负样本前均不变)。
即整体上来看,recall随着阈值的降低会增大,而precision则会减小。
也就能解释为什么是面积更能反映检测器效果的好坏了。即横坐标(recall)增大的同时,期望纵坐标(precision)下降的不多。
Average precision
定义的是平均精度,从计算式上表示为:
∫
0
1
p
(
r
)
d
r
\int_0^1 p(r) dr
∫01p(r)dr
即图中
P
−
R
P-R
P−R曲线与
x
x
x轴所被包围的面积。
离散形式为:
∑
k
−
1
N
P
(
k
)
Δ
r
(
k
)
\sum_{k-1}^N P(k) \Delta r(k)
k−1∑NP(k)Δr(k)
对于上面的案例:
ap
=
(
1
∗
0.2
)
+
(
1
∗
0.2
)
+
(
0.66
∗
0
)
+
(
0.75
∗
0.2
)
+
(
0.6
∗
0
)
+
(
0.66
∗
0.2
)
+
(
0.57
∗
0
)
+
(
0.5
∗
0
)
+
(
0.44
∗
0
)
+
(
0.5
∗
0.2
)
=
0.782
\text{ap}=(1*0.2)+(1*0.2)+(0.66*0)+(0.75*0.2)+(0.6*0)+(0.66*0.2)+\\(0.57*0)+(0.5*0)+(0.44*0)+(0.5*0.2)=0.782
ap=(1∗0.2)+(1∗0.2)+(0.66∗0)+(0.75∗0.2)+(0.6∗0)+(0.66∗0.2)+(0.57∗0)+(0.5∗0)+(0.44∗0)+(0.5∗0.2)=0.782
Interpolated average precision
使用插值计算ap。
左边的是近似的,右边的是插值的。插值计算:
∑
k
=
1
N
max
k
~
≥
k
P
(
k
~
)
Δ
r
(
k
)
\sum_{k=1}^N \text{max}_{\tilde k \geq k} P(\tilde k) \Delta r(k)
k=1∑Nmaxk~≥kP(k~)Δr(k)
即使用插值时,计算的是当前值的最大值。但是这样插值得到的结果会大于精确结果,也会大于上面的近似结果。
一开始大家使用的往往是PASCAL Visual Objects Challenge
中的AP计算方法,即采用11点插值。但是可以看到,使用插值方法会带来一定的问题。那么如果要使用AP对方法进行评价,则采用的AP计算方法也应该一致,这样尽可能的对其它因素进行消融处理。
主要参考资料
https://github.com/MathGaron/mean_average_precision
https://sanchom.wordpress.com/2011/09/01/precision-recall/