狗子的灵魂三连问:我是谁?我在哪儿?我们分别是什么?

NEXTTECH

内容整理 |笨笨熊

编辑 | ESTRELLA

笨笨熊

北邮通信博士毕业。目前行走在AI与IoT之间,偶尔飘荡到LBS上看一眼。

大家好!我们的【深度学习干货分享】已经进行三周了。在前两期的文章中,我们聚焦机器视觉领域,与大家分享了表情识别和面部识别的相关知识;想复习的小伙伴,可以翻至文末链接。

今天,我们将与大家分享深度学习在目标检测中的应用,梳理其发展脉络,对目标检测领域的经典算法进行简单的介绍。

一. 分类、定位与检测

所谓分类,其目标是要识别出输入图像中的目标物体是什么,比如下面图1(1)中的猫主子。

而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛以及实际应用中,还包括目标定位和目标检测等任务。也就是说,只识别出目标物体是只猫并不够,还要能预测物体的位置(一般用边框标记)。

目标检测实质就是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位。比如对图1(3)进行目标检测,得到的结果有猫、狗和鸭子,它们的位置如图中不同颜色的框所示。

(1)目标分类

(2)目标定位

(3)目标检测

图1 目标分类、定位、检测示例

简单来说,分类、定位和检测的区别可以总结为:

分类:是什么?

定位:在哪里?是什么?(单个目标)

检测:在哪里?分别是什么?(多个目标)

目标检测对于人类轻而易举,通过对图片中不同颜色模块的感知就能定位并分类出其中目标物体。但对于计算机,它们面对的是 RGB 像素矩阵,很难直接得到狗和猫这样的抽象概念并定位,若再与其他物体和杂乱的背景混在一起,则更难上加难。

好在这并没难倒科学家们,在传统视觉领域,目标检测就是一个非常热门的研究方向。一些特定目标的检测,比如人脸检测和行人检测已有非常成熟的技术。普通目标检测也有过很多的尝试,但是效果总是差强人意。

传统的目标检测一般使用滑动窗口的框架,主要包括三个步骤:

利用不同尺寸的滑动窗口框住图中的某一部分作为候选区域;

提取候选区域相关的视觉特征。比如人脸检测常用的Harr特征;行人检测和普通目标检测常用的HOG特征等;

利用分类器进行识别,比如常用的SVM模型。

传统的目标检测中,多尺度形变部件模型DPM(Deformable Part Model)[9]是出类拔萃的,连续获得VOC(Visual Object Class)2007到2009的检测冠军。

DPM把物体看成了多个组成的部件(比如人脸的鼻子、嘴巴等),用部件间的关系来描述物体,这个特性非常符合自然界很多物体的非刚体特征。

DPM可以看做是HOG+SVM的扩展,很好的继承了两者的优点,在人脸检测、行人检测等任务上取得了不错的效果。但DPM相对复杂,检测速度也较慢,因而也出现了很多改进的方法。

正当大家热火朝天改进DPM性能的时候,基于深度学习的目标检测横空出世,迅速盖过了DPM的风头,很多之前研究传统目标检测算法的研究者也开始转向深度学习。

其实在此之前已经有很多研究者尝试用Deep Learning的方法来做目标检测了,如OverFeat[7],但实效果一直难以突破,直到2013年R-CNN[1,2,3,6,14]诞生,基于深度学习的目标检测性能超越了传统方法,并且可以实现真正的工业级应用。当然这少不了芯片界的努力,计算力的提升使深度学习走向实际,并迅猛发展。

R-CNN是Region-based Convolutional Neural Networks的缩写,中文翻译是基于区域的卷积神经网络,是一种结合区域提名(Region Proposal)和卷积神经网络(CNN)的目标检测方法。

其实在R-CNN之前已经有很多研究者尝试用Deep Learning的方法来做目标检测了,包括OverFeat[7],但R-CNN是第一个真正可以工业级应用的解决方案,这也和深度学习本身的发展类似。神经网络、卷积网络都不是什么新概念,但在本世纪突然真正变得可行,而一旦可行之后再迅猛发展也不足为奇了。

