R-FCN论文解读

时间:2024-03-27 22:17:05

相比较之前的faster-rcnn而言,rfcn比之运行速度更快,效率更高,在准确率上也没有下降。那么rfcn网络到底是什么样的网络呢?其比faster-rcnn的区别在哪里呢?

一、rfcn的基本结构:

1.一个基本的conv网络:ResNet101--------------->提取基本的特征

2.一个RPN网络(Faster Rcnn来的)

3.一个position sensitive的prediction层

4.ROIpooling+投票的决策层

R-FCN论文解读

---RFCN的idea出发点:

分类需要特征具有平移不变性,检测则要求对目标的平移作出准确的响应。Faster-rcnn类的方法在ROIpooling前都是卷积的,是具备平移不变性的,但一旦插入ROIpooling之后,后面的网络结构就不再具备平移不变性了。因此,我们需要position sensitive core map来把目标的位置信息融入到ROIpooling中

---希望:

将耗时的卷积层都尽量移到前面共享的subnetwork上,也就是产生共享的feature map的网络

---具体的改进:

Faster-rcnn中用的Resnet(前91层共享,插入ROIpooling,后面10层不共享)。

RFCN把所有的101层都改在了前面共享的subnetwork上,最后的prediction层卷积只用了一层,大大减少了计算量。

---实现:

R-FCN论文解读

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

K^2(C+1)的conv:     ResNet的输出是W*H*1024,用K^2(C+1)个1024*1*1的卷积核去卷积即可得到K^2(C+1)个大小为W*H的position sensitive 的score map。这步的卷积就是在做预测。K=3,表示把一个ROI划分成3*3,对应的9个位置分别为:上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角)

K^2(C+1)个feature map的物理意义: 共有k*k=9个颜色,每个颜色的立体块(W*H*(C+1))表示的是不同位置存在目标的概率值(第一块黄色表示的是左上角位置,最后一块淡蓝色表示的是右下角位置)。共有k^2*(C+1)个feature map。每个feature map,z(i,j,c)是第i+k(j-1)个立体块上的第c个map(1<= 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)的概率值。

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

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

R-FCN论文解读


vote投票:k*k个bin直接进行求和(每个类单独做),得到每一个类的分数,并进行softmax得到每类的最终得分,并用于计算损失。

R-FCN论文解读


损失函数和faster RCNN类似,由分类loss和回归loss组成,分类用交叉熵损失(log loss),回归用L1-smooth损失。

R-FCN论文解读

总结:

R-FCN是在Faster R-CNN的框架上进行改造,第一,把base的VGG16换车了ResNet,第二,把Fast R-CNN换成了先用卷积做prediction,再进行ROI pooling。由于ROI pooling会丢失位置信息,故在pooling前加入位置信息,即指定不同score map是负责检测目标的不同位置。pooling后把不同位置得到的score map进行组合就能复现原来的位置信息。

参考:https://blog.csdn.net/baidu_32173921/article/details/71741970