目录
Abstract
1 Introduction
1.1 Realted Fields
1.2 Recognition - An Overview
1.3 Areas of Applicaiton(Examples)
1.4 Organization of a Computer Vision System
1.5 Historical Note
1.6 From Development to Implementation
1.7 Reading
1.8 Exercises
我们首先勾勒出一些基本的特征提取方法,然后介绍那些臭名昭着的深度神经网络。接下来,我们继续进行基于梯度直方图的特征提取和匹配 - 它们构建了许多任务的基础,例如目标实例检测和图像检索。然后,我们引入基于滑动窗口技术的目标检测,例如,适用于人脸和行人检测。它遵循图像处理技术的处理 - 分割和形态处理 - 以及形状识别技术。我们概述了基本的跟踪方法 - 针对区域和运动的物体。我们以对视频监控,车载视觉系统和遥感的调查结尾。这些方法在Matlab中进行了探索,并提供了足够的代码片段来立即探索所有这些概念; Python代码部分提供。可以在没有任何特定先决条件的情况下遵循注释,但是懂得线性代数,信号处理和模式识别的基本知识具有很大的优势。
先决条件推荐 基本编程技巧; 对于写很多代码的热情
建议 基本统计模式识别,基本线性代数,基本信号处理
计算机视觉是解释图像内容的领域。 它关注整个图像的分类,例如在对上传到互联网(Facebook,Instagram)的照片进行分类的系统中。 或者计算机视觉涉及识别图像中的物体,例如人脸检测或汽车牌照(Facebook,GoogleStreetView)。 或者它涉及图像方面的检测,例如生物医学图像中的癌症检测。
Origin 计算机视觉最初是在20世纪70年代成立的人工智能领域的子学科。创建的目标是创建一个与人类视觉系统具有相同感知能力的系统 - 您的眼睛和大部分大脑。人类视觉系统可以轻松地解释任何场景:它可以完美地区分数千个类别,并且它可以在几百毫秒的时间跨度内找到场景中的对象;它可以轻松地在几种类型的识别过程之间切换,具有灵活性和快速性,其复杂性和动态性尚未得到很好的理解。很快就发现,这个目标相当雄心勃勃。
相反,计算机视觉专注于一系列具体的识别挑战,将在1.2节中介绍。 这些挑战通常可以以不同方式实施,每种实施方案都有优点和缺点。 在过去的几十年中,已经创建了许多应用程序(第1.3节),其中一些实现的任务现在开始优于人类观察者 - 例如人脸识别,字母识别或通过交通移动的能力(自动驾驶车辆)。 尽管全视觉系统的最初目标还没有实现,但这本身就令人震惊。计算机视觉认为今天是自己的领域。
Frontier 尽管计算机视觉已经发展了近50年,但它仍然被认为是一个前沿。现代计算机视觉的成功不是真正新颖算法的结果,而是计算机速度和内存增加的结果。特别是形状识别 - 尽管其简单的声音任务 - 仍然没有被正确理解。尽管谷歌有一个可以识别数千个类的系统,但系统偶尔会失败,人们可能想知道为了实现完美的识别过程需要发明什么其他算法。如果不发明这些算法,那么家用机器人可能总是会产生一些神经拉伸错误,例如将洗衣篮误认为是垃圾桶,将微波炉与玻璃柜混淆等等。因此,尽管已经取得了所有进展,但它仍然需要创新的算法。
特别是在过去几年中,计算机视觉通过使用所谓的深度学习算法获得了新的推动力,通过该算法可以对相当大的图像集进行分类。 这就是为什么我们在经典方法快速热身之后,相对较早地处理该主题(第5节)的原因。 然后,我们继续使用在深度学习算法到来之前流行的方法,即特征提取和匹配(第6节和第7节)。 后来,我们继续传统技术(第9节),我们还提到了计算机视觉最神秘挑战的方法,即形状识别(第11节)。
有几个领域与计算机视觉有关,其中两个领域密切相关,即图像处理和机器视觉; 事实上,这两个领域与计算机视觉在一定程度上重叠,他们的名字有时被同义使用。 尽管没有商定的定义和区别,但在这里我们试图区分它们:
图像处理涉及图像的变换或其他操纵,目的是强调图像的某些方面,例如, 对比度增强,或提取边缘,斑点等低级特征; 相比之下,计算机视觉更关注更高级别的特征提取及其用于识别目的的解释。
机器视觉致力于应用一些列技术和方法,在工业应用中提供基于图像的自动检测,过程控制和机器人引导。机器视觉系统通常具有3个特征:
1)在均匀背景下看到物体,这表示“受控情况”。
2)目标具有有限的结构可变性,有时只需要识别一个目标对象。
3)3D中的确切方向是感兴趣的。
一个例子是在收费站检测和读取汽车牌照,这是一种相对受控的情况。 相比之下,计算机视觉系统通常处理具有较大可变性的物体和位于不同背景下的物体。 GoogleStreetView中的汽车牌照检测是一个具有有限可变性但背景不同的目标对象的示例。
还有两个与Computer Vision重叠的领域:
模式识别(机器学习)是分类的艺术。 要建立一个良好的计算机视觉系统,它需要大量的分类方法知识。 有时它甚至是计算机视觉系统中更重要的部分,如图像分类的情况,到目前为止所谓的深度神经网络已经产生了最佳的分类精度(第5节)。 显然,我们不能在本课程中深入分类,我们只会指出如何使用一些分类器。
计算机图形学有时被视为计算机视觉的一部分。 计算机图形学的目标是尽可能紧凑有效地表示对象和场景; 但是没有任何形式的承认。
我们首先解释三个主要的识别过程及其挑战。 然后我们提到其他识别目标。
分类(Classification):将一个对象或场景分配给一个类(类别),例如“car”,“apple”,“beach scene”等。在实践中,几个类之间的区分是可控的,但是,我们希望区分的类数越多,处理类内可变性就越具有挑战性。 很难表达同一类中的实例之间的结构变化 - 想想椅子的外观有多么不同。
识别(Identification):识别对象的单个实例。 原则上,这个过程是一种特定类型的分类(如上所述),其中的挑战是区分最终微妙的结构变异性。 示例:人脸识别,指纹识别,特定车辆的识别。
检测(Detection):搜索图像以查找特定对象类,或者搜索对象实例,或者针对特定条件对其进行测试; 计算对象出现次数。 挑战是创建一个有效的搜索,无论其大小如何,都可以找到对象:对象是否覆盖了整个图像? 或者它很小,因此难以检测? 示例:人脸检测,自动道路收费系统中的车辆检测,医学图像中可能的异常细胞或组织的检测。
在文献中,术语对象识别通常意味着这些过程的某种组合 - 有时它只代表这三个过程中的一个。
以下是一些其他常见的识别任务:
运动分析(Motion Analysis):研究物体的运动。 人们可能仅对检测目标运动感兴趣,这称为跟踪。 或者可以识别特定的运动,在这种情况下它是识别任务。
检索(Retrieval):这里我们按照一定的标准对图像进行排序。 举个?,我们将图像传递给系统,例如白玫瑰,系统返回20个最相似的图像,比如说有玫瑰,郁金香,向日葵等。排序是根据某种“比较”确定的,类似于分类或识别过程中的比较。
姿态估计(Pose Estimation):确定特定对象相对于摄像机的确切位置或方向。例如:帮助机器人手臂从装配线中的传送带检索物体或从箱子中拾取零件。
以下列表仅列出了迄今为止应用计算机视觉技术的地方; 该列表还包含图像处理和机器视觉的应用,因为这些领域是相关的:
医学成像(Medical Imaging):记录术前和术中图像; 随着年龄的增长,对人的大脑形态进行长期研究;肿瘤检测,内脏器官大小和形状的测量;染色体分析;血细胞计数。
自动驾驶安全(Automotive safety):交通标志识别,在雷达或激光雷达等主动视觉技术不能正常工作的情况下,检测街道上行人等意外障碍物。
监控(Surveillance):监测入侵者,分析公路交通,监测溺水受害者的水池。
手势识别(Gesture recognition):识别符号级语音的手势,识别用于人机交互或电话会议的手势。
指纹识别和生物识别(Fingerprint recognition and biometrics):自动访问身份验证以及取证应用程序。
可视身份验证(Visual authentication):当家庭成员坐在网络摄像头前时自动将其记录到家庭计算机上。
机器人(Robotics):识别和解释场景中的物体,通过视觉反馈运动控制和执行。
制图(Cartography):从照片制作地图,合成天气图。
雷达成像(Radar Imaging):目标探测和识别,直升机和飞机着陆的指导,遥控飞行器(RPV),导弹和卫星的视觉提示。
遥感(Remote sensing):卫星图像的多光谱图像分析,天气预报,城市,农业和海洋环境的分类和监测。
机器检查(Machine Inspection):零件的缺陷和故障检查:使用立体视觉进行质量保证的快速零件检查,使用专门的照明来测量飞机机翼或车身零件的公差; 或使用X射线视觉寻找钢铸件的缺陷; 装配线上的零件识别。
以下就是通常可以通过图像处理技术和模式识别方法解决的具体任务,这就是为什么它们通常仅在计算机视觉教科书中略微提及:
光学字符识别(OCR):识别打印或手写文本图像中的字符,通常用于以更易于编辑或索引(例如ASCII)的格式编码文本。 示例:邮件分拣(在信件上阅读手写邮政编码),自动车牌识别(ANPR),标签阅读,超市产品计费,银行支票处理。
二维码读取(2D Code Reading):读取二维码,如数据矩阵和二维码。
计算机视觉系统的组成在很大程度上取决于其应用,因此不存在一般的识别方案。 以下列表介绍了用于描述识别过程中阶段的术语; 它们并不严格按照这种顺序出现,并且不能总是清楚地区分它们。 前两个阶段显然属于图像处理领域; 以下三个阶段(3-5)代表计算机视觉的“meat”; 最后阶段(6)基本上对应于模式识别。
1)图像采集(Image Acquisition):是由一些传感器测量外部信号并产生相应的值图(一个代表该信号的图像)的过程。 存在不同类型的相机和测量(附录A)。
2)图像处理(Image Processing):是对原始图像的早期操作,以便稍后提取的特征类型。 这可以是例如对比度增强,以确保可以检测到相关信息; 生成尺度空间表示以在局部适当的尺度上增强图像结构。
3)特征提取(Feature Extraction):是从图像中提取特定类型的信息(特征)的过程,以便于以后的分类过程。 这些特征的典型例子是线条,边缘,斑点,角落等; 更复杂的特征可能与纹理,形状或运动有关。
4)检测/分割(Detection/Segmentation):是决定图像的哪些图像点或区域与进一步处理相关的过程。 例如:选择一组特定的兴趣点; 包含特定感兴趣对象的一个或多个图像区域的分割。
5)高级处理(High-level Processing):在该步骤,输入通常是一小组数据,例如一组点或假定包含特定对象的图像区域。 其余处理涉及,例如:
- 验证数据是否满足基于模型和特定应用的假设。
- 估计应用程序特定参数,例如对象姿势或对象大小。
- 图像识别:将检测到的对象分类为不同的类别。
- 图像配准:比较和组合同一对象的两个不同视图。
6)决策(Decision Making):做出应用程序所需的最终决定,例如:
- 自动检查应用程序的通过/失败
- 识别应用程序中的匹配/不匹配
- 在医疗,军事,安全和识别应用中进一步进行人体审查的标志
在计算机视觉的早期阶段,识别范式被制定为一个过程,从2D图像逐步和精心地重建场景的空间3D布局。这种三维重建过程通常分为低级别,中级和高级视觉过程,这一区分部分反映在上述阶段列表中(第1.4节)。它的灵感来自于我们人类将世界视为3D空间。多年来,很明显这种范式过于详尽和过于复杂。目前,重点在于用“暴力”方法解决识别任务,例如使用深度神经网络或基于图像块的广泛匹配的方法,其中诸如边缘检测或图像分割的经典技术几乎不起作用。因此,一些经典技术已经进入背景。这也反映在最近的教科书中。例如,Forsyth和Ponce的书遵循经典范式的结构(低/中/高级视觉),但边缘检测和图像分割的处理相当边缘; Szeliski的图书机构以最近的特征匹配方法为中心,但仍然包含大量的图像分割材料。但是,没有一本书包含最新的,令人叹为观止的发展,即使用深度神经网络进行图像分类。因此,我们将首先从该主题开始(第5节)。
通常,人们首先用更高级的语言开发系统,例如Matlab,Python,GNU Octave,R,Scilab等。一旦这个测试阶段完成,就可以将系统“翻译”成更低级的语言。 例如,如果需要,可以使应用程序以实时方式运行,例如Cython,C ++甚至C语言。
Matlab(http://www.mathworks.com/)非常便于原型设计(研究),因为它的“配置”非常紧凑,因为它可能具有最大的功能和命令集。 它提供了一个功能非常丰富的图像处理工具箱,但是可以在没有工具箱的情况下进行管理 - 我们提供了大量的代码示例。 几年以来,Matlab还拥有一个不断扩大范围的计算机视觉工具箱。 使用doc或help来阅读它提供的功能和命令。 通过从doc图像开始熟悉图像处理工具箱非常有用。
Octave,R(https://www.gnu.org/software/octave/,https://www.r-project.org/)出于训练的目的,当然也可以使用R和Octave等软件包。 其中大多数函数与Matlab中的名称相同。
Python(https://www.python.org/)可能是目前最流行的语言。 Python中的编码比Matlab中的编写稍微复杂一些,并且不能提供Matlab具有的图像显示灵活性。 Python的优点是,它可以相对容易地与其他适合移动应用程序开发的编程语言对接,而对于Matlab来说,这非常困难。 在Python中,初始化过程更加明确,数据类型(整数,浮点等)的处理也更复杂一些,这些问题使得Python代码比Matlab更长。
Python有点令人困惑的是,有不同的发行版提供不同的编辑功能。 如果一个人想要从Matlab直接过渡到Python,那么Anaconda / Spyder发行版可能是最简单的一个:它提供了我们在这个脚本中引入的许多函数。
我特别推荐安装Python版本3.5.1,这个版本还包括名为tensorflow和keras的库(模块)以及模块skimage。 Tensorflow是用于训练DeepNeuralNetworks的最热门软件包(见第5节)。 Keras是相应的高级接口。 较新的Python版本3.6还不包括Tensorflow (2017年8月)。
如果你想在这些任何高级语言之间切换,则可以使用以下摘要:http://mathesaurus.sourceforge.net/matlab-python-xref.pdf。
在下文中,我们提到了被认为是较低级别的编程语言,并且在初始化和维护变量时需要更加小心。 如果您处理视频,那么您可能需要将耗时的例程实现为其中一种语言。
Cython:本质上与Python相同,但提供了使用类似于C(C ++)的表示法更详细地指定某些变量和过程。 额外的符号可以通过几个因素加速代码。 Cython包含在Anaconda发行版中。 (不要与CPython混淆,后者是规范的Python实现)。
C ++,C:为了实现C或其变体(即C ++),我们只是指出在Web上存在具有已实现的计算机视觉例程的C库。 最突出的一个叫做wiki OpenCV,请参阅https://opencv.org/。这些库提供的许多例程也可以通过导入它们轻松访问。 通常,您需要单独安装这些库。
Sonka, M., Hlavac, V., and Boyle, R. (2008). Image Processing, Analysis, and Machine Vision. Thomson, Toronto, CA.主题介绍很广,但方法部分简洁。包含许多,精确制定的算法。纹理表示上的穷举。稍微面向经典方法,因此不能找到所有更新的方法。由三位作者写的,但读起来就像只有一个人写的一样。
Szeliski, R. (2011). Computer Vision: Algorithms and Applications. Springer.对图形和图像处理等许多主题进行细致而视觉上的美丽曝光; 强大的解释基于特征的识别和对齐,以及仅使用基本方程的复杂图像分割方法。 紧凑但仍然可以理解的附录解释矩阵操作和优化方法。
Forsyth, D. and Ponce, J. (2010). Computer Vision - A Modern Approach. Pearson, 2nd edition.详尽的关于目标对象,图像和纹理分类和检索的主题,以及处理分类器的许多实用技巧。 跟踪同样详尽。 强大的解释目标检测和更简单的图像分割方法。 比Szeliski略微更加实践。 仅书写用特征方法解释图像检索和图像分类。
Davies, E. R. (2012). Computer and Machine Vision. Elsevier Academic Press, Oxford.是机器视觉导向(而不是计算机视觉导向)。 包含解释每种方法的优缺点的大量摘要。 比任何其他书总结不同的兴趣点检测器都要好。 非常彻底地对待视频监控和自动驾驶视觉。 只书写包含自动驾驶视觉。
Prince, S. (2012). Computer Vision: Models, Learning, and Inference. Computer Vision: Models, Learn- ing, and Inference. Cambridge University Press. 也是一些计算机视觉主题的美丽曝光; 非常统计导向,从模式识别书开始。 包含一些主题的最新评论。
Wikipedia 始终善于查找定义,表述和不同观点。 甚至教科书有时也会指出维基百科页面。 但维基百科的“多样性” - 源于不同作者的贡献 - 也是它的缺点:很难从个别文章(网站)中理解整个主题。 维基百科毕竟是为它设计的:一本百科全书。 因此,教科书仍然是不可替代的。
此外,由于不同的作者在维基百科上工作,可能会发生一个作者的直观和清晰的插图被另一个作者的不那么直观的替换。 因此,我建议将一个良好的插图复制/粘贴到单词编辑器(例如winword)中以保留它。
以下两个研究问题应有助于加深我们对1.2节中介绍的识别过程的理解。
1.谷歌提供了独立程序“Google Goggles”,它是对象识别的一个例证。 它模仿哪些确切的识别过程?
2.存在对零售中的自动结账通道执行对象识别的系统。 您如何看待在这样的系统中怎样解决个人识别的过程?
3.自动驾驶汽车(例如特斯拉汽车)特别使用哪种类型的过程?
希望本文能帮助你在计算机视觉领域走得更远,学习得更加深入!