2017 CS231n学习笔记(二)----图像分类(Image Classification)

video:https://study.163.com/course/courseMain.htm?courseId=1004697005
slides:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture2.pdf
course notes:http://cs231n.github.io/
文章所有内容来自Stanford university 课程 CS231n 2017 spring

2017 CS231n学习笔记(二)----图像分类(Image Classification)_第1张图片

图像分类(Image Classification) 是计算机视觉中的核心任务,即输入一张图片,给出这张图片的标签。但问题是图像分类具有巨大的语义鸿沟(Semantic Gap),即计算机所看到的图片仅仅是一些范围在[0, 255]之间的数字,需要将其转化为对应的标签。图像分类同样有很多的挑战,如下:

  • 角度变化(Viewpoint variation) :当相机移动后,一张图片所有的像素将发生变化。
  • 光照(Illumination) : 不同光照下的同一物体的图片是不一样的。
  • 变形(Deformation) :不同的对象可能具有不同的姿势,比如一只猫可能是趴着、站着或躺着,这样的图片都是不同的。
  • Occlusion :识别的对象被其他物体遮挡。
  • 背景杂乱(Background Clutter) :同一对象具有不同的复杂背景。
  • 类内变化(Intraclass variation) :同一对象,比如猫,可能具有不同颜色的毛发、条纹等。

一个图像分类器:

def classify_image(image):
	# 一些神奇的操作
	return class_label

不像平常写的算法,如排序,图像分类器无法通过探寻所有特定的路径,得到一个确切的类标签。没有一个明显的方式去硬编码一个算法来识别猫或其它类别。但是研究者也作出了一些尝试。
2017 CS231n学习笔记(二)----图像分类(Image Classification)_第2张图片

通过找到边缘或者角落信息来总结一类图像的特征,然后来识别图像中的对象。但是这样的方法有致命的两个缺点:一个是 图片分类器容易出错,得不到正确的结果;第二个是 ,该方法无法移植到其他对象识别应用上去,一旦用于其他对象识别,该方法不在适用,需要重新设计特征选取的方法。

数据驱动方法(Data-Driven Approach)

由于图像分类无法使用传统算法如排序算法这样的硬编码模式,所以需要使用数据驱动方法,即:

  1. 收集一个拥有图像和对应标签的数据集
  2. 使用机器学习方法去训练一个分类器
  3. 在新的图像上评估分类器的性能

以最邻近算法为例,首先训练一个分类器模型来记忆所有的数据和标签:

def train(image, labels):
	# 机器学习算法
	return model

然后使用训练好的模型来预测新图像与训练图像最相似的标签:

def predict(model, test_images):
	# Use model to predict labels
	return test_labels

2017 CS231n学习笔记(二)----图像分类(Image Classification)_第3张图片
如何衡量两个图像之间的距离呢?这里以L1 距离(曼哈顿距离)为例,即:
d 1 ( I 1 , I 2 ) = ∑ p ∣ I 1 p − I 2 p ∣ d_1(I_1, I_2) = \sum_p \left\lvert I_1^p - I_2^p\right\rvert d1(I1,I2)=pI1pI2p
2017 CS231n学习笔记(二)----图像分类(Image Classification)_第4张图片
上图是一个最邻近算法的简单实现。可以看出,该算法在训练时的时间复杂度为O(1),在预测时的时间复杂度为O(N)。但实际应用中,我们希望在训练时花费相对长的时间,在预测时用最短的时间。

2017 CS231n学习笔记(二)----图像分类(Image Classification)_第5张图片
上图是二维空间中画出决策边界后的结果,可以看到,有些点的位置被分类的不够理想,如绿色部分的中间出现一个黄色点,其实它应该属于绿色。还有其中一个绿色的点插入到了蓝色区域,其实它属于蓝色。针对这样的问题,提出使用KNN的方式。

2017 CS231n学习笔记(二)----图像分类(Image Classification)_第6张图片
从K个最近的点中选择主要点的类别,其中K=1就是最邻近算法。如上图所示,当K=3或5时,边界变得更佳光滑,而且之前的K=1时的异常点问题被有效的解决了。

2017 CS231n学习笔记(二)----图像分类(Image Classification)_第7张图片
除了使用L1 distance,还可以L2 distance(欧几里得距离)。由上图可以看出,L1距离会坐标依赖,即L1距离会依赖数据的坐标。下面链接是一个KNN的Demo:
http://vision.stanford.edu/teaching/cs231n-demos/knn/

超参选择

针对前面的KNN问题,如何选择 K 和距离度量方式?这些都叫超参,即选择算法中这些我们设置的而不是学习的参数。
2017 CS231n学习笔记(二)----图像分类(Image Classification)_第8张图片
如上图所示,我们有很多方法进行超参的选择,最简单的方式是选择那些在所有数据上表现最好的超参,显然是不合理的。其次将数据分为train 和 test set,选择在test set上表现最好的超参,但是无法评价算法在新的数据上的表现。最好的方式,是将数据分为train、validation、test set,即在validation集上评估多个算法的性能,然后选择最优的算法在test set上进行测试。
2017 CS231n学习笔记(二)----图像分类(Image Classification)_第9张图片
还有一种方法是交叉验证(cross validation),即将数据分为几个folds,然后将每一个fold作为验证集,最后平均所有结果。
2017 CS231n学习笔记(二)----图像分类(Image Classification)_第10张图片
最终你会得到如上图中图表结果,横轴是K的选择,纵轴是5次交叉验证的结果。
KNN似乎是有分类的效果的,但它在对图像问题不会被使用,主要是因为:

  1. 在测试的时候速度非常慢。
  2. 对于像素的距离度量没有包含任何信息。如下面三张变化后的图片与原图片的距离其实是相同的。
    2017 CS231n学习笔记(二)----图像分类(Image Classification)_第11张图片
  3. 纬度灾难:假如有四个类,在一维空间中,只需要4个点可以表示所有情况。在二维空间中,需要 4 2 4^2 42 个点表示所有情况,在三维空间中,需要 4 3 4^3 43 个点表示所有情况。
    2017 CS231n学习笔记(二)----图像分类(Image Classification)_第12张图片

线性分类(Linear Classification)

线性分类其实是之后主讲的CNN的基础。
2017 CS231n学习笔记(二)----图像分类(Image Classification)_第13张图片
通过一个参数矩阵 W W W乘以数据矩阵 X X X再加上偏置 b b b 得到预测结果,即:
f ( x , W ) = W X + b f(x, W) = WX + b f(x,W)=WX+b
2017 CS231n学习笔记(二)----图像分类(Image Classification)_第14张图片

线性分类究竟在做些什么, 如何解释线性分类器呢?

其实参数 W 的每一行对应的是一个类别的分类器,改变 W 的一行相当于向不同方向旋转在像素空间的线,改变 b 相当于对这条线做平移。

  • 可以把 W 看成是模板匹配,W 的每一行相当于对应类的一个模板,通过内积的形式去找到最高的分数(对应的类别)。
  • 也可以认为线性分类仍然在求解最邻近,只是这次不是将测试图像与训练集做内积,而是与 W 的一行做内积,以内积来作为类模板与测试图片的距离,而不是使用 L1 或 L2 distance。

你可能感兴趣的:(2017,CS231n课程学习笔记)