R-FCN: Object Detection via Region-based Fully Convolutional Networks

来源:互联网 发布:明解c语言 中级篇 pdf 编辑:程序博客网 时间:2024/05/17 01:34

    这篇博客主要讲述基于R-CNN框架的另一个变种的目标检测方法,名为R-FCN: Object Detection via Region-based Fully Convolutional Networks,这篇论文提出的方法在一些数据集上的表现已经超过了Faster R-CNN + resNet的表现,下图可以说明这种情况。
这里写图片描述
    以上是在VOC2012的Leaderboard上面的实时数据,不仅仅是比Faster R-CNN准确率高,而且还比Faster R-CNN快至少2.5倍,但也有缺点,那就是虽然比Faster R-CNN快,但还是不能达到实时的检测的效果,也就是没有快到实时的程度。这种又快又好的模型是很值得我们学习的。说到又好又快,SSD也算一个,但这种直接回归坐标的方法的准确率确实比region-based的方法要低一些,至少在目前所了解到的模型里面这句话是成立的。
    进入正题,和R-CNN一样,本文的方法做目标检测依然是分为了两个步骤,即提出检测建议(detection region proposals)和对这些检测建议进行分类。虽然前面我们讲过有直接不用提出检测建议而是使用回归的方法,代表性的有YOLO以及SSD,但这些方法的准确率确实相对要低一些。YOLO不用说,看过之前的博客的会知道这个方法重点在快,但mAP要比Faster R-CNN低10%都不止,SSD呢倒是和Faster R-CNN有的一比,但是在目前的各个数据集上依旧是Faster R-CNN有着最好的准确率,所以说呢,进一步对Faster R-CNN进行改造,以期获得更高的检测精度和更快的检测速度是一件非常有意义的事情,而这篇论文就是做了这样的一件事情。在R-FCN中,提出检测建议的依旧是Faster R-CNN中的Region Proposal Network(RPN)网络,也同样和Faster R-CNN一样,R-FCN和RPN(名称看起来很类似但实际是完全不同的几个东西,别搞混淆了)共享了卷积层的参数。R-FCN的网络结构如下图所示:
这里写图片描述
    给定了RoI区域(也就是proposals),R-FCN就被设计用来对这些RoI进行分类,区分是背景或者是20类中的一类(以PASCAL VOC为例所以是20类)。在R-FCN中,所有需要学习的参数都是卷积层的参数,也就是没有了之前的全连接层那种结构了,这种结构也称为全卷积网络,至于什么是全卷积网络,读者可以参考论文”Fully Convolutional Networks for Semantic Segmentation “,最后一层卷积层为每一个类别产生k*k个位置敏感的得分图(后面简称为位敏分图),假如要检测的目标有C类,加上背景就是C+1类,那么最后一层卷积层就会产生k*k*(C+1)个位敏分图,下面的结构图更好的解释了这种设计:
这里写图片描述
    这里的k一般取3(后面都直接以k=3为例),则这9个位敏分图编码单个物体类别的的9个不同位置的信息,包括{top−left,top−center,top−right,…,bottom−right}。在这总共9(C+1)个通道的位敏分图之上,R-FCN采用对位置敏感的RoI pooling方法(RoI pooling是SPP-net的变种,是在Fast R-CNN中提出来的),将每一个RoI都分成了3*3个区域,然后进行选择性池化,选择性池化指的是:在上图中的位敏分图中,橙色(最左边那层)响应图像 的(top−left)区域,抠出橙色方块 RoI,池化橙色方块 RoI 得到橙色小方块 (分数);其它颜色的响应图像同理。对所有颜色的小方块投票 (或池化) 得到1类的响应结果。这样做的意义在哪儿呢?原文写道”With end-to-end training, this RoI layer shepherds the last convolutional layer to learn specialized position-sensitive score maps.“
    我们都知道做检测的时候都有一个基本的网络(base network),这个网络往往是用于进行分类任务的网络的卷积部分,而这里呢作者采用了ResNet-101(这是目前最优秀的分类网络,其在imageNet上的top 5 error达到了3%左右),只保留这个网络的卷积层结构和预训练好的参数。由于Res-Net最后一层卷积层输出的维度是2048(即通道数是2048),为了将维度降低,用一个参数是2048*1*1*1024的卷积层进行降维,然后再将能够产生k*k*(C+1)通道的卷积层作用于之上产生k*k*(C+1)通道的feature maps。
    然后将RPN网络产生的每一个RoI都分割为3*3(k*k,k=3)个网格,在第(i,j)个bin中,其中0<=i,j<=k-1,其实就是对于每一个网格,定义了一个对位置敏感的对RoI的操作,这个操作在只在(i,j)个位敏分图上进行平均池化,举个例子,i=1,j=2,那么就在第(1+1)*(2+1)个位敏分图上进行池化,因为不同下标的位敏分图表征的是全图的不同区域对位置的敏感程度的。这个操作的定义公式如下:
这里写图片描述
    其中rc(i; j)是对(i,j)个位敏分图上的第c类进行池化的结果,Zi,j,c表示对(i,j)个网格上的第c类物体对应的位敏分图进行池化。(x0,y0)表示的是RoI区域的左上角坐标,x,y相当于相对于这个左上角坐标的偏移了。对于一个RoI中的3*3个网格分别进行了平局池化后会得到 9个输出,然后对这9个输出求一个平均,因此对一个RoI的一个类别就会产生一个输出,所以对一个RoI的C+1(包括了背景类别)个类别就会产生C+1个输出。进一步,对于一个RoI的某一个类别c类,则其产生的分数表达为对上式中的所有情况的i,j进行求和再除以9,即这里写图片描述,这里9(k*k)对任何一个类别都是固定不变的,所以在计算的时候省略了,再进一步,就可以使用softmax求出最终对一个RoI的判断为各个类别的表概率大小的达式了,即这里写图片描述,这里的c从0到C(在PASCAL VOC中C取20 )。把这些个概率和真值比较,就得到了分类项的损失函数。
    和R-CNN系列的方法一样,R-FCN还是要采取bounding box回归这一策略。因此除了在用于降维的卷积层之后加上一个能够产生K*K*(C+1)个通道的feature map的卷积层以外,还要加上一个”兄弟层”,这个层产生4k*k的卷积层用于bounding box回归。每个 RoI 产生的4k*k维度的向量经平均投票后,用Fast R-CNN 的参数化方法得到1个4维向量(tx,ty,tw,th)。
    每个RoI的损失有两部分,一个是交叉熵损失函数一个是bound ing box回归的损失函数,如下式:
这里写图片描述
    其中c*表示一个RoI的真实类别标签,分类的损失函数如下图:
这里写图片描述
    回归的损失函数Lreg和Fast R-CNN中的定义一样。且RPN 产生的区域建议当 RoI 与 真实边框的 IoU 超过0.5时,标定为正样本。本文还做了在线难例挖掘 ,假设每个图像前向产生N个区域建议,计算所有建议的损失。按损失排序所有 RoIs,选择损失最高的B个 RoIs。
    R-FCN的核心部分大概就这些了,还剩下的就是一些训练时候的技巧比如weight decay、momentum的设置,以及学习率的调整等。最后得到的结果就是R-FCN的mAP比Faster R-CNN高,速度比Faster R-CNN快,可以达到170ms一帧的样子。
    该项目的地址:https://github.com/daijifeng001/r-fcn

阅读全文
0 0