R-FCN

1、R-FCN 设计的目的

虽然Faster R-CNN把整个的检测过程集成到了一个可以end-to-end训练的网络,实现了大部分计算的共享,也极大的提高了检测速度。但是整个检测过程还是不够快,因为Faster R-CNN虽然使用了conv layers来共享特征提取,但是在RoI pooling提取每个RoI的feature map之后,要使用FC layer单独对每个RoI进行分类和回归,所以假设提取了128个RoI,那么就要使用FC layer进行128次的回归和分类,而且大家也都知道FC layer的计算量是非常大的,所以这部分的计算就拖慢了Faster R-CNN的检测速度。所以还需要更充分的共享计算才能再提高速度,因此文章中提出了使用全卷积网络(FCN, Fully Convolutional Network)来实现计算共享,提高速度。具体使用的是ResNet-101的conv layers。

但是使用这样比较深的网络也存在一个问题,那就是平移不变性和平移可变性的问题。因为使用ResNet-101分类的时候,无论物体怎么翻转、平移、扭曲,分类结果还是相同的,这就是平移不变性。但是对于目标检测,当物体发生平移时,检测结果也应该随着物体的变化而变化,这就是平移可变性。但是当卷积网络变深后,输出的feature map就变小,所以在原图上的一些物体的偏移,在经过N层pooling后得到的小feature map上会感知不到,所以网络变深使得平移可变性变差。所以为了解决这个问题,首先想到的是将RoI pooling层往前移动,因为在浅层的feature map上进行RoI pooling更能提取一些位置比较精确的proposal,然后这些proposal再进行卷积就能给深层的conv来平移可变性。对于这个改进,作者也给出了试验结果来证明:RoI放在ResNet-101的conv5后,mAP是68.9%;RoI放到conv4和conv5之间的mAP是76.4%,所以证明RoI能够给深层网络带来平移可变性,同时平移可变性对于目标检测也相当重要。但是实验结果也表明,在conv5之后放RoI还是没有很好的效果,因此需要其他的方法来使得网络对于位置比较敏感,因此就提出了position-sensitive score map来达到这个目的,使得网络变深的同时,准确率也能和Faster R-CNN相媲美。

Position-sensitive score map的概念最早来自另一篇实例分割的论文Instance-sensitive Fully Convolutional Networks (https://arxiv.org/pdf/1603.08678.pdf)。

2、 R-FCN 的贡献

  • 将FCN(Fully Convolutional Network)应用于Faster R-CNN,使得整个网络的计算可以共享,从而极大的提高了检测速度,同时检测的精度和性能(mAP)也可以和Faster R-CNN相媲美。

  • 提出了position sensitive score map来平衡平移不变性(translation-invariance)和平移可变性(translation-variance)之间的矛盾。

3、 模型结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byHMWmID-1572844069176)(/Users/paulzyh/Git仓库/Papers_Reading/目标检测/图片/R-FCN_1.jpg)]

所示为R-FCN的结构图,从图中我们可以看出R-FCN主要包括4个部分:Conv layers (ResNet)、Region Proposal Network(RPN)、Classification、Regression。而整个R-FCN的流程如下:

  1. 首先输入一张图片,图片要经过resize使得图片的短边的长度为600。

  2. 然后图片先经过ResNet-101来提取特征,ResNet-101主要包括5个卷积网络块。

  3. 其中conv4的输出作为RPN的输入,和Faster R-CNN相同,这个RPN是用来提取proposal的,即提取出RoIs。

  4. 同时,ResNet-101的conv5输出因为是2048-d的,所以又加了一个新的new conv来降低channel的维度,输出的维度为1024-d。

  5. 然后这个1024-d的feature map再输入两个平行的conv layer中,一个用来classification,另一个用来regression。

  6. 对于classification的conv layer会产生一个k^2(c+1)维的position-sensitive score map,然后再结合RPN提取的RoIs进行pooling,之后再为每个RoI得到分类结果。

  7. 而对于regression的conv layer则会产生一个4k^2 维的position sensitive score map,然后也同样结合RPN提取的RoIs进行pooling,之后再为每个RoI得到回归结果。

