简单并全面地了解目标检测之fast RCNN(ROI Pooling、ROI Align和Precise ROI Pooling)

目标检测之fast RCNN[2015 Ross]

faster-rcnn_kaikeba.md.png

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特征图区域块

B3.ROI pooling layer

  • 参考了SSP(Spatial pyramid pooling) Net 空间金字塔池化,把不同尺寸的图片resize到相同尺寸,并且保留他的空间位置信息
  • 处理方式类似于resize,把不同大小特征图变成同样大小特征图
  • 原理
    • 每个特征图中大小不一样的ROI做一个网格划分,网格划分(grid)固定大小,并且在每个grid上面做一个max pooling
    • 所以不同大小的特征图(feature map)可以转换到相同大小的特征图
    • RoI为7×5,输出为2×2尺寸的ROI Pooling举例

      roi_pooling-1.gif
  • 训练细节
    • 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会使得小的更小,大的更大
  • 损失函数为分类损失函数与定位损失函数总和
    faster-rcnn_loss.md.png
    • 其中p:预测类别得分,u:真实类别,t^u:生成边界框, t^v:真实标记边界框

ROI Pooling重新思考

roi_pooling.md.png

  1. 针对上图, 两次量化的解释

    • 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的,这样的像素偏差势必会对后层的回归定位产生影响
  2. 扩展性思考:

    • 投影坐标方面:可采用padding, 向上取整
    • ROI pooling:

ROI Align[2017 Kaiming]

思路,完成下图2 * 2采样举例

  1. 坐标投射出现小数,保留小数,不取整

  2. 网格划分(比如变成2 * 2),把RoI换成2 * 2的网格,如下图一

  3. 设置超参数N为4,则每个bin内部在划分为4个小矩形,如下图二

    • bin指的是RoI网格划分之后的区域,如下图一中红框别绿线划分为4个bin
    • 需要求得每个bin的max值,即求得每个小矩形的max值中最大的max值
  4. 求得bin中每个小矩形取中心点位置的特征点,代表该小矩形,如图三的粉红色的点;具体取值规则为将正中间附近的***四个点***利用双线性差值求得

  5. 每个bin中所有小矩形取最值,代表该bin的值,如图四的黄色的点;黄色的点构成了图中2 * 2的采样结果,完成了ROI Align Pooling的实现

ROI-align-Pooling.png

ROI pooling反向传播
roi-align-bp.png

虽然解决了两次量化的问题,解决了小目标的像素损失问题,但也引来了以下问题:

  1. 需要提前指定超参数N
  2. 并不是所有的特征点都贡献进来了,每个bin的取每个区块的值只和周围四个点有关系,如果bin比较大,特征点比较多,特征图的信息没有用全

Precise ROI Pooling[2018 IoU-Net]

思路,完成下图2 * 2采样举例

  1. 坐标投射出现小数,保留小数,不取整
  2. 网格划分(比如变成2 * 2),把RoI换成2 * 2的网格,如下图一第一张图
  3. 通过周围四个点利用双线性差值求得每个偏移的特征点的值,如下图一第二张图的红色的点
  4. 对每个bin里面的值做PrPool,如图三,其实就是Average Pooling, f(x,y)中x,y由双线性差值求得,如图二所示

图一

Precise-ROI-Pooling.png

图二

Precise-ROI-fxy.png

图三

Precise-ROI-Pooling-math.png

Precise-ROI-Pooling反向传播

Precise-ROI-Pooling-bp.png

最后

原文链接

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值