学习内容是斯坦福大学的《面向计算机视觉的卷积神经网络》课程,课程代码cs231n,原文链接是Stanford University CS231n: Deep Learning for Computer Vision,同时知乎上有课程笔记的中文翻译贺完结!CS231n官方笔记授权翻译总集篇发布 - 知乎
写这个博客的主要原因是为了督促自己学完整个课程同时记录自己的学习路程,所以博客的内容大概会是我在看完课程笔记以及查阅资料之后一些自己的理解。由于我一个大一仔在这个方面几乎是一无所知,所以写的内容肯定会有错误以及理解不到位的地方,如果有大佬偶然看到了这个博客想要不吝赐教的话,十分感谢,热烈欢迎。
图像分类这篇笔记是cs231n课程笔记的第二篇,算是科普性的内容。笔记比较简单的介绍了图像分类的问题以及数据驱动的方法和流程,讲解了Nearest Neighbor分类器以及改进的K-Nearest Neighbor分类器,还对验证集、交叉验证集和超参数的概念做了介绍。在知乎的中文笔记里分了上下两部分,今天这篇博客先完成上,毕竟是第一次写,并不熟练。
图像分类,引用百度百科的定义,就是根据各自在图像信息中所反印的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。
这段长长的文字看起来晦涩难懂,让人对图像分类心生敬畏。实际上,图像分类就相当于让计算机做一个选择题,给计算机一张图片,同时给计算机ABC等选项(这些选项一般称作分类标签),每个选项对应着一个“这张图片里的物体是什么”的猜测,然后让计算机通过算法分析,再在这些选项中选一个出来反馈给我们。这就是计算机视觉图像分类要完成的主要任务。
看起来很简单,对吧?然而这却是计算机视觉领域最核心的问题之一,同时有着非常广泛的实际应用。
在这里举一个笔记中图像分类的例子:
在这张图片的分类过程中,计算机首先读取这张猫的照片,然后在算法的处理后,生成该图片属于集合 {cat, dog, hat, mug}(这四个选项是我们预先给定的)中各个标签的概率。在这里必须要提到的是,图片在计算机中是由多个矩阵组成的,是由数字组成的巨大的三维数组。在这张图片中,猫的图像大小是宽248像素,高400像素,有3个颜色通道,分别是红、绿和蓝(可以理解为把图片中的一个像素点分为三层,每一层对应一种颜色,将三层颜色叠在一起形成这个彩色的像素点,我们简称为“RGB”)。如此,该图像就包含了248X400X3=297600个数字,每个数字都是在范围0-255之间的整型,其中0表示全黑,255表示全白(注意,数组中的数字代表着亮度值)。
也许有人会想,从图片中认出一只猫有什么难的?对人来说当然很简单,毕竟人的眼睛从一堆感光细胞进化到现在的视觉系统已经花了几亿年,人的大脑里有着无比复杂的神经系统用来把收到的视觉信息转换成有用的信息。但对于才出现不久的计算机来说,还是有些吃力。不仅如此,以下这些因素,让计算机对图像的分类更加困难:
1、视角变换:一个物体可以从多个角度来观察。对于计算机来说,有可能换了一个角度,他就认不出原来的那个物体了。
2、大小变化:一个物体在不同的距离观察或大或小,同一类物体在现实生活中也有可能显示出不同的尺寸(比如说一百斤出头的我和几百斤重的奥尼尔)
3、形状变化:物体形状发生变化也会给计算机带来困惑。
4、遮挡:目标物体可能被挡住。有时候只有物体的一小部分(可以小到几个像素)是可见的。
5、光照条件:在像素层面上,光照的影响非常大,不同的亮度可能会让矩阵中的数字与之前截然不同。
6、背景干扰:物体可能混入背景之中,使之难以被辨认。有时候人都会被自然界动物的伪装所欺骗,更何况计算机。
7、类内差异:一类物体的个体之间的外形差异很大,比如椅子。这一类物体有许多不同的对象,每个都有自己的外形。
我们希望能够创造出一个足够好的模型,让它同人眼一样不受这些因素的干扰,仍然能正确的分辨出图像中的物体。
数据驱动方法可以理解为用我们已经给定的已有数据,去进行测试,解决测试中的问题。在我看来,我们高中所采用的题海战术也算是一种数据驱动方法。假定我们在复习时做了一千道题,这一千道题就是我们的已有数据。后来在考试时我们遇到了一个题目,发现这个题目和我们之前做过的有些题有异曲同工之妙,于是刷刷刷我们就把这道题写出来了,通过了测试。
在图像分类中也是一样,我们给计算机很多的数据,让计算机自己去学习。这里我们给出的数据叫做数据集,里面有多种类别的图片,每种类别的图片都会有很多张。每一张图片都会附带一个标签,表明它们的类别。
这里直接copy了笔记的内容,我觉得说的非常清楚
本课程的第一个具体算法,也称最近邻算法。简陋,准确率低,平时没人会实际使用它。不过我们要学习的不是算法本身,而是算法的思想,对我们大概了解图片分类原理有很大的帮助。
在笔记中,我们用到了一个cifar-10(CIFAR-10 and CIFAR-100 datasets)的数据集,数据集包含了60000张32X32的小图像。每张图像都有10种分类标签中的一种。这60000张图像被分为包含50000张图像的训练集和包含10000张图像的测试集。在下图中你可以看见10个类的10张随机图片。
在右图中,第一列是测试图像,然后第一列的每个测试图像右边是使用Nearest Neighbor算法从训练集中选出的10张最类似的图片。
在这个算法中,比较两个图片相似程度的方法非常简单:计算每个像素的数值差异,然后再将所有像素的差异加到一起。如图:(取其中一个颜色通道为例)
在这里我们会用带一个叫L1距离的东西:
首先,我们把代表图片的数组转换成一个一维数组,也就是一个向量(这个方法在以后还会用到很多次),然后作如下计算:
上式成为两个向量之间的L1距离。如果两张图片一模一样,那么L1值会很小,反之会非常大。除此之外,还有L2距离:
两种计算方式都能用来比较图片之间的像素差异,但分别适应不同的情况。L2对多个不太大的误差容忍度较高,但是对个别大的误差容忍度很低。
在此两个函数介绍完毕,那么继续介绍这个算法。我们把CIFAR-10的50000张图片(每种分类5000张)作为训练集,我们将余下的10000张作为测试集,让计算机来预测图片的类别,然后与我们标记好的 “标准答案(当然,计算机看不见)” 来对照,最后得出准确率。Nearest Neighbor算法将会拿着测试图片和训练集中每一张图片去比较,然后将它认为最相似的那个训练集图片的标签赋给这张测试图片,作为预测结果。
还是举个考试的例子。Nearest-Neighbor算法就相当于:下周考试,试卷上有10000道题目,每道题只有一种解题方法,而且总共只有十种解题方法。但是我由于沉迷打球,一直没有去复习。但是咱毕竟不能挂科啊,于是,我在学校打印店打了50000道模拟题,然后到了考场上(假设可以带资料)我就拼了命的翻,每做一题都要把那50000道题目都遍历一遍,找出我认为与考试题目最接近的一道题目,然后用那个题目对应的解题方法来解这个题,作为我们的答题结果。
相信看完刚才那个例子,再加上我加粗字体以及下划线的提示,有考试经验的同学立马会提出疑问:为什么只能死盯着最相似的那一道模拟题呢?为什么不能多找几道类似的题目比对比对呢?说不定这个出题老师坏得很,把题目伪装了一下来迷惑我们呢。
巧得很,对于Nearest-Neighbor算法,有人也提出了相应的疑问。为什么不能多找几张最相似的图片,然后在这几个之间比对以下呢?于是乎,K-Nearest-Neighbor出现了。这个算法在Nearest-Neighbor之上做了改进,在比对过程中,这个算法会找出K张最相似的训练集中的图片,然后在这几个图片中进行“投票”:那个种类对应的图片数量最多,就把那个种类作为这个测试图片的预测结果。在经过这样的处理之后,我们的分类算法在面对某些异常数据时,也能做出相对准确的判断。
上面示例展示了Nearest Neighbor分类器和5-Nearest Neighbor分类器的区别。例子使用了2维的点来表示(也可以当成上文所说的图片来看),分成3类(红、蓝和绿)。不同颜色区域代表的是使用L2距离的分类器的决策边界。对此,我的理解是在这张图片中,我们距离长度当做L2距离,假设我们在NN分类器中随便点一个点A作为测试数据,假定这个点在紫色区域内,那么我们可以看出,一定有一个紫色点B,离A的距离是相较于其他点最近的。也就是说B是A的最近邻点。所以根据我们的算法,B所对应的标签“紫色”就是计算机给出的A的预测结果。注意,5-NN(K==5)中也存在一些灰色区域,这些区域是因为近邻标签的最高票数相同导致的(比如:2个邻居是红色,2个邻居是蓝色,还有1个是绿色)。注意,这里的K值是可以改变的。
图像分类笔记(上)到这就结束了,剩下的内容包括NN和KNN的具体代码会在下一篇博客发上来。