face paper:R-RCN3000论文解读

论文:R-FCN-3000 at 30fps: Decoupling Detection and Classification 
链接:https://arxiv.org/abs/1712.01802

这篇文章是对R-FCN算法(关于R-FCN算法的介绍可以看博客:R-FCN算法及Caffe代码详解)的改进,当初提出R-FCN算法的主要目的在于引入position-sensitive score map解决原来Faster RCNN中ROI Pooling层的重复计算问题,有效提升速度。而这篇文章则是通过改进生成position-sensitive score map的过程(将原来的分类支路拆分成两条支路)将R-FCN的分类类别数延伸至3000类。本文主要特点在于可以对large-scale(数量大)的object进行检测,同时可以达到real-time。效果:We propose a solution to the large scale object detection problem that outperforms YOLO-9000 by 18% and can process 30 images per second while detecting 3000 classes, referred to as R-FCN-3000. 这篇文章和旷视的Light-Head R-CNN思想也比较像,可以结合看看:Light-Head R-CNN算法笔记

文中提到的一个关键句是:decouple classification and localization,classification容易理解,就是原来R-FCN中的分类支路;localization不完全是原来R-FCN的回归支路,而是指foreground/background classification+bounding box regression。因此R-FCN-3000就像是将R-FCN中的object 类别数替换成super-class的类别数后,再在conv5的输出引出第三条支路用于得到fine-grained class的类别概率,最终的objectness score是由分类支路的objectness score(Figure1中的P(Object))和第三条支路得到的fine-grained classification socre(Figure1中的P(Dog))相乘得到的,这就是解耦的含义。 
这里写图片描述

文章比较核心的观点可以看这句话:Our approach is a modification of the R-FCN architecture in which position-sensitive filters are shared across different object classes for performing localization. For fine-grained classification, these position-sensitive filters are not needed. 可以看出,本质上是通过对R-FCN中生成position-sensitive score map的过程做卷积核共享,达到加速和可以识别更多类的目的,之所以可以这么做的依据是一些类别之间的特征相似,因此可以共享。

既然是对R-FCN的改进,那么原来的R-FCN存在什么问题?R-FCN的网络结构可以看下面的Figure1,前面基于分类网络提取到特征,然后通过一个卷积层(卷积核数量为k^2(C+1))生成k^2(C+1)维的输出(这个输出就是position-sensitive score map),其中C是类别数,k是ROI输出尺寸,图中k=3,在实验中采用k=7,可以看R-FCN文章中Table2的实验结果:k=3时候在VOC07测试集上的mAP是75.5,k=7时候的mAP是76.6。因此当类别数C非常大的时候(比如本文中的3000类),那么生成的position-sensitive score maps的维度就是49*3001,也就是需要49*3001个卷积核来生成这样的score map,这样速度就难以达到要求。因此这篇R-FCN-3000通过共享卷积核计算的方式减少卷积层的卷积核数量,达到提速的目的。 
附R-FCN的一些trick效果,测试集和指标分别是VOC 07测试集和mAP。baseline是主网络为ResNet101且ROI输出尺寸k=3时,mAP是75.5,当k=7时,mAP是76.6。当训练时候加入OHEM ,mAP可以从76.6上升到79.5。当在训练中又加入multi-scale train,mAP可以从79.5上升到80.5。当再将训练数据调整为VOC07+VOC12+COCO(原来为VOC07+VOC12),mAP可以从80.5上升到83.6。 
这里写图片描述

