在前面几节中,咱们已经介绍了什么是目标检测,以及如何进行目标检测,还说起了滑动窗口,bounding box、以及IOU,非极大值抑制等概念。php
这里将会综述一下当前目标检测的研究成果,并对几个经典的目标检测算法进行概述,本文内容来自基于深度学习的目标检测,在后面几节里,会具体讲解每一种方法。html
在深度度学习的目标检测算法兴起以前,传统的目标检测算法是怎样的呢?git
传统的目标检测通常使用滑动窗口的框架,主要包括三个步骤:github
传统的目标检测中,多尺度形变部件模型DPM(Deformable Part Model)[13]是出类拔萃的,连续得到VOC(Visual Object Class)2007到2009的检测冠军,2010年其做者Felzenszwalb Pedro被VOC授予”终身成就奖”。DPM把物体当作了多个组成的部件(好比人脸的鼻子、嘴巴等),用部件间的关系来描述物体,这个特性很是符合天然界不少物体的非刚体特征。DPM能够看作是HOG+SVM的扩展,很好的继承了二者的优势,在人脸检测、行人检测等任务上取得了不错的效果,可是DPM相对复杂,检测速度也较慢,从而也出现了不少改进的方法。正当你们热火朝天改进DPM性能的时候,基于深度学习的目标检测横空出世,迅速盖过了DPM的风头,不少以前研究传统目标检测算法的研究者也开始转向深度学习。算法
基于深度学习的目标检测发展起来后,其实效果也一直难以突破。好比文献[6]中的算法在VOC 2007测试集合上的mAP只能30%多一点,文献[7]中的OverFeat在ILSVRC 2013测试集上的mAP只能达到24.3%。2013年R-CNN诞生了,VOC 2007测试集的mAP被提高至48%,2014年时经过修改网络结构又飙升到了66%,同时ILSVRC 2013测试集的mAP也被提高至31.4%。网络
R-CNN是Region-based Convolutional Neural Networks的缩写,中文翻译是基于区域的卷积神经网络,是一种结合区域提名(Region Proposal)和卷积神经网络(CNN)的目标检测方法。Ross Girshick在2013年的开山之做《Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation》[1]奠基了这个子领域的基础,这篇论文后续版本发表在CVPR 2014[2],期刊版本发表在PAMI 2015[3]。框架
其实在R-CNN以前已经有不少研究者尝试用Deep Learning的方法来作目标检测了,包括OverFeat[7],但R-CNN是第一个真正能够工业级应用的解决方案,这也和深度学习自己的发展相似,神经网络、卷积网络都不是什么新概念,但在本世纪忽然真正变得可行,而一旦可行以后再迅猛发展也不足为奇了。机器学习
R-CNN这个领域目前研究很是活跃,前后出现了R-CNN[1,2,3,18]、SPP-net[4,19]、Fast R-CNN[14, 20] 、Faster R-CNN[5,21]、R-FCN[16,24]、YOLO[15,22]、SSD[17,23]等研究。Ross Girshick做为这个领域的开山鼻祖老是神同样的存在,R-CNN、Fast R-CNN、Faster R-CNN、YOLO都和他有关。这些创新的工做其实不少时候是把一些传统视觉领域的方法和深度学习结合起来了,好比选择性搜索(Selective Search)和图像金字塔(Pyramid)等。函数
深度学习相关的目标检测方法也能够大体分为两派:post
目前来讲,基于区域提名的方法依然占据上风,但端到端的方法速度上优点明显,后续的发展拭目以待。
本文做为目标检测的一篇回顾,先来看看目标检测中普遍使用的区域提名——选择性搜索,以及用深度学习作目标检测的早期工做——Overfeat 。
目标检测的第一步是要作区域提名(Region Proposal),也就是找出可能的感兴趣区域(Region Of Interest, ROI)。区域提名相似于光学字符识别(OCR)领域的切分,OCR切分经常使用过切分方法,简单说就是尽可能切碎到小的连通域(好比小的笔画之类),而后再根据相邻块的一些形态学特征进行合并。但目标检测的对象相比OCR领域千差万别,并且图形不规则,大小不一,因此必定程度上能够说区域提名是比OCR切分更难的一个问题。
区域提名可能的方法有:
区域提名并不仅有以上所说的三种方法,实际上这块是很是灵活的,所以变种也不少,有兴趣的读者不妨参考一下文献[12]。
选择性搜索的具体算法细节[8]如算法1所示。整体上选择性搜索是自底向上不断合并候选区域的迭代过程。
输入: 一张图片 输出:候选的目标位置集合L 算法: 1: 利用过切分方法获得候选的区域集合R = {r1,r2,…,rn} 2: 初始化类似集合S = ϕ 3: foreach 邻居区域对(ri,rj) do 4: 计算类似度s(ri,rj) 5: S = S ∪ s(ri,rj) 6: while S not=ϕ do 7: 获得最大的类似度s(ri,rj)=max(S) 8: 合并对应的区域rt = ri ∪ rj 9: 移除ri对应的全部类似度:S = S\s(ri,r*) 10: 移除rj对应的全部类似度:S = S\s(r*,rj) 11: 计算rt对应的类似度集合St 12: S = S ∪ St 13: R = R ∪ rt 14: L = R中全部区域对应的边框
从算法不难看出,R中的区域都是合并后的,所以减小了很多冗余,至关于准确率提高了,可是别忘了咱们还须要继续保证召回率,所以算法1中的类似度计算策略就显得很是关键了。若是简单采用一种策略很容易错误合并不类似的区域,好比只考虑轮廓时,不一样颜色的区域很容易被误合并。选择性搜索采用多样性策略来增长候选区域以保证召回,好比颜色空间考虑RGB、灰度、HSV及其变种等,类似度计算时既考虑颜色类似度,又考虑纹理、大小、重叠状况等。
整体上,选择性搜索是一种比较朴素的区域提名方法,被早期的基于深度学习的目标检测方法(包括Overfeat和R-CNN等)普遍利用,但被当前的新方法弃用了。
OverFeat[7][9]是用CNN统一来作分类、定位和检测的经典之做,做者是深度学习大神之一————Yann Lecun在纽约大学的团队。OverFeat也是ILSVRC 2013任务3(分类+定位)的冠军得主[10]。
OverFeat的核心思想有三点:
OverFeat的关键步骤有四步:
Overfeat是CNN用来作目标检测的早期工做,主要思想是采用了多尺度滑动窗口来作分类、定位和检测,虽然是多个任务但重用了模型前面几层,这种模型重用的思路也是后来R-CNN系列不断沿用和改进的经典作法。
固然Overfeat也是有很多缺点的,至少速度和效果都有很大改进空间,后面的R-CNN系列在这两方面作了不少提高。
本小节主要介绍基于区域提名的方法,包括R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN。
如前面所述,早期的目标检测,大都使用滑动窗口的方式进行窗口提名,这种方式本质是穷举法,R-CNN[1,2,3]采用的是Selective Search。
如下是R-CNN的主要步骤:
其中目标检测系统的结构以下图所示,注意,图中的第2步对应步骤中的一、2步,即包括区域提名和区域大小归一化。
Overfeat能够看作是R-CNN的一个特殊状况,只须要把Selective Search换成多尺度的滑动窗口,每一个类别的边框回归器换成统一的边框回归器,SVM换为多层网络便可。可是Overfeat实际比R-CNN快9倍,这主要得益于卷积相关的共享计算。
事实上,R-CNN有不少缺点:
固然,R-CNN此次是冲着效果来的,其中ILSVRC 2013数据集上的mAP由Overfeat的24.3%提高到了31.4%,第一次有了质的改变。
SPP-net[4,19]是MSRA何恺明等人提出的,其主要思想是去掉了原始图像上的crop/warp(裁切/扭曲)等操做,换成了在卷积特征上的空间金字塔池化层(Spatial Pyramid Pooling,SPP),以下图所示。为什么要引入SPP层 ,主要缘由是CNN的全链接层要求输入图片是大小一致的,而实际中的输入图片每每大小不一,若是直接缩放到同一尺寸,极可能有的物体会充满整个图片,而有的物体可能只能占到图片的一角。传统的解决方案是进行不一样位置的裁剪,可是这些裁剪技术均可能会致使一些问题出现,好比下图中的crop会致使物体不全,warp致使物体被拉伸后形变严重,SPP就是为了解决这种问题的。SPP对整图提取固定维度的特征,再把图片均分红4份,每份提取相同维度的特征,再把图片均分为16份,以此类推,注意这里提取固定维度的特征,是经过对每一个网格中的每一个通道,都取出其最大值,换句话说,就是最每一个网格内的特征作最大值池化。能够看出,不管图片大小如何,提取出来的维度数据都是一致的,这样就能够统一送至全链接层了。SPP思想在后来的R-CNN模型中也被普遍用到。
SPP-net的网络结构以下图所示,实质是最后一层卷积层后加了一个SPP层,将维度不一的卷积特征转换为维度一致的全链接输入。
SPP-net作目标检测的主要步骤为:
SPP-net解决了R-CNN区域提名时crop/warp带来的误差问题,提出了SPP层,使得输入的候选框可大可小,但其余方面依然和R-CNN同样,于是依然存在很多问题,这就有了后面的Fast R-CNN。
Fast R-CNN是要解决R-CNN和SPP-net两千个左右候选框带来的重复计算问题,其主要思想为:
以下图所示,Fast R-CNN的主要步骤以下:
Fast R-CNN比R-CNN的训练速度(大模型L)快8.8倍,测试时间快213倍,比SPP-net训练速度快2.6倍,测试速度快10倍左右。
Fast R-CNN使用Selective Search来进行区域提名,速度依然不够快。Faster R-CNN则直接利用RPN(Region Proposal Networks)网络来计算候选框。RPN以一张任意大小的图片为输入,输出一批矩形区域提名,每一个区域对应一个目标分数和位置信息。Faster R-CNN中的RPN结构以下图所示。
Faster R-CNN的主要步骤以下:、
总之,Faster R-CNN抛弃了Selective Search,引入了RPN网络,使得区域提名、分类、回归一块儿共用卷积特征,从而获得了进一步的加速。可是,Faster R-CNN须要对两千个Anchor Box先判断是不是目标(目标断定),而后再进行目标识别,分红了两步。
前面的目标检测方法均可以细分为两个子网络:
R-FCN则将最后的全链接层换为了一个位置敏感的的卷积网络,从而让全部计算均可以共享。具体来讲,先把每一个提名区域划分为k×k个网格,好比R-FCN原文中k的取值为3,则对应的九个网格分别表示:左上top-left,上中top-center,,右下bottom-right,对应下面第一张图中的九宫格及第二张图中的不一样颜色的块,每一个Grid都有对应的编码,但预测时候会有C+1个输出,C表示类别数目,+1是由于有背景类别,所有的输出通道数量为k2×(C+1)。
须要注意的是,上面两张图中不一样位置都存在一个九宫格,可是Pooling时候只有一个起做用,好比bottom-right层只有右下角的小块起做用。那么问题来了,这一层其余的8个框有什么做用呢?答案是它们能够做为其余ROI(偏左或偏上一些的ROI)的右下角。
R-FCN的步骤为:
本小节介绍端到端(End-to-End)的目标检测方法,这些方法无需区域提名,包括YOLO和SSD。
YOLO的全拼是You Only Look Once,顾名思义就是只看一次,进一步把目标断定和目标识别合二为一,因此识别性能有了很大提高,达到每秒45帧,而在快速版YOLO(Fast YOLO,卷积层更少)中,能够达到每秒155帧。
网络的总体结构如图所示,针对一张图片,YOLO的处理步骤为:
网络的模型如图所示,将448×448大小的图切成S×S的网格,目标中心点所在的格子负责该目标的相关检测,每一个网格预测B个边框及其置信度,以及C种类别的几率。YOLO中S=7,B=2,C取决于数据集中物体类别数量,好比VOC数据集就是C=20。对VOC数据集来讲,YOLO就是把图片统一缩放到448×448,而后每张图平均划分为7×7=49个小格子,每一个格子预测2个矩形框及其置信度,以及20种类别的几率。
YOLO简化了整个目标检测流程,速度的提高也很大,可是YOLO仍是有很多能够改进的地方,好比S×S的网格就是一个比较启发式的策略,若是两个小目标同时落入一个格子中,模型也只能预测一个;另外一个问题是Loss函数对不一样大小的bbox未作区分。
SSD[17,23]的全拼是Single Shot MultiBox Detector,冲着YOLO的缺点来的。SSD的框架如图所示,图(a)表示带有两个Ground Truth边框的输入图片,图(b)和(c)分别表示8×8网格和4×4网格,显然前者适合检测小的目标,好比图片中的猫,后者适合检测大的目标,好比图片中的狗。在每一个格子上有一系列固定大小的Box(有点相似Anchor Box),这些在SSD称为Default Box,用来框定目标物体的位置,在训练的时候Ground Truth会赋予给某个固定的Box,好比图(b)中的蓝框和图(c)中的红框。
SSD的网络分为两部分,前面的是用于图像分类的标准网络(去掉了分类相关的层),后面的网络是用于检测的多尺度特征映射层,从而达到检测不一样大小的目标。SSD和YOLO的网络结构对好比图所示。
SSD在保持YOLO高速的同时效果也提高不少,主要是借鉴了Faster R-CNN中的Anchor机制,同时使用了多尺度。可是从原理依然能够看出,Default Box的形状以及网格大小是事先固定的,那么对特定的图片小目标的提取会不够好。
基于深度学习的目标检测整体上分为两派:
下表大体对比了各类方法的性能(Fps,每秒帧数)和VOC 2007上的MAP对比。注意相关数据搜集自不一样的paper,因为评测硬件和环境等区别,数据仅供参考,不具备绝对对比意义。
注:数据取自各自paper,因为评测硬件和环境等区别,数据并不具备绝对对比意义,仅供参考。
Fps | VOC 2007 | |
Overfeat | 0.5 | |
R-CNN | 0.077 | 48-66% |
SPP-net | 63.1-82.4% | |
Fast R-CNN | 66.9%-70% | |
Faster R-CNN | 15(ZF Model) | 73.2%-85.6% |
R-FCN | 6 | 83.6% |
YOLO | 45-150 | 58.8% |
SSD | 58-72 | 75.1% |
基于深度学习的目标检测的研究目前依然很是火热,下图为VOC2012目标检测排行榜[25](2016-10-18结果),很高兴看到不少华人和国内同仁在这方面各领风骚。
固然,目标检测还有很长的路要走,好比业界公认较难的小目标检测问题。
小试身手,来一张实际的三里屯照片,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.(R-CNN)
[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.(R-CNN)
[8] J.R. Uijlings, K.E. vandeSande, T. Gevers, and A.W. Smeulders. Selective search for object recognition. IJCV, 2013.(Selective Search)
[10] ILSVRC 2013 results
[12] J. Hosang, R. Benenson, P. Dolla ́r, and B. Schiele. What makes for effective detection proposals? TPAMI, 2015.(Selective Search)
[14] Girshick, R. Fast R-CNN. ICCV 2015.(R-CNN)
[18] R-CNN(代码)
[19] SPP-net(代码)
[20] Fast R-CNN(代码)
[21] Faster R-CNN代码
[22] YOLO
[23] SSD(代码):https://pjreddie.com/darknet/yolo/(使用)
[24] R-FCN(代码)
[25] Detection Results: VOC2012 Competition – “comp4” (train on own data):
[27]基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN(强烈推荐)
[28]基于深度学习的图像目标检测(上)
[29]基于深度学习的图像目标检测(下)
[30]You Only Look Once: Unified, Real-Time Object Detection 中文版 中英文对照(YOLO)
[31]]SSD: Single Shot MultiBox Detector 中文版 中英文对照(SSD)
[32]YOLO9000: Better, Faster, Stronger 中文版 中英文对照(YOLO9000)
[33]Deformable Convolutional Networks 中文版 中英文对照(Deformable-ConvNets)
[34]Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 中文版 中英文对照(Faster R-CNN)
[35]R-FCN: Object Detection via Region-based Fully Convolutional Networks 中文版 中英文对照(R-FCN)
[36]Feature Pyramid Networks for Object Detection 中文版 中英文对照(FPN)
[37]目标检测论文整理