http://blog.csdn.net/kangroger/article/details/52338344

图像分类

图像分类是把一副图像赋予一个标签的,标签范围已知。图像分类问题是计算机视觉的核心;其他计算机视觉问题,例如物体检测、分割等,最终都可以看做是图像识别问题。

下面是一副图像,高和宽分别为400和248,包括3个通道RGB。这意味着图像包含400×248×3=297,600个像素,分类过程就是把这么多像素转换为一个标签。

  图像分类面临着以下挑战:  1、视角变化:同一个物体在不同角度拍摄的图片不同。  2、比例变化:物体在图片所占比例可能不同。  3、变形:同一个物体,形状会发生有时会改变。  4、遮挡:目标物体有时会被遮挡,仅仅能看到部分物体。  5、光照:光照会影响像素值的大小。  6、背景:目标物体可能混乱在背景噪声中。  7、对象内部差异:一类对象范围很广,例如椅子,有各式各样的的椅子,外表各不相同。

下图是这些挑战的实例。优异的图像分类模型应该能够应对上面这些变化及其组合。

数据驱动

写一个图像分类算法和写一个数字排序算法并不相同,前者不像后者那么直观。像教小孩一样,我们需要大量的有标签的图像来训练一个图像分类算法。这种方法叫做数据驱动。下图就是用来供算法学习的训练集。

图像学习流程

图像分类的任务就是输入一组像素数据,输出一个标签。其流程吐下:  输入:N个有标签的图片,标签总类别为K。这些训练数据称作训练集。  学习:学习每一类图片的特征。这一步叫做训练或学习模型。  评估:用一个不同于训练集的有标签的集合来评估学好的模型。

最近邻分类器

最近邻分类器和卷积神经网络并不相关,但是它可以让我们学习了解图像分类的一些问题。

图像分类数据集CIFAR-10

CIFAR-10是很流行的小的图片集,它包含60,000张32x32的图片,总共有10个类别,每张图片属于其中一个类别。这60,000张图片分类训练集(50,000)和测试机(10,000)。下图在10类中随机挑选了一些:

如果使用最近邻分类器,具体做法就是把测试机的每张图片和50,000张训练集的图片做对比,找出距离最小的图片就其类别。

怎么对比图片的距离,一张图片有32x32x3个像素,最简单的办法就是对比每个像素值。即,给定两个向量I1,I2,来计算他们之间的L1距离

d1(I1,I2)=∑P|Ip1−Ip2|

下图是计算过程的可视化

这样的算法,只能达到38.6%左右的识别率,和最优的识别率95%差别很大。

如何选择距离:计算向量之间的距离有很多方式,另外一个常用的就是L2距离,它是计算两个向量之间的高斯距离:

d1(I1,I2)=∑P(Ip1−Ip2)2−−−−−−−−−−−√

使用这个距离,大概可以达到35.4%左右的识别率,比L1距离略低。

L1 vs L2:在对比两个向量的差异时,相比之下,L2比L1更加不能容忍这些差异。相对于一个大的差异,L2能更加容忍几个中等的差异。  这里需要理解,例如3个向量:  [1,3],[4,6],[2,8],比较第一个向量和第二三个向量的L1,L2距离  L1距离为:4−1+6−3=6,2−1+8−3=6  L2距离为:32+32−−−−−−√=18−−√,12+52−−−−−−√=26−−√  L1距离相同时,L2距离却不同,L2加上了平方,在L1相同时,即差异和相同时,各个差异比较平均情况下,L2更小。

k-Nearest Neighbor分类器

上面例子中,只使用了距离测试图像最近的图片。kNN是使用了k个最近的图片,让k个图片来投票决定测试图片的标签。显然当k=1是就退化为上面的情况了。可以想象,更高的k值可以是分类结果更加平滑。

在实际问题中,图和选择k值,下面就来说明。

验证集用来调优超参数

在使用kNN分类时,k选择多少是最优?在计算距离时,L1还是L2,或者其他。这些参数叫做超参数hyperparameters,在机器学习的算法中会经常提到超参数这个概念。

在调参时,绝不应该使用测试集。测试集只是用来最后验证算法性能的,如果使用测试集调参,训练的模型在测试集上的表现会过于乐观,可能会造成在测试集的过拟合。

一个正确的做法是把训练集一分为二,一个小的训练集叫做验证集。以CIFAR-10为例,可以ongoing49,000张来训练,1000张当做验证集,在验证集上调参。当训练集比较小时,可以考虑使用交叉验证。

交叉验证,交叉验证是把训练集等分为几份,选择其中一份当做验证集,其余的当做训练集来训练。例如,下图是把数据分为5份,是5折交叉验证。

  可以看书k=7是最优。5折交叉验证过程如下

实践,在实践中并不经常使用交叉验证,而是单独使用一个验证集,因为交叉验证带来了巨大的计算代价。常常把训练集的50%~90%当做训练集,其余当做验证集。如果验证集图片数量太少,最好还是使用交叉验证,常用的有3折、5折、10折交叉验证。

NN的优缺点

NN十分简单,容易实现和理解,且不需要训练,它需要存储所有训练数据在预测时进行计算。我们常常更加关心预测花费的时间,而不十分关心训练所用时间。实际上,深度卷积网络训练时花费很多时间,但是预测时间很短。

