李飞飞主讲斯坦福大学 CS231n 课程笔记
雷锋网 (公众号:雷锋网) AI 科技评论按: 本门课程是李飞飞在斯坦福大学讲授的计算视觉,他们团队主要通过机器学习和深度学习的方法来传授机器视觉的相关内容,本文作者吉林大学珠海学院的赵一帆进行了笔记方面的整理。笔者能力有限,如有出错,请及时告知。
图像分类的任务,这是一个计算机视觉中真正核心的任务,准确说它是研究图形处理的任务。
o 做图像分类时,分类器接受一些输入图像,并且已经确定分类或者标签的集合,比如说可爱的猫咪。
o 分类器的工作就是查看未分类的图片并且给它分配到其中一些固定的分类标签。
这对于计算机来说是一件很难的事情
o 事实上,当一个计算机看着这些图片的时候,它肯定没有一只猫的整体概念,计算机呈现图片的方式其实就是一大堆数字。图像可能只是一些像的像素,每个像素由红、绿、蓝三个数字表示,这很难从几千个巨大数列中提取猫的特性。
这个问题被称为语义鸿沟,对于猫的概念或者其它的标签,是赋给图像的一个语义标签,和这些计算机实际看到的像素值之间有着巨大的差距。
o 这是一个非常困难的问题。因为可以用很微小,很微妙的方式改变图片,这将导致像素网络整个发生变化。
· 比如,还是同样一只猫,如果这只猫恰好静坐着,但是把相机移动到另一边,那么这个巨大数字网络中的每一个小格子,每一个像素都会完全不同。但是,它依旧是同样一只猫。
同时,算法需要对这些变化鲁棒,但是,不仅仅只有视觉角度这一个问题。
o 在场景中也会有照明问题,无论猫咪出现在漆黑、昏暗的场景中,还是非常明亮、阳光照射的场景中,它始终都是一只猫。
o 对于这种情况算法也应该具有鲁棒性。
猫咪属于液态动物
o 而且猫咪可以由千奇百怪的姿势和位置。
o 对于不同的形变情形,算法也应该是鲁棒的。
当然还有遮掩的问题
o 可能仅仅有猫咪的一部分,比如说脸,甚至值看到尾巴尖儿从沙发垫下露出来
处理的时候还会有照片背景混乱的问题
o 可能一张图片的前面所显示的是一只猫会和照片背景很相似。
还有可能会有类内差异的问题
o 这张照片看上去是一些猫,但实际上,每只猫都会有视觉上的差异。
o 比如猫有不同形状、大小、颜色以及年龄。
这真的是一个很难的问题,但是大脑在处理这些的时候不觉得有什么难的,因为大脑里早就有处理这些东西的神经存在。
o 如果想让计算机程序同时处理这些事情,且不说那些小猫的图片,任何你想到的图像,都会是很难的算法问题。
o 尽管这些问题很难处理,奇迹的是目前已经有效的算法可以处理这些事情。
o 这些算法不仅仅有效,而且在某些特定的情况下接近人脑处理,这些算法只用几百毫秒的时间,这是相当难以置信的技术。
对于图像分类会有哪些程序调用接口,如果可以写一个python模型接受一个图片作为参数,然后来一波神操作,最后返回这个图片上面,是只猫还是狗等等。
o 但是并没有什么直接了当的算法可以解决图像识别算法,如果在上算法课,排序、计算凸包或者信息加密技术算法,可以枚举出所有可能发生的步骤
o 但是当来解决识别对象的算法的时候,并没有什么简明了的算法可以直接完成这些识别。
尽管如此,人们还是做了很多尝试,尝试出一组编码的规则来识别不同的动物。
o 对于猫来说,猫有耳朵、眼睛、嘴巴、鼻子。根据Hubel和Wiesel的研究,边缘检测对视觉识别是十分重要的
o 所以可以尝试,计算出图像的边缘,然后把边、角各种形状分类好
· 比如说有三条线是相交的,那这就可能是一个角点,比如猫耳朵也有这样的角,诸如此类,可以写一些规则来识别这些猫。
o 但事实上,这种算法并不是很好
· 首先,是很容易出错的
· 其次,如果想对一种除了猫之外的对象进行分类,那就得从头来一次。
所以,基于此用数据驱动的方法
o 不写具体的分类规则来识别一只猫或鱼,取而代之的是,从网上抓取数据大量猫或者其他的图片数据集。
· 这种手机图片数据集的方法实际上也挺花时间的,但是好在已经有很多很高质量可用的图片数据集。
· 一旦有了数据集,训练机器来分类这些图片,机器会收集所有数据,用某种方式总结,然后生产一个模型总结出识别出这些不同类的对象的核心只是要素。
· 最后,用这个模型来识别新的图片来看看能不能识别。
o 所以,不仅仅只有一个函数输入图片,然后识别出它是一只猫。而是需要两个函数,一个是训练函数,这函数接收到图片和标签,然后输出模型;另一个是预测函数,接受一个模型,对图片种类进行预测。
本课程主要讨论神经网络还有卷积神经网络还有深度学习等等
o 但是这种数据驱动类的算法是比深度学习更广义的一种概念,他是十分有用的。
o 通过这种过程,对于一个简单的分类器,称之为最近邻,这种算法很想诚实的默者。
在训练机器的过程中,只单纯记录所有的训练数据。在图片预测的步骤,拿出一些新的图片去训练数据中,寻找于新图片最相似的,然后基于此来给出一个标签。
具体来说,比如一个叫做CIFAR-10的数据集
o 这是机器学习中很常用的一个测试数据集。数据集CIFAR-10会各处10个不同的类别。每个类别会给出5万张训练数据图和1万张测试图片
o 举个例子
· 这是在数据集上的最近邻分类器,在右边的大格里
· 最左边一列是CIFAR-10数据集的测试图片,在右边将训练图片进行分类的结果,并显示对应测试示例的最相似的训练图片。
· 可以看到,虽然他们不完全正确,但看起来还是比较相似的。
o 所以当选择最近邻用于这些图片,就能在训练集中找到最接近的示例。
有一个细节必须清楚
o 如果给出两张图片,该如何对他们进行比较?
o 如果要将测试图片与所有训练图片进行比较,将会有很多不同的选择来确定需要什么样的比较函数。
o 如上图片适用了距离,有时称之为曼哈顿距离。这是一个简单的比较图片的方法,只是对这些图片中的单个像素进行比较。
o 只取测试图像上的像素,用它减去训练图像对应像素的值,然后取绝对值,就得到这两幅图像这个像素的差别,将图像中所有像素的差值相加。
o 虽然这种比较图片的方法看起来有点笨,但有些时候却也有它的合理性。这也给了一个比较两幅图片的具体方法。
o 这个例子的两幅图像中,共有456处不同。
这里是最近邻分类器的完整Python代码
o 它非常简明,因为用了Numpy的向量运算
o 这是之前提到过的训练函数,将它运用于最近邻算法非常简单,只需要存储训练数据即可。
o 在测试的时候,将输入图像,然后使用距离函数,将测试图片与训练实例进行比较,然后再训练集中找到最相似的实例。
o 可以看到,使用这些向量化操作,只需要一两行Python代码就能实现。
o 这里还有写简单的问题
· 如果再训练集中有N个实例,训练和测试的过程可以有多块?
§ 因为训练并不需要任何事情,只需要储存数据,只是拷贝了一个指针,无论数据集有多大,那将是一个恒定的时间。
§ 但是在测试时,将数据集中N个训练实例,与测试图像进行对比,这是一个很慢的过程。
在实际中,最近邻算法到底表现如何?
o 所以画了这个图形,叫做最近邻分类器的决策区域。
o 训练集包含二维平面的这些点,点的颜色代表不同类型
o 可以发现最近邻分类器时根据相邻的点来切割空间并进行着色
o 但是这个分类器并非时最好的选择,可以饭先最近邻分类器的一些问题
· 其中一个就是图像中部集中了大多数绿点,但在中心却有一个黄点,黄色区域被分割成两块,也看到了其他地方相同的情况,绿点有一个近了蓝色区域,红点也有几个近了蓝色区域,这些点可能时噪声或者失真信号。
由这个动机出发,就产生了K-近邻算法
o 它不只是找出最近的点,还会做一些特殊动作,根据我们测得距离度量找到K个点,然后在这些相邻点中进行投票,然后这些票最多的近邻点预测出结果。
o 可以想象下更复杂的完成这个任务的方法,可以在距离上加权进行投票等等。但完成这个任务最简单的方法还是进行多数投票
o 这里用同样的数据集,使用K等于1、3、5的最近邻分类器
· 当k等于3时,可以看到绿色区域中的黄色噪点,不会再导致周围的区域分为黄色,由于使用多数投票的方法。
· 当K等于5时,蓝色和红色区域间的这些决策边界会变得更加平滑好看
o 所以当使用最近邻分类器的时候,总会给K赋一个比较大的值,这样hi使决策边界更加平滑,从而得到更好的结果
【学生提问】:
· 白色区域代表什么?
· 白色区域代表这个区域中没有获得K最近邻的投票,可以做一个大胆的假设将它归为某一个其他类别
思考计算机视觉时,再几个不同的观点之间,反复思考与验证时非常有用的
o 第一种观点是,在平面上的高维点的概念
o 另一个观点是具体图像的观察,因为图像的像素点允许把这些图像看作高维向量
。