论文:Acquisition of Localization Confidence for Accurate Object Detection

Githubhttps://github.com/vacancy/PreciseRoIPooling

ECCV 2018 oral

Face++

论文贡献:

  1. 改进传统NMS,提出IoU-guided NMS
  2. 改进ROI Pooling,ROI Align,提出Precise RoI Pooling
  3. 改进边界框定位的基于回归(regression-based )的方法,提出基于迭代式优化(optimization-based )的方法

 IoU-guided NMS


首先,传统的NMS操作所使用的得分是分类的得分,而分类的得分表示了分类的置信度,而不是定位的框的置信度。因此使用分类的得分作为定位框的得分本来就缺乏可解释性,虽然大部分情况下都可以得到不错的效果。但是还是会存在一些情况,定位框的得分低,但是分类分数高,这样就会造成NMS过程中过滤掉一些更加准确的框,使得定位准确性降低。

论文使用了预测和groundtruth的IOU得分作为定位框的得分。这样就真正做到了IOU大,定位置信度高,IOU小,定位置信度低,这样的正相关操作。


最终经过实验论证,IoU-guided NMS效果优于传统NMS。


  1. 传统 NMS :  根据边界框的分类置信度排序,每次选择cls score最大的框,并对与它IoU大于阈值的框抑制,直接将其置信度置为0。定位准确的边界框中有很大一部分会被错误抑制,这是由分类置信度和定位准确度之间的不匹配造成的。
  2. IoU-guided-NMS : 使用预测得到的IoU来对预测框进行排序,每次选择IoU最大的框并对与它IoU大于一定阈值的框抑制。
  3. soft-NMS:NMS基础上,IoU 大于阈值的框不将其分类置信度置为0,而是将其置信度使用线性加权或者高斯加权降低。与最高得分的IOU的交集越大,分数降低的越多。
  4. locality_aware_nms:NMS基础上加了weighted_merge,所谓weighted_merge就是将2个IOU高于某个threshold的输出框,进行基于得分的合并。合并后的输出框的坐标数值介于2个合并的输入框之间,这样操作可以将所有回归出的框的坐标信息都利用起来,有助于减少位置误差,而不是像传统的nms一样,直接取分数最高的那个。整体思想和soft-nms类似。

 

算法流程



整体思想就是使用预测的IOU得分替换原始的分类得分,然后对分类得分和IOU得分进行跟新。

optimization-based边界框回归:



基于回归的边界框定位:


基于坐标回归的方法,边界框的位置会随着不断迭代而降低


基于优化的边界框定位:


基于优化的方法经过不断迭代会使得边界框精度不断提升。



红色为基于优化的方法,蓝色为基于回归的方法。不管是FPN还是Cascade R-CNN,基于优化的方法会随着不断迭代而精度提升,而基于回归的方法表现出前面几次微弱的提升,继续迭代就下降的趋势。

算法流程


整体思想根据IOU的得分算出梯度grad,然后向梯度增加的方向对边界框的坐标进行跟新,为什么是梯度增加的方向,因为IOU的得分是越大越好。



boxdet :检测的边界框


boxgt :groundtruth


c:条件参数


transform :一个变换函数,输入检测的边界框和条件参数c,会将现在预测的边界框进行调节变换,使得变换后的边界框与groundtruth的差异越来越小。

IoU-Net 整体框架:



ROI Pooling,ROI Align,PrROI Pooling大对比:



ROI Pooling:


ROI Pooling在faster RCNN中提出。主要有2个缺点,


  1. 需要进行2次量化取整的操作,会带来精度的损失
  2. ROI区域中的像素是离散化的,没有梯度的更新,不能进行训练的调节