R-CNN这个领域目前研究非常活跃,先后出现了R-CNN、SPP-net[4,15]、Fast R-CNN[10,16]、Faster R-CNN[5,17]、R-FCN[12,20]、YOLO[15,18]、SSD[13,19]等研究。

Ross Girshick作为这个领域的开山鼻祖总是神一样的存在,R-CNN、Fast R-CNN、Faster R-CNN、YOLO都和他有关。这些创新的工作其实很多时候是把一些传统视觉领域的方法和深度学习结合起来了,比如选择性搜索(Selective Search)和图像金字塔(Pyramid)等。

二. 基于深度学习的目标检测

深度学习相关的目标检测方法也可以大致分为两派:

基于区域提名的two stages方法:如R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN;

端到端(End-to-End)的one stage方法:无需区域提名,如YOLO系列、SSD。

目前来说,基于区域提名的方法性能上占据上风,但端到端的方法速度上优势明显,在产业界颇受青睐,后续的发展也值得期待。

01

基于区域提名的方法

1.1 R-CNN

早期的目标检测,大都使用滑动窗口的方式进行窗口提名,这种方式本质是穷举法,R-CNN采用的是Selective Search。

以下是R-CNN的主要步骤:

通过多尺寸的边界框进行Selective Search,根据周围的纹理、颜色、强度选择像素组成候选区域(区域建议);

将每一个候选区域通过一个改进的Alexnet网络来判断此区域是否为有效区域,利用SVM来确定图像类别;

确定类别后,利用线性回归来改善边框。

其中目标检测系统的结构如图2所示,在创建一组区域建议后,R-CNN网络会将每个图像块传递给一种改进版的AlexNet网络,确定这些图像块是否为有效区域。虽然R-CNN存在一些不足,检测速度也比较慢,但是它这次是冲着效果来的,其检测效果第一次有了质的改变。

图2 R-CNN目标检测系统框架

1.2 Fast R-CNN

R-CNN网络的性能很好,但是实际上训练起来很慢,主要有以下两个原因:

单个图像的每个区域建议都需要利用AlexNet网络进行判断,每次判断大约需要2000次前向传播。

此网络必须单独训练三种不同的模型:提取图像特征的CNN网络,判断类别的分类器和缩小边框的回归模型。这样子很难训练这些网络。

于是2015年,R-CNN网络的第一作者Ross Girshick解决了这两个问题,发明了新的网络Fast R-CNN。Fast R-CNN网络的主要创新点有两个:

创新点1:引入感兴趣区域池化(ROI Pooling)

在CNN的前向传递过程中,,每个图像的多个区域总是互相重叠,导致次运行相同的CNN计算,多达2000次。可不可以对每个图像只运行一次CNN运算,然后在2000次前向传播过程中找到一种共享这个计算结果的方法?

RoIPool层共享了CNN网络在图像子区域中的前向传播过程。在图3中,是从CNN的特征图谱中选择相应的区域来获取每个区域的CNN抽象特征。然后,通常使用最大池化操作来合并每个区域中的初级抽象特征。所以我们只进行了原始图像的一次前向传播操作,而不是2000次。

图3 ROI Pooling过程

创新点2:将所有模型整合到一个网络中

在R-CNN中,使用了CNN网络来提取图像特征,用SVM来分类对象和用回归模型来缩小边界框,但是Fast R-CNN使用单个网络模型来实现以上三个功能。

图4是Fast R-CNN网络的过程示意图,将CNN网络、分类器和缩小边框的回归模型整合成一个单输入双输出的网络。Fast R-CNN在CNN输出层用softmax函数代替了SVM分类器,来输出对象类别。同时在CNN输出层,还加入了用来输出边界框坐标的线性回归层。这样单个网络就可以输出所需信息。

图4 Fast R-CNN框架

Fast R-CNN比R-CNN的训练速度(大模型)快8.8倍,测试时间快213倍。

1.3 Faster R-CNN

