检测算法的速度瓶颈主要包括以下三个:
速度瓶颈 | 解决者 | 时间 | 解决方案 |
---|---|---|---|
特征抽取 | SPPNet | 2014 | 共享特征抽取 |
proposal生成 | Faster R-CNN | 2015 | 由CNN来生成proposal |
proposal的处理 | R-FCN | 2016 | 共享proposal处理 |
由上表易知,R-FCN就是为了 解决 不共享的proposal处理过程 而诞生的。
在这之前,SPPNet通过“共享特征抽取”,免去了前半段网络的重复计算;而后半段的网络依然要重复无数次 (对每个proposal都要计算一遍) ,极其耗时。
而到了Fast R-CNN中,由于在FCN里契入了负责处理位置信息的RoI Pooling,提出前半段负责“特征抽取”,后半段负责“proposal处理”的检测网络 (其实后面还有cls和reg双分支,这里略过) 。然而依然没有针对后半段网络的重复计算进行改进。
R-FCN针对这个痛病,将处理位置信息的任务交给了 “ position-sensitive score map ” (位置敏感得分图) 来做,从而炒了RoI Pooling的鱿鱼。检测网络的前半段和后半段被完整地连到了一起,形成一个FCN (全卷积网络):
position-sensitive score map是通过一个 k2(C+1)k2(C+1)k^2 (C+1) 的卷积操作来得到的:
其中:
每种颜色代表RoI的一个相对位置(如“左上角”、“右下角”等等),每种颜色对应的channel数为C+1(注意不是C),表示该相对位置是第c类(也可能是第0类,即背景)的可能性。
对RoI可能的每个类别而言,对应有不相邻的k2k2k^2个map块。抠出来分别做 global average pooling (论文说global max pooling也行) :
得到的k2k2k^2个单值分别按照正方形的相对位置填进去,组成一个k×k×1k×k×1k×k×1的小grid。由于每个RoI对应C+1C+1C+1种可能的类,于是每个RoI最终能得到一个k×k×(C+1)k×k×(C+1)k×k×(C+1)的厚grid。这里面既包含了位置信息,也包含了分类信息。
接着如传统的two-stage检测算法惯用做法一样,NMS降低其数量级,接着送入双分支(cls和reg)。
有了position-sensitive score map机制,则如果一个bbox能很好地overlap上某个类别为c(也可能是第0类,即背景)的object,那么c类别下对应的k2k2k^2个小grid应该都会得到较好的activation。将它们取global average pooling,就可以得到较高的score。对所有的C+1个类别得到的C+1个score进行softmax,就能判定该RoI属于类别c:
同理,和所有object的overlap都较小的RoI,不管在哪一种类别的判别下,对应的k2k2k^2个小grid都很难(或者只是小部分)被activate。经过global average pooling后,无一例外只能得到较低的score。从而该RoI被判为 类别0 (即“背景”):
将R-FCN与当时的主流检测网络Faster R-CNN进行性能对比。
在VOC2007上:
在VOC2012上:
在COCO上:
总而言之:
附上R-FCN的一些检测效果图:
R-FCN是一个兼顾精度和速度的经典算法,开启了检测算法的一个新研究方向。此后的Light-Head R-CNN、R-FCN-3000、DetNet,均是踩着R-FCN的肩膀提出的。
论文Speed/accuracy trade-offs for modern convolutional object detectors中指出:
但是呢,R-FCN所设计的position-sensitive score map虽然免去了proposal的重复处理,却也由于其自身厚重的设计而为人所诟病。这也为Li Zeming大神提出score map更轻薄的Light-Head R-CNN埋下了伏笔。
[1] R-FCN: Object Detection via Region-based Fully Convolutional Networks [2] 论文阅读: Speed/accuracy trade-offs for modern convolutional object detectors [3] 论文阅读: Light-head R-CNN