cs231n-神经网络入门之路
图像分类
图像分类的过程:首先有现成的一堆标签,输入一张图片,计算机通过分类从标签集里选出一个标签给这张图片,
例子:如我们对一张小猫图片进行分类
需要注意的是,在计算机的眼里,图像并不是如人眼中所看到的那样,而是一个巨大的三维数组,如上图就是宽为248像素,高为400像素,然后还有rgb三个通道,所以就是一个[247,399,2]的一个数组,一共有247*400*3个数字,每个数字代表一个像素点,同时每个数字都是0~255的一个数值,0表示全黑,255表示全白。简单理解就是有三个不记厚度,长宽相等的平面,将一个像素看作一个单位大小的图片,每个像素在三个平面(rgb三个平面)上都有一个点,且在每个平面上对应的位置相同,由于颜色的显示是有rgb三原色组成,所以三个平面分别代表red,green,blue每个颜色的程度(0~255,0表示全黑,255表示全白),
三个平面组合起来就可以在一个像素上显示颜色,而这张图片宽为247,高为400,所以一共有247*400个像素的超小的图片(在这里简单看作一张小图片,因为将图片放大到一定倍数,一个像素也可能是一张纯色的图片),将他们拼接起来,就组成了这张小猫的图片。
图像识别的算法实现
那么图像的原理我们知道了,怎么写出一个可以识别图像并给他们标签使他们分类的算法呢?
聪明的人们从自身出发,决定让计算机学习小朋友认识图片的方法,先拿出大量的数据,并且给他们分好标签,写一个算法让计算机去学习,通过大量的数据计算机对每个类别外形有了一个辨别的基础,这时候这个算法就算是图像识别的初步了,我们此时也可以输入一张全新的,之前的那堆数据中没有的图片,来让这个算法识别,但一般来说只是简单的写一个算法并给些数据就结束的识别算法准确率都不太可观,所以就需要不断改良这个算法,使它的准确率不断其提高,这也是图像识别需要研究的内容,怎样能够提高对图像识别的准确率。那么,为什么计算机识别图像有这么大的困难呢?每张图片不都是数字吗?计算能力如此强大的计算机没办法得出每个图片直接的差异吗?原因如下。
- 视角变化(Viewpoint variation):同一个物体,摄像机可以从多个角度来展现。
- 大小变化(Scale variation):物体可视的大小通常是会变化的(不仅是在图片中,在真实世界中大小也是变化的)。
- 形变(Deformation):很多东西的形状并非一成不变,会有很大变化。
- 遮挡(Occlusion):目标物体可能被挡住。有时候只有物体的一小部分(可以小到几个像素)是可见的。
- 光照条件(Illumination conditions):在像素层面上,光照的影响非常大。
- 背景干扰(Background clutter):物体可能混入背景之中,使之难以被辨认。
- 类内差异(Intra-class variation):一类物体的个体之间的外形差异很大,比如椅子。这一类物体有许多不同的对象,每个都有自己的外形。
既然我们理解了图像分类算法的实现步骤,那么我们就开始一步步来实现吧!
第一步便是找来能让计算机学习的数据,我们称它为“训练集(training set)”,如cs231n课程中用到的cifar10数据集,它里面的训练集就是下面这样子:
分类好的图片(部分)
好的,那么我们现在有了数据,就可以开始算法部分了,算法所要实现的内容及流程大概如下:
- 输入:我们将训练集中的图像个数定义为N个,将标签总类定义为K个,输入这部分需要做的就是读入这些数据。
- 训练:这一步的任务是使用训练集来学习每个类到底长什么样。一般该步骤叫做训练分类器或者学习一个模型。
- 让分类器来预测它未曾见过的图像的分类标签,并以此来评价分类器的质量。我们会把分类器预测的标签和图像真正的分类标签对比。毫无疑问,分类器预测的分类标签和图像真正的分类标签如果一致,那就是好事,这样的情况越多越好。