- 计算机视觉实战:基于TensorFlow 2
- (法)本杰明·普朗什 艾略特·安德烈斯
- 5002字
- 2025-02-25 10:28:53
1.3 计算机视觉简史
温故而知新。
——孔子
为了更好地理解计算机视觉的现状和当前的挑战,建议快速地看一看它是如何诞生以及在过去的几十年里是如何发展的。
1.3.1 迈出成功的第一步
科学家们一直梦想着研发包括视觉智能在内的人工智能技术。计算机视觉的起步就是由这个想法驱动的。
低估感知任务
在人工智能(Artificial Intelligence,AI)研究领域,计算机视觉作为一个专门的领域早在20世纪60年代就开始被研究人员所关注了。象征主义哲学认为下棋和其他纯粹的智力活动是人类智力的缩影,而这些研究人员深受象征主义哲学的影响,低估了低等动物功能(如感知能力)的复杂性。这些研究人员是如何相信他们能够通过1966年的一个夏季项目再现人类感知的呢?这是计算机视觉界的一个著名轶事。
马文·明斯基(Marvin Minsky)是最早提出基于感知构建人工智能系统的方法的研究人员之一(见“Steps toward artificial intelligence”,Proceedings of the IRE,1961)。他认为,利用诸如模式识别、学习、规划和归纳等较基础的功能,有可能制造出能够解决各种各样问题的机器。然而,这一理论直到20世纪80年代才得到适当的探索。在1984年的“Locomotion,Vision,and Intelligence”一文中,汉斯·莫拉韦克(Hans Moravec)指出,神经系统在进化的过程中逐步发展到能够处理感知任务(人类大脑中超过30%的部分用于处理视觉任务!)。
正如他所指出的,即使计算机在算术方面表现很出色,它们也无法与我们的感知能力竞争。从这个意义上,利用计算机编程来解决纯粹的智力任务(例如下棋)并不一定有助于开发一般意义上的智能系统或与人类智能相关的智能系统。
人工选定局部特征
受人类感知的启发,计算机视觉的基本机制很简单,而且自早期以来并没有太大的发展——其思想始终是首先从原始像素中提取有意义的特征,然后将这些特征与已知的标记特征进行匹配,以实现图像识别。
在计算机视觉中,特征是从与当前任务相关的数据中提取出来的一段信息(通常用数学表示为一个一维或二维向量)。特征可以是图像中的一些关键点、特定的边缘、可识别的色块等。它们应当很容易从新的图像中获得,并包含进一步识别图像所需的信息。
过去,研究人员常常提出越来越复杂的特征。边缘和线的提取首先用于场景的基本几何理解或字符识别。然后,纹理和照明信息也被考虑在内,形成了早期的对象分类器。
20世纪90年代,基于统计分析(如主成分分析(Principal Component Analysis,PCA))的特征,首次成功地应用于复杂的识别问题,如人脸分类。一个经典的例子是马修·特克(Matthew Turk)和亚历克斯·彭特兰(Alex Pentland)提出的特征脸(Eigenface)算法(Eigenfaces for Recognition,MIT Press,1991)。在给定人脸图像数据库的情况下,通过PCA可以计算人脸图像的均值和特征向量/图像(也称为特征量/图)。从理论上讲,这一组特征图像可以被线性地组合起来,以重建原始数据集的人脸或实现更多处理。换句话说,每个人脸图像都可以通过特征图像的加权来近似(参见图1-8)。这意味着可以简单地通过每个特征图像的重建权值列表来定义特定的人脸。因此,对一幅新的人脸图像进行分类,只需将其分解为特征图像,获得其权值向量,并与已知人脸的向量进行比较:

