https://zhuanlan.zhihu.com/p/38709522
https://zhuanlan.zhihu.com/p/52499758
前言
深度学习助力目标检测达到了一个前所未有的高峰。自 2014 年以来,目标检测框架分为two-stage 和 one-stage 两大类,前者以经典方法 Faster R-CNN 为代表,后者以 YOLO 和 SSD 为主要框架。近年来,两类最深刻的idea:更好的基础网络 & 融合不同卷积层的特征叠加在经典方法上,产生了大量变体,本文以三类主要框架为基础,速览后Faster R-CNN 时代下的目标检测方法。
目录:
1. 简单回顾
2. 最深刻的两个idea
3. 大显神通的各类变体
4. PASCAL VOC & COCO 数据集排名 : Faster R-CNN 系列胜了吗?
简单回顾
所谓目标检测,实则是从属于计算机视觉中的一项任务。它的目标是定位出图像中的物体,并且给出其具体类别。在自动驾驶车辆,智能监控中,目标检测的意义十分重大。而作为评判一个目标检测系统的标准,我们有三个重要的指标。
第一,IOU,也即判别预测的方框和真实的方框有多接近的一个指标。
第二,是 mAP(mean Average Presion),在多个类别的检测中,每一个类别都可以调整阈值,算出召回率从0到1时的准确率(同一召回率取最高的准确率),计算准确率的平均值,而后再对于所有类求平均得到 mAP。这个值介于0到1之间,且越大越好。
第三,是 fps,用于评判系统速度有多快。
目标检测算法的目标即为:定位更准、速度更快、分类更精确。有了这些指标,还需要有数据集来对算法进行评估。这里介绍一下两类最常用的通用数据集:
1、PASCAL VOC 数据集。这个数据集中有20个类别,如person,bird,cat,bicycle等。
2、微软的 COCO 数据集,这个数据集中一共有80个类别,面向于室内,室外。
它们大多面向于这类生活中的场景。在目标检测的特定领域应用中,也有特定的数据集。如,加州理工行人检测数据集,KITTI 自动驾驶算法数据集,可以看到它们的场景都是用车辆在实际的路口中拍摄的。
丰富而巨大的数据集极大地推动了目标检测领域的发展。与之对应的,还有不停提升的计算力和算法的更新。随着 2012 年 AlexNet 卷积神经网络赢得 ImageNet 分类赛的冠军,应用了深度学习的计算机视觉取得了一系列重大突破,其中最亮眼之一目标检测领域,一系列优秀的框架被提出,不少已经投入商用。
整个的目标检测框架也分为两大类。第一是 two-stage 两步走的框架,先进行区域推荐,再进行目标分类;另一个是 one-stage 端到端的框架,应用一个网络把所有事情都做了,一步输出结果。
2014 年 R-CNN 框架的提出是最早将卷积网络应用到目标检测上的方法之一。R-CNN 首先利用选择性搜索这类图像分割的算法进行区域推荐,而后将这些区域分别裁剪下来,缩放送入卷积网络,来做判定。在 VOC 数据集上,它一下就提升了 20% 多的 mAP。但是这样就会造成速度慢,因为给出的推荐区域通常有 2000 多个。
在其基础上改进的 Fast R-CNN 通过在卷积层的最后一层添加一个区域池化层,使得推荐区域能够直接映射到这里来提取特征,减少了数千次重复的卷积运算,大大提升了速度。但它的区域推荐方法还是使用的选择性搜索,不能和 CNN 共享计算,速度瓶颈仍然存在。而 Faster R-CNN 则推出了区域建议网络 RPN,将这一步也用 CNN 来做,并且让区域建议网络和分类网络共享卷积特征,使得目标检测框架几乎达到实时,并且 mAP 达到了极高。
上述的 R-CNN 系列都是两步走的框架,那么端到端的框架是怎么样的呢?
来看 YOLO 。它将图像分成 S*S 个单元,每个单元分别去预测方框,利用网络对这些方框直接去学习真实方框和所属类别。YOLO 非常快,小型的模型可以达到 155 fps ,但是随之而来的是 mAP 的降低,以及定位不准的问题。而 SSD 则有点像 Faster R-CNN 中的多类别 RPN 网络,是一个十分成功的检测框架。它采用特征金字塔的多层预测方法,在不同的卷积层上设置前景方框,在不同大小的特征图上考虑不同的尺度,相当于每个层分开预测,最后一起得到结果。
从 R-CNN 到 Faster R-CNN,再到和其并驾齐驱的 YOLO 和 SSD ,目标检测的发展在2015~2016 年达到了一个巅峰。正如少林武功界的看家本领一样,在最新的目标检测研究中,有两个最主要的 idea 可以极大的提升检测器的性能,我们一一进行介绍。
最深刻的两个idea
1、融合不同卷积层的特征
(1)HyperNet: Towards Accurate Region Proposal Generation and Joint Object Detection (CVPR2016,清华信息科学与技术国家实验室 + 清华计算机智能技术与系统国重 + Intel 中国研究院 )
在 SSD 中有这么一个思想,低层感受野较小,用它去检测小物体,高层感受野较大,用它去检测大物体。然而它忽略了一个事实:低的卷积层语义信息很弱,无法对后续的分类有很好的帮助,导致小目标的检测提升其实不大。那么 HyperNet 就采取一个融合卷积特征的方式。特征图的尺寸不同怎么办?大的进行一个池化缩小,小的进行一个上采样进行扩大,而后融合。通过以上的改进策略,HyperNet 可以在产生大约 100 个region proposal 的时候保证较高的recall,同时目标检测的 mAP 相对于 Fast R-CNN 也提高了大约 6 个百分点。
但是, HyperNet 这样的方式融合得到的特征图在空间信息和语义信息上都是有一些损失的。有没有更好的特征融合方式呢?
(2) Feature Pyramid Networks for Object Detection (CVPR2017,FAIR + CMU)
2017 年的 CVPR 大会上提出了 FPN 网络,它采用特征金字塔的方式,既用融合后的特征做检测,又让预测在不同特征层独立进行。在上面我们提到,低的卷积层语义信息很弱,无法对后续的分类有很好的帮助,导致小目标的检测提升其实不大。那么 FPN 就尝试用高层的语义对低层进行弥补,取得了相当不错的效果。
如上图展示的 4 种利用特征的形式:(a) 图像金字塔,(b) 仅采用一层的特征,(c) SSD 式,(d) FPN 式。可以看到,FPN 似乎是 SSD 和 HyperNet 的结合体与变式。它在右侧的路径通常称为 top-down path。
如何进行横向连接和融合?如下。把高层特征做2倍上采样,然后将其和对应的前一层特征结合,注意前一层特征经过 1*1 的卷积改变维度使得可以用加法进行融合。值得一提的是,这只是其中一种融合方式,当然也可以做通道上的 concat。
FPN 并不是一个目标检测框架,它的这种结构可以融入到其他的目标检测框架中,去提升检测器的性能。截至现在,FPN 已经可以说成为目标检测框架中必备的结构了。
2. 更好的基础网络
(1) Deep Residual Learning for Image Recognition (CVPR2016 Best Paper,微软亚洲研究院)
第二个 idea,更好的基础网络。这里就不得不提到深度残差网络。传统的卷积神经网络模型都以层叠卷积层的方式提高网络深度,从而提高识别精度。但是实验发现过深的网络会出现退化问题,比浅层的网络损失更高,正确率更低。
原因引一下 Wang Feng 的回答:
图像具备有局部相关性,神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。
深度残差网络致力于解决这个问题。它的核心结构是通过一个跳层连接把输入直接叠加到输出上,在反向传播的时候,这一路梯度是原封不动的往回传的,相关性是很强的。
ResNet 的应用这个网络去做 Faster R-CNN 的基础网络用于特征提取,什么都不用做,在 VOC数据集上取得了 3% 的性能提升,在 COCO 数据集上取得7%的性能提升,而且一举赢得 2015年的 COCO 目标检测赛冠军。在ResNet提出后,几乎所有取得高 mAP 的目标检测框架全部应用或借鉴了残差网络。
(2)Deformable Convolutional Networks (ICCV2017,微软亚洲研究院)
更好的基础网络不仅仅是指的是如何去堆叠网络的深度,还有如何让网络更好的去适应物体的变化。CNN 的几何结构是固定的,导致对几何形变的建模受到限制。如何有效地建模物体各种姿势的变化呢?当然可以用足够多样性的数据集,或者是有一些几何不变性的特征去构建算法,但是始终存在新的、未知的形变。试想如果卷积核可以沿着物体是什么样去提取特征,似乎就可以一定程度上解决问题。
这也是 DCN 的核心思想,和普通的卷积核不同,给每个采样点加一个偏移,并且这个偏移通过额外的卷积层学习得到。从上边的图可以看到,如果能够学习出偏移,那么似乎可以表示出扩大,旋转这类变换。
如何将这类卷积方法应用到网络中去呢?
通过一个额外的卷积层对 feature map 进行卷积,出来的是怎么偏移的参数(即,每个点代表我该怎么去偏移?),而后再将这个偏移信息用到对原feature map的卷积上去。
怎么用到 ROI Pooling 层上去呢?如上图所示,RoI 被分为 3*3 个 bin,被输入到一个额外的 fc 层来学习 offset,然后通过一个deformable RoI pooling 层来操作使每个 bin 发生偏移。
上边是可视化的结果,红点表示激活点映射到原图的采样点,可以看到这类聚集出来的点是覆盖了目标的,说明学习是有效的。将其用在目标检测的基础网络上,在 mAP 上能取得 2~9 范围的提升。
融合不同卷积层的特征和更好的基础网络这两个 idea 影响深远,之后的目标检测框架几乎都应用了它们去得到更高的 mAP。
大显神通的各类变体
1、Faster R-CNN的进化
(1)R-FCN: Object Detection via Region-based Fully Convolutional Networks(NIPS2016,微软亚洲研究院 + 清华大学)
Faster R-CNN 的精度其实已经很高了,但是缺点在于它的速度不够快。什么原因呢?因为它在区域推荐网络之后,对于每一个推荐的区域都会分别送入 ROI Pooling 层,而后面还有几层全连接层用来做分类和回归,这个过程拖慢了速度。其次,物体分类是要求有平移不变性的,而定位物体又要要求能够对物体的平移产生响应,这样就造成一个矛盾。试想如果没有后面全连接层的计算,就能提升速度;如果可以让有较强语义信息的高层特征图有空间信息,就可以有更好的精度。R-FCN 基于Faster R-CNN的结构,通过学习位置敏感得分图和选择性池化去解决这两个问题。
对于提取的特征图,通过k^2*(C+1)个卷积核来生成如此多维度的特征图,C代表类别,上面五颜六色的千层饼的一层就有 C+1 个维度(+1表示背景),而 k 方则代表了想要去编码多少个这样的位置。如【左上,中上,….,中间,….,中下,右下】一共 9 种位置,那么这个饼就有9层 (C+1)的特征。 具体的例子,饼的每一层的一个维度的一个像素(好拗口…..)代表的意思可以理解为:属于(C+1)类中的婴儿这一类,并且是这个婴儿的左上位置的概率。看看选择性池化出来的对应于千层饼的特征图颜色可以知道:特定部位的 bins 只在特定的层上产生。
R-FCN 在 PS ROI Pooling 后,没有全连接层,而是用一个平均池化来产生分类的向量。以这种方式既加入了空间信息,又减少了上百个区域的 fc 运算,因而R-FCN在精度上比Faster R-CNN 略高,并且比 Faster R-CNN 快了 2.5 倍。
上图是可视化的结果,可以看到学习出来的特征真的能够去代表左上、右下这些空间信息。
(2)Mask R-CNN (ICCV2017 Best Paper,Facebook AI Research )
Mask R-CNN是Faster R-CNN的横向扩充,由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)。在基础网络方面,采用了 ResNet-101 + FPN,保证提取的特征足够强,此外,通过双线性插值改进了 ROI Pooling 层,提出新的ROIalign层,解决ROI映射到特征图上有小数需要舍弃引发的不对称的问题,最后,语义分割任务的加入也给目标检测带来了一定的性能提升。
2、YOLO的进化
(1)YOLO 9000 : Better, Faster, Stronger (CVPR2017, 华盛顿大学 + 微软艾伦人工智能研究院)
YOLOv2 是 YOLO 的进化版本,在左边的表上可以看到它用到了一系列的技巧。最重要的是三个点:
a. 用更好更快的基础网络
b. 多尺度训练的思想,每隔几次迭代改变网络结构:每 10 个 batch,网络会选择新的图像大小
c. 引入 Faster R-CNN中的 anchor boxes,并通过聚类方式代替手工选取 prior box
每一个技巧都会有 mAP 的提升,最终在 40fps 下能够在 VOC2007 数据集上达到 78.6 的mAP,比 Faster R-CNN 略高,但比其快几倍。在论文中还引入了 WordTree,用层次概念去搭建分类构建可以检测 9000 种物体的 YOLO9000。
(2)YOLO v3 : An Incremental Improvement
YOLO v3 是 YOLO 的终极版本。在基础网络上,采用了更加好的网络,借鉴了 yolov2中Darknet-19 以及 Resnet 的设计,使用了很多有良好表现的 33 和 11 的卷积层,并且融合了前面的 FPN。最终形成有 53 个卷积层的 Darknet-53。并且在 anchor box 上,仿照 SSD形成多尺度预测,一共有3种尺度,每种尺度预测 3 个 box 。此外,将 Softmax 用独立的多个logistic分类器替代,更适用于语义联系较强的数据集。最终的效果也是十分惊艳,在 COCO 数据集上,以IOU交叠比为大于 0.5 视为预测正确时,YOLO 的表现几乎全方面超过所有的方法,速度是别人的 2~3 倍。
在 yolov3 中,对于一个 ground truth 只会选择 iou 交叠比最大的一个 pred box 与其进行配对,从而进行类别与方框的修正。
3、SSD的进化
DSSD : Deconvolutional Single Shot Detector (CVPR2017,北卡教堂山分校+ 亚马逊)
看完了Faster R-CNN和YOLO的进化,我们再来看SSD是怎么进化的。我们自然会想到用融合不同卷积层的特征这个套路,将高层语义信息和低层细节信息进行融合,但是各方法特征图金字塔的构造方式各不相同,只是针对于特定的网络结构来做优化。DSSD 就提出了一种通用的方法,使用反卷积层来做这个事情。方法就是把蓝色的 SSD 层做反卷积操作形成红色层,使其和上一级蓝色层尺度相同,再把二者融合在一起,得到的新的红色层用来做预测。然后这个新的红色的特征图又这么跟上一级的特征反复一遍,最后在红色的特征图上做多尺度检测框架。
为了整合浅层特征图和反卷积层的信息,作者引入了上面右图所示的反卷积模块,在融合特征图的时候不是线性相加而是用了点积,这也带来了额外 0.2 的 mAP 提升。
4、Faster R-CNN + SSD
Single-Shot Refinement Neural Network for Object Detection (CVPR2018,中科院自动化所 + 麦肯锡全球研究院)
从上面我们基本对 one-stage 和 two-stage 的方法的变体有了大致了解。通常情况下,单阶段方法速度更快,两阶段方法 mAP 更高。有没有将两者融合的方法呢?在前不久的 CVPR2018 上有这样一个方法,取 Faster R-CNN 和 SSD 两者之长。
从这个网络结构上看,非常像 SSD 的分层预测再结合,而上下两个相互关联的模型 Anchor Refinement Module (ARM)和 Object Detection Module(ODM)分别做区域推荐和目标分类+回归,又是 Faster R-CNN 的经典两步。其中,上面的 ARM 模块可以看作一个简化的 SSD,这里只做二分类,即目标的有无,去除一些无物体的候选区域,对位置和尺寸进行大致的调整;而下面的 ODM 可以看作为一个 Fast R-CNN, 多类别分类是和矩形框回归,中间的 TCB 模块可以看作 FCN 中的 top-down,进行特征的融合。框架结构简单又有效,取得了不错的效果。
PASCAL VOC & COCO -> 终究是Faster R-CNN胜了?
这里附一下 PASCAL VOC 目标检测数据集的排名,这个挑战为 Competition
“comp4”,可以在额外的数据集上训练(TRAIN ON ADDITIONAL DATA)再来在VOC2012 data 上测试。
前十名的变体中,有 4 项来自 SSD 的变体,5 项来自 Faster R-CNN,1项 Faster R-CNN + SSD 的结合变体。在这里我们可以认为,对目标检测的精度有要求,似乎就应该选用 Faster R-CNN 或 SSD 为基础改进的经典目标检测方法。
而在微软的COCO数据集上,Faster R-CNN 大有横扫的意味。前 10 名中有 9 项都是来自于Faster R-CNN 的变体,而剩下的一项还是未公布具体方法。
虽然 one-stage 的方法在精度上不断想与 two-stage 的方法抗衡,但在数据集上的结论以及越来越快的 Faster R-CNN 变体的出现是否可以说明,Faster R-CNN 的 two-stage 终归是更好的方法?期待未来更加精彩的突破出现。