在深度学习中有一类研究热点,目标检测,从2012年AlexNet到2016年,尤为是2015年开始,深度学习中的深层的卷积神经网络发展迅猛,其中不但衍生出了例如VGG, GoogleNet等愈加区域标准化的深层网络,也相继提出一系列检测加速的策略,例如针对快速提取proposal的方法,像selective search, edge box, BING, RPN等,这些方法的发展和完善,使得基于深度学习的目标检测精度愈来愈高,并且速度愈来愈快,我整理了这一发展过程,对其中的部分方法进行讲解,准备有限,有不足或者疑问的地方请你们多多指教,其中一些参考文章和网站不在PPT中,但也对相关做者表示感谢。程序员
我讲解的内容主要分为三部分归纳为BBS,基于深度学习目标检测的背景,几个近几年的比较经典的卷积神经网络,以及最后的总结。算法
这里列举了几个经典的CNN网络,须要指出的是,这里除了AlexNet, GoogleNet, VGG外,其余都是能够进行目标检测的,可是做为经典,所以有必要在这里向它致敬,今天演讲的内容主要是这几个网络。14年以前,深度学习虽然也有很多人关注,可是成果相对较少,最重要的一个缘由,我我的以为就是入门门槛过高,除了一些牛逼的实验室和大神能玩得转外,其余人想搞都很是吃力,可是14年以后就是另外一番景象,深度学习如同秋风扫落叶般,侵入了计算机视觉的各个领域,一些普通实验室和我的,也能迅速地开展相关的研究。编程
缘由我以为主要是两个:第一是显卡性能的提高和成本下降,2012年AleXNet训练的时候,引入了两块GTX 580,每块具备1.5G显存,显存频率2GHz,足足训练了五六天,在2014年市面上能见到的较好的显卡仍是NVIDIA GTX 800系列,无论是显存大小仍是显存频率都不够给力,而你们都知道深度学习后来被推崇的主要缘由,就是其速度快,可是当年并非这样,想要进行该领域的研究,须要更好的专业级显卡,硬件成本要求过高,这一条就将不少人拒之门外;2015年以后新推出GTX 900系列,TITAN 系列等,在计算能力上提高了不少个level,价钱也能够接受,960如今应该不超过2000块,TITAN X国内大概8000多,这里说的GPU主要指的是NVIDIA旗下的,在GPU加速运算这块AMD棋差一招,如今已经无法跟NVIDAI竞争。windows
并且NVIDIA如今也向学者免费提供显卡,显卡型号是TITAN X,我4月份的时候,向官方递交了申请书,5月初就收到了对方重新加坡寄来的显卡,仍是很给力的,有兴趣的同窗能够去尝试一下。markdown
第二个缘由就是相关的开发包的完善和成熟,例如2014年开源,影响力巨大的caffe深度学习框架,适宜NVIDIA GPU加速运算的开发包CUDA、CUDNN,以及其余编程开发环境对于深度学习的推动例如Python, Matlab和你们经常使用的开源库OpenCV,Google在caffe公布后,也耐不住寂寞,在2015年也公布了它的深度学习框架TensorFlow。网络
就目前来看,caffe框架支持C++,Python和Matlab环境,具备较大的用户群,如今开源的大部分工程都是基于caffe框架的,tensorflow主要支持Python环境,目前基于此进行研究的开源工程不多,这两个框架我都进行了研究,因此专门拿出来说讲,我的建议若是是想要开始学习,直接学习caffe较好,相关的开源demo和文档更多,在GitHub和Stack overflow两大程序员网站上相关的讨论也较多,学习上手较快,还有其余的一些框架,就再也不多讲。app
如今进入主题,基于深度学习的目标检测问题,是这两年的热点问题之一,首先让咱们来看三个概念,Recognition, Detection 和 Segmentation(略)。框架
就这三类数据,对经常使用的一些数据集,进行简单的罗列。机器学习
以上是三个常见的较大的数据集。函数
常见的评估方法,IoU, AP, mAP。
这里解释一下常常见到的评价指标,Top-1 / Top-5 error是什么意思。给定一个测试样本,以及正确的label,对模型预测样本属于各个label的几率值进行降序排列,若是预测所属类别可能性比较靠前的N个中没有正确的label,那就认为预测失败。至关因而对预测的要求下降要求,不求可能性最大的那种结果就是正确的,可是至少可能性较大的几种类别里,要含有正确的结果,下面给出的公式至关因而Top-1 error。
这是经典CNN网络AlexNet的结构,包括5层卷积层+3层全链接层,在文章里为了进行分类,还在最后一层全链接层后加了一层softmax层,在第1,2,5层卷积层后加了LRN层和Max Pooling层。这篇论文对于网络框架的一些实现细节,进行了不少论证工做,也是后来不少网络都以此为蓝本,进行新的拓展。
讲述几点做者的主张:不用simgoid和tanh做为激活函数,而用ReLU做为激活函数,缘由是:加速收敛。由于sigmoid和tanh都是饱和(saturating)的。何为饱和?多是他们的导数越接近目标,对应的导数越小,而ReLu的导数对于大于0的部分恒为1。因而ReLU确实能够在BP的时候可以将梯度很好地传到较前面的网络。
LRN操做能够提升网络的泛化能力,下降分类的错误率。论文里下降了2个百分点的错误率,其中,x,y是像素位置,求和含义是,把该位置上n几个临近的卷积核产生的feature map上的值加起来,N是这一层中全部的卷积核数量,K, alpha, beta是一组参数,取值通常都是固定的。
论文中对于pooling时,是否应该存在overlapping,进行讨论,所谓的overlapping就是指pooling窗口在移动的过程当中跟前面的窗口要不要保持必定的重叠度,分析后做者认为保持必定的重叠度,能够必定程度上减弱过拟合问题和下降分类偏差。
为了不过拟合,使用了两种策略,一种是数据拓充(Data Augmentation),也使用了两种方法:第一种是随机Crop,训练的时候,将输入的256x256的图像,随机裁剪成为224x224+水平翻转拓展了2048倍,测试阶段,产生5x2个crop, 即使拓展了这么多,其实避免过拟合的程度也颇有限,论文里错误率下降了一个百分点,训练关键仍是原始数据要多。第二种是对RGB空间作PCA,即主成分分析,而后对主成分作一个轻微的高斯扰动,进一步下降错误率。
另一种策略称为Dropout,深层网络常常具备大量的参数,虽然对于非线性问题具备较强的描述和学习能力,可是训练过程当中过拟合也是很让人头疼的,有人提出将几个不一样的网络的预测结果融合在一块儿,可是分别训练这样的网络代价很大,Dropout方法就解决了这个问题,在训练的过程当中把部隐单元drop掉,若是训练过程当中设置一组不一样的drop组合,就能够在一次训练过程当中获得几个不一样的网络的叠加效果。
让咱们来看,真正开始利用卷积神经网络进行目标检测的R-CNN,缩写的全称是Regions with CNN features, 我在前面讲述过,CNN并不能直接进行目标检测,只能进行识别或者分类,也就是说,给定一个图片或者图片区域,它只能回答你,里面是否含有某类目标的可能性,那怎么样才能进行目标检测呢?最简单的作法就是,我使用一个滑动窗口,把整幅图像都遍历一遍,找出全部类别评分比较高的区域,而后进行标记,可是这种作法,想想就会发现很大的不足,首先天然场景里图片中目标的大小时不肯定的,使用固定大小的滑动窗效果不行,可是搞出更复杂多变的滑动窗,计算量上一下就吃不消,若是能有一种有效的策略,提供较少许的可能存在待检测目标的区域,上面提到的问题就能很好的解决。利用CNN训练的特征对提取的目标候选区进行分类,这就是R-CNN的核心思想。
咱们能够把R-CNN的结构分红独立的三块:定位使用的selective search,提取出2k个候选区,特征提取使用的是深层卷积神经网络CNN,文中是去掉最后一层softmax层的AlexNet,分类方法选择了L-SVM,对于每一个类别使用NMS非最大抑制方法,舍弃掉部分region,获得检测结果。R-CNN的成功之处在于:a.使用CNN获取更高级别的目标特征取代了人工设计特征提取方法;b.使用类别独立的region proposal提取方法(Selective Search)减小了检测搜索的空间。它指出了一条使用深度学习进行目标检测的可行方案,其后的不少方法,基本都是参照这个流程,在各个子模块进行优化和改进。固然不足也很明显,提取proposal方法较慢(CPU, 2s/img);在检测时,对于提取的proposal所有warp到固定的size而后输入到CNN网络中并非最佳方法(后来在Fast R-CNN中解决了这一问题)。
关于proposal提取方法,在至关长的一段时间里都是研究的热点,这里引用了15年的一篇论文,它对当时比较流行的一些方法(或者说是能够找到源码的方法)进行了分析和评价,它把这些方法大体分为两类,一种是Grouping,将图像过度割,而后再聚合在一块儿的,好比R-CNN使用的selective search,另外一种是Window scoring 生成大量的窗口并打分,而后过滤掉低分的窗口,还有介于二者之间的例如multibox,这里没有列举;还有一些其余很好的方法,好比Faster R-CNN使用的RPN、HyperNet、YOLO方法等,由于在论文发表以后提出,因此没被列在内。
这是一张基于VOC07和ImageNet 的各类提取proposal方法能力的测试图,做者分析发现:(1)MCG, EdgeBox,SelectiveSearch, Rigor和Geodesic在不一样proposal数目下表现都不错;(2)若是只限制小于1000的proposal,MCG,endres和CPMC效果最好;(3)若是一开始没有较好地定位好候选框的位置,随着IoU标准严格,recall会降低比较快的包括了Bing, Rahtu, Objectness和Edgeboxes。其中Bing降低尤其明显;(4)在AR这个标准下,MCG表现稳定;Endres和Edgeboxes在较少proposal时候表现比较好,当容许有较多的proposal时候,Rigor和SelectiveSearch的表现会比其余要好;(5)PASCAL和ImageNet上,各个OP方法都是比较类似的,这说明了这些OP方法的泛化性能都不错。
简单讲解一下Selective search的方法原理,前面已经说了它是一张基于Grouping的方法,首先对图像进行过度割,过度割后的区域块和相邻的区域块之间计算类似度,把类似度最高的两个合并,而后重复上面的过程,直到整幅图像被合并成为一个区域,迭代中止;所以它是一种由粗到细,具备必定层次的方法。
这是层次聚类的算法伪码,很容易理解。
为了使得聚类不单一化,也就是产生尽量多样的候选区域,文章对于类似度进行了多种描述,颜色空间上进行了多种转换,同时区域的纹理、大小、填充孔洞,以及起始的区域等特征都会影响类似度。总得来讲,这种方法仍是很不错的,可是就是计算量有点大。
在SPP-net前,因为CNN网络结构的特色,全链接层须要固定长度的输出,所以广泛做法都是使输出图像的大小固定,因为全部图像卷积层操做都是同样的,就能够保证输入到全链接层的向量大小是相同的。有两种方法,第一种是Crop,从原图上按照必定方式裁剪出固定大小的图像,第二种是warp,就是把使用bounding-box标注的目标区域,拉伸成固定大小,这两种方式都具备必定弊端,那就是传入网络训练的图像与原始数据并不一致。
SPP-net的思路就是想要解决样本rescaling问题,提出直接使用任意尺度的图像输入网络进行训练,从而增长尺度不变性,减小过拟合问题。
若是原图输入是224x224,对于conv5出来后的输出,是13x13x256的,能够理解成有256个这样的filter,每一个filter对应一张13x13的reponse map。若是像上图那样将reponse map分红4x4 2x2 1x1三张子图,作max pooling后,出来的特征就是固定长度的(16+4+1)x256那么多的维度了。若是原图的输入不是224x224,出来的特征依然是(16+4+1)x256;能够理解成将原来固定大小为(3x3)窗口的pool5改为了自适应窗口大小,窗口的大小和reponse map成比例,保证了通过pooling后出来的feature的长度是一致的。
与R-CNN相似,检测上仍然使用相同的方法,Selective search + SVM,可是作了一些优化,使得速度提高很多,虽然SPP-net提出这种对训练图像大小不作限制的思想,并无被继续使用,可是spatial pyramid pooling layer的方法,在后来的Fast R-CNN, Faster R-CNN和HyperNet方法中得以延续:RoI Pooling layer,用以把region proposal对应区域的feature map转换成固定大小的feature map,而后输入到全链接层中。
再看卷积神经网络结构上的发展,有影响力比较大的两个深层卷积神经网络GoogleNet 和 VGG,这两个网络结构在ILSVRC 2014年分类挑战赛上分别得到了第一名和第二名的好成绩。这是两篇论文里分别对网络精度的描述。
先看GoogleNet,论文提出了两种基本模式,首先是简单模式,3个使用不一样大小卷积核的卷积层和一个pooling层,在一层里,依次分别进行,而后使用concat层把输出链接在一块儿,另一个模式是在其中两个卷积层以前和pooling层以后,添加具备更小卷积核的卷积层,而后再用concat层进行链接。
这是总体网络结构的基本框架,这里每一个inceptiond都是一个基础模型b,加起来一共有22层深,若是把5个pooling层也算进来,就有27层深(表格中全部的inception都是前面基础模型中的b结构,深度为2)。
这是具体的网络结构图,由于太长了,我把它转成水平。做者总结认为,这种网络结构,相比于较浅的、较窄的网络结构,虽然增长了部分计算量,可是却能取得明显的效果增益。在实际测试中,效果确实也要比传统的网络效果更好。
这是VGG的网络框架,从A到E一共6种,网络深度从11层到19层不等,论文也对卷积核大小进行了探讨,感兴趣的能够阅读原文。相对于这就是2014年以前基于深度学习进行目标检测的主要成果,固然还不少关于数据预处理,检测proposal提取方法,网络结构优化的尝试等没有在上文描述中出现,可是我以为前面讲述的几个方法在当时已经算是集大成者,各方面性能表现都很惊艳,比传统的机器学习方法优越很多。
如今来说2015年以后的该领域的一些发展,首先是Fast R-CNN。在R-CNN和SPP-net以后,做者分析他们存在如下三个不足:第一:训练的时候,提取proposal、CNN特征提取,SVM分类,和bbox 回归是分开隔离的,而Fast R-CNN实现了端到端的联合训练(提取proposal除外),这种思路在之后的检测方法中延续;第二,训练时间和内存开销大,R-CNN提取特征给SVM训练时候须要中间要大量的磁盘空间存放特征,Fast R-CNN去掉了SVM这一步,全部的特征都暂存在显存中,不须要额外的磁盘空间;第三,检测速度慢,在测试的时候,须要把提取的proposal(前面提到是2k个)都输入到网络中提取特征,做者测试,若是使用VGG16网络,一张图像在GPU模式下消耗的时间是47s。咱们看一下Fast R-CNN的网络结果,输入一张图像和多个proposals,论文里也称为RoI, 通过卷积网络获得feature map,再把这些feature map输入到RoI pooling layer池化成一个固定大小的feature map, 通过全链接层后展开为一个特征向量,而后将特征向量同时应用于softmax和bbox regressor,前者是用于类别几率估计,后者用于对bounding box的位置进行回归。在提取过量proposal的时候,实际中,这些proposal多数都是相互重叠的,所以按照R-CNN的作法,把这些相互重叠的proposal依次输入到网络中打分,就会致使一个很严重的问题,那些重叠部分会被反复计算feature(使用的是同一个网络,就至关于把一张图不一样部分反复算了不少遍),这样的计算浪费是很没有必要的,而Fast R-CNN避免了这个问题,它对一张图像只计算一次卷积feature map,而对于proposal对应的图像区域,它把他们在卷积feature map上对应的区域分别取出,经过RoI pooling layer 生成固定大小的feature map,而后进行后面的分类以及bbox回归。这点改变是它速度提高的重要缘由之一。
介绍一下RoI pooling layer,前面讲述单层的SPP layer将这个卷积输出的ROI对应的feature map下采样为大小固定的feature map再传入全链接层,方法也很简单,在前面讲述SPP-net的时候,已经讲过为了可以输入任意尺度的图像,在卷积层输出的最后,添加空间金字塔池化层,使输出的特征向量具备固定的大小,这里也是一样的道理,只不过是为了使不一样size的RoI区域可以输出统一,方便后面的分类以及bbox 回归。Fast R-CNN只是用了一层spp layer 获得固定大小的feature map,论文里设置的是7x7,为何不使用更多层,主要是出于两方面的考虑:一个是会增长计算量,下降速度,另外一个就是由于在训练时,做者使用了ImageNet预训练结果进行网络参数的初始化,若是把这里的池化层拓展为多个spp layer那些模型的参数就没办法直接使用,就必须从新训练。
关于尺度不变性,论文里引用了SPP-net的方法,brute force, 也就是简单认为object不须要预先resize到相似的scale再传入网络,直接将image定死为某种scale,直接输入网络来训练就行了,而后指望网络本身可以学习到scale-invariance的表达。image pyramids (multi scale),也就是要生成一个金字塔,而后对于object,在金字塔上找到一个大小比较接近227x227的投影版本,而后用这个版本去训练网络。凭感受能够看出,方法2应该比方法1更加好,做者也在讨论了,方法2的表现确实比方法1好,可是好的不算太多,大概比方法高1个mAP左右,可是时间要慢很多,因此做者实际采用的是第一个策略,也就是single scale。这里,Fast R-CNN测试之因此比SPP-net快,很大缘由是由于这里,由于SPP-net用了方法2,而Fast R-CNN用了方法1。
做者分析,在整张图像分类过程当中,在计算全链接层上计算花费的时间要比卷积层少,可是对于目标检测来讲倒是相反的,由于要处理的RoI数量比较多,像图上显示的在forward pass过程程中,fc6和fc7占了44.9%的时间,所以做者提出经过利用SVD分解的方法,将大规模的全链接矩阵缩减到很小的数据量,论文里讲述,将fc6 25088x4096的矩阵压缩为1024个奇异值,fc7 4096x4096 压缩为256个奇异值,虽然在精度上降低了0.3%,可是速度上却提高了30%。
Fast R-CNN 将R-CNN用于分类的分类器,从SVM换成了softmax,可是这二者到底哪个究竟更好,做者也进行了探讨,这是一组对比试验,其中S,M,L分别都是网络模型,S指的就是AlexNet,M指的是VGG_CNN_M_1024,L指的是VGG16网络深度依次增长,能够看出使用softmax的结果比SVM都要好一些,并且做者指出,在ROI打分的时候,softmax会提供各个类别的score,而svm提供的是one-vs-rest,前者对于分类来讲可能更有利。
这是一个R-CNN, SPP-net,Fast R-CNN的速度对比表,能够看出速度提高的仍是很明显的。论文就不少其余细节也都进行了讨论,例如网络更新是否应该所有更新仍是部分更新问题,数据量的问题等,这里就不作介绍了。
再来看2015年另一篇论文,Faster R-CNN。 在Fast R-CNN以后,一些研究者也逐渐意识到,提取proposal成为了提高目标检测速度和精度的瓶颈,R-CNN,SPP-net和Fast R-CNN提取proposal的方法都还依赖于selective search。在提取proposal是在CPU中进行的,单幅影像耗时差很少2s,即使通过Fast R-CNN的优化加速后,想要作到视频实时处理,速度仍然还不够。因而Faster R-CNN就提出来,应该把提取proposal也交给CNN来作。在Fast R-CNN中,目标检测是在卷积feature map上基于区域进行的,那是否是也能够直接从卷积feature map上产生proposal呢?答案是确定的。这就是Faster R-CNN的核心思想:RPN提取proposal+Fast R-CNN分类。图中显示的就是RPN的示意图,其中conv feature map就是卷积层最后输出的feature map,使用滑动窗口,这里给出的3x3的滑动窗口,把其中的高维特征展开降维成256维的低维向量,把获得的特征向量分别输入到两个并列的层里,一个box-regression layer(reg)和一个box-classification layer(cls)。
在RPN网络中,滑动窗口中心所在位置,咱们成为sliding position, 在每一个sliding position会按照必定的规则产生一系列的box,这些相关的box就被成为anchors,论文里指出每一个sliding position 会按照3个不一样的尺度,产生3个不一样长宽比(1:1, 1:2, 2:1)一共9个anchors, 假设一幅feature map大小是WxH,那么它所产生的anchors数量就是:WHk,在数据处理的时候,做者把图像都rescale 到1000x600大小,获得的卷积feature map为60x40,因此每张图能够产生anchors 有60x40x9约为20k个,这是远远过量的,并且速度很快,经过对IoU进行非最大抑制后,余下2k的anchors投入训练,在检测的时候,这个数目还好降得更低,减为了300个。
速度和精度上的提高效果都比较显著。
这是HyperNet的网络结构。经历了Fast R-CNN和Faster R-CNN后,人们开始从新审视这些算法的检测结果,不难发现,因为深层卷积网络的使用,使得人们可以经过卷积和池化快速获得proposal windows对应的高维特征,可是最后卷积层输出的feature map都是很是粗糙的(feature map上很小的区域,对应到原图上就具备很大的感觉野),这就很容易致使定位不许确的问题,当面临检测小物体时,这种弊端就更加突显,每每获得的bbox与ground truth误差较多。这是HyperNet的考虑,做者以为有必要提出一种策略下降这种由于conv feature map的过于粗糙而产生的定位误差,而解决方法就是,既然顶层的conv层缩水太厉害,那就把它在扩大,也就是这里使用的Deconv 对高层特征进行上采样,同时还联合浅层的conv来增长网络判别和定位的能力,从而获得更加精细化的定位。这就是HyperNet的核心思想。
与Fast R-CNN,Faster R-CNN同样在训练时都将训练数据rescale成为1000x600或600x1000。不一样卷积层上的feature map融合时,因为具备不一样的分辨率,须要统一到相同size,所以对于浅层feature map经过pooling降采样,对于深层feature map经过去卷积化Deconv进行上采样,而后经过LRN操做进行数据归一化,以后经过concat层把数据联接在一块儿。做者分析这样作的优点有三点:a.多尺度的特征描述; b.获得的feature map大小对于目标检测更为合适(合成的Hyper feature map 大小是250x150,而Faster R-CNN为60x40); c.计算更加高效,没有冗余计算,全部的feature都已经在生成proposal和检测以前完成,以后不须要再进行特征提取。关于proposal提取方法(参考的论文就是Faster R-CNN做者提出的,感受跟RPN很像,可是效果要好一些)。
加速策略(略)。
速度上比Fast R-CNN快了很多,跟Faster R-CNN差很少,可是精度上比前二者都更高。
还有一些很好的其余算法,这里没有列举出来,可是从这些列出的算法中,能够看出一些内容: 1.目标检测在融入了深度学习后,发展迅速,尤为是近几年,检测的速度不断加快,精度也在不断提升; 2.总体目标虽然是快速高效地完成检测,但研究的热点内容逐渐从如何更好地构建深层神经网络,转变到快速高效地提取proposal,再到如何更准确地定位和实时处理问题; 3.基本的卷积神经网络结构已经在2014年左右奠基了基本格局,由基本网络例如AlexNet, VGG,GoogLeNet等衍生出的检测网络比比皆是; 4.提取proposal的方法,始终都是提升检测速度的关键,逐渐从利用原图信息提取proposal,转变为利用conv feature map提取的方式,例如RPN,HyperNet等; 5.训练测试的pipeline,从特征提取,定位和分类独立进行,转变为全都在神经网络里完成的end-to-end模式; 6.仍然有较大的提高空间,从各类检测方法的评估来看,mAP精度还有不小的提高空间(目前还停留在80%如下),而想要实现实时处理(如YOLO),就要以牺牲精度为代价。