【行人检测】miss rate versus false positives per image (FPPI) 前世今生(理论篇)

一、前言

最近在做行人检测相关的东西,用到一个指标叫做miss rate versus false positives per-image (FPPI),但是搜了一圈网上发现相关的资料很少,所以自己再梳理一下这个指标相关的知识,也方便后续的人使用这个,如果有不对的地方欢迎指正。

二、miss rate versus false positives per window (FPPW)

【行人检测】miss rate versus false positives per image (FPPI) 前世今生(理论篇)_第1张图片

在介绍miss rate versus false positives per-image(后文简称FPPI)之前,就不得不先说另一个指标,名字叫
miss rate versus false positives per window(后文简称FPPW) 。

起初呢,大家是使用FPPW作为评价行人检测指标的。这个指标最早出现在文章 Histograms of Oriented Gradients for Human Detection。这篇文章中发表了INRIA行人数据集,评估性能的时候就是用这个FPPW(值得一提的是,HOG+SVM这个经典的行人检测方法也是在这篇文章中提出的)

下面简单介绍下FPPW的检测原理:

在行人检测中,因为我们只关注检测框的情况,所以结果主要可以分为三种情况:

  1. 若ground truth为【有行人】,detection检测到了该行人,则这个检测结果为 true positive
  2. 若ground truth为【有行人】,但detection没有检测该行人,则这个行人为 false negative,也就是漏检了
  3. 若ground truth为【没有行人】,但detection检测结果为有行人,则这个行人为 false positive,也就是检测到了空气、误检

其中,positive = true positive+false negative,即真实行人的数量。
true negative表示【没有行人】且detection检测结果为无行人,但是这个是无意义的,我们不关心这个,所以构建评价指标的时候不需要用到。

(如果你觉得TP、TN这些很容易弄混的话,可以参考下这个记忆方法:【机器学习】TP、TN、FP、FN记忆方法)

FPPW的纵轴是miss rate,横轴是false positives per window,两个坐标轴都是采用对数坐标轴表示:

  1. miss rate = false negative / positive,即1-recall,即表示所有存在的行人中(positive),漏检的行人(false negative)占了多少
  2. false positives per window = false positive / the number of window

为什么要用the number of window呢,因为这和HOG+SVM的原理相关,他的检测过程大概是这样的:

  1. 输入一张待检测的图片
  2. 首先用滑窗法,选取图片上的某一块区域(后面称这块区域为window)
  3. 提取这个区域的HOG特征
  4. 将HOG特征输入SVM中,利用SVM进行分类,判断是否为行人

通过上面的过程我们可以看到,因为SVM仅仅只是作为分类器,所以如果要检测到不同size的行人的话,就需要在滑窗法中用很多不同size的窗口去滑动,每滑动一次,就对应一个window,因此诞生了很多window,每个window都对应一个SVM的预测结果。

对于一张图片来说,我们关注的是SVM是否能够对这些window判断准确,所以用false positive / the number of window,就可以评估SVM在这张图片上的检测性能如何。

那如何得到多个miss rate与fppw值呢?

这和ROC曲线的套路比较类似,即通过调整检测的阈值,来得到一系列的miss rate与fppw。

例如,阈值越高,说明只有置信度越高的检测框才能被认为是检测器的输出,所以输出的实际检测框越少、检测框越准确,检测到空气的可能性越低,这也会导致漏检概率越大(置信度低的true positive变为了false negative),所以此时miss rate增加,fppw减少。反之同理。

上面是只有一个图片时的计算方法,对于多张的图片来说,其实也是类似的。首先先把所有图片的结果都放在一起,按照置信度由高到低排序,然后按照置信度的高低来调整检测的阈值,由此就得到了一系列的miss rate与fppw,然后再除以the number of window(此时the number of window为每张图片上window的数量*图片的数量)。

(调整检测的阈值的例子在下文中有)

那FPPW如何量化对比呢?

