## 基于深度学习的计算机视觉技术发展 文/王洪彬 >图像识别任务取得巨大成功之后,深度学习技术就被广泛应用于计算机视觉的各个具体任务上,而物体检测应该是除了图像识别之外,应用最为广泛的一个计算机视觉的具体任务。本文主要概述深度学习技术在计算机视觉领域的应用,主要以图像识别和物体检测技术的发展为主要脉络。 ### 背景介绍 什么是计算机视觉?简单讲,计算机视觉就是使用计算机模拟人脑对图像和视频的处理。这里有两个关键点:1.对图像和视频进行处理;2.模拟人脑。其实模拟人脑这一条并没有那么强的约束性,我们不必教条地模拟人脑的处理方式,但不得不说,人脑对图像和视频的处理方式对计算机视觉具有极大的启发性。 按具体的任务来分,计算机视觉主要有图像识别、物体定位、物体检测、图像语义分割、物体分割、超分辨率、场景识别等等。本文会着重介绍图像识别和物体检测任务的历史、发展和现状。 什么是图像识别?给定一副图像,计算机视觉算法需要告诉我们,这幅图像中,是否有鸟、猫、狗等等。如图1所示,为经典的 PASCAL VOC 图像识别任务的几个例子。 图1 PASCAL VOC和ImageNet ILSVRC竞赛的示例图片 图1 PASCAL VOC 和 ImageNet ILSVRC 竞赛的示例图片 由图1可以看出,PASCAL VOC 只需识别出图像中是否有鸟、猫、狗等等,而对应的 ImageNet ILSVRC 竞赛的图像就要求识别出图像中的鸟、猫、狗对应的品种(图中鸟的品种包括:flamingo——火烈鸟;cock——公鸡;ruffed grouse——环羽松鸡;quail——鹌鹑;partridge——山鹑;猫的品种包括:Egyptian cat——埃及猫;Persian cat——波斯猫;Siamese cat——暹罗猫;tabby——斑猫;lynx——猞猁;狗的品种包括:dalmatian——斑点狗;keeshond——荷兰卷尾狮毛狗;miniature schnauzer——迷你雪纳瑞犬;standard schnauzer——中型雪纳瑞犬;giant schnauzer——巨型雪纳瑞犬)。PASCAL VOC 图像识别任务共有20个种类,而 ImageNet ILSVRC 共有1000个类别。 那么物体检测又是什么呢?同样给计算机一张图片,计算机视觉算法不仅需要告诉我们这张图片中有哪些种类的物体,还要告诉我们这些物体的具体位置。一般物体的具体位置使用边界框(Bounding Box)的方式给出,如图2所示。 图2 PASCAL VOC有关物体检测的示例图片 图2 PASCAL VOC 有关物体检测的示例图片 从图2可以看出,如左上的第一幅图,计算机视觉算法不仅需要知道图中有椅子,还要知道有三把椅子,并且要用边界框准确的把三把椅子的位置标注出来。而右下的图片,计算机视觉算法还要知道图中既有狗,又有猫,并且猫和狗是有相互交叠的,这种情况下,计算机视觉算法还要准确标记猫和狗的位置。PASCAL VOC 和 ImageNet ILSVRC 竞赛都有物体检测的训练和测试数据集合。不过,现在比较广泛使用的还是 PASCAL VOC 20 类的物体检测任务,我们可以在 PASCAL VOC 官网提供的排行榜(leaderboard)上看到最近的物体检测算法排名情况。 本文主要介绍这两种算法,那么这两种任务有什么必然的联系吗?当然有,一个很明显的情况是,如果我们有个很好的物体检测算法,那么我们就会知道图片中都有哪些物体,这样图像识别算法就可以简单地利用物体检测算法的结果来判断图中是否有鸟、猫、狗等物体。另一方面,如果我们有一个很好的图像识别算法,那么我们可以把图片中可能存在物体的边界框一一拿给图像识别算法来识别是否存在鸟、猫、狗等,这样,我们也可以得到一个很出色的物体检测算法。拿这两种方案进行比较,我们可能觉得第一个方案更简单直观些,但是第二个方案才是当今计算机视觉技术发展的路线图,详情下面会介绍。 ### 深度学习在图像识别上的发展——从 AlexNet 到 ResNet #### “神级文明”的降临——AlexNet 之于 ImageNet ILSVRC 2012年之前,包括 PASCAL VOC 和 ImageNet ILSVRC 等竞赛的主流算法还是基于特征提取加分类器的传统方案。而传统方案的 Top5 错误率(即每张图片,图像识别算法可以提出五种最有可能包含的物体种类,如果图片的正确分类出现在这五个分类中时,则认为此次识别正确)的冠军成绩一直徘徊在28.2%~25.8%之间(2010年28.2%,2011年25.8%,2012年除了 AlexNet 以外的最好成绩26.2%)。然而情况在2012年迎来巨大转机——基于深度卷积神经网络的 AlexNet 来了,并且以16.4%的 Top5 错误率赢得了冠军,比第二名的26.2%,足足低了近10个百分点,如表1所示。AlexNet 当时参加比赛的队伍的名称为 SuperVision。 表1 2012年 ImageNet ILSVRC 竞赛队伍比赛成绩 表1 2012年ImageNet ILSVRC竞赛队伍比赛成绩 看过《三体 III》的同学们应该知道在《三体》所营造的科幻世界中有神级文明这一说法,意味着其科技发展程度远远高于宇宙中的其他一般文明,比如我们的地球文明。而在2012年的时候,基于深度卷积神经网络的 AlexNet 以高姿态进入多年没有显著进展的计算机视觉领域,多少有点“神级文明”降临的味道。 AlexNet 得名于其设计者的名字 Alex Krizhevsky,他是深度学习界的大宗师加拿大多伦多大学的 Geoffrey E. Hinton 的得意门生。说了这么多关于 AlexNet 的“八卦”,AlexNet 到底长什么样?如图3所示,是 AlexNet 的结构示意图。 图3 AlexNet结构示意图 图3 AlexNet 结构示意图 图3中作者使用了五层卷积层和三层全连接层,而卷积层的卷积核的尺寸也从第一层的11×11,变到了第二层的5×5,以及其后的3×3,同特征图谱的尺寸一样(从224×224,到55×55,到27×27,到13×13),呈缩小的趋势。同时,卷积核的数目却从96(=48×2)变到256(=128×2),再到384(=192×2),大体呈放大的趋势(除了最后一层卷积层的卷积核数目为256=128×2,比前面的384少)。此种设计,大致是受限于计算资源,Alex 希望网络中每层卷积网络的计算量大致相同。AlexNet 分为上下两部分,主要因为 Alex 是在两个 GPU 上训练的网络,所以他把网络一分为二,方便分配计算资源。从图3中可以看出,两个 GPU 在第三层卷积层上有交互,还有最后的三层全连接层有交互,其余各层都是在各自的 GPU 内部进行计算。 Alex 在论文中特地强调:“我们最后的网络包括五层卷积层和三层全连接层,好像这个深度显得格外的重要:我们发现去除任何卷积层的行为都会导致较差的性能,即使每一个卷积层所包含的参数还不到模型参数数目的百分之一。” Alex 的工作得到了计算机视觉研究领域的特别关注,其后计算机视觉就以深度学习为基础,迎来了一个又一个的新高峰。 #### Google 的 Inception 系列图像识别网络 AlexNet 仅仅是为计算机视觉界开了一扇窗。随后,有大量的研究团队进行了深入研究,并相继提出了对 AlexNet 的改进。而由 Szegedy 领衔的 Google 计算机视觉团队,在2014年参加 ImageNet ILSVRC 竞赛,其提出的深度网络模型 GoogLeNet 一举夺魁,取得了6.67% Top5 错误率的好成绩。不仅如此,其随后的 Inception 系列网络,更一步一步的把 Top5 错误率降到了3.08%的水平。 图4 Inception模块结构图 图4 Inception 模块结构图 那么 Inception 系列都有哪些重要的改进呢?首先作为第一代 Inception 的 GoogLeNet,采用了多尺度卷积的方法,而 AlexNet 中每层网络只有单一尺寸的卷积核。如图4所示,Szegedy 构想的神经网络层之间的特征图谱传输应该是进行多尺度卷积运算,同样输入的特征图谱,要经过卷积核大小为1×1,3×3,5×5的卷积运算,和3×3的最大值池化运算,然后把这四个运算的结果进行合并,作为这个模块的输出。但是由于考虑到计算的复杂度和具体的实现细节,Szegedy 的 Inception 模块加入了1×1的卷积层来进行输入特征图谱通道数的缩减和输出特征图谱通道数的变换,如图5所示。把多个 Inception 模块串联起来,就得到了 Inception 深度网络模型,如图6所示。 图5 GoogLeNet使用的Inception模块 图5 GoogLeNet 使用的 Inception 模块 图6 GoogLeNet(Inception-v1)结构示意图 图6 GoogLeNet(Inception-v1)结构示意图 随后的 Inception-v2 主要调试出了深度网络的一个重要问题:内部协变量偏移,并提出了 Batch Normalization(批量归一化)算法克服了这一难题,如图7所示,使得深度网络的训练不再强度依赖于网络参数的初始化和网络训练计划的制定,并使得 Sigmoid 函数也可以应用于深度神经网络,而不必一定使用 ReLU 作为深度神经网络的激励函数,最终得到了4.9%的 Top5 错误率。 图7 Batch Normalization算法 图7 Batch Normalization 算法 Szegedy 在 Inception 网络取得巨大成功之后,对深度卷积神经网络的设计进行了深刻的总结和思辨,其主要的设计宗旨发表在论文中,而 Inception-v3 则作为思辨的副产品,把 Top5 错误率降低到了3.5%。这些设计宗旨主要涉及如何在特征图谱的传输过程中尽量减少信息的丢失,和如何改进模型来减少模型的计算量等诸如此类的问题。 而 Inception-v4 是在何恺明提出残差网络之后,Szegedy 把 Inception 和残差网络结合的一个产物,并进一步把 Top5 错误率降低到了3.08%。 由于 ImageNet ILSVRC 竞赛需要分辨1000个细致的类别,比如不同品种的鸟、猫、狗等,即使人类来做这些分类任务,其 Top5 的错误率也要有5.1%左右,所以计算机视觉在图像识别领域应该说已经很成熟了,并大幅超越了人类的识别水平。 #### ResNet——残差网络 尽管 Inception-v4 的 Top5 错误率很低,并且 Inception 系列一直保持着极高的水准,但第一个在 ImageNet ILSVRC 竞赛中创造“计算机视觉算法超越人类识别水平”历史的是由微软亚洲研究院的何恺明提出的 ResNet——残差网络,Top5 错误率3.57%。 图8 残差网络模块示意图 图8 残差网络模块示意图 即使有了像 Batch Normalization 这样加速深度网络模型快速收敛的算法工具,过深的神经网络还是不易训练。而其中原因,和反向传播算法在深度神经网络中较为低效的偏微分值传播有关,而残差网络的提出,就很好地解决了这一问题,残差网络的模块中不仅有通常的卷积层,还有一条“高速公路”把模块的输入直接累加到卷积层和激励层的输出结果上,这样在反向传播的过程中,总是有一条“高速公路”可以把偏微分值高效地传播回来,从而快速得出模型当前的梯度,并进行优化。如图8所示,为残差网络的模块示意图,其中x为输入特征图谱,一路经过卷积层、激励层、卷积层;另一路只是把x输出,最后把这两路分别输出的特征图谱相加,再经过激励层,就得到了残差网络模块的输出。如图9所示,为残差网络的结构图。残差网络意义重大,其后的好多网络都是基于这一网络结构改进而来。同时残差网络使用了 Batch Normalization 算法,为该网络结构的快速做出了重大贡献。 图9 残差网络结构示意图 图9 残差网络结构示意图 ### 物体检测技术——从 R-CNN 到 R-FCN 除了图像识别,在计算机视觉领域比较重要的任务当属物体检测。在看到 AlexNet 在 ImageNet ILSVRC 竞赛中取得的巨大成功之后,基于深度卷积网络的物体检测算法也是层出不穷,其中的佼佼者当属 R-CNN 系列算法,从 R-CNN 开始,历经 SPPnet、Fast/Faster R-CNN、到 R-FCN,相关的 PASCAL VOC 物体检测测试集合 test 2012 的检测指标 mAP(mean Average Precision),也从62.4%提升到了88.4%。 #### R-CNN——小试牛刀 如何设计物体检测算法呢?经过多年的研究,业界发现图像识别要比图像检测简单些,AlexNet 也主要是从图像检测的角度进行突破的。那么设计物体检测算法,自然要利用现有的高质量图像识别算法,但如何在物体检测算法中使用图像识别算法,这里面就需要很多的考虑了。最直观、也是最单纯的想法是使用滑动窗口的方案,在图片上使用不同尺寸、不同长宽比的矩形窗口,从图像上的左上角开始,每次移动一个像素点,这样我们会得到几乎所有的备选窗口,再对备选窗口应用图像识别算法进行识别。但最简单的,一般也是最无效的。后来研究者发现,用滑动窗口得到的大部分窗口都是不合格的,不是窗口中只含背景,就是含有物体的窗口质量不高(相对于待检测物体太大或太小),从而导致计算量过大,同时测试集合的指标结果也偏低,这样,备选窗口的质量就成为了物体检测算法的瓶颈之一了。 2013年,研究者 Uijlings 提出了基于区域提议的物体检测方案,其中区域提议就是使用区域提议算法得出高可能性的备选窗口。相较滑动窗口方案,备选窗口的数量大幅减少,备选窗口的质量大幅增加。Uijlings 使用Selective Search 作为区域提议算法,但遗憾的是,Uijlings 没有使用更好的基于深度卷积网络的图像识别算法,还是使用传统的图像识别算法(空间金字塔加 Bag-of-Words)。同一年,在 Berkeley 的 Girshick,想到了一个非常好的点子,将 Selective Search 的区域提议算法与 AlexNet 相结合,因为 AlexNet 是更好的图像识别算法,这样 R-CNN 就诞生了。Girshick 用数据说明了一切,R-CNN 网络在 PASCAL VOC test 2010上的 mAP 为53.7%,而同样使用 Selective Search 的 Uijlings 网络只有35.1%。 RCNN 的流程示意图如图10所示,分为四个阶段:1.一张待检测图片经过 Selective Search 算法的处理,会得到大约2000个备选窗口,每个备选窗口都要分别经过2~4的阶段处理;2.其中任一备选窗口,需要进行一次仿射变换,变换为227×227的大小;3.变换后得到大小为227×227的窗口图片,被送入 CNN 进行特征提取,得到4096维的特征向量;4.每一个类别都会有一个 SVM 分类器,4096维的特征向量会被分别送入每个类别的分类器中,询问是该类的得分;5.把所有备选窗口按不同类别进行最大值抑制,最后可以输出每个类别的最有可能包含物体的窗口。 图10   R-CNN的网络流程示意图 图10 R-CNN 的网络流程示意图 Girshick 的 R-CNN 的基本架构为后来的物体检测算法所继承。在 PASCAL VOC test 2012上R-CNN 的 mAP 为62.4%。如图11所示为使用 R-CNN检 测物体的效果。 图11   R-CNN物体检测算法示例 图11 R-CNN 物体检测算法示例 ### SPPnet——摆脱尺寸的限制 R-CNN 的出现,真如一轮耀眼的太阳,照亮了物体检测前方的路。但是对于 R-CNN 还有一些未尽事项,发现这些未尽事项,并给出可行的解决方案,这正是我们算法工程师的职责所在。R-CNN 中的一个未尽事项就是输入 CNN 网络的备选窗口要仿射变换到一个固定的尺寸227×227,这样的限制主要是来自于 AlexNet 中全连接层的要求(输入的特征向量必须是固定维度的),而与 AlexNet 中前五层的卷积网络没有关系(卷积网络不对输入图片尺寸作要求)。如果所有的备选窗口可以共享卷积层的参数和计算,那么无论是物体检测系统的训练,还是检测应用,都会有极大的速度提升,而另外只需在全连接层前面加入变换备选窗口到指定大小的功能即可。以上这些就是由微软亚洲研究院的何恺明等人提出的 SSPnet(空间金字塔池化网络)的主要思路。如图12所示,左上说明,如果要保持备选窗口不发生形变(保持长宽比),那么就只能截取车子的一部分用于识别,而物体的边界框不是很准;右上说明,如果要保持备选窗口包含全部物体,那么按照 R-CNN 的做法,需要对备选窗口进行一定的拉伸,从而发生形变,这样不利于 CNN 网络对物体的识别。图片下面是 R-CNN 和 SPPnet 的流程结构比较,如前所述。 图12 SPPnet网络结构图和备选窗口裁切方法举例 图12 SPPnet 网络结构图和备选窗口裁切方法举例 空间金字塔池化,主要的想法来自计算机视觉早期对非固定大小图片的处理方法,首先计算出在最后一层卷积层上对应的备选窗口大小(Selective Search 提议的是基于图片输入层的,由于 AlexNet 中间会经历多次最大值池化,减小特征图谱尺寸,应用空间金字塔池化的那一层的备选窗口大小与 Selective Search 提议的区域大小不一样,但是可以由 Selective Search 提议的区域计算得出),然后把备选窗口分为4×4个区域,每个区域使用最大值池化;同样,按2×2个区域进行最大值池化;最后使用整个备选窗口做最大值池化。把以上如金字塔般池化后的结果组成一个固定大小的特征向量(4×4×d+2×2×d+1×1×d=21d,d 为最后一层卷积层的通道数),并送入剩下的全连接层,如图13所示。 图13   空间金字塔池化结构示意图 图13 空间金字塔池化结构示意图 #### Fast R-CNN——再接再厉 Girshick 在看到 SPPnet 之后,颇受启发,紧接着就提出了 Fast R-CNN,从名字上看,就知道它的主要特点是比 R-CNN 快。不仅快,而且 Fast R-CNN在PASCAL VOC test 2012 上有更高的 mAP:68.4%。 Girshick 自己总结了有关 Fast R-CNN的主要贡献: 1. 比 R-CNN 和 SPPnet 更高的 mAP; 2. 使用多目标损失函数,单一的训练过程; 3. 端到端的训练过程(克服SPPnet的缺点); 4. 更快的速度(0.3s/image,不包括区域提议)。 第一条毋庸多言;第二条说的是 R-CNN 和 SPPnet 都使用的是交替训练的方式;第三条主要克服了空间金字塔池化的反向偏微分传播不易计算的缺点;第四条是因为一张图片的约2000个备选窗口使用共享的卷积层计算,从而节省了时间,但是不包括费时的区域提议(Selective Search约2s左右)。Fast R-CNN 的结构示意图如图14所示,有必要说明的是,Girshick 使用类似何恺明 SPPnet 的方案,不过 Girshick的RoI Pooling 层只是把备选窗口分成7×7个区域进行最大值池化,这样有利于反向传播算法的实现。 图14   Fast R-CNN的系统结构示意图 图14 Fast R-CNN 的系统结构示意图 #### Faster R-CNN——RPN 一个个“不合理”的地方被改进了,现在的 Fast R-CNN 共享了卷积层的计算,几乎保持了备选窗口的长宽比(从 Selective Search 的区域提议到最后一层卷积层的备选窗口的映射是多对一映射,不能严格保持长宽比),全系统使用一个多目标的损失函数,可以端到端地进行训练,除了区域提议,检测一张图片用时0.3s。一切都那么完美,只有区域提议,还是使用非深度神经网络的算法,是不是这个地方也可以改进?答案是肯定的,这正是2015年发布的 Faster R-CNN 的主要改进点。当然从名字上可以看出,Faster R-CNN 又快了,秘诀就在于使用深度神经网络替换了 Selective Search 区域提议算法。由于 Fast R-CNN 的共享卷积层输出了质量很高的特征图谱,Faster R-CNN 便在其之上添加了 RPN(Region Proposal Network)如图15所示。 图15   Faster R-CNN网络结构示意图 图15 Faster R-CNN 网络结构示意图 区域提议网络主要是假设最后一层卷积层输出的特征图谱上的每一个点都有 k 个用于锚定的备选窗口,同时在特征图谱上添加卷积网络预测这 k 个锚定窗口的物体性(objectness)和窗口的大小,位置调整,这些结果结合锚定窗口,可以计算出真正用于预测的备选窗口集合,从而替代 Selective Search,如图16所示。 图16    RPN网络示意图 图16 RPN 网络示意图 如图17所示,为 Faster R-CNN 的物体检测示例图片。由于使用了共享的卷积层提取特征图谱,Faster R-CNN 使用 RPN 计算备选窗口的成本很低,所以在GPU上,全部计算用时0.2s左右,同时 PASCAL VOC test 2012 的 mAP 进一步提高,为83.8%。 图17    Faster R-CNN示例图片 图17 Faster R-CNN 示例图片 #### R-FCN——图像平移易变性 现在只剩下在 RoI Pooling 后的分类器网络的计算没有在备选窗口间进行共享了。前面的网络一般都分为两个部分:一个为特征提取部分,另一个为分类器部分。是什么原因造成这种结构呢?一方面是由于继承 R-CNN 网络的历史原因;另一方面,单纯地把分类器部分的卷积层移动到特征提取部分,只在最后使用 RoI Pooling 和单层全连接网络进行分类和边界框调整,实验结果不尽如人意。 微软亚洲研究院的研究员们发现了问题所在,并提出了解决方案。问题是简单的 RoI Pooling 加单层全连接网络的方案对备选窗口的偏移不是特别敏感。偏移前后的备选窗口共享有大部分的特征图谱区域,所以经过 RoI Pooling 和单层全连接网络后,两者区别不会太大,这也就是所谓的“图像平移不变性”,是图像识别任务需要具备的特性。而物体检测任务与图像识别任务不同,备选窗口一点点的偏移,就可能对检测指标造成一定的影响,所以物体检测任务追求的是“图像平移易变性”。 如何在 RoI Pooling 层后加入少量的卷积层来达到这一特性呢?R-FCN(Region-based Full Convolutional Network)使用了如图表 18所示的对位置敏感的得分图谱结构,在卷积网络得到的特征图谱之上,再进行一次卷积,得到 k^2 (C+1)个通道的特征图谱,然后在此特征图谱上做把备选窗口分为 k×k 个区域的 RoI Pooling,得到 k×k×(k2 (C+1))尺寸的张量,分别在每个类别(C代表类别数,C+1 包括了背景类别)的尺寸为 k×k×k2 的特征图谱的每一个通道上选择该通道所代表的位置的值,使用 k2 个通道上的 k2 个值进行表决,就得到了一个具有“图像平移易变性”的得分值。 图18 R-FCN位置敏感的得分图谱结构示意图 图18 R-FCN 位置敏感的得分图谱结构示意图 R-FCN 的整体网络结构如图19所示。由于只是在 RoI Pooling 层之后添加了一个表决层,所以 R-FCN 共享了绝大部分计算,导致 R-FCN 的计算速度较 Faster R-CNN 提高2.5倍到20倍,同时在 PASCAL VOC test 2012上的 mAP 得到进一步的提升,到达了88.4%。 图19 R-FCN网络结构示意图 图19 R-FCN 网络结构示意图 ### 计算机视觉的其他热门技术 除了以上介绍的图像识别、物体检测技术,像前不久何恺明在 Facebook 人工智能研究院提出的 Mask R-CNN 网络,就大幅提高了物体分割任务的精度。还有 Goodfellow 大神的名作——生成对抗网络,GAN,能生成高质量的数据,可以应用在生成图像、超分辨率等众多领域。技术在不断更新,越来越先进的网络被开发出来,随着人类对深度学习的了解不断加深,我们有理由相信这是一条通用人工智能的可行道路。“路漫漫其修远兮,吾将上下而求索”,不仅科研工作者要抱着一颗探索之心,普通的深度学习工程师也要不断补充学习,不断在工作中探求可行的解决方案,大家共勉之。希望通过本文简单的介绍,可以为渴望了解深度学习及计算机视觉领域的朋友打开一扇窗,得窥一二,如果需要在这方面继续深入下去的话,还是建议多读读经典论文。