【Deep Learning】R-FCN

  这篇的主要是介绍基于 R-FCN 的目标检测。其中值得注意的便是作者提出了使用全卷积网络,也就是 FCN 来代替之前的检测方法中(Fast R-CNN、Faster R-CNN等)中的网络结构,去除了网络中的全连接层等部分,为了得到更好的效果,在基础网络结构中使用了 hole algorithm 等算法,其中最值得注意的部分是文中所使用的 position-sensitive 思想,具体内容在下面具体内容中进行介绍。


1. 综述

  这部分主要根据论文中的 IntroductionRelated Work 对这种目标检测结构进行介绍。
  之前的网络(如 R-CNN,Fast R-CNN 等)已经说明了利用 region proposal 结合 深度网络用来进行目标检测是有效的。但是在 R-CNN 中计算那些关于 crop 和 变换的区域的计算是不共享的。而 SPP-Net,Fast R-CNN 和 Faster R-CNN 是 “半卷积”的,在卷积网络中是计算共享的,但是在另一个子网络是各自计算独立的区域。
  目前已经有可以被认为是“完全卷积”模型的物体检测器。OverFeat 通过在共享的卷积特征映射上滑动多尺度窗口来检测对象;类似的,在 Fast R-CNN 中,研究了使用滑窗来代替 region proposal。在某些情况下,可以将单精度的滑动窗口改造成一个单层的卷积层。在 Faster R-CNN 中使用 RPN 结构是一个全卷积检测器,用来预测出一个关于多尺度的参考边框的实际边框。原始的 RPN 网络是与类别无关(class-agnostic)的。但是对于 class-specific 也是可以应用的。
  因此,综上所示,目前来说,对于物体检测可以通过 ROI Pooling layer 分成两个方法:

  • 独立于 ROI 的共享的、全卷积的子网络。(a shared, “fully convolutional” subnetwork independent of RoIs)
  • 不共享计算的 ROI-wise 子网络(an RoI-wise subnetwork that does not share computation)

  造成这两种不同来源于之前提出的分类网络结构,比如说 AlexNetVGG 等。它们由两个子网络组成,一个是以 spatial pooling layer(空间池化层) 结束的卷积子网,另一个是若干个 fully-connected layers(全卷积层)。因此,在目标检测任务中, spatial pooling layer 很自然的也就转换成了 ROI pooling layer。

  但是目前最好的图像分类网络,例如 ResNetGoogleNets 都是使用 fully convolution 设计的,因此,类似的,很自然的可以想到通过使用全卷积在目标检测结构中构建一个 共享计算的,卷积子网络,而不将 ROI-Wise 子网络作为 hidden layer(隐藏层)。然而,通过对这个想法的实验可以得出,使用这种方法构建的目标检测网络的准确率与其分类的最优准确率有着很大的差距。为了解决这个问题,在 ResNet paper 中作者将 Faster R-CNN 检测方法中的 ROI pooling layer 很不自然的插入在两个卷积层中间,这样便通过一个更深的 ROI-wise 子网络来提升了检测的准确率,但是其代价是由于在每个 ROI 中未共享计算从而降低了检测速度。

  作者发现,前面这种“不自然”的设计是由于在分类任务中的“平移不变性”和目标检测任务中要求的“平移转变性”的矛盾。具体来说,一方面,在图像级别的 分类任务中更加倾向于 translation invariance(平移不变性),也就是在一张图像中的目标的移动应该不影响最终的分类结果。因此,深层(全)卷及网络结构更加倾向于保持整个结构的这种特性(平移不变性);但是另一方面,目标检测任务需要定位一张图像中目标的具体位置,也就是需要存在 translation-variant (平移转变性)。为了解决这个问题,在 ResNet paper 在目标检测流程中在两个卷积层之间插入了 ROI pooling layer。这种操作打破了平移不变形,以此 post-ROI 在评价不同 region 时不再保持平移不变性。然而,这种引入平移转变性的设计是以牺牲训练和测试效率为代价的,因为它引入了非常大量的 region-wise layers。

  因此在本文中,提出了一个新的目标检测结构,也就是 R-FCN( Region-based Fully Convolutional Network),我们的网络由共享的全卷积结构组成,就像 FCN 网络一样。为了将上面提到的“平移转变性”融合到 FCN 中,我们通过在 FCN 的输出上使用一系列的特定卷积层构建了一系列的 position-sensitive score map(位置敏感得分图)。这些 位置敏感得分图 中的每一个都对相对空间位置对位置信息进行编码。在这个 FCN 的顶层,我们添加了一个位置敏感(position-sensitive) ROI pooling 层,以此用来管理从这些得分图得到的信息,并且这一层是没有任何附加权重的。可以看出 整个结构是端到端(end-to-end)的。所有需要学习的参数(权重)都是对于整张图像而言并且都是共享的,此外还对空间位置进行编码用来目标检测。下图表示了作者设计这种 R-FCN 的整体流程:

