为了账号安全,请及时绑定邮箱和手机立即绑定

目标检测之R-FCN网络

论文地址:https://arxiv.org/abs/1605.06409
Github代码:Matlab版Python版

背景

在Fast R-CNN中,rbg利用 ROI Pooling 解决了不同尺寸 proposal 的特征提取问题,在其升级版 Faster R-CNN 中rbg进一步提出了 RPN 网络,通过共享输入图像的卷积特征,快速生成 proposal。纵观整个 R-CNN 系列的发展过程,我们可以发现,Fast R-CNN中之所以引进 ROI Pooling 是因为网络中全连接层的存在。事实上,一些state of art的图片分类网络均为全卷积网络,如ResNet、GoogLeNet等。所以很自然地,是否可以将目标检测的网络也用全卷积网络来实现?事实证明,如果简单地丢弃全连接层(实现融合特征和特征映射),检测的效果会很差。

作者认为这主要来源于这样的一对矛盾:

图像分类:要求图像具有平移不变性(translation invariance)
目标检测:要求图像具有位置敏感性(translation variance)

Region based Fully Convolutional Network(R-FCN)的提出即是为了解决这样的一对矛盾,R-FCN中的一个关键层是位置敏感ROI池化层(position-sensitive RoI pooling layer)。

R-FCN结构

https://img1.sycdn.imooc.com//5d32b1550001836006070337.jpg

r-fcn

首先来看一下R-FCN的网络结构。和Faster R-CNN一样,R-FCN也是 基于region proposal的两级检测架构。

“对于region-based的检测方法,以Faster R-CNN为例,实际上是分成了几个subnetwork,第一个用来在整张图上做比较耗时的conv,这些操作与region无关,是计算共享的。第二个subnetwork是用来产生候选的boundingbox(如RPN),第三个subnetwork用来分类或进一步对box进行regression(如Fast RCNN),这个subnetwork和region是有关系的,必须每个region单独跑网络,衔接在这个subnetwork和前两个subnetwork中间的就是ROI pooling。我们希望的是,耗时的卷积都尽量移到前面共享的subnetwork上。因此,和Faster RCNN中用的ResNet(前91层共享,插入ROI pooling,后10层不共享)策略不同,本文把所有的101层都放在了前面共享的subnetwork。最后用来prediction的卷积只有1层,大大减少了计算量。”

https://img1.sycdn.imooc.com//5d32b158000185cb07160130.jpg

R-FCN 首先也是一个RPN的网络,用于生成和训练proposal(ROI)。所不同的是,Faster R-CNN中,ROI Pooling层直接对ROI进行分块池化输出用于分类和回归的特征向量。

R-FCN中,则将每一个ROI划分成k×k个格,池化输出每个格的位置得分,再通过投票方式得到 ROI 最后的输出特征向量。的首先生成 k^2(C+1) 通道大小的输出。其中,C 为类别数(+1为背景), k^2 表示将ROI区域划分成 k×k个格,如上图所示。如 k=3,则对应9个格,分别为上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角),如下图所示:

https://img1.sycdn.imooc.com//5d32b15c000118a707210367.jpg

Backbone网络:ResNet101——去除原始网络最后的平均池化层和全连接层,保留100层的卷积层用于特征提取。为了降维,100层卷积层之后又添加了一层1×1×1024的卷积层,使输出维度变成1024(原始的是2048)。之后再接一层卷积层用于产生得分图。

位置敏感得分图&位置敏感ROI Pooling:将w×h大小的ROI划分成k×k个格(大小 ≈ \frac{w}{k}×\frac{h}{k})。对每个格进行位置敏感池化操作,如下式:
r(i,j|Θ) = \sum_{(x,y)∈bin(i,j)}^{}z_i,_j,_c(x+x_0,y+y_0|Θ)/n
式中,r(i,j|Θ)是第(i,j)个格的池化响应;z_i,_j,_c表示k^2(C+1) 中的一个得分图;(x_0,y_0)表示ROI左上角的格。

https://img1.sycdn.imooc.com//5d32b16000019ef703630354.jpg


k^2个得分图通过投票(eg.求均值)后得到ROI上 C+1 维的输出向量。后接一个softmax层得到每一类的最终得分,并在训练时计算损失,如下图。

https://img1.sycdn.imooc.com//5d32b1630001e70503000266.jpg

ROI的位置回归:R-FCN的位置回归方式与R-CNN和Fast R-CNN相似。上面说到,在base网络的 feature map 之后连接了一层卷积用于产生k^2(C+1)维的位置敏感得分图。此处仍然从base网络上连接一个 4k^2 通道的得分图(与位置敏感得分图并列),用来做 ROI 的坐标微调。同样对这个 4k^2 大小的得分图进行 ROI Pooling操作,输出 t=(t_x, t_y, t_w, t_h) 大小的 4 维坐标向量。

训练的相关细节:损失函数与Fast RCNN相似,分类部分为交叉熵损失,回归部分为平滑L1损失,总的损失为这两部分的和:

L(s, t_{x, y, w, h}) = L_{cls}(s_{c^*}) + \lambda[c^* > 0]L_{reg}(t, t^*)

  1. IoU大于0.5的ROI被当做正样本,其余作为负样本

  2. 采用单尺度训练,尺度大小为600像素(min(w, h))。每张图片通过OHEM选取128个hard example做反向传播

  3. 分别用学习率为0.001,20k次迭代;学习率为0.0001,10k次迭代在VOC数据集上做微调

  4. 采用类似Faster R-CNN中的4步训练策略交替训练RPN网络和R-FCN网络

推理部分:与Faster R-CNN等类似,采用阈值0.7的NMS进行非极大值抑制。

À trous卷积和stride调整:R-FCN调整了部分卷积核的stride大小(conv4及之前的保持stride=16,conv5的stride由2变为1)。同时,conv5上的卷积采用À trous卷积(空洞卷积),补偿减小stride带来的影响。

实验结果

VOC数据集

1.  与Faster R-CNN的对比

https://img1.sycdn.imooc.com//5d32b1690001ebd106900214.jpg

https://img1.sycdn.imooc.com//5d32b16c0001b98b06880580.jpg

2. ResNet深度、ROI生成策略的影响

https://img1.sycdn.imooc.com//5d32b17000010dec07170229.jpg


COCO数据集

https://img1.sycdn.imooc.com//5d32b1730001f2fa07130237.jpg



作者:Kaami
链接:https://www.jianshu.com/p/30b57b36add5


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消