即使Fast R-CNN的性能有了很大的改善,但是仍然存在一个短板——区域建议生成方式(region proposer)。在上面已经提到,为了检测图像中对象位置,第一步是要产生一系列随机多尺度的边界框或是待测试的感兴趣区域。在Fast R-CNN中,通过Selective Search方法创建这些区域,这是一个相当缓慢的过程,被认为是整个流程的短板。

Faster R-CNN则直接利用RPN(Region Proposal Networks)网络来计算候选框。RPN以一张任意大小的图片为输入,输出一批矩形区域提名,每个区域对应一个目标分数和位置信息。Faster R-CNN中的RPN结构如图5所示。

图5 Region Proposal Network(RPN)

Faster R-CNN的主要步骤如下:

特征提取:同Fast R-CNN,以整张图片为输入,利用CNN得到图片的特征层;

区域提名:在最终的卷积特征层上利用k个不同的矩形框(Anchor Box)进行提名,k一般取9;

分类与回归:对每个Anchor Box对应的区域进行object/non-object二分类,并用k个回归模型(各自对应不同的Anchor Box)微调候选框位置与大小,最后进行目标分类。

总之,Faster R-CNN抛弃了Selective Search,引入了RPN网络,使得区域提名、分类、回归一起共用卷积特征,从而得到了进一步的加速。同时Faster R-CNN第一次提出了Anchor Box的概念,此后在YOLO、SSD中得到了借鉴。

02

端到端的方法

Faster R-CNN需要对两万个Anchor Box先判断是否是目标(目标判定),然后再进行目标识别,分成了两步。纵然检测准确率不断提高,但速度一直是无法克服的瓶颈。是否可以将两步合为一步?YOLO和SSD应运而生,这些方法无需区域提名,真正实现了端到端的目标检测。

2.1 YOLO系列

YOLO的全拼是You Only Look Once,顾名思义就是只看一次,进一步把目标判定和目标识别合二为一,所以识别性能有了很大提升,达到每秒45帧,而在快速版YOLO(Fast YOLO,卷积层更少)中,甚至可以达到每秒155帧。YOLO已经形成了一个系列,目前版本更新到了YOLO3,每一个版本都对前一版本进行了改进,性能有所提升。

以最经典的第一版本为例,YOLO的整体结构如图6所示,针对一张图片,处理步骤为:

把输入图片缩放到448×448大小;

运行卷积网络;

对模型置信度卡阈值,得到目标位置与类别。

图6 YOLO检测系统

网络的模型如图7所示,将448×448大小的图切成S×S的网格,目标中心点所在的格子负责该目标的相关检测,每个网格预测B个边框及其置信度,以及C种类别的概率。YOLO中S=7,B=2,C取决于数据集中物体类别数量,比如VOC数据集就是C=20。对VOC数据集来说,YOLO就是把图片统一缩放到448×448,然后每张图平均划分为7×7=49个小格子,每个格子预测2个矩形框及其置信度,以及20种类别的概率。

图7 YOLO模型

YOLO简化了整个目标检测流程,速度的提升也很大,但是YOLO还是有不少可以改进的地方,比如S×S的网格就是一个比较启发式的策略,如果两个小目标同时落入一个格子中,模型也只能预测一个;另一个问题是Loss函数对不同大小的bbox未做区分。

针对YOLO中存在的问题,YOLO2的目标是Better、Faster、Stronger。主要做了以下几个方面的改进:使用一系列的方法对YOLO进行了改进,在保持原有速度的同时提升精度;提出了一种目标分类与检测的联合训练方法,同时在COCO和ImageNet数据集中进行训练得到YOLO9000,实现9000多种物体的实时检测。

YOLO3又在YOLO2的基础上引入了特征金字塔,其网络架构比YOLO2要复杂,以速率换取性能。虽然检测速率有所下降,但进一步提升了对小物体的检测效果。

2.2 SSD

SSD的全拼是Single Shot MultiBox Detector,冲着YOLO的缺点来的。

