python 图像识别技术_搭建基于K近邻的图像识别系统-python实现

本文根据贪心学院付费课程《机器学习集训营》整理而来,参见课程网址:AI教AI。

本文目录

1. 图像识别

2. 数据集介绍

3. 图像的读取以及表示

4. 图像识别的挑战及传统机器学习方法的解决方案---人工特征提取

5 基于KNN算法的图像识别任务说明与实现

本文正文

1. 图像识别

所谓的图像识别其实就是识别图片里的物体,比如是猫还是狗。

图像识别的应用场景特别多,比如人脸识别、物体识别、监控视频里的异常检测、无人驾驶等,其核心技术都来自于图像识别。

目前对于图像识别任务,最有效的方法是使用深度学习,比如卷积神经网络。但实际上,我们也可以通过其他简单的算法如KNN来识别图片,只不过比起卷积神经网络效果会差一些。但这不妨碍我们对这个领域的学习。

我们的任务是:使用KNN算法来识别图像。

2. 数据集介绍

作业里使用的数据是一个非常经典的数据集叫做CIFAR-10。具体的下载地址可以通过下方链接来获得。 http://www.cs.toronto.edu/~kriz/cifar.html。

一定要选择python版本,下载解压后直接放到工程根目录备用。

3. 图像的读取以及表示

图像本身是一个非结构化的数据,而且非结构化数据本身是不能直接用来做模型输入的。

那什么是非结构化数据呢? 简单来讲,文本、图片、声音、视频这些都属于非结构化数据,需要做进一步的处理。相反, 结构化的数据指的是存放在数据库里的年龄,身高等这种信息。

对于图像来说,此过程相对简单。一般可以通过Python自带的库来读取图片,并把图片数据存放在矩阵(Matrix)或者张量(Tensor)里。

图片是由像素来构成的,比如256256或者128128。两个值分别代表长宽上的像素。这个值越大图片就会越清晰。另外,对于彩色的图片,一个像素点一般由三维数组来构成,分别代表的是R,G,B三种颜色。除了RGB,其实还有其他常用的色彩空间。如果使用RGB来表示每一个像素点,一个大小为128128像素的图片实际大小为128128*3,是一个三维张量的形式。

import matplotlib.pyplot as plt

# 读取图片的数据,存放到img,请注意将图片路径改为你自己的图片路径

img = plt.imread('/home/anaconda/data/RGZNXLY/ch3/sample.jpg')

print (img.shape) # 打印图片的大小

plt.imshow(img) # 展示图片

plt.show()

4. 图像识别的挑战及传统机器学习方法的解决方案---人工特征提取

图像识别其实是一个很具有挑战的任务,主要的原因来自于环境的因素。图像识别工作中需要考虑的点包括,从不同视角拍摄同一个物体,图像的大小不一样,主要的物体被部分遮盖,图片的亮度,同一个物体可以有不同的形状等。

上面的两幅图分别表示一个物体在不同角度下的拍摄以及图片亮度的不同。我们的认知空间是三维的,在这个空间里我们可以选择任意的角度来拍摄一个物体,这时候角度的差异会带来很不一样的拍摄结果,这一点我相信大家都深有体会。

另外,图像的亮度也非常重要。对于无人驾驶任务,它需要识别各类交通指示牌、行人、其他的车辆以及道路状况等等。 但显然在晚上识别起来更具有难度。

上面的图分别表示遮挡物、形状、大小对图片的影响。一个物体被遮挡就意味着我们看不到它的全貌,这增加了识别上的难度。另外,同一个物体也有不同的形状。即便一个椅子,也有成千上万的不同形状。最后,图片大小的不一致也会带来识别上的困难。

所以,一个好的图像识别系统需要考虑到上述这些问题。即便在不同的环境下,也需要做到正确的识别。

问题:假如我们直接读取图片里的数据,然后再通过KNN算法来识别图片,那这种方案是否能考虑到上面提到的几点呢?很显然是不可以的。KNN模型的核心是计算距离。假设我们把图片转换成数据,之后无非就是计算两个矩阵/张量之间的距离罢了,这很明显不会考虑到以上几个问题,这也是为什么KNN这种方式得出来的效果并不是特别好的主要原因。

那如果坚持使用KNN算法,有没有可能在效果上做一些提升呢?

一种方法就是做图像上的特征工程。 在第二节里我们学会了如何把图片转换成像素值,我们可以把它认为是原始特征。但我们很难通过这些原始特征来理解图片中的一些特性。

所以,在过去很长的时间里很多学者都在研究如何从图片里提取特征,而且这些特征可以很好地对图像做个总结,并且较好地处理不同环境带来的影响。 比如一个特征很少受图像亮度和角度的影响。第二种特征我们称作是rotation-invariant。

上面列了几个比较经典的图像特征。

颜色直方图(颜色直方图)

颜色特征里最常用的是颜色直方图,其实就是对R,G,B三种颜色做了一个统计,比如有百分之多少的R颜色落在[10,20]的区间。对于上面的这幅图,左边所展示的是构建完RGB直方图之后的结果。

SIFT

另外,SIFT特征也经常用在图像识别当中,它是一个局部的特征,它会试图去寻找图片中的拐点这类的关键点,然后再通过一系列的处理最终得到一个SIFT向量。 具体的细节大家可以参考网上其他的资料。

HOG

最后,HOG也是非常重要的图像特征,它通过计算和统计图像局部区域的梯度方向直方图来构建特征。

由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性。

对于后两个特征的理解由于需要一些视觉相关的基础,不在这里详细阐述。现阶段,只需要知道有这类的特征,以及如何使用工具去抽取这些特征就可以了。

