目标检测之fast RCNN[2015 Ross]
ROI: region of interest(类似region proposal)
B0.Region Proposal:和RCNN一样
- 2k每张图ROI,为每个ROI记录下坐标
B1 & 2.卷积Convolution & 投影Projection
- 对一张图只做一次卷积,每个ROI记录下的坐标投射到特征图上
- 比如使用backbone网络结构为VGG,4 max pooling, 即坐标 /16
- 得到2k个feature map zone特征图区域块
- 参考了SSP(Spatial pyramid pooling) Net 空间金字塔池化,把不同尺寸的图片resize到相同尺寸,并且保留他的空间位置信息
- 处理方式类似于resize,把不同大小特征图变成同样大小特征图
- 原理
- 每个特征图中大小不一样的ROI做一个网格划分,网格划分(grid)固定大小,并且在每个grid上面做一个max pooling
- 所以不同大小的特征图(feature map)可以转换到相同大小的特征图
- RoI为7×5,输出为2×2尺寸的ROI Pooling举例
- 训练细节
- batchsize = 2;64RoIs/image -> 128 proposals(从2k个region proposal中按一定方式选出来(比如按大于指定阈值…));
- 1/4 pos(正样本) & 3/4 neg(负样本)
- IOU>0.5 pos, [0.1, 0.5] neg, [0,0.1]hard neg
- 训练时正负样本按1:3比例,测试用负难样本,如果有错误情况,用负难样本重新训练
- 问题
- cnn中和ROI pooling中加起来pooling(取整)较多,损失像素点较多,当ROI较小时,相对损失的特征就更多了,fast rcnn对小目标检测不太友好
B4 FC layers
FC层中参数较多,可考虑SVD加速(一般不会,矩阵乘法加速效果更好)
B5 Multi-task Loss多任务损失函数
- 分类:n+1(需考虑背景), softmax + cross entropy, L(cls)
- 定位:offset(用偏置项做预测), smoothL1, L(loc)
- 注意: Smoooth L2会使得小的更小,大的更大
- 损失函数为分类损失函数与定位损失函数总和
- 其中p:预测类别得分,u:真实类别,t^u:生成边界框, t^v:真实标记边界框
ROI Pooling重新思考
-
针对上图, 两次量化的解释
- Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800 * 800,最后一层特征图feature map大小:25 * 25
- 假定原图中有一region proposal,大小为665 * 665,这样,映射到特征图中的大小:665/32=20.78,即20.78 * 20.78,Caffe的Roi Pooling的C++源码,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20 * 20,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素;那么0.8的偏差,在原图上就是接近30个像素点的差别。
- 假定pooled_w =7, pooled_h=7,即pooling后固定成7 * 7大小的特征图,所以,将上面在 feature map上映射的20 * 20的 region proposal划分成49个同等大小的小区域,每个小区域的大小20/7=2.86,即2.86 * 2.86,此时,进行第二次量化,故小区域大小变成2 * 2
- 每个2 * 2的小区域里,取出其中最大的像素值,作为这一个区域的‘代表’,这样,49个小区域就输出49个像素值,组成7 * 7大小的feature map
- 总结,所以,通过上面可以看出,经过两次量化,即将浮点数取整,原本在特征图上映射的20 * 20大小的region proposal,偏差成大小为7 * 7的,这样的像素偏差势必会对后层的回归定位产生影响
-
扩展性思考:
- 投影坐标方面:可采用padding, 向上取整
- ROI pooling:
ROI Align[2017 Kaiming]
思路,完成下图2 * 2采样举例
-
坐标投射出现小数,保留小数,不取整
-
网格划分(比如变成2 * 2),把RoI换成2 * 2的网格,如下图一
-
设置超参数N为4,则每个bin内部在划分为4个小矩形,如下图二
- bin指的是RoI网格划分之后的区域,如下图一中红框别绿线划分为4个bin
- 需要求得每个bin的max值,即求得每个小矩形的max值中最大的max值
-
求得bin中每个小矩形取中心点位置的特征点,代表该小矩形,如图三的粉红色的点;具体取值规则为将正中间附近的***四个点***利用双线性差值求得
-
每个bin中所有小矩形取最值,代表该bin的值,如图四的黄色的点;黄色的点构成了图中2 * 2的采样结果,完成了ROI Align Pooling的实现
虽然解决了两次量化的问题,解决了小目标的像素损失问题,但也引来了以下问题:
- 需要提前指定超参数N
- 并不是所有的特征点都贡献进来了,每个bin的取每个区块的值只和周围四个点有关系,如果bin比较大,特征点比较多,特征图的信息没有用全
Precise ROI Pooling[2018 IoU-Net]
思路,完成下图2 * 2采样举例
- 坐标投射出现小数,保留小数,不取整
- 网格划分(比如变成2 * 2),把RoI换成2 * 2的网格,如下图一第一张图
- 通过周围四个点利用双线性差值求得每个偏移的特征点的值,如下图一第二张图的红色的点
- 对每个bin里面的值做PrPool,如图三,其实就是Average Pooling, f(x,y)中x,y由双线性差值求得,如图二所示
图一
图二
图三
Precise-ROI-Pooling反向传播