Figure2是网络如何得到detection score的过程,该过程包含两条支路(Figure2上面那条是生成objectness score的过程,Figure2下面那条是生成fine-grained classification score的过程),这两条支路的结果的乘积才是最终的detection score。因此在Figure2中回归部分并未画出,但是需要注意的是回归部分和R-FCN的回归部分差不多,也需要position-sensitive filters参与,filter数量是P*P(这里个人认为应该是P*P*8,不知道是不是原文略过了),回归的时候并不需要知道框中的object属于哪个类别,只需要知道是一个object即可,而最终回归的结果是由分类支路中的super-class支路的预测结果和回归支路的预测结果相加得到,对应原文:To get the super-class probability, softmax function over K super-classes is used and predictions from the localization branch are directly added to get the final position of the detection. 这里的localizaiton branch指的是回归支路。附R-FCN中回归部分和Figure2的上面那条支路类似,从conv5后面那个1024维的输出特征引出一条路,其中一条就是Figure2中先用(K+1)P*P个卷积核进行卷积得到position-sensitive score map,然后经过PSROI Pooling层得到K+1维的大小为P*P的feature map,最后进行vote操作得到K+1维的1*1输出,表示该ROI属于K+1个类的概率;另一条路就是回归,具体来讲是先用8*P*P个卷积核进行卷积得到feature map,然后经过PSROI Pooling层得到8维的大小为P*P的feature map,最后也是vote操作得到8维的1*1输出,表示框的四个点坐标。这里需要注意的是在Faster RCNN中,分类支路和回归支路都是采用全连接层来得到坐标的,而且该全连接层的输出channel数量和object的类别数挂钩,比如对于VOC数据集,其object的数量是20,那么分类支路的全连接层的输出channel数量是21,回归支路的全连接层的输出channel数量是21*4=84。而这种回归支路和object类别数挂钩的情况在R-FCN中已经不存在了。 
对于Figure2上面那条支路,position sensitive层的filter数量是(K+1)*P*P,K表示super-class数量,关于什么是super-class,可以看后面那个截图。借鉴的思想就是自然界很多类别之间的差异很小,因此类型相近的一些类可以看成是一个super-class,而Figure2上面这条支路就是对这样的super-class做分类,这个super-class的数量是固定的,可以通过聚类得到,因此即便每个super-class里面的子类数量增加,也不会增加这条支路的计算量。因此这条支路就是将原来R-FCN中的分类支路的类别数替换成了这里的super-class数量,其他不变。这样相当于对每个super-class,都有P*P个position-sensitive filters(卷积核)来执行卷积操作。 
对于Figure2下面那条支路,是用来做fine-grained classification的,所以可以看到这条支路中有一个包含C个卷积核的卷积层,C就是所有object的类别数,C中有K个super-class。注意该部分没有用到position sensitive卷积层去得到score map因此filter数量是C也比较大,但是相比R-FCN中的(C+1)*P*P,P=7时候计算量大约只有原来的1/49。 
所以这两条支路的一条输出每个ROI属于哪个super-class的概率,维度是K+1维的;另一条支路输出每个ROI属于某个super-clss的哪个具体类别的概率,维度是C维的,C包含K个super-class。因此将FIgure2上面支路的K+1维输出(Figure2中的Pbg+Psc)中的后面K维(Figure2中的Psc)和Figure2下面支路的C维输出(Figure2的Pcls)相乘得到最终的概率。 

这里有几个符号容易弄混,首先C表示所有的object类别数,C可以划分成K个super-class,文中是先对主网络(ResNet-101)的最后一层输出(2048维)feature map矩阵求均值,然后采用K-means算法来做聚类,这样就能将其中类别差异较小的类归到一个super-class(比如华南虎和东北虎可以归到同一个super-class),因此每个super-class(也就是ki)就包含数个sub-class(也就是cj),可以参考Figure2中Psc和Pcls的颜色就知道这些符号的含义。 
这里写图片描述

详细看看Figure2中两条支路的正负样本是如何确定的: 
For detecting super-class ki(Figure2的上面那条支路), an RoI is assigned as positive for super-class ki if it has an intersection over union (IoU) greater than 0.5 with any of the ground truth boxes in ki, otherwise it is marked as background (label for background class K + 1 is set to one). 
For the classification branch (to get the final 3000 classes,也就是FIgure2中下面那条支路), only positive RoIs are used for training, i.e. only those which have an IoU greater than 0.5 with a ground truth bounding box. The number of labels for classification is C instead of K + 1 in detection.

总结起来,The key insight behind the proposed R-FCN-3000 architecture is to decouple objectness detection and classification of the detected object so that the computational requirements for localization remain constant as the number of classes increases.

实验结果: 
一些实验细节可以参看原文,比如采用ResNet-50作为主网络;3种anchor scale:(64,128,256),3种aspect ratio:(1:2),(1:1)和(2:1);multi-scale inference;NMS等。

Figure3中的(a)和(b)是在给定总的类别数的前提下,super-class数量对实验结果的影响,当super-class数量为1的时候,就相当于用于object detection的那部分(Figure2中上面那条支路)是用来检测一个object是background还是foreground。(c)则是在给定super-class=1的前提下,总的类别数对最后实验结果的影响。 
这里写图片描述

Table3则是在总的class数量为1000前提下,对不同的聚类数目与时间和效果的对比。 
这里写图片描述

Table5是关于一些网络细节设计上的对比。 
这里写图片描述

更多实验结果可以参看原文。

转载博客:http://blog.csdn.net/u014380165/article/details/78809002

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值