深度学习真正广为人知是2016年阿尔法狗战胜围棋高手李世石九段,隔年战胜彼时的世界围棋第一人柯洁。深度学习其实是由机器学习中的神经网络发展而来,而神经网络早在上世纪50年代就开始发展了,历经三起两落。
提出神经网络的简单模型为第一个高峰。
最开始的神经网络只有单层,并且是线性的,所以表示能力有限,解决不了“异或”问题。神经网络进入第一次低潮。
上世纪80年代,DavidRumelhar和GeofferyE.Hinton提出了反向传播(backpropagation)算法,解决了两层神经网络的复杂计算问题,因为引入了“隐藏层”,同时克服了“异或”问题。这是第二次高峰。
但受限于当时的数据获取、计算资源等,神经网络训练极容易过拟合,后来被SVM压住了一头,进入第二次低潮。
难能可贵的是,Hintion、Bengio、LeCun三巨头依然在神经网络领域默默耕耘,Hintion于2006年发明“深度置信网络”,通过逐层预训练解决了网络过拟合问题。随后为了回击质疑,在2012年ImageNet竞赛中以神经网络方法强势夺冠并大幅领先第二名20多个百分点,接下来便是我们所熟知的第三次高峰了。并且这次高峰开始深刻影响到我们生活的方方面面,也许人工智能时代真的要来临了。
Hintion的精神很值得我们学习,科研不是一味追热点,追来追去成不了大牛,唯有埋头耕耘,才能在一个领域做出真正的有价值的东西。
在图像领域,主要是卷积网络大放异彩。
LeNet-5由YannLeCun等人在1998年提出,LeNet-5是基于梯度学习的卷积神经网络,并成功应用于手写数字字符识别,在那时的技术条件下就取得了低于1%的错误率,因此被用于全美所有的邮政系统。它是深度学习发展过程中的重要里程碑,对后来的卷积神经网络的设计和发展产生了深远影响。
LeNet-5包含两层卷积、两层池化、三层全连接。
这里多说几句,LeNet-5绝对是开创了深度学习的先河,为后世提供了基本的网络框架,后面的深度学习发展基本没有跳脱出这个框架,大师之所以为大师,就是开宗立派、名垂青史。
AlexNet是由AlexKrizhevsky等人在2012年提出的一种深度卷积神经网络模型。它是在ImageNetLargeScaleVisualRecognitionChallenge(ILSVRC)比赛中取得突破性成果的模型,标志着深度学习在计算机视觉领域的重要进展。
Alex-Net在2012年ImageNet竞赛中力压群雄,强势夺冠并大幅领先第二名20多个百分点,当时学界业界表示受到了惊吓。
首先这幅图分为上下两个部分的网络,论文中提到这两部分网络是分别对应两个GPU,当时是因为计算资源有限,所以利用两块GPU来将特征图分组卷积,所以单看一个分支就够了。为了更方便的理解,我们假设现在只有一块GPU或者我们用CPU进行运算,单看一个分支,网络层数为8层,5层卷积,3层全连接层。结构与LeNet-5区别不大,但是使用了7x7、11x11的大卷积核增大感受野。
Alex-Net使用的新技术
VGG是Oxford的VisualGeometryGroup提出的。该网络主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。
VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少,计算量少)
简单来说,在VGG中,使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5x5卷积核,这样做的主要目的是在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果,同时减少计算量。
VGG网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的maxpooling。这样的结构为后续的深度学习提供了范式。
VGG使用的新技术
GoogLeNet与VGG不同,该网络主要工作是探索了增加网络的宽度。论文提出了名为Inception的结构来实现既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。
GoogLeNet使用的新技术
ResNet(ResidualNeuralNetwork)是由KaimingHe等人在2015年提出的一种深度残差网络模型。它在解决深度神经网络中的梯度消失和模型退化问题上取得了重要突破。
VGG网络试着探寻了一下深度学习网络的深度究竟可以深几许以能持续地提高分类准确率。我们的一般印象当中,深度学习愈是深(复杂,参数多)愈是有着更强的表达能力。凭着这一基本准则CNN分类网络自Alexnet的7层发展到了VGG的16乃至19层,后来更有了Googlenet的22层。可后来发现深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,testdataset的分类准确率也变得更差。排除数据集过小带来的模型过拟合等问题后,发现过深的网络仍然还会使分类准确度下降(相对于较浅些的网络而言)。
作者提出,这可能是因为更深的网络会伴随梯度消失/爆炸问题,从而阻碍网络的收敛。这种加深网络深度但网络性能却下降的现象被称为退化问题。于是ResNet提出了res-block结构,对于更深层次的模型:添加恒等映射(identitymapping)(就是跳跃结构,直接把信息恒等传递到下一层)。在这种情况下,更深的模型不应该产生比其对应的较浅的网络更高的训练误差。
原先的网络输入x,希望输出H(x)。现在我们令H(x)=F(x)+x,那么我们的网络就只需要学习输出一个残差F(x)=H(x)-x。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能(这句话是理解残差的关键)。
思想其实很朴素,resblock基于一个假设:当把浅层网络特征恒等映射传到深层网络时,深层网络的效果一定会比浅层网络好(至少不会差),所以resblock构造了一个恒等映射,就是增加了一个跳跃结构,让前面的信息直接流入后面的网络层,这样就不怕网络退化了。简化了学习过程,增强了梯度传播。实际上resblock个人认为没有严谨的数学证明,但实验证明确实很好。
正因为resblock的设计,ResNet到达了上百层深度,越深效果越好,取得了2015年ImageNet挑战赛冠军,同时这是第一个错误率(3%)低于人类(5%)的模型。
Xception是Google继Inception后提出的对Inception-v3的另一种改进。Xception的结构基于ResNet,但是将其中的卷积层换成了SeparableConvolution(极致的Inception模块)。
DepthwiseSeparableConvolution与Xception区别:
作者认为带激活函数的Xception相比于没有激活函数的Depth-wiseconvolution收敛过程更快、准确率更高,而两者关于1x1卷积和3x3通道卷积的顺序差异,作者认为影响不大。
ImageNet最后一届竞赛的冠军,提出了SE结构。
对于CNN网络来说,其核心计算是卷积算子,其通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H和W维度)以及通道间(C维度)的特征融合。
语义分割,简单来说就是像素级别的分类任务。将图片中的每一个像素都分类到对应的物体去,用不同的颜色标识。
比如上图每一个像素都属于一个类别,比如汽车,行人等,这对自动驾驶场景来说十分有意义。
语义分割网络的基础还是卷积神经网络,不过去掉了全连接层,变成了全卷积网络了。而且通常采用编码和解码的网络结构。为什么要采用编码解码的结构呢?因为前面的分类网络使得图片的分辨率越来越小,这其实是一个编码的过程,而语义分割要得到原图大小的结果图,所以很自然的还需要解码(上采样),将特征图还原至原图大小。
语义分割网络的发展过程,主要的改进方向就是想方设法地利用全局上下文信息。这一点大家要牢记。因为低层的特征语义信息比较少,但是目标位置准确,分辨率高;高层的特征语义信息比较丰富,但是目标位置比较粗略,分辨率低。
FullyConvolutionNetworks(FCNs)全卷积网络是第一个端到端的语义分割网络,最大贡献就是成功将卷积网络应用于语义分割上。
在VGG的基础上,将最后一层替换成卷积层,采用线性插值实现上采样,输出原图大小的结果图。其实原理很简单,不过FCN只有编码结构,最后直接暴力上采样,缺少了解码结构,自然分割效果不会很好。
SegNet就是在VGG的基础上,增加了解码的结构,是对FCN的改进,保留了更多语义信息。
SegNet在解码器中使用反池化对特征图进行上采样,并在分割中保持高频细节的完整性。反池化(up-poolong)我们之前讲过,不再赘述。
U-Net是一种用于图像分割的深度学习网络架构。它最初由OlafRonneberger等人于2015年提出,并被广泛应用于医学图像分割任务中。
U-Net比较大的特点就是跳跃结构,充分利用了高低语义信息(上下文信息),实验结果更好。
U-Net算是分割任务发展的里程碑,由于U-Net的网络结构简单且易于实现,因此在许多图像分割任务中被广泛采用。
DeepLabv1认为语义分割的全局上下文信息十分重要,越大的感受野越能帮助语义分割的效果提升,基于这一点,
论文中提出了语义分割中的三个挑战:
DeepLabv2最主要的贡献是提出了空洞空间金字塔池化(AtrousSpatialPyramidPooling),在不同的分支采用不同的空洞率以获得多尺度图像表征,如下图可以很好的说明。
DeepLabv3使用ResNet作为主干网络。
MaskR-CNN架构相当简单,它是流行的FasterR-CNN架构的扩展,在其基础上进行必要的修改,以执行语义分割。
PSPNet与RefineNet都是想方设法利用上下文信息,PSPNet是利用空间金字塔池化聚合全局上下文;RefineNet则是利用远程残差结构聚合上下文。都取得了很好的效果。
PSPNet
RefineNet
图像的目标检测任务主要可以分为三大类:(1)目标分类:识别图片中物体是什么;(2)目标定位:识别物体的同时,还要定位物体;(3)目标检测:多目标的分类与定位。
随着手工特征的性能趋于饱和,目标检测研究在2010年之后达到了一个平稳期,2010-2012年间进展缓慢。2012年,卷积神经网络取得了重大突破(Alex-Net),其作为一个深度神经网络,能够学习一幅图像鲁棒的高级特征表示。紧接着R.Girshick等人率先提出了具有CNN区域特征(RegionswithCNN,RCNN)的方法用于目标检测。从那时起,目标检测开始高速发展。在深度学习时代,目标检测可以分为两种类型:“两阶段(Two-stage)检测方法”和“单阶段(One-stage)检测方法”,前者将检测定义为“从粗到精”的过程,而后者将检测定义为“一步走”的过程。许多优秀的基于卷积神经网络的目标检测方法被提出,如基于两阶段的SPPNet、FastRCNN、FasterRCNN,这些算法首先生成图像中目标物体的建议候选区域,其次再对候选区域做进一步的分类和坐标框回归,得出最后的目标检测结果;还有基于单阶段的YOLO、SSD和RetinaNet等,这些算法直接通过回归的方式进行图像中目标物体的检测,即分类和回归同时进行。
两阶段检测精度高但速度慢;单阶段检测精度稍低但速度快,one-stage算法对小目标检测效果较差。
基于两阶段的CNN检测器
R-CNN系统分为3个阶段,反映到架构上由3个模块完成。
R-CNN的方法其实很简单,不再赘述。
测试阶段的目标检测
在测试阶段,R-CNN在每张图片上抽取近2000个候选区域。
然后将每个候选区域进行尺寸的修整变换,送进神经网络以读取特征,然后用SVM进行类别的识别,并产生分数。
候选区域有2000个,所以很多会进行重叠。针对每个类,通过计算IoU指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。
非极大性抑制
目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。
非极大值抑制的流程如下:
R-CNN的缺点
R-CNN的缺点第一是太慢,2000多个候选框。第二个缺点不是端到端的方法。第三个缺点是所以特征图固定缩放,影响了精度。
2014年,何凯明等人提出了空间金字塔池化网络(SpatialPyramidPoolingNetworks,SPPNet)。以前的CNN需要固定大小输入,例如AlexNet的输入为224×224,R-CNN也是固定缩放。SPPNet的主要贡献是引入了空间金字塔池化层,支持CNN生成固定长度表示,而不考虑图像/感兴趣区域的大小,无需重新缩放。利用SPPNet进行目标检测,可以得到特征图,整个图像只计算一次,避免了重复计算卷积特征。在不牺牲准确率的情况下,比RCNN提升了2倍的速度。虽然SPPNet有效地提高了检测速度,但它还存在一些弊端:一是它仍然不是一个端对端的方法,二是它只微调了全连接层,而忽略了前面的层。空间金字塔池化层我们前面讲过,不再赘述。
2015年,R.Girshick提出了FastRCNN检测器,这是对RCNN和SPPNet的进一步改进。FastRCNN使我们能够同时训练检测器和一个边界框(Boundingbox)回归器,在相同的网络配置下,在VOC07数据集上,FastRCNN将mAP从58.5%(RCNN)提升到70.0%,同时检测速度比RCNN快200倍以上。虽然FastRCNN成功地融合了RCNN和SPPNet的优点,但其检测速度仍然很慢。
FastRCNN主要有3个改进:
1、卷积不再是对每个regionproposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个regionproposal分别做卷积,因为一张图像中有2000左右的regionproposal,肯定相互之间的重叠率很高,因此产生重复计算。直接对整张图像卷积后,再使用SelectiveSearch算法生成候选特征图
2、用ROIpooling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把regionproposal作为输入。
3、将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器。
2015年,S.Ren等人提出了FasterRCNN检测器。FasterRCNN是第一个端到端的基于深度学习的目标检测方法,同时也是第一个近实时的深度学习探测器。FasterRCNN的主要贡献是引入了区域候选网络(RegionProposalNetwork,RPN)。从RCNN到FasterRCNN,对象检测系统中的大多数单个网络块,例如候选检测、特征提取、边界框回归等,已逐渐融入到统一的端到端学习框架。
相比FAST-RCNN,主要两处不同:
1、使用RPN(RegionProposalNetwork)代替原来的SelectiveSearch方法产生建议窗口;
2、产生建议窗口的CNN和目标检测的CNN共享
就是因为优化了SelectiveSearch方法,所以目标FasterRCNN速度很快,接近实时。
第一步是在一个滑动窗口上生成不同大小和长宽比例的anchorbox(如上图右边部分),取定IoU的阈值,按GroundTruth标定这些anchorbox的正负。于是,传入RPN网络的样本数据被整理为anchorbox(坐标)和每个anchorbox是否有物体(二分类标签)。RPN网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个anchorbox有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为RPN网络的目标训练。
由RPN得到RegionProposal在根据概率值筛选后经过类似的标记过程,被传入R-CNN子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。
RPN(RegionProposalNetwork)网络的作用、实现细节
RPN网络的作用:RPN专门用来提取候选框,一方面RPN耗时少,另一方面RPN可以很容易结合到FastRCNN中,成为一个整体。
RPN网络的实现细节:一个特征图(FasterRCNN的公共FeatureMap)经过slidingwindow处理,得到256维特征,对每个特征向量做两次全连接操作,一个得到2个分数,一个得到4个坐标{然后通过两次全连接得到结果2k个分数和4k个坐标[k指的是由锚点产生的K个框(Kanchorboxes)]}
2个分数,因为RPN是提候选框,还不用判断类别,所以只要求区分是不是物体就行,那么就有两个分数,前景(物体)的分数,和背景的分数;4个坐标是指针对原图坐标的偏移,首先一定要记住是原图;
预先设定好共有9种组合,所以k等于9,最后我们的结果是针对这9种组合的,所以有HxWx9个结果,也就是18个分数和36个坐标。
RPN的损失函数(多任务损失:二分类损失+SmoothL1损失)
RPN中的anchorbox是怎么选取的?
滑窗的中心在原像素空间的映射点称为anchor,以此anchor为中心,生成k(paper中defaultk=9,3scalesand3aspectratios/不同尺寸和不同长宽比)个proposals。三个面积尺寸(128^2,256^2,512^2),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1)
为什么提出anchorbox?
主要有两个原因:一个窗口只能检测一个目标、无法解决多尺度问题。
目前anchorbox尺寸的选择主要有三种方式:人为经验选取、k-means聚类、作为超参数进行学习
为什么使用不同尺寸和不同长宽比?为了得到更大的交并比(IOU)。
基于单阶段的CNN检测器
YOLO意思是YouOnlyLookOnce,创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片(不用看两眼哦)就能知道有哪些对象以及它们的位置。YOLO将图片划分为7x7=49个网格(grid),每个网格允许预测出2个边框(boundingbox,包含某个对象的矩形框),总共49x2=98个boundingbox。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。
去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测boundingbox的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量
根据YOLO的设计,输入图像被划分为7x7的网格(grid),输出张量中的7x7就对应着输入图像的7x7网格。或者我们把7x7x30的张量看作7x7=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。具体来看每个网格对应的30维向量中包含了哪些信息。
20个对象分类的概率:因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。
2个boundingbox的位置:每个boundingbox需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(boundingbox的中心点的x坐标,y坐标,boundingbox的宽度,高度),2个boundingbox共需要8个数值来表示其位置。
2个boundingbox的置信度:boundingbox的置信度=该boundingbox内存在对象的概率x该boundingbox与该对象实际boundingbox的IOU
总的来说,30维向量=20个对象的概率+2个boundingboxx4个坐标+2个boundingbox的置信度
创新点:1.将整张图作为网络的输入,直接在输出层回归boundingbox的位置和所属的类别。2.速度快,onestagedetection的开山之作。
缺点:1.首先,每个单元格只预测2个bbox,然后每个单元格最后只取与gt_bbox的IOU高的那个最为最后的检测框,也只是说每个单元格最多只预测一个目标。2.损失函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。3.由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率的图片。4.和two-stage方法相比,没有regionproposal阶段,召回率较低。
SSD由W.Liu等人于2015年提出。这是最重要的第二个单阶段检测器。SSD的主要贡献是引入多分辨率检测技术,这显著提高了检测效率,特别是对于一些小型检测物体,SSD在检测速度和速度上都有优势。
SSD和Yolo一样都是采用一个CNN网络来进行检测,但是却采用了多尺度的特征图,其基本架构如图所示。下面将SSD核心设计理念总结为以下三点:
1.采用多尺度特征图用于检测
所谓多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,这正如上图所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标
2.采用卷积进行检测
与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为nxmxp的特征图,只需要采用3x3xp这样比较小的卷积核得到检测值。
3.设置先验框
在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD借鉴了FasterR-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(boundingboxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如图所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的