因为曲线与曲线之间是没办法量化对比的,所以作者使用FPPW= 1 0 − 4 时 10^{−4}时 104的miss rate作为结果对比的参考点(地位类似ROC曲线中的AUC值)。

以上,就是FPPW的大致原理。

原文中,作者说FPPW这个指标对于miss rate变化非常敏感,即miss rate稍微变化一点点,横轴的fppw就会改变非常大。例如,miss rate每降低1%,就相当于将原本的fppw降低1.57倍。

三、miss rate versus false positives per image (FPPI)

【行人检测】miss rate versus false positives per image (FPPI) 前世今生(理论篇)_第2张图片

前面介绍了FPPW,但是FPPW存在以下问题:

  1. 不能反映false positive在不同size和位置空间中的表现,即无法得知分类器检测目标附近的表现或分类器在与目标相似的背景下性能如何。
    因为我们从per window中无法得知这个window是在图像中哪个位置的,也无法得知这个window的size如何,我们用per window所能得到关于window的有用信息量也不大,所以per window并没有什么特别优势
  2. FPPW这个指标不好理解,因为per window这个概念过于接近底层的检测原理了,按照正常的思维,我们其实比较好奇的是 “对于每一张图片,误检率是多少”,我们会思考更加宏观、贴近实际应用的场景,反而不会关心每个window检测情况是怎样

所以在文章Pedestrian detection: A benchmark中,作者提出了FPPI作为更合适的行人检测衡量指标。

FPPI的好处主要如下:

  1. per image这个概念更加贴近实际生活,更好理解

下面简单介绍下FPPI的检测原理:

FPPI的纵轴是miss rate,横轴是false positives per image,两个坐标轴都是采用对数坐标轴表示:

  1. miss rate = false negative / positive,即1-recall
  2. false positives per image = false positive / the number of image

我们可以发现,其实就只是横轴变了而已,其实纵轴是一样的。

同样,我们也可以调整阈值,得到一系列的miss rate和fppi。

那FPPI如何量化对比呢?

同样,曲线与曲线之间是没办法量化对比的,所以一开始,使用FPPI=1时的miss rate作为结果对比的参考点。

但是在后续的论文Pedestrian Detection: An Evaluation of the State of the Art 中(两篇论文的作者都是大神Piotr Dollar),作者改成了使用log-average miss rate作为结果对比的参考点,计算方式为:

在对数坐标系下,从 1 0 − 2 10^{-2} 102 1 0 0 10^0 100之间均匀地取9个FPPI值,这9个FPPI值会对应9个miss rate值,将这9个miss rate值求均值,就得到了log-average miss rate。

(对于一些在达到特定FPPI值之前,就已经提前结束的曲线,miss rate值则取曲线所能达到的最小值)

什么叫提前结束的曲线呢?

我们可以看看下面这张图
【行人检测】miss rate versus false positives per image (FPPI) 前世今生(理论篇)_第3张图片
倒数第二个紫色的HogLbp还没有达到 1 0 0 10^0 100就已经提前结束了,而且你也会发现不同曲线也是长短不一,为什么会这样呢?其实这和不同检测器的输出有关。

因为FPPI图中的曲线本质上是由一组一组的[fppi,mr]点组成的,这些点就连成了曲线,曲线提前结束了,说明这些点的最大fppi值到不了 1 0 0 10^0 100。而一组一组的[fppi,mr]点是通过调整检测器的阈值得到的。检测器的阈值选取方式,是根据检测器输出检测框的数量和置信度决定的。

例如,检测器A检测了3张图片,它在这3张图片上共输出了10个检测框,每个检测框有其对应的置信度,我们按照置信度将这些检测框由高到低排序,例如:0.9、0.85、0.8、0.75、0.7、0.65、0.6、0.55、0.5、0.45。

我们先选择0.9作为检测器的阈值,大于等于0.9的检测框,我们认为有行人、低于0.9的检测框,我们认为没有行人,这样我们就得到了一个[fppi,mr]点。