除了这些特征可以较好地总结一个图片,它还有一个非常重要的优点,就是特征的降维。

对于一个中小型图片,它的大小一般大于2562563。如果把它转换成向量,其实维度的大小已经几十万了。这会导致消耗非常大的计算资源,所以一般情况下我们都会尝试对图片做一些降维操作。其实特征提取过程我们自然地可以理解为是降维过程。

这种降维操作会更好地保留图片中重要的信息,同时也帮助过滤掉无用的噪声。

除了特征提取之外,我们还有一种常用的降维工具叫做PCA(Principal Component Analysis), 它是一种无监督的学习方法,可以把高维的向量映射到低维的空间里。它的核心思路是对数据做线性的变换,然后在空间里选择信息量最大的Top K维度作为新的特征值。

具体的细节我们会放在无监督学习的章节里介绍。现阶段,我们只需要了解有这样的一个算法,而且知道如何使用sklearn去调用就可以了。

其实PCA也经常用在图像识别任务中,比如人脸识别。另外,我们也可以通过PCA把高维的数据映射到2维或者3维空间里,然后再通过可视化来理解数据。

5 基于KNN算法的图像识别任务说明与实现

5.1 整体描述

在这个项目里, 你需要完成一个图像识别的任务,主要使用的模型是KNN算法。使用的数据集是cifar-10,是图像识别领域最为经典的数据及之一。具体的数据可以从以下的链接下载: https://www.cs.toronto.edu/~kriz/cifar.html, 下载之后把是数据集解压在当前的工程的根目录下。 在这个任务里,你即将要完成的几个任务是:读取图片文件、展示图片、并做部分采样。采样的原因主要是为了节省训练的时间,因为我们知道KNN的搜索复杂度为O(N),何况图片也属于高维的数据,这也会增加搜索效率。

使用KNN算法识别图片。在这里,我们需要使用K折交叉验证来最适合的超参数。

使用PCA技术先给图片做降维,然后在使用KNN来识别图片。 另外,使用PCA把图片降维到2维度空间里,这时候相当于我们得到了每一个图片在(x,y)轴上的坐标。之后把采样过的一些图片在二维空间里根据每个坐标点来展示一下。

给每一个图片抽取两个经典的特征,color historgram和HOG, 抽取的过程已经给你写好。抽取完之后再通过KNN来训练。

基于第四步,换成神经网络模型去识别。虽然还没有讲到神经网络,但根据提前给定的参数设置并结合sklearn的文档,完全可以去实现一个神经网络模型。

5.2 分步骤描述

1.文件的读取、可视化、以及采样

在这部分我们需要读取图片文件,并展示部分图片便于观察,以及做少量的采样。

文件的读取: 读取部分的代码已经提供,你只需要调用一下即可以读取图片数据。

可视化: 选择其中的一些样本做可视化,也就是展示图片的内容以及它的标签。

采样:统计一下各类出现的个数以及采样部分样本作为后续的模型的训练。

2. 使用KNN算法识别图片。

KNN有几个关键的参数:K: 指定选择多少个neighbors。 这个值越大,我们知道KNN的决策边界就会越平滑,而且越不容易过拟合, 但不保证准确率会很高。

p: 不同距离的指定,看以下的说明。

KNN依赖于两个样本的距离计算,这里简单介绍一下一个概念叫做Minkowski Distance,是一个种通用的距离计算方法。假如我们有两个点,分别由两个向量来表达

,这时候根据Minkowski Distance的定义可以得到以下的结果:

从上述的距离来看其实不难发现

时其实就是绝对值的距离,

时就是欧式距离。所以欧式距离其实是Minkowski Distance的一个特例而已。所以这里的

值是可以调节的比如

3. 抽取图片特征,再用KNN算法来识别图片

在课程里也讲过,一种解决图像识别问题中各种环境不一致的方案是抽取对这些环境因素不敏感的特征。这就是所谓的特征工程。 在这里,我们即将会提取两种类型的特征,分别是color histogram和HOG特征,并把它们拼接在一起作为最终的特征向量。 至于这些特征的概念请参考第三章的内容,或者网络上的一些解释。我们已经提供了抽取特征的工具,只需要调用就可以使用了。 所以你需要做的任务是:调用特征提取工具给每一个图片提取特征。 如果想深入了解,可以查看其代码

使用K折交叉验证去学出最好的模型(同上)

4. 使用PCA对图片做降维,并做可视化

PCA是一种常用的降维工具,可以把高维度的特征映射到任意低维的空间,所以这个方法也经常用来做数据的可视化。具体PCA相关的教程可以参考sklearn官方文档,https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html, 他有一个主要的参数需要设计,就是n_components, 指的是降维之后的维度。比如设置为2,就代表降维到2维的空间。具体PCA内部的原理我们会在无监督学习的章节里再做详细介绍。现阶段,能看懂官方文档,以及指导如何使用就可以了。 需要完成以下任务:通过PCA把数据降维,然后再通过KNN来分类

把降维之后的数据可视化

5 使用神经网络识别图片

在这里,我们将尝试使用神经网络来识别图片。虽然还没有学过神经网络但没有关系,能够看懂文档,而且知道如何调用网络模块就可以了。在深度学习部分会详细介绍这儿写模型。我们将会搭建包含一层隐含层的神经网络(多层就意味着是深度神经网络)。这里使用的数据为特征提取之后的数据(HOG, color histogram)。

5.3 代码实现

完整github工程文件如下:(如上文所述,需要自行下载数据集并解压放入工程文件夹。)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值