CS231N-Lecture2 Image Classification Pipline

图片分类概述

一、概述

这一课标题是Image Classification Pip-line,大概就是讲了图片分类的整个框架流程。看完之后确实对于卷积网络底层是如何对图片进行分类的有了再进一步的认识,感觉又清晰了一些。

点击这里下载CS231N的所有课件PDF

  1. 图片是如何被分类的 图片分类用人类语言来描述大致就是将一个图片,通过某种方式,映射到一个标签上的过程。
  2. 图片分类的挑战 1) 语义层面 计算机只认识0和1,如何让计算机认识每张图片并进行分类,首要的就是把图片变成数字。 对于人类来说这为理解增加了难度。每张非黑白图片都会被转化程一个长 x 高 x 深的矩阵;例如一张300 * 100像素的图片,会转换成一个300 x 100 x 3的矩阵,作为分类器的输入,然后进一步通过数学计算,完成分类。 例子中的深度3表示表示彩色图片的色彩通道RGB。 2) 图片的明暗 这张图片中有两只猫,左边一只光线很暗,右边一只光线明亮。
    这里写图片描述 必须让分类器对像素的敏感程度做出相应理想的反应,才能完成图中两只猫的识别。 3) 物体的不同形态或姿势 图片里都是猫,但是姿势各异。需要调整分类器对不同的姿势做出理想的反应,并成功将图片分类为猫也是挑战之一。 4) 遮挡 对于人类来说,虽然被遮挡了,但是我们一眼可以确认图片里的是猫。对于分类器来说,这是一个巨大的挑战。 分类器需要要根据图片中仅有一些特征,做出正确的反应并分类图片。 5) 背景融合 背景颜色和猫咪的颜色相差无几,意味着每个像素的矩阵数值十分接近。分类器要成功从很相近的数值中分辨出图片中的猫同样是很艰巨的任务。 另外,对于其他生活中的实际例子来说,例如排序,我们可以写一个冒泡算法,但是对于图片分类这样抽象的问题,是没有固定的算法可言的。 我们需要用到分类器,以及之后会涉及的神经网络,卷积神经网络的支持,来完成这项任务。