计算复杂度也是一个研究领域,几个Approximate Nearest Neighbor(ANN)算法和一些库可以用来加速。这些算法把精确度和复杂度做了一些trade off,例如预处理或索引建立kdtree,或者使用k-measn。

NN分类器更加适合低维度的数据,在图像分类中很少使用。图像是高维度数据,包含许多像素,高维数据的距离不符合直觉。下面图像的L2距离相似,但是图像语义差别很大。

下面这种图更加能说明这一点,相邻紧的图L2距离小,可以看出,邻近的图主要是背景或颜色相近,不是语义上的相近。

总结

本节介绍了图像分类、最近邻分类器(提出了超参数概念)。设置超参数的方法是设置验证集。在训练集样本比较少时,可以使用交叉验证方法。介绍了L1,L2距离概念。

kNN实践总结:

1、预处理数据:对数据进行进行归一化处理,使数据均值为0,方差为1。  2、如果数据维数很高,使用PCA等降维。  3、分割训练集,要有验证集。如果训练集样本比较少,考虑使用交叉验证。  4、测试不同的k值以及距离度量L1,L2。  5、如果预测时间过长,考虑使用近似NN库(Approximate NN library)。  6、记录超参数。不应该使用验证集来训练(最后的模型再用验证集训练),因为这样可能会导致超参数发生变化。正确的做法是使用测试集来评估超参数的效果。

knn计算机在图片中的应用,图像分类和kNN相关推荐

  1. 深度学习与计算机视觉(一)图像分类与KNN

    1.图像分类与KNN 1.1 图像分类 1.1.2 图像识别的难点:类内形变+类间相似** 1.1.3 图像识别的途径 1.1.4 机器学习解决图像分类的流程 1.2 最近邻分类器(Nearest N ...

  2. KNN学习之图像分类与KNN原理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 简介 KNN算法,即K近邻算法是一种监督学习算法,本质上是要在给定 ...

  3. 学习KNN(一) 图像分类与KNN原理

    学习KNN(一) 图像分类与KNN原理 学习KNN(二)KNN算法手写数字识别的OpenCV实现 学习KNN(三)KNN+HOG实现手写数字识别 简介 KNN算法,即K近邻算法是一种监督学习算法,本质 ...

  4. ML之kNN(两种):基于两种kNN(平均回归、加权回归)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能

    ML之kNN(两种):基于两种kNN(平均回归.加权回归)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能 目录 输出结果 设计思路 核心代码 输出结果 Bosto ...

  5. 【KNN分类】基于matlab模拟退火优化KNN、蝗虫算法优化KNN数据分类【含Matlab源码 2275期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[ELM分类]基于matlab鲸鱼算法优化核极限学习机数据分类[含Matlab源码 2012期] 获取代码方式2: 付费专栏Matlab智 ...

  6. 深度学习与计算机视觉系列(2)_图像分类与KNN

    作者: 寒小阳 &&龙心尘  时间:2015年11月.  出处:  http://blog.csdn.net/han_xiaoyang/article/details/49949535 ...

  7. 【深度学习】图像分类之KNN算法

    文章目录 前言 一.CIFAR-10 数据集简介 二.Nearest Neighbor Classifier(最近邻分类器) L1距离(曼哈顿距离) L2距离(欧氏距离) 三.k - Nearest ...

  8. [Python图像处理] 三十九.Python图像分类万字详解(贝叶斯图像分类、KNN图像分类、DNN图像分类)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. P2:图像分类:KNN与线性分类器

    自豪兄YYDS: https://www.bilibili.com/video/BV1K7411W7So?p=2 一.kNN KNN 从数据集中选择距离测试用例最近的K个测试用例,根据K个测试用例的类 ...

最新文章

  1. Ubuntu 系统安装Visual Studio Code
  2. 3- MySQL数据类型
  3. 判断一个图是否为树(有向图以及无向图)
  4. 美国地铁列车相撞可能由设备陈旧引发(组图)
  5. (一)MVC5干货篇,目录和路由
  6. 物理光学11 衍射的基本概念与惠更斯原理
  7. Java 洛谷 P2141 珠心算测验
  8. 布点算法的原理和实现
  9. RecyclerView Item 布局宽高无效问题探究
  10. Linux学习笔记三--vim
  11. dev可以运行mysql文件夹_Linux查看mysql 安装路径和运行路径
  12. 小程序服务器api接口,百度智能小程序API 开放接口
  13. 《解剖PetShop》系列之三
  14. CSS学习笔记(四)CSS字体属性
  15. python写ini文件不能保持原有顺序问题_python 生成 xml文件 属性的顺序问题
  16. Mysql 中转换表的引擎
  17. 为何大富连续三天彻夜未眠!
  18. python vecm_用Eviews处理有关VARVECM模型的几个问题
  19. 极客时间课程总结:那些编程之外的能力
  20. 人生算法之「延迟满足感」

热门文章

  1. 非营利组织Eatbch展示了每一个小的微交易是如何起作用的
  2. ZipKin添加自定义跨度Span
  3. asp.net core 教程(七)-异常处理、静态文件
  4. CentOS 6.8 安装最新版 Git
  5. manager的烦恼
  6. uniq :删除文件中重复出现的行
  7. Thecus色卡司1U机架式网络存储服务器
  8. 部门工作中的“求同存异”法则
  9. 为什么要在linux命令前加上 ./
  10. 简单工厂模式_计算器实现