1
本文作者: 大牛讲堂 | 2016-11-10 10:01 |
雷锋网按:本文作者邬书哲博士,师从中科院计算所山世光博士。
邬书哲博士对山世光博士讲到的内容在细节上做了补充。其补充内容主要包含三个部分:首先是深度学习在物体检测领域点燃的星星之火,即R-CNN系列的工作,其次是针对检测器的速度问题所提出的两个代表性方法:YOLO和SSD,最后是传承了经典检测方法的Cascade CNN。
R-CNN的出现带来检测精度的一次巨大提升,在Pascal VOC 2010上,全面超越了之前的方法,mAP提高了20%;在ImageNet的物体检测竞赛上,刷新了之前的冠军记录,mAP提高了10%。然而R-CNN的检测速度非常慢,在GPU上处理一张图需要13s,在CPU上处理一张图需要长达53s。
Fast R-CNN是R-CNN的加速版本,其借鉴了SPP-net的做法,在提取每个窗口的特征之前,直接在全图上进行卷积,避免了大量重复计算,同时采用SVD分解对分类所用的全连接层进行压缩,将一个大的全连接层拆解成两个小的全连接层。通过这样的策略,Fast R-CNN相比R-CNN能够有213倍的加速比。
总的来看,Fast R-CNN还是不够快,因为其采用了Selective Search来提取候选窗口,这部分处理一张图在CPU上需要2s,而即使是采用EdgeBox,在GPU上也需要0.3s,这个时间和分类的时间相当。于是Faster R-CNN进一步引了RPN网络,并且让其和分类网络共享卷积层,实现进一步的加速。从R-CNN到Faster R-CNN,这是一个化零为整的过程,从不同的模块不同的方法来做,到最后整合到同一个网络中来做,精度不断提高,速度也是在不断提高的。
Faster R-CNN中有一个非常关键的设计,也就是anchor box,相比于之前的滑动窗口+图像金字塔的方式,采用anchor box实际上是固定输入图像不变,而改成去变化窗口,采用不同大小和长宽比的窗口来扫描图像。Faster R-CNN在Pascal VOC 2012、ILSVRC 2015和MS COCO 2015的检测任务上都获得了最好成绩,并且在绝大多数类别上都获得了最高的AP。
在Faster R-CNN中,如果采用ResNet这样的网络结构,那么每一个候选窗口都要经过其最后一组卷积层的计算,这会带来巨大的时间开销,这部分时间大概会占到总的检测时间的三分之一,因此出现了一个改进版:R-FCN,其将RoIPooling后移,最后一组卷积继续在整个特征图上做,从而进一步避免了重复计算。R-FCN中有一个比较巧妙的设计,叫做位置敏感得分图,以这张图为例,在判断候选框里面是不是一个人的时候,其会分别观察这个框的各个位置,如左上角、右上角等,然后分别作出判断,之后再投票整合得到最终的分类结果。可以看到这个跟DPM稍微有点相似,但是不同的是这里各个部分的几何关系是固定的,而DPM会推断各个部件的位置。
R-FCN相比于Faster R-CNN在达到类似精度的条件下在速度上能够有3倍左右的提升,在某些情况下甚至能够有20倍的提升。
R-CNN系列方法经过一系列的加速,在很多情况下,还是无法达到实时的25fps这个要求,影响速度的因素有很多,包括输入大小、候选窗口的数量等。并且这一系列方法还有一个特点,就是要看两次,一看定候选窗口,二看才定检测结果。为了提高检测速度,出现了YOLO和SSD这样的方法,其特点就是只看一次,直接得到检测结果。
另外输入图像的尺寸也减小了,从Faster R-CNN的1000x600减小到了YOLO的446x446,网络规模也进行了一定的控制。可以看到在YOLO的网络最后是两个全连接层,直接用全图的信息来预测检测框,这可以看成是对上下文的信息进行了利用,还有就是全连接层的计算本身比较快。YOLO使得检测速度得到了很大提升,快速版本在GPU可以达到150fps,然而其精度下降得非常厉害,因此实用性大大降低了。
有两个因素是比较影响精度的,一是网格划分,其使得位置过于粗糙,二是网络深度,太深层的特征使得特征过于粗糙。SSD一方面控制了网络深度,另一方面在回归窗口的时候会同时采用不同层的特征,在较浅层上回归小的窗口,在较深层上回归大的窗口。SSD速度相比没有YOLO那么快,但是换来了精度上的提升。如果和前面提到的Faster R-CNN相对比,SSD可以看成是一个RPN网络。个人认为,在完全相同的条件下,SSD速度会更快,但是Faster R-CNN精度会更好。
最后要讲的方法是经典上的一个传承:Cascade CNN。当考虑一些特定类别目标的检测的时候,尤其是人脸和人体,对速度的要求会更高,而如果只考虑单一类别的物体,传统的级联结构分类器仍然是非常有效的方法。而RPN加上Fast R-CNN的形式本身看起来也是一种级联。Cascade CNN是3组一共6个网络进行级联,交替进行分类和边框校准。分类网络的输入图像的分辨率是随着输入规模动态调整的,在最开始输入规模比较大的时候,用比较小的输入图像,这样可以尽量的节约时间,然后逐渐从12x12变化到24x24,再到48x48。
Cascade CNN在做窗口校准的时候,还不是采取回归的方式,而是人为的设置了45种不同的模式,然后采用分类的方式来对窗口进行校准。Cascade CNN后续也有一些跟进的工作,例如采用多任务协同学习,这种做法在网络比较小的时候,能够让它的精度得到提升。再有比方说把多级分类器协同训练,这样可以采用类似于Faster R-CNN那样端到端的训练方式,这可以使精度再进一步往上提。
从之前的工作到现在的工作,有一些基本的策略,包括难例挖掘,多尺度,相关任务协同学习,上下文建模等,这些策略都被广泛验证是有效的。当出现一个新的方法之后,大家往往会把同样的策略应用到这个新方法上去,做出一系列的工作。
物体检测领域现在还有很多其它的工作,比如说DenseBox、尺度相关池化、Inside-Outside Net、Multi-region CNN等等,这些方法很多都体现了以上提到的策略,同时也使基于深度学习的物体检测方法走得更远。
雷锋网注:本文由大牛讲堂授权发布,如需转载请联系原作者,并注明作者和出处,不得删减内容。有兴趣可以关注公号【地平线机器人技术】,了解最新消息。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。