二、分类方法

  1. K—NN分类
    • NN分类器 NN(Nearest Neighbors)分类通过计算目标与训练数据的距离来确定目标属于哪个分类的算法。 NN中有两种计算距离的方式; 课程中用python构建了一个简单的NN分类器: 这里写图片描述 红框中的代码就是在计算目标点与每一个训练数据的距离,并将最近的距离设置到Ypred中保存; NN分类器的弊端在于,测试的时候,效率很低。因为要将目标图片的每一行数据,和训练数据的所有行进行对比来计算最小距离。复杂度是线性上升的。 但是在图片分类任务中,我们最关心的是测试(应用)阶段的效率。因此后面会说到,不会用NN分类器来分类图片,而会使用在测试阶段效率很高的卷积网络来执行分类任务。
    • K-NN分类 K-NN分类和NN分类有点不同,NN分类中需要将目标图片的数据和所有训练数据进行对比,而K-NN中,只需要和临近的K个数据进行对比。 上图中,的NN classifier(中间的图片),在蓝色区域的左下角,有一小块的绿色区域,里面又一个绿色的点。这片区域被标成了绿色,是因为如果有任意点落在那个绿色区域里面,这个绿色的点将会是离这个点最近的点,因此这个落下的点会被标记成绿色。 KNN classifier(最右边图)中,如果设置了K为5,那么就不会出现中间那张图的情况。处于蓝色区域中的绿色点将被忽略。因为如果有点落在那个绿色点的旁边,分类器将会取临近5个点来计算最终结果,因为,其他4个蓝色点的权重将会超过1个绿色点,最后这个区域将被标记成蓝色。 在这里要纠正一下,对于NN和KNN的理解在多次看视频之后有了改变。NN应该可以说是K值无限大的时候,所以计算了目标相对于所有训练数据的距离,而KNN只计算指定的K个点的距离。 因此,KNN相对于NN会更有效。
    • 不会使用KNN来分类图片 KNN是基于距离来投票计算最终分类的,这有个问题,也就是下图中展示的问题。 图中的最左边的是原图,第二张图片将人物左移了,第三张遮住了某些区域,第四张调暗了光线。但是后三张图片每一张和原图的的L2距离是一样的,因此根本无法判断这些图片有什么区别。
  2. Linear Classification 线性分类器采用Parametric方式来分类图片;其的原理大致如下: 构建一个方法,这个方法用图片作为输入,并且输出对于每个类型的预测分数。理想情况下,分数越高的预测类型,就应该是目标图片的类型。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dcLLUtSc-1587400432637)(http://img.blog.csdn.net/20170516180956459?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVpc2VqaXVodWNoZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)] 图中,猫的图片是一个32 x 32 x 3的输入,function f通过将W作用在所有的输入数据上,然后输出10个最终分数,这10个分数对应即将预测的10个类型。 简单来书,这个方法就是将32 x 32 x 33072个数字,转换成一个有3072个数字的列向量,然后映射成最后的10个预测分数。 最后的10个预测分数中,我们希望目标图片所属的那个类型的分数高,而其他9个分数都低。比如如果图片是猫,那么猫这个类型的分数将高于其他所有类型的分数。 这个模型的关键在于调整W的值来获取最终更准确的预测分数。 这个模型还应该加上b(bias)才完整。 这里说到,如果训练数据中大多数是猫的图片,那么最后猫的模型中,b会略高于其他类的模型。因为整个分类器会倾向于判断猫的图片,高于其他类型的b会让猫这个类型的预测结果更容易高于其他类型。 下面是一个使用4个像素图片作为输入的例子。 输入图片有四个像素,在这里这个图片是应该是一张黑白图片,课件上的这张图片有些不合理,因为输入的向量中只有4个像素,没有深度的信息。这4个像素被转换成一个列向量,每个数字是每个像素的0-255的数值。这是Input x。 假设我们有3个类型需要预测,分别是猫,狗,以及船。因此对于每个类型,都要有相应的Weight,所以Weight是一个3 x 4的矩阵。 另外,每个类型都有一个b(bias),所以最后还有一个有3个数字的列向量b。 通过将x和Weightdot product之后,再加上b,会得到3个最终的预测分数,对应三个类型。 图中,猫的分数是-96.8,狗的分数是437.9,船的分数是43.95。但是原图是猫,因此这个预测分数是很糟糕的,需要调整Weightb来使猫这个分数高于其他两个类型的分数。下一讲会涉及到loss function,用于调整W和b。 总的来说,在Linear Classification中,我们要做的就是不断调整W和b,让最终的目标类型的预测分数高于其他类型即可。 每一个预测分数,都是图片中所有像素点的值的加权和。另一种说法是,lc做的就是在不同空间上,累加图片的像素值。 lc所做的事情,最终可以归纳成一种总结模板的过程。它将训练数据中出现最多的情况,归纳总结成一个大致通用的模板。 上图中,课程的作者Andrej把训练之后的分类器的Weight的每一行(Weight的每一行是一个拥有3072个数字的向量,其实就是一张32 x 32 x 3的图片转换之后的向量),反过来转换成一张图片。 上图底部,第一张图片是飞机的模板。为什么是蓝色的呢?因为分类器在看到飞机的训练图片的时候,在蓝色的像素上,有大量的正的Weight权重,换句话说,就是飞机的训练图片中有大量的蓝色像素,那么分类器就会将这个蓝色的像素的值加权然后相加,最后就形成模板中这样的蓝色区域。 再例如,后面的青蛙的模板。绿色的像素就有正的权重,而其他颜色在青蛙的分类器中,有较低的,或者0,或者负数的权重。 以此类推。 比较有趣的是,在汽车和马的模板中,看起来比较怪异。马的模板貌似有左右两个头,汽车的看的不是很清楚,大致来说汽车的模板中貌似有一面镜子,汽车的车头朝向了不同的方向。 造成这个现象的原因是因为训练数据中汽车和马的朝向各不相同,有向左的,有向右的,有向前又有向后的,所以造成了这种现象。 这个分类器太简单了,以至于没有办法对上述的朝向问题做出很好的反应,之后的CNN将更加强大,对于这样的问题有很好的解决方式。 来看看另一种对于Linear Classifier的解读。 图中模拟的是一个3072维的空间,在这个空间里面,图片就是一个点(因为图片就是3072维的缘故吧~不知道对不对)。 在这个空间里,每个分类器就是一个划过这个空间的梯度(gradients),也就是图中的每条直线。这些直线上,就是分类器预测出来的每个从负到正的分数在某种方向上排列之后形成的梯度(#这里的解释不是很明白,需要再体会一下#)。 用car那条红色的直线为例。这条直线是Wb作用于汽车图片之后,所有为0的预测分数的集合。也就是说这条直线中,所有的预测分数都是0。之后,红色直线上的箭头,指明了一个方向,沿着这个方向,汽车分类器将更多的渲染出与汽车相关的像素,产出汽车类型更高的预测分数。 这里的三条直线,都是类似的情况。 在之后使用optimizer之后,我们可以看到这三条直线不断调整自己的方位,尝试去将自己所属的类型和其他类型更好的分开。比如汽车分类器就会尝试将汽车与其他的类型分开。 这里Andrej提出了一个问题: 什么类型的数据,会让线性分类器很难分辨? 下面是一些答案。
    • 再引用一下上面那个图。
    想象一下,如果有一个类型在这个图的中心位置,而另外国有的类型处于这第一个类型的四周,围成了一个圈的话,那么线性分类器就无法将这些类型很好的分开了。(仅靠直线不可能将一个围成圈的几个类型完全分开)
    • 另外一种很难分辨的情况是,如果先用飞机的一张原图训练一个分类器,然后在测试的时候,将这张图片的像素反转。虽然轮廓上来说还是一架飞机,但是由于颜色完全反转了,分类器会觉得这并不是一架飞机而给飞机这个类型给出很低的预测分数,导致分类失败。
    • 黑白的图片对于线性分类器来说是灾难。因为lc是根据颜色的加权和作预测基础的。如果改成黑白,那么只能通过轮廓,细节,纹理来判断这是什么东西,对于lc来说这做不到。
    • 再进一步考虑的话,由于线性分类器是对图片的像素做文章,因此,所有在像素上有歧义的图片都会令线性分类器很头疼。什么叫像素上有歧义呢?假设我们有一朵向日葵的图片,另一张是一个小孩子的脸在一朵向日葵的中心,相当于向日葵的叶子围在小孩子脸周围,这样的图片就很麻烦。叶子的像素很接近,小孩的脸的像素(颜色,明暗)和原本的向日葵的中心如果也很接近,那么分类器只能靠猜了。
  3. Loss Function Loss function用数学的方法来衡量我们设定的一组Wb对于预测结果有多好,或者有多坏,是用来量化损失(loss)的方法。 只有损失被量化了,之后才能通过optimizer来不断调整Wb,最后使损失最小化。

三、总结

分类器,以及最终的Convolution Neural Network要做的事情,就是将上图中图片对应的类型的预测分数提高,将其他无关的类型的预测分数降低。

分类器,以及最终的Convolution Neural Network的原理,就是将图片转换成向量,然后通过不同的手段,使用loss functionoptimizer,来找到最好的一组Wb,使预测分数最优。