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

我只是一个虾纸丫 提交于 2020-01-04 00:56:30

整个R-FCN的结构

一个baseconv网络如ResNet101, 一个RPNFaster RCNN来的),一个position sensitiveprediction层,最后的ROI pooling+投票的决策层。

R-FCNidea出发点(关键思想)

分类需要特征具有平移不变性,检测则要求对目标的平移做出准确响应。现在的大部分CNN在分类上可以做的很好,但用在检测上效果不佳。SPPFaster R-CNN类的方法在ROI pooling前都是卷积,是具备平移不变性的,但一旦插入ROI pooling之后,后面的网络结构就不再具备平移不变性了。因此,本文想提出来的position sensitive score map(位敏得分图)这个概念是能把目标的位置信息融合进ROI pooling

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

方法细节

1. Backbone architecture: ResNet 101——去掉原始ResNet101的最后一层全连接层,保留前100层,再接一个1*1*1024的全卷积层(100层输出是2048,为了降维,再引入了一个1*1的卷积层)。

2. k^2(C+1)conv: ResNet101的输出是W*H*1024,用K^2(C+1)1024*1*1的卷积核去卷积即可得到K^2(C+1)个大小为W*Hposition sensitivescore map。这步的卷积操作就是在做predictionk = 3,表示把一个ROI划分成3*3,对应的9个位置分别是:上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角),如图Figuire 3

k^2(C+1)feature map的物理意义: 共有k*k = 9个颜色,每个颜色的立体块(W*H*(C+1))表示的是不同位置存在目标的概率值(第一块黄色表示的是左上角位置,最后一块淡蓝色表示的是右下角位置)。共有k^2*(C+1)feature map。每个feature mapz(i,j,c)是第i+k(j-1)个立体块上的第cmap1<= i,j <=3(i,j)决定了9种位置的某一种位置,假设为左上角位置(i=j=1),c决定了哪一类,假设为person类。在z(i,j,c)这个feature map上的某一个像素的位置是(x,y),像素值是value,则value表示的是原图对应的(x,y)这个位置上可能是人(c=person)且是人的左上部位(i=j=1)的概率值

ROI pooling就是faster RCNN中的ROI pooling,也就是一层的SPP结构。主要用来将不同大小的ROI对应的feature map映射成同样维度的特征,思路是不论对多大的ROI,规定在上面画一个n*n bin的网格,每个网格里的所有像素值做一个pooling(平均),这样不论图像多大,pooling后的ROI特征维度都是n*n。注意一点ROI pooling是每个feature map单独做,不是多个channel一起的。

ROI pooling的输入和输出:ROI pooling操作的输入(对于C+1个类)是k^2*(C+1)*W' *H'W'H'ROI的宽度和高度)的score map上某ROI对应的那个立体块,且该立体块组成一个新的k^2*(C+1)*W' *H'的立体块:每个颜色的立体块(C+1)都只抠出对应位置的一个bin,把这k*kbin组成新的立体块,大小为(C+1)*W'*H'。例如,下图中的第一块黄色只取左上角的bin,最后一块淡蓝色只取右下角的bin。所有的bin重新组合后就变成了类似右图的那个薄的立体块(图中的这个是池化后的输出,即每个面上的每个bin上已经是一个像素。池化前这个bin对应的是一个区域,是多个像素)。ROI pooling的输出为为一个(C+1)*k*k的立体块,如上图中的右图。

相似的方法定位了边界框回归(bounding box regression)。在k^2(C+1)个卷积层,我们附加了一个4k^2个卷积层用于边界框回归Position-sensitive RoI pooling 4k^2map中表现出来,对于每一个RoI,产生一个4k^2维的向量,然后被聚合为一个4维向量通过平均投票。这个4维用 t = (t_x, t_y, t_w, t_h) 参数化一个边框。

caffe的实现中实际为8k2维的向量,因为类别分为了两类,前景和背景。

Training(训练)  

在预先计算了region proposals,端对端地训练R-FCN结构是非常简单的。接下来,我们的损失函数(loss fuction)的定义由两部分组成:交叉熵损失(cross-entropy loss边界回归损失(box regression loss

上式中,CRoI的真实标签(C = 0表示的是背景)。

RoI与实际边框的重叠部分至少有0.5,那么我们认为是positive examples,否则是negative example

训练的样本选择策略:online hard example mining (OHEM) 。主要思想就是对样本按loss进行排序,选择前面loss较小的,这个策略主要用来对负样本进行筛选,使得正负样本更加平衡。

 

效果:  

 

 

 

 

参考:

https://blog.csdn.net/zchang81/article/details/78624853

文献位置:

https://arxiv.org/abs/1605.06409

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!