为什么要使用ROI pooling?
在RCNN中,整体流程是:先在原图中截取大约2K个region proposals 然后送入CNN网络进行训练,训练完成后用分类器进行分类,完成物体的检测。
但是这个结构会出现问题:
- 产生大量的region proposals 会导致performance problems,很难达到实时目标检测。
- 在处理速度方面是suboptimal。
- 无法做到end-to-end training
因此为了改善这种情况,引出了ROI pooling ,ROI pooling层能够实现training 和testing的显著加速,并且提高基恩侧效率。
- 从具有多个卷积核池化的深度网络中获得的固定大小的feature maps;
- 一个表示所有ROI的N*5的矩阵,其中N表示ROI的数目。第一列表示图像index,其余四列表示其余的左上角和右下角坐标;
ROI Pooling
如上图所示,在对特征进行ROI pooling 的时候先对特征缩小16倍,(16倍的原因在Fast RCNN中,此处不做详细解释),原来的特征是第一幅图虚线部分,但是由于一些特征除不尽16,比如100*200,因此需要对特征进行向下取整,得到一个整数(就是实线框部分),然后对得到的区域进行四等分,(如第二幅图),(实际在网络中不一定是分成2x2的pooling ,只是为了方便解释。)但是跟前面原因一样,部分ROI可能需要向下取整才能进行划分。划分成4份后,对于每个矩形框取其最大值就可以完成ROI pooling。
ROI pooling 的不足:
- ROI pooing 中对特征的处理有两次向下取整,直观感受上,取整的差值不到1,对结果的影响不会很大。但是实际上再物体检测的过程中,不同的物体的大小不同,所以提取出的特征也不同,对于大的物体影响可能很小,但是对于小的物体特征影响会很大。比如一条鲸鱼的特征,进行ROI pooing后影响可以忽略不计,但是同样的对于一条小鱼来说,如果进行两次向下取整,提取的特征可能会受到致命影响。
- 最后分成四个小块,对每个小块只取他的最大值,丢失的信息过于多。
ROI Align
ROI Align的过程:
前两步过程和ROI Pooling 相同,不同的是采用了双线性插值的办法,解决的了对量化过程中对特征的影响,在4等分的基础上(绿色虚线,注:实际中不是四等分,此处是为了方便解释)进行再次分割成4份(黑色虚线,注:此处在Fast Rcnn就是分成4份,是实验的结果),分成四份后,按照周围四个蓝点进行双线性插值的得到一个粉红色的点,得到之后,在绿色框内四个粉红点中,取最大值。
ROI Align 是对ROI pooling的一次改进:
- 在两次量化的过程中采用双线性插值的方法,解决了量化过程对特征的影响。
- 分割后在分割,然后在进行取最大值,解决了部分信息的丢失。
ROI Align的问题:
- 引入了新的参数(加黑框)
- 没有彻底解决信息丢失的问题
Precise Roi poolling
分成四等分后,注意左边分f(x,y)代表的红点的坐标,wi,j 表示蓝点(ij表示行和列),左下方的两个公式其实就是标准的双线性插值计算红点坐标,每四个蓝点都能计算出一个红点,计算完坐标之后,通过右下方的第一个公式计算出左上角红色区域的平均值,这样就解决了信息丢失的问题。
PrROI Pooling:
- 在进行量化的时候,没有产生信息丢失。
- 相对于ROI Align中没有引入新的参数。
- 解决了信息丢失的问题。