SSD的框架如图8所示,图8(a)表示带有两个Ground Truth边框的输入图片,图8(b)和(c)分别表示8×8网格和4×4网格,显然前者适合检测小的目标,比如图片中的猫,后者适合检测大的目标,比如图片中的狗。在每个格子上有一系列固定大小的Box(有点类似前面提到的Anchor Box),这些在SSD称为Default Box,用来框定目标物体的位置,在训练的时候Ground Truth会赋予给某个固定的Box,比如图8(b)中的蓝框和图8(c)中的红框。

图8 SSD框架

SSD的网络分为两部分,前面的是用于图像分类的标准网络(首先在ImageNet上进行分类训练,然后去掉分类相关的层并迁移到此处进行fine tune),后面的网络是用于检测的多尺度特征映射层(特征金字塔雏形),从而能够检测不同大小的目标。SSD和YOLO的网络结构对比如图9所示。

图9 SSD和YOLO的网络结构对比

SSD在保持YOLO高速的同时效果也提升很多,主要是借鉴了Faster R-CNN中的Anchor机制,同时使用了多尺度。但是从原理依然可以看出,Default Box的形状以及网格大小是事先固定的,那么对特定的图片小目标的提取会不够好。

随着深度学习在计算机视觉领域的发展,各种目标检测算法层出不穷;模型之间相互借鉴改进,有很强的延续性。从现阶段看,Faster R-CNN、YOLO和SSD是三个使用相对广泛的目标检测模型。

后续是否会出现脱离这两种架构的全新的目标检测方法,我们拭目以待。但无论使用哪种算法,最终,我们都需要在准确性和速度之间找到一个更好的平衡点。

参考资料:

[1] R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. ImageNet Large-Scale Visual Recognition Challenge workshop, ICCV, 2013.

[2] R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2014.

[3] R. Girshick, J. Donahue, T. Darrell, J. Malik. Region-Based Convolutional Networks for Accurate Object Detection and Segmentation. IEEE Transactions on Pattern Analysis and Machine Intelligence, May. 2015.

[4] K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV. 2014.

[5] S. Ren, K. He, R. Girshick, J. Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. Advances in Neural Information Processing Systems 28 (NIPS), 2015.

[6] C. Szegedy, A. Toshev, D. Erhan. Deep Neural Networks for Object Detection. Advances in Neural Information Processing Systems 26 (NIPS), 2013.

[7] P. Sermanet, D. Eigen, X.Zhang, M. Mathieu, R. Fergus, and Y. LeCun. OverFeat: Integrated recognition, localization and detection using convolutional networks. In ICLR, 2014.

[8] J.R. Uijlings, K.E. vandeSande, T. Gevers, and A.W. Smeulders. Selective search for object recognition. IJCV, 2013.

[9] Felzenszwalb P F, Girshick R B, McAllester D, et al. Object detection with discriminatively trained part-based models[J]. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 2010, 32(9): 1627-1645.

[10] Girshick, R. Fast R-CNN. ICCV 2015.

[11] Redmon, J., Divvala, S., Girshick, R., Farhadi, A.: You only look once: Unified, real-timeobject detection. In: CVPR. (2016)

[12] R-FCN: Object Detection via Region-based Fully Convolutional Networks. Jifeng Dai, Yi Li, Kaiming He, and Jian Sun. Conference on Neural Information Processing Systems (NIPS), 2016.

[13] Liu W, Anguelov D, Erhan D, et al. SSD: Single Shot MultiBox Detector[J]. arXiv preprint arXiv:1512.02325, 2015.

[14] R-CNN: Region-based Convolutional Neural Networks: https://github.com/rbgirshick/rcnn

[15] SPP-net: https://github.com/ShaoqingRen/SPP_net

[16] Fast R-CNN: https://github.com/rbgirshick/fast-rcnn

[17] Faster R-CNN: https://github.com/rbgirshick/py-faster-rcnn

[18] YOLO: http://pjreddie.com/darknet/yolo/

[19] SSD: https://github.com/weiliu89/caffe/tree/ssd

[20] R-FCN: https://github.com/daijifeng001/r-fcn

NEXTTECH深度学习课堂

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180919A24L9800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券