1、RoI Pooling
实现从原图ROI区域映射到卷积区域最后pooling到固定大小的功能,然后通过池化把该区域的尺寸归一化成卷积网络输入的尺寸。
2、ROIAlign
上面RoI Pooling从原图ROI映射到卷积区域,即原图ROI与特征图ROI之间的映射,使用了stride间隔的取整,使得特征图ROI再映射回原图ROI的时候有stride的误差。尤其经过最大值池化后的特征与原ROI之间的空间不对齐就更加明显了。
因此,ROIAlign从原图到特征图直接的ROI映射直接使用双线性插值,不取整,这样误差会小很多,经过池化后再对应回原图的准确性也更高些。
这里假设得到的浮点型坐标为(x,y),取其周围最近的四个点,在Y方向内插两次,再在X方向内插一次,得到新的值。ROI的形状是不变化的。
但是下面的warp是先改变形状的,这也是这两种操作的不同之处
3、RoI Warping Layer
在pooling层前面,添加一层,将特征图crop一块,然后warp到固定的尺寸,这里的warp采用长度和宽度两个方向的双线性插值。
具体参考如下网址:http://dubur.github.io/
align?一致吗?个人觉得信息的降维,必然会有一定的损失即使是ROIAlign也不可能完全对齐,只能相对精确罢了。
4. PSROIPooling:Position Sensitive ROI-Pooling
原文:https://blog.csdn.net/Bruce_0712/article/details/80287355
源码解析:https://blog.csdn.net/u013010889/article/details/79232740
https://blog.csdn.net/bruce_0712/article/details/80287385
上面两个讲的比较好
讲解:https://blog.csdn.net/wfei101/article/details/79597707
https://blog.csdn.net/lanyuxuan100/article/details/78909211
https://blog.csdn.net/wfei101/article/details/79598143
Position Sensitive ROI Pooling(位置敏感的候选区域池化)是检测框架R-FCN的主要创新点。一般来讲,网络越深,其具有的平移旋转不变性越强,这个性质对于保证分类模型的鲁棒性有积极意义。然而,在检测问题中,对物体的定位任务要求模型对位置信息有良好的感知能力,过度的平移旋转不变性会削弱这一性能。研究发现,对于较深的全卷积神经网络(Inception、ResNet 等),Faster-RCNN检测框架存在着一个明显的缺陷:检测器对物体的位置信息的敏感度下降,检测准确度降低。一般来讲最直观的解决方法是将RPN的位置向浅层移动(比如在ResNet中将RPN嵌入到conv4_x的位置),但这样做会明显增加 Fast-RCNN 部分的计算量,使得检测速度明显变慢。
有鉴于此,R-FCN 这篇文章的作者提出了一种全新的特征聚集方法:Position Sensitive ROI Pooling。其主要思想是在特征聚集时人工引入位置信息,从而有效改善较深的神经网络对物体位置信息的敏感程度。同时,R-FCN的大部分操作都直接对整张图片进行,这也大大优化了网络的运行速度。PS-ROI Pooling 具体操作方法如下图所示(这里仅显示了分类分支,包围框回归分支操作类似,在通道数和损失函数形式上有一些区别):
如上图,每一个候选区域(ROI)被平均分割成 k^2 个矩形单元,前序特征图先通过一层 1*1 的卷积核生成通道数为 k^2*(C+1) 的特征图。这里,k^2 代表一个ROI里所有矩形单元的数量,C+1 代表所有的类别数加上背景。这 k^2*(C+1) 张特征图每 C+1 张分成一组、共包含 k^2 组,每组负责向对应的矩形单元进行响应。池化每一个ROI时,各个点(一共 k^2 个),均由上一层中对应分组的对应位置区域通过平均池化获得。由此获得一组 C+1 张特征图。最后,将这些特征图经过全局平均池化,得到 C+1 维的向量,计算分类损失函数。
计算反向传播时,遵循“向对应位置回传梯度的原则”,池化后的每一个点回传的梯度传向池化前特征图上对应通道对应区域的特征点上。具体实现可参见源码:PSROI-Pooling 源码
RFCN是基于Faster RCNN的工作,base net得到feature maps, 用RPN得到proposals。由于classification需要固定长度的feature vector,就需要ROI pooling layer + fully connected layer来获得,但是这个过程会去除目标的位置信息,而这个信息对于检测问题,至关重要。所以,RFCN提出position-sensitive score maps来解决这个问题。 position-sensitive ROI pooling layer的输入是ROI features, 输出是C+1维的特征向量。 其实在第二个卷积的时候,它产生的7*7*21个输出,是不知道具体所谓的位置信息的,而是后面的position-sensitive roi pooling这一步的特定选取规则,使得对于每一类,这49个maps产生了差异,在训练的时候,为了使最后的损失函数最小,这49输出对应的kernel就慢慢地显现出差异。 rfcn的核心是延续fastRCNN的思想:对于每一个proposal,所有的卷积操作(费时的操作)都只做一次。fastRCNN提出baseNet,让proposal从feature map上寻找roi,但是不同的proposal还是得重复进行后面的全连接层;rfcn提出psROIpooling, 让proposal从bbox map和score map上寻找roi,从而取消全连接层,这样不同的proposal做的重复的事情,就只有后面的average pooling。其实,per roi map还是二维的,最后二维变成一维是通过average pooling来实现的。 示例图如下:
|
5、PS-ROI Align 的主要思路和实现细节
ROI Align的具体原理和实现细节已在博文中说明得很清楚了。在这一改进思路的启发下,博主尝试将 ROI Align 移植到 PS-ROI Pooling 中,实现了一个 Position Sensitive ROI Align 的算法。主要改进就是两次量化的取消:ROI的边界坐标值和每个ROI中所有矩形单元的边界值保持浮点数形式,在每个矩形单元中计算出固定位置固定数量的采样点的像素值作平均池化。具体的前向传播和反向传播细节如下:
- 前向传播:
a. 遍历池化后特征图上的每一个像素点,在池化前特征图上寻找对应通道上的对应区域;
b. 将每一个候选区域平均划分成 n * n 个单元;
c. 在每一个单元内,按照设置的采样点数目计算出采样点的坐标值;
d. 使用双线性内插的方法计算出特征图上每一个采样点处所对应的值;
e. 依照平均池化的方式计算出 a 步骤中当前点的值,并且记录下所有采样点的位置坐标。 - 反向传播:
a. 遍历池化后特征图上的每一个像素点,在池化前特征图上寻找对应通道上的对应区域;
b. 在a步骤的当前区域中遍历每一个点,分别和前向传播中记录下来的所有采样点坐标比较,如果横纵坐标都小于1,则回传平均后的梯度值。
初步的实验表明,PS-ROI Align 对模型的检测性能有提升,对小物体的感知能力有明显改善。PSROIAlign源码