上述过程是R-FCN进行目标检测的一个流程,接下来给大家详细讲解R-FCN中的各个部分。

ResNet卷积层

在R-FCN中采用的是ResNet-101的网络结构,ResNet-101主要包括5个conv块,其中包括100个的conv layer和1个FC layer,在文中去掉了最后一层FC layer,只使用了前5个conv块,共100层卷积。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZO8AUgut-1572844069177)(/Users/paulzyh/Git仓库/Papers_Reading/目标检测/图片/R-FCN_2.jpg)]

Region Proposal Network(RPN)

R-FCN中的RPN和Faster R-CNN中的PRN相同,并没有进行改进。

分类

在分类模块中,new conv层输出的1024-d的feature map输入到一个 1 ∗ 1的卷积层中,然后得到一个k^2(c+1)维的position sensitive score map。k^2(c+1) 表示有k^2个score map,每个score map是c+1维的,代表着(c+1)类。这个k^2 score map都对应着k∗k 的网格的空间位置,第一个score map对应的是网格的top-left,第二个score map对应的是网格的top-center,依次类推。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SgtzHSuX-1572844069178)(/Users/paulzyh/Git仓库/Papers_Reading/目标检测/图片/R-FCN_4.jpg)]

得到这个position-sensitive score maps之后,就要结合RoIs来进行RoI pooling了,和Faster R-CNN相同的是,都会将RoI对应的feature map分成 k ∗ k k*kk∗k 个bin,然后在每个bin内进行pooling,然而不同的是R-FCN使用的是selective pooling。整个pooling过程可以用以下公式表示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s421ntV0-1572844069178)(/Users/paulzyh/Git仓库/Papers_Reading/目标检测/图片/R-FCN_5.png)]

其中,(x0​,y0​) 表示的是RoI的左上点的坐标,(x,y) 表示的是bin(i,j) 中的点的坐标,所以(x+x0​,y+y0​)就是bin(i,j) 中的点在feature map上的坐标,然后z i,j,c​(x+x0​,y+y0​∣Θ) 就是坐标对应的像素点的值,所以公式右侧的意思是bin(i,j) 中所有的像素点的值加和然后求平均,这就是说在bin(i,j)中采用的是average pooling。这也就是说每个最后得到的rc​(i,j∣Θ) 是用第(i,j) 个score map上的第(i,j) 个bin中进行average pooling得到。这个公式很绕,不懂也没关系,我们用图来说明。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7HxVSgRu-1572844069179)(/Users/paulzyh/Git仓库/Papers_Reading/目标检测/图片/R-FCN_6.jpg)]

如上图所示,对于一个RoI,首先将其分为 k∗k 个bin,在这里为 3∗3,也就是9个score map都应将RoI对应的区域分为 3∗3 。那么在pooling时,第一个score map上的top-left bin中进行average pooling, 然后得到pooling后的feature map的左上角的值。然后第二个score map上的top-center bin 中进行average pooling,然后得到pooling后的feature map的top-center的值,依次类推。在图中,我使用了相同的颜色来表示进行average pooling的bin,以及其在pooling后的feature map上对应的位置。需要注意的是,在这里每个bin中使用的是average pooling,那使用max pooling也是可以的。

 

 

 

:position sensitive score map的通道个数为K*K*(C+1) 。其中C表示物体类别种数,再加上1个背景类别,所以共有(C+1)类,而每个类别都有 K*K个score maps(将该map分成c+1份,每份k*k个)。现在我们只针对其中的一个类别来进行说明,假设我们的目标属于人这个类别,那么其有 K*K 个score maps,每一个score map表示原始图像中的哪些位置含有人的某个部位,该score map会在含有对应的人体的某个部位的位置有高的响应值,也就是说每一个score map都是用来描述人体的其中一个部位出现在该score map的何处,而在出现的地方就有高响应值”。既然是这样,那么我们只要将RoI的各个子区域对应到属于人的每一个score map上然后获取它的响应值就好了。但是要注意的是,由于一个score map都是只属于一个类别的一个部位的,所以RoI的第 i个子区域一定要到第i张score map上去寻找对应区域的响应值,因为RoI的第i个子区域需要的部位和第i张score map关注的部位是对应的。那么现在该RoI的K*K个子区域都已经分别在属于人的K*K个score maps上找到其响应值了,那么如果这些响应值都很高,那么就证明该RoI是人。

