2.1 计算机视觉
人工智能是人类一个非常美好的梦想。我们想制造出一种机器,使它能跟人一样具有一定对外界事物感知的能力,如看见世界。
在20世纪50年代,数学家图灵提出判断机器是否具有人工智能的标准:图灵测试。即把机器放在一个房间,人类测试员在另一个房间,人跟机器聊天,测试员事先不知道另一个房间里是人还是机器。经过聊天,如果测试员不能确定跟他聊天的是人还是机器,那么图灵测试就通过了,也就是说这个机器具有与人一样的感知能力。
但是从图灵测试提出来开始到21世纪初,50多年时间有无数科学家提出很多机器学习的算法,试图让计算机具有与人一样的智力水平,但直到2006年深度学习算法成功,才带来了一丝解决的希望。
2.1.1 人类视觉的启迪
20世纪50年代Torsten Wiesel和David Hubel两位神经科学家在猫和猴子身上进行了一项非常有名的关于动物视觉的实验,如图2-1所示。
图2-1 脑部连入电极的猫
实验中猫的头被固定,视野只能落在电视屏幕上,电视屏幕上会不时出现小光点或者划过小光条,而一条导线直接连入猫的脑部区域视觉皮层位置。
Torsten Wiesel和David Hubel通过实验发现,当有小光点出现在屏幕上时,猫视觉皮层的一部分区域被激活,随着不同光点的闪现,不同脑部视觉神经区域被激活。而当屏幕上出现光条时,则有更多的神经细胞被激活,区域也更为丰富。他们的研究还发现,有些脑部视觉细胞对于明暗对比非常敏感,对视野中光亮的方向(不是位置)和光亮移动的方向具有选择性。
从Torsten Wiesel和David Hubel做这个有名的脑部视觉神经实验之后,视觉神经科学(见图2-2)正式被人们确立。目前为止,关于视觉神经的几个被广为接受的观点如下:
图2-2 视觉神经科学
·脑对视觉信息的处理是分层级的,低级脑区可能处理对比度、边缘之类,高级脑区处理更抽象,如人脸、房子、运动的物体等。信息被一层一层抽取出来,往上传递,进行处理。
·大脑对视觉信息的处理也是并行的,不同的脑区提取出不同信息、干不同的活,有的负责处理这个物体是什么,有的负责处理这个物体是怎么动的。
·脑区之间存在着广泛的联系,同时高级脑区对低级脑区也有很多反馈投射。
·信息的处理普遍受自上而下和自下而上的注意和调控。
进一步的研究发现,当一个特定物体出现在视野的任意一个范围时,某些脑部的视觉神经元会一直处于固定的活跃状态。对视觉神经科学的解释就是人类的视觉辨识是从视网膜到脑皮层,神经系统从识别细微特征演变为目标识别。计算机如果拥有这么一个“脑皮层”,能够对信号进行转换,那么计算机依照人类拥有视觉就会变为现实。
2.1.2 计算机视觉的难点和人工神经网络
尽管通过大量研究,人类视觉的秘密正在逐渐被揭开,但是相同的经验用于计算机上却并非易事。计算机识别往往有严格的限制和规格,即使同一张图片或者场景,一旦光线或者观察角度发生变化,计算机的判别也会发生变化。对于计算机来说,识别两个独立的物体容易,但是在不同的场景下识别同一个物体则困难得多。
因此,计算机视觉(见图2-3)核心在于如何忽略同一个物体内部的差异而强化不同物体之间的区别,即同一个物体相似而不同的物体之间有很大的差别。
图2-3 计算机视觉
长期以来,对于解决计算机视觉识别问题,大量的研究人员投入了很多精力,贡献了很多不同的算法和解决方案。经过不懈努力和无数尝试,最终计算机视觉研究人员发现,使用人工神经网络解决计算机视觉问题是最好的解决办法。
人工神经网络在20世纪60年代就萌芽了,但是限于当时的计算机硬件资源,其理论只能停留在简单的模型之上,无法全面发展和验证。
随着人们对人工神经网络的进一步研究,20世纪80年代人工神经网络具有里程碑意义的理论基础“反射传播算法”的发明,将其原本非常复杂的链式法则拆解为一个个独立的只有前后关系的连接层,并按各自的权重分配错误更新。这种方法使得人工神经网络从繁重的、几乎不可能解决的样本计算中脱离出来,通过学习已有的数据统计规律对未定位的事件进行预测。
随着研究的进一步深入,2006年,多伦多大学的Geoffrey Hinton在深层神经网络的训练上取得了突破。他首次证明了使用更多隐藏层和更多神经元的人工神经网络具有更好的学习能力。其基本原理就是使用具有一定分布规律的数据保证神经网络模型初始化,再使用监督数据在初始化好的网络上进行计算,使用反向传播对神经元进行优化调整。
2.1.3 深度学习
深度学习在很多学术领域,比非深度学习算法往往有20%~30%成绩的提高。很多大公司也逐渐开始出手投资这种算法,并成立自己的深度学习团队,其中投入最大的就是谷歌。2008年6月披露了谷歌脑项目;2014年1月谷歌收购DeepMind;2016年3月其开发的Alphago算法在围棋挑战赛中,战胜了韩国九段棋手李世石,证明深度学习设计出的算法可以战胜最强的人类选手。
在硬件方面,Nvidia最开始做显示芯片,但从2006年及2007年开始主推用GPU芯片进行通用计算,它特别适合深度学习中大量简单重复的计算量。目前很多人选择用Nvidia的CUDA工具包进行深度学习软件的开发。
微软从2012年开始,利用深度学习进行机器翻译和中文语音合成工作,其人工智能小娜背后就是一套自然语言处理和语音识别的数据算法。
百度在2013年宣布成立百度研究院,其中最重要的就是百度深度学习研究所,当时招募了著名科学家余凯博士。不过后来余凯离开百度,创立了另一家从事深度学习算法开发的公司地平线。
Facebook和Twitter也都各自进行了深度学习研究,其中Facebook携手纽约大学教授Yann Lecun,建立了自己的深度学习算法实验室,2015年10月,Facebook宣布开源其深度学习算法框架,即Torch框架;Twitter在2014年7月收购了Madbits,为用户提供高精度的图像检索服务。
2.1.4 前深度学习时代的计算机视觉
互联网巨头看重深度学习当然不是为了学术,主要是它能带来巨大的市场。那为什么在深度学习出来之前,传统算法没有达到深度学习的精度呢?
在深度学习算法出来之前,对于视觉算法来说,大致可以分为以下5个步骤:特征感知、图像预处理、特征提取、特征筛选、推理预测与识别。在早期的机器学习中,占优势的统计机器学习群体对特征是不大关心的。
我们认为,计算机视觉可以说是机器学习在视觉领域的应用,所以计算机视觉在采用这些机器学习方法的时候,不得不自己设计前面4个部分。
但对任何人来说这都是一个比较难的任务。传统的计算机识别方法把特征提取和分类器设计分开来做,然后在应用时再合在一起,如图2-4所示。如果输入是一个摩托车图像,那么首先要有一个特征表达或者特征提取的过程,然后把表达出来的特征放到学习算法中进行分类学习。
图2-4 传统识别过程
在过去20年中出现了不少优秀的特征算子,如最著名的一个是SIFT算子,即对尺度旋转保持不变的算子。它被广泛地应用在图像比对,特别是在structure from motion(运动恢复结构,sfm)这些应用中;另一个是HoG算子,它可以提取物体,比较鲁棒的物体边缘,在物体检测中扮演着重要的角色。
这些算子还包括Textons、Spin image、RIFT和GLOH,都是在深度学习诞生之前或者深度学习真正流行起来之前,占领视觉算法的主流。
2.1.5 仿生学角度看深度学习
如果不手动设计特征,不挑选分类器,那么有没有别的方案呢?能不能同时学习特征和分类器呢?即输入某一个模型的时候,只是输入图片,输出就是它自己的标签。图像的特征分类过程如图2-5所示,输入一个人的头像,出来的标签就是一个50维的向量(在50个人里识别),其中对应明星的向量是1,其他位置是0。
图2-5 图像的特征分类过程
这种设定符合人类脑科学的研究成果。
1981年诺贝尔医学生理学奖颁发给了David Hubel,一位神经生物学家。他的主要研究成果是发现了视觉系统信息处理机制,证明大脑的可视皮层是分级的。他认为人的视觉功能一个是抽象,一个是迭代。抽象就是把非常具体的形象的元素,即原始的光线像素等信息,抽象出来形成有意义的概念。这些有意义的概念又会往上迭代,变得更加抽象,是人可以感知到的抽象概念。
像素是没有抽象意义的,但人脑可以把这些像素连接成边缘,边缘相对像素来说就变成了比较抽象的概念;边缘进而形成球形,球形然后到气球,又是一个抽象的过程,大脑最终就知道看到的是一个气球。
图2-6所示为模拟人脑识别人脸的过程。从最开始的像素(pixels)到第二层的边缘(edges),再到人脸的部分(object parts),最后到整张人脸(object models),是一个抽象迭代的过程。
图2-6 模拟人脑识别人脸的过程
例如,看到图2-4中的摩托车,我们可能在脑子里就几微秒的时间,但是经过了大量的神经元抽象迭代。对计算机来说最开始看到的根本也不是摩托车,而是RGB图像三个通道上不同的数字。
特征或者视觉特征,就是把这些数值综合起来用统计或非统计的形式,把摩托车的部件或者整辆摩托车表现出来。深度学习在流行之前,大部分的设计图像特征就是基于此,即把一个区域内的像素级别的信息综合表现出来,利于后面的分类进行学习。
如果要完全模拟人脑,那么我们也要模拟抽象和递归迭代的过程,把信息从最细琐的像素级别,抽象到“种类”的概念,让人能够接受。
2.1.6 应用深度学习解决计算机视觉问题
受从前研究的启发,“带有卷积结构的深度神经网络(CNN)”被大量应用于计算机视觉之中。这是一种依照生物视觉的逐层分解算法,分配不同的层级对图像进行处理。例如,第一层检测物体的边缘、角点、尖锐或不平滑的区域,这一层几乎不包含语义信息;第二层基于第一层检测的结果进行组合,检测不同物体的位置、纹路、形状等,并将这些组合传递给下一层。以此类推,使得计算机和生物一样拥有视觉能力、辨识能力和精度。
因此,CNN的基本原理和基础被视为计算机视觉的首先解决方案,这就是深度学习的一个应用。除此之外,深度学习应用于解决计算机视觉的还有其他优点,主要表现如下:
·深度学习算法的通用性很强,在传统算法里面,需要针对不同的物体定制不同的算法。相比来看,基于深度学习的算法更加通用,如在传统CNN基础上发展起来的faster RCNN,在人脸、行人、一般物体检测任务上都可以取得非常好的效果。计算机视觉辨识图片如图2-7所示。
图2-7 计算机视觉辨识图片
·深度学习获得的特征(feature)有很强的迁移能力。特征迁移能力指的是在A任务上学习一些特征,在B任务上使用也可以获得非常好的效果。例如,在ImageNet(物体为主)上学习到的特征,在场景分类任务上也能取得非常好的效果。
·工程开发、优化、维护成本低。深度学习计算主要是卷积与矩阵相乘,针对这种计算优化,所有深度学习算法都可以提升性能。