首页 AI学术青年与开发者社区

【中文字幕】2017春季CS231n 斯坦福深度视觉识别课

开课时间:2017年11月10日
开课时长:讲座共有6个lecture,3个 Guest Talk,已完结。加入小组即可立即观看(完全免费):https://ai.yanxishe.com/page/groupDetail/19。
免费课 基础入门
现价: 免费
该课程已关闭

重点:图像分类

语义鸿沟:计算机不认识猫

数据驱动:数据集 训练 模型 识别

训练函数 预测函数

最近邻算法

曼哈顿距离:绝对值相加

K-最近邻算法:根据距离选K个点投票决定颜色,K越大边缘越平滑

白色区域:没有最近的点(超过阈值))

[展开全文]

“语义鸿沟”就是:由于计算机获取的图像的视觉信息与用户对图像理解的语义信息的不一致性而导致的低层和高层检索需求间的距离。

[展开全文]

图像分类:数据驱动方法

图像分类任务是计算机视觉中的主要任务,当你做图像分类的时候分类系统接收了一些输入图像,比如可爱的猫,并且系统已经清楚了一些确定了分类或者标签的集合,这些标签可能是一只狗狗或者一只猫咪,也有可能是一辆卡车,还有一些固定类别的标签集合,那么计算机的工作就是看图片,但是它肯定没有人对猫的那样一种概念,电脑看到的只是一些像素,所以对于计算机来说这是一个巨大的数字矩阵,很难从中提取出猫的特性,我们把这个称为语义鸿沟。对于猫咪的概念或者它的标签是我们赋予特性的一个语义标签,一个猫的语义标签和计算机实际上看到的像素值之间有着巨大的差距。一旦图片发生了微妙的变化,这将导致像素网路整个发生变化,虽然两个矩阵中的数据完全不同,但是它们仍然都是代表猫,因此我们的算法需要对这些变化鲁棒。还不仅仅是视角的问题,还有光照条件不同的问题,目标对象还有变形的问题,还有遮挡的问题以及类内差异的问题,我们的算法应该是在这些条件下都是鲁棒的。

 

我们可以用Python写一个图像分类器,输入是图像,输出为图像的标签。

比如:

def classify_image(image):

        return class_label

目前我们并没有直截了当的图像识别算法。

目前有一些硬编码的规则来识别不同的动物,我们都知道猫有耳朵、眼睛、嘴巴、鼻子,根据Hubel &Wiesel的研究,我们了解到边缘对于视觉识别是非常重要的,所以我们可以尝试计算图像的边缘,然后把边、角等各种形状分类好,比如有三条线是这样相交的,那这就可能是一个角点,比如猫耳朵有这样那样的角因此我们可以写一些规则来识别这些猫。但是实际上这些算法是不好的,容易出错。其次,如果我们相对另外一种对象进行分类,比如除了猫,我们需要识别其他的动物,就需要从头开始。


我们需要一种可以推演的方法,那就是数据驱动的方法。

我们不写具体的分类规则来识别一只猫或者鱼,我们从网上抓取大量猫的图片的数据集,一旦我们有了数据集,我们训练机器来分类这些图片,机器会去收集所有的数据,用某种方式总结,然后生成一个模型,总结出识别出这些不同类的对象的核心知识要素,然后我们用这些模型来是识别新的图片。因此我们的借口变成了这样:

写一个函数,不仅仅是输入图片,然后识别他是一只猫,我们会有两个函数,一个是训练函数,这函数接收图片和标签,然后输出模型;

另外一个函数输入新图片,然后输出标签。前一个模型为训练模型,后一个为预测模型。

我们用一定的规则来比对一组图片,

比如L1 distance ,将两幅图片的像素相减,求这些差的绝对值之和。

完整的Nearest NeighborPython 代码:

import numpy as np #进行向量运算

class NearestNeighbor:

        def __init__(self):

          pass

        def train(self,x,y):

       """  X is N * D where each row is an example . Y is 1-dimension of size N """
#近邻算法在训练阶段只是简单得记住训练数据

       def predit(self,x):

          """  X is N * D where each row is an example  we wish to predict label for """

        num_test = x,shape[0]

        #保存输入输出的格式一致

       Ypred = np.zeros(num_test,dtype=self.ytr.dtype)

     for i in xrange(num_test):

      #循环遍历每一个测试数据

       distance = np.sum(np.abs(self.xtr-x[i,:}),asix=1)

       min_index = np.argmin(diatances)

Ypred[i] = self.ytr[min_index]

return Ypred

 

注意:因为近邻算法在训练阶段只是简单地记住了训练图片,所以它的时间复杂度是0(1),但是测试阶段就是有一个将训练数据与测试数据对比的过程,其时间复杂度就是O(N)。与卷积神经网络不同,卷积神经网络在训练阶段花费的时间很长,在测试阶段就很快。