3.2 Position-Sensitive Rol Pooling
ROl的K*K个子区域在各个类别的score maps上每个子区域的响应值,就是通过位置敏感Rol池化操作(Position-sensitive RoI pooling)找到的,其字面意思是池化操作是位置敏感的。

通过RPN提取出来的RoI区域,包含了x,y,w,h的4个值,也就是说不同的RoI区域能够对应到score map的不同位置上,而一个RoI会被划分成K*K个bins(也就是子区域。每个子区域bin的长宽分别是 h/k 和 w/k ),每个bin都对应到score map上的某一个区域。既然该RoI的每个bin都对应到score map上的某一个子区域,那么池化操作就是在该bin对应的score map上的子区域执行,且执行的是平均池化。在前面已经讲了,第i个bin应该在第i个score map上寻找响应值,那么也就是在第i个score map上的第i个bin对应的位置上进行平均池化操作。由于有(C+1)个类别,所以每个类别都要进行相同方式的池化操作,同样,结果也是c+1个channel。
那么对于每个类别,该类别的K*K个值都表示该RoI属于该类别的响应值,那么将这K*K个数相加就得到该类别的score,那么一共有(C+1)个scores,那么在这(C+1)个数上面使用简单的softmax函数就可以得到各个类别的概率了(注意,这里不需要使softmax分类器了,只需要使用简答的softmax函数,因为这里就是通过简单的比大小来判断最终的类别的)。

 

 

 

在pooling后得到的feature map其实就是文中提到的position-sensitive score,大小为k∗k∗(c+1),每一类都有k^2个position-sensitive score,然后用这k^2个score对RoI进行投票,其实就是用每一类的k^2个score进行加和求平均值,代表这一类的一个score:

然后再用一个softmax进行分类,其实就是计算每一类的概率值:

至此,便完成了分类。

为什么是position-sensitive的

为什么position-sensitive score map能够带来平移可变性呢?要回答这个问题,我们首先要搞清楚position-sensitive score maps中每个像素点的值究竟代表什么意思。图5给出了一个score map的实例,图5中间的9张图便代表9个score map,分别代表左上、中上、右上等。以左上角的score map为例,这个score map上的每个点都代表了该点出现在目标左上角的概率(得分),也就是说该点右下方刚好是目标物体的得分(score)。所以剩下的八张图依次代表图上的每个点出现在目标的正上方、右上方、左中方、正中方、右中方、左下方、正下方和右下方的概率(得分)。

img

搞清楚每个score map的点代表什么意思之后,我们来看在这些score map上是如何进行pooling的。 首先在每个score map上都找到RoI所对应的位置,并把这块区域分为3∗3 的网格 ,如图5中的绿色框所示。首先,我们从左上角的score map上取出左上角的1∗1 小格,左上角的score map代表了每个点出现在目标左上方的概率,因此我们取RoI左上角的1∗1 的小格的均值就代表了这个RoI左上角的部分出现在目标左上方的概率(得分)。之后我们从第二张图中取正上方的一个1∗1 的小格,第二张图上每一个点代表该点出现在目标正上方的概率(得分),所以我们在这张图的RoI区域取正上方的1∗1 小格的均值,就代表了这个RoI正上方这部分出现在目标正上方的概率(得分)。以此类推,在第三张图上取右上方的小格子就代表了RoI右上方出现在目标右上方的概率(得分)。这样9个格子分别在9张score map上取得,然后就组成了一个完整的的3∗3 score map,这个score map就代表了RoI的各个区域出现在目标的概率(得分)。上图最右侧为最终组合出来的score map,我们可以看到它就是把各个部分的出现黑衣男的概率组合起来得到的一个概率分布图(score map)。当组合出来的9宫格score map对应ground truth时,小方格1就对应了ground truth左上角的位置,小方格2对应了ground truth正上方的位置,依此类推,所以用这种9宫格训练时就有了目标位置的信息在里面 。