图1-8 将一幅人像图像分解为均值图像和特征图像的加权和(平均图像和特征图像是在一个更大的人脸数据集上计算所得的)
另一种出现于20世纪90年代末并彻底改变了该领域的方法是尺度不变特征变换(Scale Invariant Feature Transform,SIFT)。正如其名称所表明的,这个方法由David Lowe提出(见论文“Distinctive Image Features from Scale-Invariant Keypoints”,Elsevier),它通过一组对尺度和方向变化具有鲁棒性的特征来表示可视对象。简单地说,该方法在图像中寻找一些关键点(搜索其梯度中的不连续点),在每个关键点周围提取一个图块,并为每个关键点计算一个特征向量(例如,图块或其梯度中的值的直方图)。然后,可以使用图像的局部特征及其对应的关键点来匹配其他图像中的类似视觉元素。在图1-9中,我们使用OpenCV将SIFT方法应用于图像(https://docs.opencv.org/3.1.0/da/df5/tutorial_py_sift_intro.html)。对于每一个局部化的关键点,圆的半径表示特征计算所考虑的图块的大小,直线表示特征的方向(即邻域梯度的主方向)。

图1-9 从给定图像中提取的SIFT关键点(使用OpenCV)
随着时间的推移,研究人员逐渐开发出了更先进的算法——使用更具鲁棒性的算法提取关键点或者计算并结合有区别的特征——但是整个过程(从一张图像中提取特征,并将其与其他图像的特征进行比较)基本是相同的。
添加一些机器学习技术
然而,研究人员很快就发现,在识别任务中,提取鲁棒的、有区别的特征只是完成了一半的工作。例如,来自同一类的不同元素可能看起来非常不同(例如不同外观的狗),它们只共享一小部分公共特征。因此,不同于图像匹配任务,更高阶的语义分类等问题不能只通过比较被查询图像与已标记图像的像素特征来解决(如果必须完成每一幅图像同一个大型标签数据集比较,那么考虑到处理时长,这个过程也可以作为次优解决方案)。
这就是机器学习的切入点。20世纪90年代随着越来越多的研究人员试图解决图像分类问题,更多基于特征的统计方法开始出现。支持向量机(Support Vector Machine,SVM)由Vladimir Vapnik和Corinna Cortes标准化,长期以来是学习从复杂结构(如图像)到简单标签(如类)映射的默认解决方案。
给定一组图像特征及其二值标签(例如,猫或非猫,如图1-10所示),可以对SVM进行优化,使其能够根据提取的特征训练将一个类与另一个类分离的函数。一旦得到了这个函数,只需将它应用到未知图像的特征向量上,就可以将图像映射到这两个类中的一个(后来研究人员提出SVM也可以扩展到多个类)。在图1-10中,我们训练SVM回归一个线性函数,让该函数根据从两类图像中提取的特征(在本例中,特征是个二值向量)将两个类分离开来。

图1-10 支持向量机回归的线性函数(请注意,如果基于内核技巧,支持向量机还可以为不同的类找到非线性的解决方案)
还有许多其他机器学习算法在过去几年也被计算机视觉研究人员所采用,比如随机森林、词袋模型、贝叶斯模型,当然还有神经网络。
[1] 见论文“Support-vector networks”(Springer, 1995)。
1.3.2 深度学习的兴起
那么,神经网络是如何称霸计算机视觉,成为今天我们熟知的深度学习的呢?本节给出了一些答案,详细介绍了这个强大工具的技术发展史。
早期尝试和失败
令人惊讶的是,人工神经网络甚至出现在现代计算机视觉之前。它们的发展是一个典型的发明时间过早的例子。
感知机的兴起和衰落
20世纪50年代,Frank Rosenblatt提出了感知机(perceptron),这是一种机器学习算法,灵感来自神经元和第一个神经网络的底层块。通过适当的学习过程,这种方法能够识别字母。然而,这种炒作是短暂的。Marvin Minsky(人工智能之父之一)和Seymor Papert很快证明了感知机无法学习像XOR这样简单的函数(异或函数,给定两个二进制输入值,如果有且只有1个输入值为1,则返回1,否则返回0)。在今天,这对我们来说是非常容易理解的——因为当时的感知机是用线性函数建模的,而XOR是非线性函数——但在当时,在很多年里它阻碍了研究人员做进一步的研究。
太大以至于无法扩展
直到20世纪70年代末80年代初,神经网络才重新引起人们的注意。几篇研究论文介绍了如何使用相当简单的反向传播机制来训练具有多层感知机的神经网络。我们将在下一节中详细介绍,这个训练通过计算网络误差并通过各个感知机层进行反向传播来使用导数更新它们的参数。不久之后,第一个卷积神经网络(Convolutional Neural Network,CNN),即当前主流识别方法的鼻祖,被开发出来并应用于手写字符的识别,取得了一定的成功。
但是,这些方法计算量大,无法扩展应用到更大的问题。取而代之,研究人员采用了更轻量级的机器学习方法,如支持向量机,于是神经网络的应用又停滞了十几年。那么,是什么让它们重新回到人们的视野并发展成了如今的深度学习呢?
回归的理由
回归的原因有两个,根源于互联网和硬件性能的爆炸式发展。
互联网:数据科学的新黄金国
互联网不仅是一场通信革命,它也深刻地改变了数据科学。通过将图片和内容上传到网上,科学家们分享图片和内容变得更加容易,并逐步导致了用于实验和基准测试的公共数据集的产生。此外,不仅是研究人员,很快全世界的每个人都开始以指数级的速度在网上添加新的内容,共享图片、视频等。这开启了大数据和数据科学的黄金时代,而互联网就成了其中新的黄金国。
仅仅通过为不断在网上发表的内容添加索引,就可以了解到图像和视频数据集已经达到了之前从未想象过的大小,从Caltech-101(1万幅图片,由Li Fei-Fei等发布于2003年,Elsevier)到ImageNet(1400多万图片,由Jia Deng及其他人发布于2009年,IEEE)或Youtube-8M(800多万视频,由Sami Abu-El-Haija等发布于2016年,Google)。即使是公司和政府也很快认识到收集和发布数据集以促进其特定领域创新的众多优势(例如,英国政府发布的用于视频监控的i-LIDS数据集,以及由脸书和微软等赞助的用于图像字幕的COCO数据集)。
随着如此多的可用数据覆盖了如此多的用例,打开了新的大门(数据饥渴类型的算法,即需要大量训练样本才能成功收敛的算法终于可以成功应用了),也提出了新的挑战(例如,如何有效地处理所有这些信息)。
比以往任何时候都更强大
幸运的是,由于互联网的蓬勃发展,计算能力也随之蓬勃发展。硬件变得越来越便宜,速度也越来越快,这似乎遵循了著名的摩尔定律(即处理器速度每两年将会翻一番——这是近40年来的真理,尽管现在观察到的增长有所减速)。随着计算机运行速度的加快,它们的设计也变得更加适合计算机视觉。这要感谢电子游戏。
图形处理单元(Graphics Processing Unit,GPU)是一种计算机组件,即一种专门用来处理运行3D游戏所需运算的芯片。GPU被优化用来生成或处理图像,并行化这些繁重的矩阵运算。尽管第一个GPU是在20世纪80年代构想出来的,但它们确是在2000年才变得便宜和流行的。
2007年,主要的GPU设计公司之一英伟达(NVIDIA)发布了第一个CUDA版本,这是一种允许开发者直接为兼容的GPU编程的编程语言。不久之后,类似的语言OpenCL也出现了。有了这些新工具,人们开始利用GPU的力量来完成新的任务,比如机器学习和计算机视觉。
深度学习或人工神经网络的重塑
数据饥渴、计算密集型的算法终于有了施展身手的条件。伴随着大数据和云计算,深度学习突然变得无处不在。
是什么让学习变得有深度?
事实上,“深度学习”这个术语早在20世纪80年代就已经被创造出来了,那时神经网络第一次以两三层神经元堆叠起来的形式重新出现。与早期的、更简单的解决方案不同,深度学习重组了更深层次的神经网络,即具有多个隐藏层的网络——在输入和输出之间设置了额外的层。每一层处理它的输入并将结果传递给下一层,所有这些层都经过训练以提取越来越抽象的信息。例如,神经网络的第一层将学会对图像的基本特征(如边缘、线条或颜色梯度)做出反应;下一层将学习使用这些线索来提取更高级的特征;以此类推,直到最后一层,该层将推断出所需的输出(例如预测的类或检测结果)。
然而,当Geoff Hinton和他的同事提出了一个有效的解决方案来训练这些更深层次的模型,每次一层,直至达到期望的深度时,深度学习才真正开始被使用。
深度学习的时代
随着神经网络的研究再次回到正轨,深度学习技术开始蓬勃发展,直到2012年取得重大突破才最终让它真正崭露头角。自从ImageNet发布以来,每年都会组织一场竞赛(ImageNet大型视觉识别挑战(ImageNet Large Scale Visual Recognition Challenge,ILSVRC),http://image-net.org/challenges/LSVRC/),研究人员可以提交他们最新的分类算法,并将它们在ImageNet上的性能表现与其他算法进行比较。2010年和2011年的获胜方案分类误差分别为28%和26%,采用了SIFT特征和SVM等传统概念。然后到了2012年,一个新的研究团队将识别误差降低到了惊人的16%,将其他所有参赛者远远甩在了后面。
Alex Krizhevsky、Ilya Sutskever和Geoff Hinton在他们描述这一成果的论文“Imagenet Classification with Deep Convolutional Neural Networks”(NIPS,2012)中提出了现代识别方法的基础。他们构想了一个8层的神经网络(后来命名为AlexNet),包括几个卷积层和其他现代组件,如dropout和修正线性激活单元(Rectified Linear activation Unit,ReLU),这些都将在第3章中详细介绍,因为它们已成为计算机视觉的核心。更重要的是,他们使用CUDA来实现他们的方法,这样它就可以在GPU上运行,最终使得在合理的时间内,在像ImageNet这么大的数据集上迭代完成深度神经网络训练成为可能。
同年,Google演示了云计算的技术进步如何应用于计算机视觉。使用从YouTube视频中提取的1000万张随机图像数据集,教一个神经网络识别包含猫的图像,并将1.6万多台机器的训练过程并行化,最终将准确率提高了一倍。
由此开启了我们目前所处的深度学习时代。每个人都参与进来,提出了越来越深的模型、更先进的训练方案,以及更轻量级的适用便携设备的解决方案。这是一个令人兴奋的时代,因为深度学习解决方案变得越有效,就有越多的人试图将它们应用到新的应用和领域。
通过本书,我们希望传递一些当前的热情,并提供一个有关现代方法和细节的概述,以便于你制定深度学习解决方案。
[1] 见论文“The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain”(American Psychological Association, 1958)。
[2] 见论文“A Fast Learning Algorithm for Deep Belief Nets”(MIT Press,2006)。