K最近邻(k-Nearest Neighbour,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。 K值越大,边界越平滑。

[展开全文]
  1. ​python, Numpy向量化操作
  2. 训练函数:接收图片和标签,输出模型
  3. 预测函数:  接收一个图片,对此进行分类,进行预测
  4. 数据集:CIFAR10
  5. 近邻算法

 

[展开全文]

challenges:

  • viewpoint variantion
  • illumination(照明)
  • deformation(可变形性)
  • occlusion(遮挡)
  • background clutter(物体和背景难以区分)
Data-Driven Approach
NN-L1 distance
KNN-take vote(the larger value of k, the more smooth of decision boundaries)
 
 
 

 

[展开全文]

深度学习与计算机视觉 斯坦福CS231n

Day2

 

让神经网络进行思考

 

  1. 分类的难点

  设定图片是一张巨大的数字表单(300*100*3(3代表红绿蓝三色道0-255))的三维数组(这些数字的反映的是亮度以及每个像素点三基色分别所占的权值)

  1. 视点的变换问题-->摄像机的旋转和移动(比如同一张图,不同的观察角度下的识别)-->设定多个分类器,得到多个训练结果的模板(基本上一个分类器对应一个结果模板)。同时检测(for循环),选择一个最相似的。
  2. 光线问题
  3. 识别物体形态的变换
  4. 遮挡问题
  5. 背景杂斑问题(识别物体与背景颜色纹理都很相近)
  6. 种类演变问题

 

【最初的方法:
1.检测边缘并勾画边界,根据边缘结构和连结方式分类(耳朵)-》不可扩展,特征不明显-->数据驱动
2.训练一个模型,这个模型是一个类,这个类去进行分类】

 

 

 

2.近邻算法分类器

  使用一部分测试数据用来评估分类器的好坏

<1> 一般将X定为图像像素数据,Y定为标签。然后对每一个测试图像使用FOR循环获取图像X的测试集。遍历类的时候,需要考虑测试时间性能,在训练方法内投入的计算和在测试方法内投入的计算这之间需要我们权衡。训练数据集规模变大的时候,算法减慢的速度是线性的。近邻算法分类器具有即时性,但造价昂贵。

 

【image-->text
1.卷积神经网络CNN
2.循环神经网络RNN-排序(时间序列)-->在CNN中,每个神经元只能向上一层传导(前向神经网络);而在RNN中,神经元可以直接作用到自身(即第M层神经元在T时刻的输入,除了自身M-1层神经元的输出,还包括了T-1时刻的输出)

参考:https://www.zhihu.com/question/34681168】

 

<2>距离的定义:可以看做是一种超参数

      A.曼哈顿距离算法(L1):十字距离,不是直线距离。是直角边+直角边,而不是斜边。

  “想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个曼哈顿距离。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)

(1)二维平面两点a(x1,y1)b(x2,y2)间的曼哈顿距离

  

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离

  

      B.欧氏距离(L2):两点间距离公式,斜边。

  欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。

(1)二维平面上两点a(x1,y1)b(x2,y2)间的欧氏距离:

  

(2)三维空间两点a(x1,y1,z1)b(x2,y2,z2)间的欧氏距离:

  

(3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

  

  也可以用表示成向量运算的形式:

 

 

<3>验证方式:

K折交叉验证把数据集分成两部分,第一部分用于构建模型,第二部分用于验证模型;并且,验证是一个循环反复进行的过程。

可以解释为:初始数据采样分割成K个子样本,每次交叉验证中将某个子样本作为验证模型的数据,其他K-1个样本合集作为训练集;交叉验证重复K次,使得每个子样本验证一次,然后平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这种方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次模型效果。

 

<4>近邻算法分类器的缺点

(1)效率很低

(2)效果不是很好,当样本不平衡时,如果一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的 K 个邻居中大容量类的样本占多数。

 

<5>TIPS

  1. 不同的方法会有不同的泛化结构。
  2. 不应该只相信测试集,防止过拟合。
  3. 噪声和异常值一样带有随机性。
  4. 不同的K值所存在的覆盖问题:K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,容易发生过拟合;如果 K 值较大,优点是可以减少学习的估计误差,缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,是预测发生错误。
  5. 算法中的分类决策规则往往是多数表决(投票),即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别。
  6. 距离度量一般采用 Lp 距离,当p=2时,即为欧氏距离,在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。

 

  1. 线性分类

(1)参数多态方法:定义函数f(x,W)(输入像素值,输出类别)=Wx+b(b是偏置参数),根据特定程序集上的梯度,斜率和位置,分类器进行移动进行分类。

【对于W的认识:

1.W的每一行都与图像进行点乘
2.W有关注或者不关注不同的空间位置的权利,权重小的像素点不参与。
3.序列化方法把像素变成一列,要把图片改成一样的大小,压缩成方形图片,就可以转换为在空间上对齐的列。
4.基本上所有的分数都是一个所有的像素点值的加权和。计算不同空间的颜色和。类似模版匹配。显示的颜色有正权重。】

 

  1. 对于线性分类来说什么样的测试集会是难以分类的?

1.计算特定位置混合的颜色很难。

2.不同的纹理

  1. 损失函数

损失函数是一种能够定量的测量每一个W在数据集上表现得有多差的方法。

通过这种函数,我们不需要控制W的初始值。

 

[展开全文]

图像分类

谷歌云

python3 numpy

api

edges

conners

not good

最近邻:fast train, slow training  

cifar-10

曼哈顿距离

K最近邻

 

[展开全文]

相关课程

开课日期:直播已结束,可回看开始
智能驾驶 基础入门 87051
开课日期:开始
机器学习 基础入门 111844

授课教师

暂无教师
微信扫码分享课程