计算机视觉实战:基于TensorFlow 2
上QQ阅读APP看书,第一时间看更新

1.2 广义计算机视觉

计算机视觉如今应用广泛、无处不在,以至于不同的专家对它的定义可能会有很大的不同。在本节中,我们将全面介绍计算机视觉,突出它的应用领域和面临的挑战。

1.2.1 计算机视觉概述

计算机视觉很难定义,因为它处于几个研究和开发领域的交叉领域,比如计算机科学(算法、数据处理和图形)、物理学(光学和传感器)、数学(微积分和信息论)和生物学(视觉刺激和神经处理)。从本质上讲,计算机视觉可以概括为从数字图像中自动提取信息。

当涉及视觉时,我们的大脑会创造奇迹。我们能够破译眼睛不断捕捉到的视觉刺激,能够立即分辨出一个物体与另一个物体的区别,能够认出只见过一面的人的脸,等等,这些能力都是令人难以置信的。对于计算机来说,图像只是像素块,是红绿蓝值的矩阵,没有其他意义。

计算机视觉的目标是教会计算机如何理解这些像素,就像人类(和其他生物)那样,甚至比人类做得更好。的确,自深度学习兴起以来,计算机视觉已经有了长足的进步,它已经开始在一些任务(比如人脸识别或手写文字识别)上表现出了超越人类的性能。

在大型IT公司的推动下,研究社区变得异常活跃,数据和视觉传感器的可用性也越来越高,越来越多雄心勃勃的问题正在被解决——基于视觉的自动驾驶导航、基于内容的图像和视频检索、自动注释和增强等。对于专家和新手来说,这确实是一个激动人心的时代。

1.2.2 主要任务及其应用

每天都有基于计算机视觉的新产品出现(例如,工业控制系统、交互式智能手机应用程序或监控系统),它们涵盖了广泛的任务领域。本节将讨论其中主要的任务,详细介绍它们在现实问题中的应用。

内容识别

计算机视觉的一个核心目标是理解图像,也就是说,从像素中提取有意义的语义信息(比如图像中的对象及其位置和数量)。这个一般性问题可以分为几个子领域,大致包含目标分类、目标识别、目标检测和定位、目标和实例分割以及姿态估计。

目标分类

目标分类(或图像分类)是在预定义的集合中为图像分配适当的标签(或类别)的任务,如图1-1所示。

图1-1 应用于图像集的人和汽车标签分类器示例

早在2012年,它已经作为深度卷积神经网络应用于计算机视觉的第一个成功案例而闻名(将在本章后面介绍)。自那时起,这个领域就开始飞速发展,目前已经在各类特定用例中都表现出了超越人类能力的性能(一个著名的例子是犬种的分类——深度学习方法在识别人类“最好的朋友”的区分特征方面非常有效)。

常见的应用包括文本数字化(使用字符识别)和图像数据库的自动注释。

在第4章中,我们将介绍先进的分类方法及其对计算机视觉的影响。

目标识别

目标分类方法是从预定义的集合中分配标签,而目标识别(或实例分类)方法则学习去识别某一类的特定实例。

例如,可以配置目标分类工具来返回包含人脸的图像,而目标识别方法则聚焦于人脸的特征来识别某个人,并在其他图像中识别他们(即在所有图像中识别每个人脸,如图1-2所示)。

图1-2 应用于肖像的识别器示例

因此,可以将目标识别看作对数据集进行聚类的过程,通常会用到一些数据集分析概念(将在第6章介绍)。

目标检测和定位

另一项任务是检测图像中的特定元素。它通常应用于监控应用甚至先进的相机应用中的面部检测、医学上的癌细胞检测、工业厂房中受损部件的检测等。

检测通常是进一步计算的第一步,提供更小的图像块以分别进行分析(例如,为面部识别剪裁图像中某人的面部,或为增强现实应用提供一个围绕对象的边界框来评估其姿态),如图1-3所示。

图1-3 汽车检测器示例,它返回候选物的边界框

先进的解决方案将在第5章中详细介绍。

目标和实例分割

分割可以看作一种更高级的检测类型。与简单地为识别的元素提供边界框不同,分割方法返回掩膜,用于标记属于特定类或某一类的特定实例的所有像素(参见图1-4)。这使得任务变得更加复杂,实际上,这也是计算机视觉方面少数几个深度神经网络与人类表现仍相去甚远的领域之一(人类大脑在绘制视觉元素的精确边界或轮廓方面确实非常高效)。目标分割和实例分割如图1-4所示。

图1-4 汽车的目标分割方法与实例分割方法结果对比