这里写图片描述


2. 具体细节

  这部分主要介绍 R-FCN 中的具体细节,对应论文中的部分为 Our approach 的前半部分,个人认为这部分也是整篇 paper 的精华所在。下面进行具体介绍:

2.1 整体介绍

   R-FCN 的基本思路是 首先使用 RPN 结构将一幅图像中的候选区域进行选出,然后在 RPN 网络和 R-FCN 结构中共享这些特征。

   在由 RPN 给出图像中的候选区域后,R-FCN 结构将得到的 ROI 进行目标划分到相应类别或是背景。在 R-FCN 中,所有的学习权重都是作用在整张图像上的卷积操作。最后一个卷积层对每个类别产生 k2 position-sensitive score map,因此一共会产生 k2(C+1) 个通道的输出层,其中有 C 个类别还有一类是背景。 k2 个得分图对应在 ROI 位置上的 k×k 个位置。例如,如果 k×k=3×3 ,那么每个类别对应的区域可以被编码成为 {左上,中上,右上,…,右下}({top-left, top-center, top-right, … , bottom-right})。

   R-FCN 以 position-sensitive ROI pooling layer 作为结束层。该层聚合最后一个卷积层的输出,并为每个 RoI 生成分数。与之前的 SPP-Net 和 Fast R-CNN 不同的是,这里的 ROI pooling 是一种选择池化 (selective pooling),并且k×k的每个条目仅仅聚集来自于k×k得分地图堆里面的一个得分地图。通过端到端的训练,这个 ROI pooling 层将最后的卷积层转换为特定的 位置敏感得分图(position-sensition score maps)。

2.2 Backbone architecture.

  本文中 R-FCN 的结构是基于ResNet-101的,尽管其他网络(AlexNet, VGG)是适用的。ResNet-101 有100 层卷积层和后面的一个区全局平局池化层以及一个 1000 类的全连接层。在我们的设计中,我们去掉了卷积层后面的全局平局池化以及全连接层而仅使用卷积层用来计算特征图(feature maps)。我们使用在 ImageNet 数据集上预训练好的 ResNet-101 结构。在 ResNet-101 中,最后一个卷积块是 2048 维的,因此,我们最后添加一个随机初始化的 1024 维的 1*1 卷积用来降低维度。然后我们应用 k2(C+1) -channels 的卷集成用来生成得分图(sensitive-position score map)。

2.3 Position-sensitive score maps & Position-sensitive ROI pooling.

  为了将位置信息明确地编码到每个RoI中,我们将每个 RoI 矩形通过规则网格划分为k * k 个 bins。对于一个 size 为 w,h 的 ROI 区域,每个 bin 的 size 大致为 [wh×hk] 。在作者所使用的方法中,最后一个卷积层 对于每个类别 都产生 k2 个得分图(score map)。在第 (i,j) 个bin 内 (0i,jk1) ,定义一个位置敏感 ROI 池化(position-sensitive RoI pooling)仅仅用来池化第 (i,j) 个 score map:

rc(i,j|Θ)=(x,y)bin(i,j)zi,j,c(x+x0,y+y0|Θ)/n

  在上面的公式中, rc(i,j 是对于第 c 类的第 (i,j) 个池化相应, zi,j,c k2(C+1) 个 score map 中的一个, (x0,y0) 是 ROI 的左上角, n 是在当前这个 bin 中的像素个数,因此,上述公式可以看做是一个平均池化的操作,Θ 是网络中所有的可学习的参数。第 (i,j) 个 bin 的范围是 iwkx<(i+1)wk 以及 jhkx<(j+1)hk 。具体操作可以用下图来表示: 这里写图片描述
   这里对上面这幅图进行简要的说明,下面的三点参考博客 R-FCN论文阅读:
  ①首先看 k2(C+1) 个 feature map,可以看到上图中这些 feature map 一共有 9 种颜色,也就是说每种颜色的立体块(假设尺寸为 W×H×(C+1)  )表示的是不同位置存在目标的概率(也就是第一个的黄色立体块表示的是左上角的位置,最后一块浅蓝色表示的是右下角的位置)。因为一共有 k2(C+1) 个feature map,对于每个 feature map, zi,j,c 表示的就是第 i+k(j1) 个立体块上的第 c 个(表类别)map(1 i,j 3),其中 ( i,j )决定了这 9 中位置中的某一种位置,这里我们假设左上角为 i=j=1 ,c 决定了是哪一类,假设这里指的是 person。在 zi,j,c 这个feature map 上的某一个像素的位置是(x,y),像素值是value,则value表示的是原图对应的(x,y)这个位置上可能是人(c=‘person’)且是人的左上部位(i=j=1)的概率值。

  ②后面的 ROI pooling,就相当于是 Faster R-CNN 中的 ROI pooling 层,主要作用是将不同大小的 ROI 对应的 feature map 映射成为同样维度的特征,大致思路是对于无论多大的 ROI 区域,规定在相应区域上画出一个 k*k 个 bins 的网格(grid cell),对每个网格里所有像素值做一个平均池化(average pooling),这样无论图像是多大,在经过 ROI pooling 之后的 ROI 特征维度都是相同大小的。这里需要注意的是,ROI pooling 是每个 feature map 单独做的,而不是多个通道一起做的

  ③对于 ROI pooling 来说,它的输入是大小为 k2(C+1)WH (C 表示类别,W’和 H ’表示 ROI 的宽高)的score map 上某 ROI 对应的那个立体块,并且该立体块组成一个新的大小为 k2(C+1)WH 的立体块,在这个新的立体块中,每个颜色的立体块都只拿出对应位置的一个 bin,并把这 k*k 个 个 bins 组成新的立体块,大小为 C+1WH 。 例如,在上图总第一块的黄色只取左上角的 bin,最后一块淡蓝色也只取右下角的 bin。所有的 bin 进行重新组合也就成为了上图右侧中的那个薄的立体块,但是上图中的这个薄的立体块是已经经过了 pooling 操作之后的,也就是说,每个 channel
上的每个 bin 已经是经过平均池化操作后的单一像素,在池化前,这个 bin 对应的是一个区域,也就是有多个像素。

2.4 Vote on the ROI

   在经过 ROI pooling 操作后,得到的 k2 个位置敏感得分再进行投票操作,所谓投票操作,再本文中,使用的是如下的简单方法:
  直接对平均得分进行投票,对每个 ROI 产生一个 (C+1) 维的向量:

rc(Θ)=i,jrc(i,j|Theta)
上面这个公式是说,对于每一类的 score,直接进行求和。然后在进行根据下面公式对每一类的 score 进行 softmax 操作:
sc(Θ)=erc(Θ)/c=0Cerc(Θ)
利用上面的 softmax 公式得到每类的最终得分并用于计算损失。

2.5 Bounding box regression

   对于边界回归作者采用的是和 Fast R-CNNFCN 中的方法类似的方法。在基本的卷积层后,除了添加上面的 k2(C+1) 维卷积层外,作者还添加了 4k2 维的卷积层用来进行 bounding box regression。与上面的方法类似,位置敏感池化(position-sensitive pooling)在这 4k2 个feature maps 上进行操作,对于每个 ROI 产生一个 4k2 维的向量,然后再通过平均投票(类似上面的方法)这 4k2 维的向量合并成为一个 4 维向量。这个 4 维向量按照 Fast R-CNN 中的方法参数化为 t=(tx,ty,tw,th) 。需要注意的是,为了简单起见,作者使用与类别无关的边界框回归,但是对于类特定的情况同样是适用的。

3. Training

   在使用 RPN 网络将 region proposals 计算出来后,便很容易使用基于 R-FCN 框架执行端到端的训练。根据 Fast R-CNN 中的方法,这里定义在每个 ROI 上的损失函数是交叉熵损失和边界回归损失之和:

L(s,tx,y,w,h)=Lcls(sc)+λ[c>0]Lreg(t,t)

  在上面的公式中, c 表示的是 ROI 区域的真是标记( c=0 表示目标类别是背景)。其中
Lcls(sc)=log(sc)
是分类损失的交叉熵, Lreg 是边框回归损失, t 表示的是真实的边框, [c>0] 是一个指示函数,当为真时,返回 1 否则返回 0。在上面的全局损失函数中,为了平衡分类损失和边框回归损失,作者令 λ=1 (根据 Fast R-CNN )。在这里需要说明的是,作者定义的正样本时那些和真实边框 IoU 大于 0.5 的 region proposal,否则划为负样本。

  在训练本文的这个整个网络的过程中,采用 OHEM(online hard example mining)是非常容易得。因为每个 ROI 区域的计算是可以忽略的,从而使得样本挖掘(example mining) 近似是 cost-free 的。这里假设每张图片有 N 个 region proposals,前网络的前向过程中,计算这 N 个 region proposals 的损失,然后对这些 ROI 进行排序(包括正样本和负样本)然后选出具有最高的损失的 B 个样本。反向传播仅在这些选出的 B 个样本上进行。因为本文中的 每个 ROI 的计算近乎是微不足道的,因此前向传播的时间几乎与 N 无关。

  在训练具体参数方面,我们是用参数为 0.0005 的权重衰减和 参数为 0.9 的 momentum 优化方法。我们默认设置为在但尺度上进行训练,具体尺度为 600 像素大小。每个 GPU 用来处理一张图像,在反向传播过程中,B=128。作者使用 8 个 GPU 用来训练(因此 mini-batch 的大小最好选为 8 的倍数)。此外,作者还在 VOC 数据集使用学习率为 0.001 的 20k mini-batches 和 学习率为 0.0001 的 10k mini-batches 进行微调。为了使 R-FCN 与 RPN 结构共享网络中的特征,这里使用的方法与 Faster R-CNN 相同,采用 4 步训练法进行相关的训练操作。

4. Inference

  在推断过程中,feature map 在 RPN 和 R-FCN 中是共享的。之后 RPN 部分选择出相应的 ROI 区域,而 R-FCN 部分评估了 category-wise scores 以及 regresses bounding boxes。在推论阶段,我们计算了300个ROI区域。结果通过 非极大值抑制(NMS) 来进行后处理,在这个过程中使用了 0.3 IoU 的阈值,作为 standard practice。

5. A trous and stride

   论文中的全卷积网络结构是在 FCN 的基础上进行修改的。特别的,作者将 ResNet-101 中的 stride 从 32 降低到了 16。从而增加了 score map 的分辨率。在 conv4 之前的所有层都没有发生变化,在 conv5 中的 stride=2 改为 stride=1,因此在 conv5 中的算有卷积操作都相应的修改为 “hole algorithm”算法一次来补偿 stride 减少带来的影响。通过使用这种算法,使得改变 stride 前后得到的 feature map 的接受域(receipt field)不变。为了公平对比, RPN 结构仅在 conv4 及之前进行权重共享。

6. Visualization

  下面的两图中给出类当 k×k=3×3 时由 R-FCN 得到的位置敏感得分图(position-sensitive score maps)。预期这些特定位置的得分图将会在对象的特定相对位置被强烈激活。例如,“顶部中心敏感”得分图大致在物体的顶部中心位置附近呈现出较高分数。如果有一个候选框准确度的覆盖了一个真实目标(下图一), k2 个 bins 中大多数都会被强烈激活,也正是那些投票(voting)操作导致了这些高的得分。相反的,如果一个候选区域没有准确的覆盖在真实目标上, k2 个 bins 中的一部分 bins 不会被激活,同时 voting 得分也很低。
这里写图片描述

这里写图片描述


7.参考文献

  1. R-FCN
  2. [译] 基于R-FCN的物体检测
  3. R-FCN:基于区域的全卷积网络来检测物体
  4. R-FCN论文阅读
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值