本文主要是介绍R-FCN-3000 at 30fps: Decoupling Detection and Classification,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
论文地址:R-FCN-3000 at 30fps: Decoupling Detection and Classification
概述:
【导读】美国马里兰大学、复旦大学和Gobasco人工智能实验室联合提出R-FCN-3000实时3000类目标检测框架,对R-FCN框架中的物体检测和分类进行解耦。本文对R-FCN体系结构进行修改,其中位置敏感滤波器在不同的目标类之间共享来进行定位。对于细粒度的分类,这些位置敏感的滤波器是不需要的。因此,R-FCN-3000学习到了通用的物体性,也达到了更快的速度。R-FCN-3000在ImageNet检测数据集上获得34.9%的mAP,在每秒处理30帧图像的同时,可以以18%的优势超过YOLO-9000。作者相信,未来R-FCN-3000可以适用于更为广阔的目标检测场景(如十万类目标检测),并可以更好的整合目标类别先验。代码将会公开。
▌作者
-
Bharat Singh 马里兰大学计算机系博士生,主要研究方向为目标及动作识别
http://www.cs.umd.edu/~bharat/
-
Hengduo Li 复旦大学在读本科生
https://www.linkedin.com/in/hengduo-li-50588032/
-
Abhishek Sharma 印度德里农业供应链科技初创公司Gobasco联合创始人
https://www.linkedin.com/in/abhishek-sharma-a1204921/
-
Larry S. Davis 马里兰大学教授
http://www.umiacs.umd.edu/~lsd/
▌摘要
R-FCN-3000,一个大规模的实时目标检测器,其中的目标检测和分类是解耦的。为了获得RoI的检测分数,我们将物体性分数(objectnessscore)乘以细粒度的类别分数。我们的方法是对R-FCN体系结构进行修改,其中位置敏感滤波器在不同的目标类之间共享来进行定位。对于细粒度的分类,这些位置敏感的滤波器是不需要的。R-FCN-3000在ImageNet检测数据集上获得34.9%的mAP,在每秒处理30帧图像的同时,超过YOLO-9000 18%。R-FCN-3000学习的物体性可以被推广到新的类中,并且性能随着训练目标类的数量增加而增加。这个结论证明了我们可以学习通用目标检测器。本文将随后提供代码。
▌详细内容
随着深度CNNs的出现,目标检测在基准数据集上的性能取得了重大飞跃。这归功于CNN结构的强大的学习能力。在过去的五年中,PASCAL和COCO 的mAP得分分别从33%提高到88%和从37%提高到73%(在重叠率50%的评价标准上)。虽然在有数十个类别的基准数据库上有了很大的改进,但是对于需要实时检测数千个类别的现实生活中的目标检测进展甚微。最近的一些努力已经构建了了大规模的检测系统,但是以牺牲准确度为代价。
这篇文章提出了一个新颖的解决方案,能够在比YOLO-9000提高18%的精度来完成大规模目标检测问题,每秒可以处理30帧图像,同时检测3000个类别,被称为R-FCN-3000。
R-FCN-3000是对最近的一些目标检测体系结构[文章中文献6,5,23,25,29]进行修改以实现实时大规模目标检测的任务。最近提出的全卷积(fullyconvolutional)分类检测器计算给定图像中目标的每类分数。其在有限的计算预算中显示出惊人的准确性。虽然全卷积方式为诸如目标检测[6],实例分割[22],跟踪[10],关系检测[41]等任务提供了一个有效的解决方案,但他们需要为每个类设置类特定的过滤器,以禁止他们应用于其他的类。例如,R-FCN [5] / Deformable-R-FCN [6]要求每个类别有49/197个位置特定的滤波器。Retina-Net [23]对于每个卷积特征映射,每个类需要9个滤波器。
因此,这样的结构将需要数十万个用于检测3000个类的过滤器,这将使得它们在实际应用中速度非常慢。这篇文章提出的R-FCN-3000结构背后的重要启发是解耦物体性检测和对被检测物体的分类,使得即使随着类别数量的增加,对于定位的计算需求保持不变-参见图1。这篇文章利用这样的事实,即许多目标类别在视觉上相似并共享部件。例如,不同品种的狗都有共同的身体部位;因此,学习一套不同的滤波器来检测每个种类是矫枉过正的。因此,R-FCN-3000为固定数量的超类执行目标检测(使用位置敏感滤波器),然后在每个超类内进行细粒度分类(不使用位置敏感滤波器)。
通过对图像的深层语义特征进行聚类(在这种情况下是ResNet-101的2048维特征)获得超类。因此,这篇文章不需要语义层次的结构。通过将超类概率与超类内的细粒度类别的分类概率相乘,获得给定位置处的细粒度类别的概率。
为了研究使用超类而不是单个目标类别的效果,这篇文章将超类的数量从1改变到100,并评估ImageNet检测数据集的性能。令人惊讶的是,即使有一个超类,检测器也表现的很好!这一结果表明,位置敏感滤波器可以学习检测通用的物体性。它也重新验证了过去很好的研究概念[1,2,39]:目标是一个通用的概念,可以学习一个通用的目标检测器。因此,为了执行目标检测,将RoI的物体性分数乘以给定类别的分类概率就足够了。
该结果可用于数千个类别的快速检测器,因为不再需要每个类别的位置敏感滤波器。在PASCAL-VOC数据集中,只用本文提出的基于物体性的检测器,作者观察到,与可变形的R-FCN [6]检测器相比,所有20个目标类别的类别特定滤波器(class-specific filters)的mAP下降了1.5%。R-FCN-3000训练了3000个类,与ImageNet数据集上当前最先进的大型目标检测器(YOLO-9000)相比,获得了18%的mAP提升。
最后,这篇文章在看不见的类(zero-shot 设定)上评估提出的目标检测器的普适性,并观察到当在更大数量的类上训练物体检测器时,泛化误差减小。
▌模型简介
(1)框架
R-FCN-3000使用RPN产生proposals。对于每个超类k有P*P个位置敏感的滤波器。在进行位置敏感的RoIpooling和对预测进行平均之后,本文可以得到网络对于分类和定位的得分。
为了得到超类概率,网络在K个超类上进行softmax。为了得到细粒度的类别概率,作者增加了两个卷积层,再使用softmax。
R-FCN-3000首先生成region proposals,这些region proposals作为输入提供给超类检测分支(如R-FCN),其,整体的预测每个超类(sc)的检测分数。另外,本文使用类无关的边界框回归步骤来改进每个RoI的位置(这个步骤在图中没有显示)。为了获得语义类别,本文不使用位置敏感滤波器,而是以全卷积的方式预测每个类的分数。最后,作者将RoI中的每个类别分数进行averagepooling,得到分类概率。分类概率乘以超类检测概率来检测3000个类别。当K是1时,超级检测器来预测物体性。
(2)目标函数
为了训练检测器,作者使用在线难样本挖掘(OHEM),并使用smooth L1 loss来进行检测框定位。
对于细粒度的分类,作者只在C个目标类中使用softmax loss来进行正样本分类。由于相比于proposal的数量,positive ROI的数量非常少,因此作者对这个分支的loss进行了一个因子为0.05的加权,以保证这些梯度不会制约整个网络训练。这种设置是重要的,因为这篇文章中的训练中使用了多任务损失。
▌结论
这篇文章证明,通过仅使用一组滤波器来进行目标与背景检测,可以预测通用的物体性得分。这种物体性分数可以简单地与检测对象的分类分数相乘,在性能上只有一个较小的下降。最后,作者表明,可将学习到的物体性泛化至未出现的类,并且性能随着训练目标类的数量而增加。它支持物体性具有普遍性的假设。
本文提出了大规模目标检测的重大改进方法,但许多问题仍然没有得到解决。一些有前景的研究问题是:
-
如何加快R-FCN-3000检测100,000个类别的分类过程?
-
一个典型的图像包含有限数量的目标类别-如何使用这个先验知识来加速推断?
-
如果还需要检测对象及其部件,那么在这个架构中需要做什么改变?
-
由于在每个图像中使用有效的类来标记每个对象是代价很高的,所以如果某些目标没有在数据集中标记出来,可以学习鲁棒的目标检测器吗?
详解:
这篇文章是对R-FCN算法的改进,当初提出R-FCN算法的主要目的在于引入position-sensitive score map解决原来Faster RCNN中ROI Pooling层的重复计算问题,有效提升速度。而这篇文章则是通过改进生成position-sensitive score map的过程(将原来的分类支路拆分成两条支路)将R-FCN的分类类别数延伸至3000类。本文主要特点在于可以对large-scale(数量大)的object进行检测,同时可以达到real-time。这篇文章和旷视的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))相乘得到的,这就是解耦的含义。
文章比较核心的观点可通过对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,回归的时候并不需要知道框中的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,而上面这条支路就是对这样的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的上面那条支路), super-class 与真实框的(IoU>0.5)为正ROI , 负责为背景(label for background class K + 1 is set to one).
For the classification branch (to get the final 3000 classes,也就是FIgure2中下面那条支路), 只训练正 RoIs The number of labels for classification is C instead of K + 1 in detection.
重点思想: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是关于一些网络细节设计上的对比。
这篇关于R-FCN-3000 at 30fps: Decoupling Detection and Classification的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!