首先,ROI Pooling涉及到的2次量化操作,每进行一次都会有精度的损失。第一次是ROI pooling之前预测的边界框是个float数值,而不是整数,这样就涉及到一次取整的操作,取整后才可以输入ROI Pooling。第二次是ROI Pooling需要对提取的ROI做pooling操作,输出一个7_7大小的feature map,即7_7给bin。这样ROI的长度或者宽度除以7,得到的也是一个float数值,而非整数,这个时候又涉及到一次量化取整的操作。如上图所示,除以7后得到的是一个红色虚线框,但是这时候由于是float类型,(x1, y1)、(x2, y2)所对应的像素都是不知道的,所以得进行量化取整,即分别求得(x1, y1)、(x2, y2)的下、上确界,得到红色实线框。然后再对每一个bin做average pooling操作,输出最终的7_7的feature map。


 


ROI Align:


ROI Align是ROI Pooling的改进版,mask RCNN中提出。



优点:


(1)改进了ROI pooling中2次量化操作,从而使得精度有保障。


(2)对每一个bin内部的N个插值的像素使用双线性插值进行跟新,有梯度的传导


缺点:


  1. ROI区域中的每个bin区域中引入了新的参数,即需要插值的点的数目N。并且这个N是预先设定的,无法根据feature map做自适应调整。
  2. 这N个点的梯度只与其上下左右4个整数位置的像素点有关,而不是整个区域的像素点都有梯度的传递。

首先在输入ROI Align之前的边界框的点还是和ROI pooling一样,采用同样的思来得到,同样是一个float数值,但是这个数值对应的位置的像素不需要进行双向性插值得到。ROI Align操作同样是需要输出一个7_7的feature map。再经过ROI Align之后,与ROI pooling一样,也是得到7_7个float类型的框的位置(x1, y1)、(x2, y2),也就是bin区域。如上图中的红色虚线框。对于每一个bin区域,构造其中间的N个点,N需要预先设置,上图中N=4,这样对其平均分成3_3块,bin区域的中间就会生成4个需要的点,这4个红色的点(ai, bi)就是需要的坐标点,同样这4给红色点的坐标也是float类型,从上、下、左、右4个整数值位置的像素使用双线性插值得到。最终对每一个bin区域的4个像素求平均,也就是average pooling操作,得到每个bin的输出,最终输出7_7的feature map。

PrROI Pooling:


优点:


  1. 不涉及任何量化取整操作
  2. 解决了ROI Align中插值像素点数目N的问题,这里不再有该参数,整个feature map是一个连续的整体。
  3. 整个区域的像素值通过求积分得到,所以,所有的像素值都有梯度的传递。


对于每一个bin区域,假设(x1, y1)、(x2, y2)为其中一个bin区域的左上角和右下角坐标,图中红色虚线框。基于每个bin中的整数值位置的像素点就可以积分出整个区域的像素值。


IC函数计算每一个连续的x,y方向的偏移的乘积,在1个像素以内的偏移,使用该像素(i,j)计算,即该像素上下左右1个像素以内的区域都会被计算到。超过一个像素的偏移的,使用下一个整数像素点(i+1,j)或者(i,j+1)计算。然后该偏移的乘积和(i,j)的像素值wij乘积得到f(x,y)。从(x1, y1)到(x2, y2)对f(x,y)求积分,即可以得到整个bin区域的像素的和,然后求平均,就得到该bin区域的输出。最终每一个bin区域都输出1个数值,形成最终的7_7输出的feature map。

实验结果:


IoU-guided NMS 的有效性:



optimization-based方法的有效性:



IoU-guided NMS+optimization-based方法联合训练的有效性:



测试速度:



总结:


  1. 论文首次指出使用分类的得分作为边界框得分的不合理性,进而提出IOU得分,从而引出了IoU-guided NMS操作,使得定位精度有很大提升,尤其是在阈值为0.9时的精度提升很明显。
  2. 论文提出了ROI Pooling和ROI Align的改进版Precise RoI Pooling 。使得边界框定位这块可以梯度传递,使得精度提升。
  3. 论文提出了regression-based方法的改进版optimization-based的方法,充分利用Precise RoI Pooling的梯度可导,对预测边框进行迭代更新,使得精度有提升。