在图1-4中,目标分割算法为所有属于汽车类的像素返回一个掩膜,而实例分割算法为它识别的每个汽车实例返回一个不同的掩膜。这对于机器人或智能汽车来说是一项关键任务,这样它们就可以理解周围的环境(例如,识别车辆前方的所有元素)。它也可用于医学图像,在医学扫描中,精确分割不同的组织可以辅助更快地诊断和更便捷地可视化(比如给每个器官赋予不同的颜色或清除视图中的干扰)。这将在第6章结合自主驾驶应用实例进行讲解。

姿态估计

根据目标任务的不同,姿态估计可能有不同的含义。对于刚体,姿态估计通常是指物体在三维空间中相对于摄像机的位置和方向的估计。这对机器人特别有用,这样它们就可以与环境进行交互(挑选对象、避免碰撞等)。它也经常被用在增强现实中,在物体上叠加3D信息。

对于非刚体元素,姿态估计也可以表示其子部件相对位置的估计。更具体地说,当将人视为非刚性目标时,典型的应用是对人的姿势(站立、坐着、跑步等)的识别或手语理解。这些不同的情况如图1-5所示。

图1-5 刚体和非刚体姿态估计示例

在这两种情况下,对于全部或部分元素,算法的任务是根据它们在图像中的2D表示,评估它们在3D世界中相对于摄像机的实际位置和方向。

视频分析

计算机视觉不仅适用于单个图像,也适用于视频。视频流有时需要逐帧分析,而有些任务要求你将图像序列作为一个整体来考虑其在时间上的一致性(这是第8章的主题之一)。

实例跟踪

一些关于视频流的任务可以通过单独研究每一帧来完成(无记忆地),但是更有效的方法要么考虑以前图像的推论来指导新图像的处理,要么将完整的图像序列作为预测的输入。跟踪,即在视频流中定位特定元素,就是这种任务的一个很好的例子。

通过对每一帧进行检测和识别,可以逐帧跟踪。然而,使用以前的结果来对实例的运动进行建模以部分预测它们在未来帧中的位置会更加有效。因此,运动连续性是这里的一个关键词,尽管它并不总是成立(例如对于快速移动的对象)。

动作识别

另一方面,动作识别则属于只能通过一系列图像来解决的任务。就像当单词被分开和无序时无法理解句子含义一样,如果不学习连续的图像序列,那么也不能识别动作(参见图1-6)。

图1-6 贝拉克·奥巴马是在挥手、指着什么人、驱赶蚊子,还是做别的什么?只有完整的帧序列才能帮助标记这个动作识别动作

识别动作意味着在预定义的集合中识别特定的动作(例如,人类的动作——跳舞、游泳、画正方形或画圆)。应用范围包括监视(如检测异常或可疑的行为)和人机交互(如手势控制设备)等。

既然目标识别可以分为目标分类、检测、分割等,那么动作识别同样如此(动作分类、检测等)。

运动估计

有些方法不试图识别移动的元素,而是专注于估算视频中捕获的实际速度或轨迹。相对于所表现的场景,评估相机本身的运动也是很常见的。运动估计在娱乐行业特别有用,例如,为了应用视觉效果或者在电视流(如体育广播)中覆盖3D信息而进行动作捕捉。

图片内容感知

除了分析其内容外,计算机视觉方法也可以用来改善图像本身。越来越多的基础图像处理工具(如用于图像去噪的低通滤波器)正在被更智能的方法所取代,这些方法能够利用图像内容的先验知识来提高其视觉质量。例如,如果一个方法知道了一只鸟通常是什么样子的,它就可以根据这些知识用鸟类图像中的相干像素代替噪声像素。这个概念适用于任何类型的图像恢复,无论是去噪、去模糊,还是分辨率增强(超分辨率,如图1-7所示)等。

图1-7 图像超分辨率传统方法与深度学习方法的比较(注意在第二张图片中细节是多么清晰)

一些摄影或艺术应用程序也使用了内容感知算法,比如智能人像或智能美容模式,旨在增强模特的一些特征,再比如智能删除/编辑工具,可以用一些连贯的背景来替代不需要的元素以去除它们。

在第6章以及第7章中,我们将演示如何建立和使用这样的生成方法。

场景重建

最后,虽然我们不会在本书中处理场景重建问题,但还是要简单介绍一下。场景重建的任务是根据给定的一个或多个图像恢复场景的三维几何形状。一个简单的例子是基于人类视觉的立体匹配。它是在一个场景的两个不同视点的图像中寻找对应元素的过程,从而得出每个可视化元素之间的距离。更先进的方法是获取多个图像并将其内容匹配在一起,从而获得目标场景的三维模型。这可以应用于物体、人、建筑物等的三维扫描。