接下来,我们选择0.85作为检测器的阈值,大于等于0.85的检测框,我们认为有行人、低于0.85的检测框,我们认为没有行人,这样我们就得到了一个[fppi,mr]点。

以此类推,一直到0.45,我们就可以一共得到10个[fppi,mr]点,即检测器输出了多少个检测框,我们就能得到多少个[fppi,mr]点。当阈值为0.45时,假设检测器A对应的[fppi,mr]点的值为[0.8, 0.25],那么此时,检测器A的曲线最多只能画到fppi=0.8,所以就到不了 1 0 0 10^0 100

但是如果换了一个检测器,可能他们输出的检测框结果。例如,检测器B检测同样的3张图片,假设它在这3张图片上也是共输出了10个检测框,按照上面的步骤,检测器B就会输出10个[fppi,mr]点。当阈值为0.45时,假设检测器B对应的[fppi,mr]点的值为[1.5, 0.25],那么此时,检测器B的曲线在绘制的时候就会超出 1 0 0 10^0 100

(不同检测器输出的检测框数量可能也不一样,也是一个影响因素,为了简化表述所以上面的例子中没有考虑进去)

其实说白了,就是不同检测器性能不一样。当检测器的阈值选择最低的那个置信度时,本质上就是所有的检测框我们都认为检测结果为行人,此时如果有些检测器有很多误检的框,那么它所能达到的fppi就会比较高;如果有些检测器误检的框比较少,那么它所能达到的fppi最大值也会比较低,所以因此导致了不同检测器的fppi上界不同。

以上,就是FPPI的大致原理。

四、由ROC曲线得到FPPI曲线

在实际画FPPI曲线的代码中,作者用的是compRocplotRoc这些带有ROC字眼的词来写的,那我们从理论上来看看作者是怎么通过ROC得到FPPI的

【行人检测】miss rate versus false positives per image (FPPI) 前世今生(理论篇)_第4张图片

ROC曲线的y轴是TPR(True positive rate),x轴是FPR(False positive rate):

  • TPR = TP / ( TP + FN )
  • FPR = FP / ( FP + TN )

TPR 和recall的计算公式是一样,所以我们可以认为TPR=recall

FPPI曲线的y轴是miss rate,x轴是fppi(false positives per image):

  • miss rate = FN / ( TP + FN )
  • fppi = FP / the number of image

关于y轴的转换

miss rate = ( TP + FN - TP) / ( TP + FN ) = 1 - recall = 1 - TPR

所以只要用1减去ROC曲线的y值,就可以得到FPPI曲线的y值

关于x轴的转换

作者在compRoc函数中,对于ROC曲线,计算的y轴就是fppi!这其实是一个名词理解的问题。。。。

通常,我们一听到ROC曲线,想到的就是y轴是TPR、x轴是FPR的曲线。

但是在作者的代码中,他所指代的ROC,指的是y轴是TPR、x轴是fppi的曲线。所以不存在类似y轴一样的FPR与fppi之间的转换,因为作者直接算的就是fppi

我们也可以换一个角度理解他为什么要这样命名,其实ROC曲线的FPR和FPPI曲线中的fppi他们的本质是非常相近的,分子都是FP,这两个指标关注的都是误检方面。

两者的区别只是在于分母不同,FPR的分母是“所有负例”,fppi的分母是“所有图片”。

这也是很好理解的,因为在行人检测任务中,“所有负例”的数量实在是太多了!一张图片就只有那么几个行人(即“正例”),没有行人的地方都可以认为是“负例”,这个数量我们是确定不了的。

所以在行人检测任务中,FPR是算不出来的,所以用的是fppi来评价误检的情况

最后再次建议,搞机器学习一定要把这几个概念背熟啊!(【机器学习】TP、TN、FP、FN记忆方法)


在下一篇文章中【行人检测】miss rate versus false positives per image (FPPI) 前世今生(实战篇-上),我们将跑通作者绘制FPPI图的代码以及源码解读

你可能感兴趣的:(目标检测,MATLAB,自动驾驶)