Regression

Regression的过程和classification的过程大致一样,只不过是维度改变了一下。在regression的时候,同样先将new conv输出的feature map输入到一个1∗1的卷积层中,不过这个卷积层输出的维度是4k^2,即得到维度为 4k^2的position-sensitive score map,然后使用同样的方法进行pooling,得到k∗k∗4的一个score maps,这代表对于每一个位置,都有k^2个score值,然后同样对这k^2个score求平均值,便得到一个4维向量,代表每个RoI需要偏移的位置,根据这4个值对RoI的位置进行调整,即可得到最红的bounding box的位置t=(tx​,ty​,tw​,th​) 。

img

需要注意的是,regression对于每个RoI都值获得4个位置值,所有这4个值是和类别无关的,当然也可以让这些位置值和类别相关,这样就需要1∗1 卷积层的输出为4k^2,这样每个类都会有对应的4个位置值。如果有不了解bounding-box regression的同学,可以参考我的这篇文章(Jacqueline:【目标检测】基础知识:IoU、NMS、Bounding box regression)(知乎作者)。

至此,regression的过程也做完了。我们可以发现在classification和regression中,在RoI之后就没有需要学习的层了(no learnable layer),因此这就使得RoI-wise的计算接近于cost-free,因为便可以极大的提高训练和测试的速度。

Training

在训练的过程中,可以使用预训练的ResNet-101网络和预先计算好的region proposals,这样就很容易训练end-to-end的R-FCN网络。然后R-FCN的loss函数的定义和Faster R-CNN也相同:

其中, c*是RoI的ground-truth label,如果为0,那就代表是背景。 是定义分类的cross-entropy loss。Lreg​ 是回归的损失,定义和Fast R-CNN中的相同,其中t∗ 代表ground-truth bounding box。[c∗>0] 是一个指示器,当c∗>0 的时候为1,否则为0。 λ为1。此外,在训练时,如果RoI和ground-truth box的 IoU大于0.5,那么为正样本,否则为负样本。

Inference

在测试时,会为每张图片提取300个RoIs,然后最终得到的bounding box需要通过非极大值抑制(NMS)来进行筛选,在NMS的过程中把IoU的阈值设为0.3。 如果有不了解NMS的同学,可以参考我的这篇文章(Jacqueline:【目标检测】基础知识:IoU、NMS、Bounding box regression)。

空洞卷积/膨胀卷积(atrous convolution)

在R-FCN中将ResNet的conv5的strides从2变成1,使得resnet-101的有效跨距从32像素减少到16像素,从而提高了score map的分辨率,同时,为了弥补strides的减小,在conv5部分使用空洞卷积。

img

其中,图(a)是kernel size为3∗3 的1-dilated conv,这和普通的卷积操作一样。图(b)对应的是kernel size为3∗3的2-dilated conv,由于空洞为1,所以进行卷积时,会隔一个点进行卷积,感受野将变为7∗7 ,如图所示只有9个红色的点和3∗3 的kernel发生卷积操作,其余的点略过。图c是kernel size为的3∗3 4-dilated conv,这时就可以达到15∗15的感受野。所以和传统的卷积操作,空洞卷积可以扩大感受野,让卷积层的输出包含更大范围的信息。注意,在R-FCN中只在ResNet的conv5部分使用了空洞卷积。

总结

本篇文章结合Faster R-CNN和FCN,提出了一个简单高效的R-FCN网络,它可以达到与Faster R-CNN几乎相同的检测精度,但速度却比Faster R-CNN快2.5-20倍。所以整个网络总结起来就是简单、快速、高效。

 

参考:https://zhuanlan.zhihu.com/p/61865235

           https://blog.csdn.net/qq_16540387/article/details/81879536

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值