Acquisition of Localization Confidence for Accurate Object Detection
论文链接: https://arxiv.org/abs/1807.11590
github代码:https://github.com/vacancy/PreciseRoIPooling
背景:
当前的先进检测器都有一下流程:图像特征生成,Proposal生成,区域特征提取,区域识别和回归,重复删除。 在NMS过程中,只使用类别分数最高的bbox来抑制分数低的bbox,这样的方式缺少了bbox准确度的信息,缺少定位置信度的存在两个缺点:
1 NMS时,分高但是位置不够准的框可能会把分低但是位置很准的框杀掉。这使得原本定位准确的边界框会在迭代回归的过程中偏离目标。和我们的最终目标是冲突的。
2 在对boox做refine时,缺少位置准确性的监督,仅仅是回归坐标,这样的做法缺乏可解释性,并且经过多次迭代框的回归可能越来越差。 在Cascade RCNN中有相关试验。
Insight:
基于以上观点,文章改进主要是:增加了一个预测bounding box和gt box 之间IoU(也即位置置信度)的分支IoU-net,利用此分支解决以上两个问题:
(1)NMS时用IoU-guided NMS
(2)得到bouding box后,利用IoU net对bouding box进行进一步的refine
如上图的两条曲线,基于最优(目标是得到更高的IoU)的refine方法(红线)和基于bboxregression的迭代更新方法(蓝线)对比 。 Bbox refine时,用bbox regression的迭代方法会越修越差。
如何训练IoU-Net分支
1 为了适应各种proposal的分布,IoU net的训练样本是通过gtbox随机抖动生成的,train_set =(随机抖动框,随机抖动框和gt的IoU)
2 IoU net的训练和其他分支的训练是可以同时进行的,并且IoUnet分支的辅助训练会提高最终预测结果(因为网络学到了一些别的有效信息)
学习预测IOU
IoU预测器从FPN获取视觉特征并估计每个边界框的定位精度。通过对真实的boox抖动来生成用来训练IoU-Net的边界框和标签,而不是从RPN中获取建议框。具体而言,对训练集中的所有真值边界框,使用一组随机参数手动变换它们,从而生成候选边界框集。然后,我们从该候选集中移除具有与匹配真值的IoU小于train = 0.5的边界框,统一从关于 IoU的候选集中抽取训练数据。对于每个边界框,使用t提出的精确RoI池化层从FPN的输出中提取特征。然后将这些特征馈入用于IoU预测的双层前馈网络。。
IoU预测器与大多数现有的基于RoI的检测器兼容。由于训练过程独立于特定检测器,因此它对输入分布的变化是稳定的。
IoU guide NMS:
和普通NMS类似,IoU-guided NMS是IoU(预测出来的)大的框去杀IoU小的框,当框 i 杀掉框j 时,框 i 的分数变成 i,j中分数最大的。算法流程:
IoU guide bbox refine:
这个过程发生出来的bounding box做进一步refine,refine目标是使在inference阶段,利用IoU net对预测的bouding box的IoU越来越大,算法步骤为:
1. 网络预测得到boudngbox b=(x1,y1,x2,y2)
2. b做PrRoI pooling并i通过IoU net分支,得到输出结果prev_score
3. 通过prev_score对b的梯度更新b的坐标,得到新的框 b’
4. b’再次通过PrRoI pooling和 IoU net分支,得到新的分数new_score
5.如果new_score 比prev_score小或者差小于一定阈值则停止迭代,否则继续迭代,直到达到最大IoU
不断将经过PrPool的检测框输入到IoU分支,通过计算与GT的IoU分数来计算梯度,从而更新IoU分支的参数。
Roi align也没有量化。但是,特征图上只有和bin中的四个点相邻的4*4=16个点有梯度。x1,y1,x2,y2可能没有梯度,就无法学习到x1x,2,y1,y2的变化,所以只有PrRoIPooling能够做到基于优化的bbox refinement
基于回归的方法,用回归的方法修正x y w h ,直接比较bbox坐标差
基于优化的方法,是比较IoU的大小去得到loss。
Precise Roi Pooling:
三种池化抽取区域特征方式的对比:他们都是基于ROI和特征图抽取目标区域特征的方法。
RoI Pooling:提出的初衷是为了解决区域特征图的大小不一致,导致对每一个区域的分类和边框回归需要再次使用原图切片resize后进行cnn提取特征分类。 因为分类的FC层接受 的特征向量长度是固定的,不同大小的特征图无法被同时使用。原始RoI Pooling的做法是:1 预测得到的ROI先除以stride=16并量化取整得到坐标为整数值的ROI,然后将ROI划分成k*k个bin(k=7),划分后得到的一个bin的左上角坐标是(x1,y1),右下角坐标是(x2,y2),因为(x1,y1,x2,y2)不一定都是整数,所以还有一个量化的过程,也就是对左上角坐标(x1,y1)向下取整,对右下角坐标(x2,y2)向上取整,这样就得到红色实线框。
论文的对比图中的公式是求均值,而Fast RCNN以及目前常用的ROI pooling实现中使用最大池化。ROI Pooling虽然解决了不同大小ROI的所提取的特征图尺寸不统一的问题,但是其量化操作会引入一定的误差,是后续ROI Align的改进方向。
ROI Align:不再对ROI进行量化操作,首先,将浮点值的ROI划分成k*k个bin,对于1个bin计算该bin的值时也不对该bin的坐标进行量化,而是在该bin中均匀取4个点,这4个点的坐标用(ai, bi)表示,通过计算f(ai,bi)得到该点的特征值,计算公式使用双线性插值:
如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,然后根据R1和R2对P点进行插值,就得到P点的猜测值。
这样计算得到4个红点的特征值后求平均就是这个bin的特征值。ROI Align这种计算每个bin值得方式没有引入量化操作,时通过插值方式得到的值也比较准确,因此引入的误差较少,这是Mask RCNN和Faster RCNN相比很重要的一个改进点。
PrROI Pooling。研究者引入了PrRoI 池化来完成的边界框修正。它没有任何坐标量化过程,而且在边界框坐标上有连续梯度。PrROI Pooling采用积分方式计算每个bin的值。这种计算方式和ROI Align最大的区别在于计算一个bin的值时不仅仅考虑该bin中4个插值点的均值,而是将bin中的插值看作是连续的。
积分形式的PrPool(bin,F),对(x1,y1,x2,y2)都可导,确保上面说的box refine的可行性
这是IoU-Net可以在预测过程中不断的求导,反向传播,更新梯度的最重要的原因。之前的方式是无法求导的。
作者的实验结果:
IoU NMS: 对IoU高的AP提升明显。在FPN、Cascade、Mask上分别提升了1.1、0.1、0.6个点。
IoU refinement:对所有的IoU指标的AP都有提升。在FPN、Cascade、Mask上分别提升1.4、0.8和1.7个点
联合训练: 加入IoUnet分支后,就算不使用IoU-NMS和IoU-refine,在FPN resnet-50和resnet-100上分别能提升 0.6、0.4个点,这说明在联合训练时,IoUnet分支能让back bone学到一些有用信息,对检测任务起到辅助作用。
本希望复现这个工作。由于种种原因,只能做一下不使用IoU-NMS和IoU-refine的简单实验。
如果能自己写一个很有难度的PrPooling 层,用自己改造的NMS代码,一定会很有收获和成就感吧
关于NMS使用分类置信度存在缺陷的想法切中要点,但是对于池化部分,今年的另外一篇文章就更加的创新: Learning Region Features for Object Detection
直接将手工设计的区域特征提取的过程转变为可学习的过程,尽量少的引入认为的先验。因为无法解释这样的先验是否是正确的。
网友评论