图像识别算法(一)

article/2025/10/18 10:57:30

目录

一、图像识别

二、最近邻分类器(Nearest Neighbor Classifier)

三、k-最近邻分类器(k - Nearest Neighbor Classifier)

四、超参数的设置(Hyperparameter)

五、分析


一、图像识别

对于人脑来说,图像识别是一个简单的问题,但是对于程序来说,这是一个值得研究的问题。总的来说,物体检测,分割等这些计算机视觉的问题都可以简化为图像识别。

图像识别存在许多需要考虑的问题。对于计算机来说,一张图像是相当于一个矩阵。如下所示:

 一张彩色的猫的图片对于计算机来说是一个3*248*400的三维张量。图像识别的任务就是给输入的一张图像一个标签。

图像识别存在很多挑战:

1.视角变化(viewpoint variation)—一张物体在不同角度的拍摄下也会有不一样的效果。

2. 比列变换(scale variation)—— 物体不仅仅在图像中存在大小差异,同时在现实生活中也存在大小差异。

3.形变(deformation)—— 许多感兴趣的对象不是刚体,可以以极端方式变形。

4.遮挡(occlusion)——可以遮挡感兴趣的对象。 有时只能看到对象的一小部分(少至几个像素)。

5.光照条件(illumination conditions)—— 照明的影响在像素级别上是剧烈的。

6.背景杂波(bakground clutter)——感兴趣的对象可能会融入其环境,使其难以识别。

7.类内变异(intra-class variation)——感兴趣的对象通常比较广泛,比如椅子。这些对象有许多不同的类型,每种类型都有自己的外观。

 data-driven approach:与其编写一个算法指定每个感兴趣的类别的样子,不如设计一个学习算法。向计算机提供每一个类别的许多例子,然后算法通过对这些例子进行学习得到每一个类别的视觉外观,这种方法被认为是data-driven approach,因为它依赖于具有标记的训练数据集。

 图像识别的流程:训练,验证,测试

Input:输入我们需要的具有标记的N张图像(监督学习)。

Learning:我们的任务就是利用分类器在数据集中学习到不同类别的特征。我们将此步骤称为训练分类器或者学习模型。

Evaluation: 我们通过要求分类器预测一组它以前从未见过的新图像的标签来评估分类器的质量。 然后我们将这些图像的真实标签与分类器预测的标签进行比较。

二、最近邻分类器(Nearest Neighbor Classifier)

在实际中,最近邻分类器是不常用的,但是它揭示了图像分类的部分依据。

首先介绍一下数据集。CIFAR-10是一个图像分类常用的数据集。 它大约有60000张关于模型的小图片(图片尺寸大约为32*32)。这个数据集包含了10个不同的类别。

我们从这个数据集中提取10000张作为测试集,剩余的图像作为训练集。上图的右边就是分类器的分类结果,但是分类效果并不是很好。 

对于最近邻分类器,图像分类的依据是L1 distance

d_{1}=\sum |I_{1}^{p}-I_{2}^{p}|

其在二维矩阵中的用法如下所示:

 将两个图像元素相减,然后将所有差异相加为一个数字。 如果两个图像相同,则结果为零。 但如果图像非常不同,结果会很大。

Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # a magic function we provide
# flatten out all images to be one-dimensional
Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3) # Xtr_rows becomes 50000 x 3072
Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) # Xte_rows becomes 10000 x 3072

上段代码中,Xtr存储的是训练数据集,共50000张图片,Ytr存成的是训练集的标签,是一个一维数组(长度为50000)。Xte存储的是测试集的数据集,共10000张图片,Yte存储的是测试集的标签。

nn = NearestNeighbor() # create a Nearest Neighbor classifier class
nn.train(Xtr_rows, Ytr) # train the classifier on the training images and labels
Yte_predict = nn.predict(Xte_rows) # predict labels on the test images
# and now print the classification accuracy, which is the average number
# of examples that are correctly predicted (i.e. label matches)
print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )

上面代码实现了分类器的训练。

import numpy as npclass NearestNeighbor(object):def __init__(self):passdef train(self, X, y):""" X is N x D where each row is an example. Y is 1-dimension of size N """# the nearest neighbor classifier simply remembers all the training dataself.Xtr = Xself.ytr = ydef predict(self, X):""" X is N x D where each row is an example we wish to predict label for """num_test = X.shape[0]# lets make sure that the output type matches the input typeYpred = np.zeros(num_test, dtype = self.ytr.dtype)# loop over all test rowsfor i in range(num_test):# find the nearest training image to the i'th test image# using the L1 distance (sum of absolute value differences)distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)min_index = np.argmin(distances) # get the index with smallest distanceYpred[i] = self.ytr[min_index] # predict the label of the nearest examplereturn Ypred

上面的代码实现了最近邻分类器。

但是这个分类器的数据集CIFAR-10上的分类效果并不好,仅仅只有38.6%左右。

现在我们考虑换一个图像分类的依据。从最初的L1-distance换为L2-distance.

L2-distance:

d_{2}(I_{1},I_{2})=\sqrt{\sum (I_{1}^{p}-I_{2}^{p})^{^{2}}}

distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))

但一般在实际操作中不会选择平方后再开根号,而是选择直接平方就好了,这样会提高算法的复杂度。

三、k-最近邻分类器(k - Nearest Neighbor Classifier)

 K-最近邻分类器跟最近邻分类器非常的相像。不同的是K-最近邻分类器不是考虑最接近的那一张图像而是考虑最接近的那K张图像。

利用分类器对最左边的图像按照颜色将点分开。我们可以看到NN classifier 分类器存在了过拟合的状态,这样的分类器往往在其他的数据中表现很差。5-NN classifier 分类结果中存在白色的部分,这部分是分类器无法判别的部分(也就是说利用L2-distance计算时,至少有两个以上的类别在这片区域出现了相等的情况)。我们可以看到5-NN classifier 的分类结果更平滑,也就是说更有泛化能力。

四、超参数的设置(Hyperparameter)

注意:我们不能将测试集用于调整超参数。每当您设计机器学习算法时,您都应该将测试集视为一种非常宝贵的资源,最好在最后一次之前永远不要接触它。最后只对测试集进行一次评估

但是我们可以通过验证集去选择最合适的超参数。

这个想法是将我们的训练集分成两部分:一个稍小的训练集,以及我们所说的验证集。 以 CIFAR-10 为例,我们可以使用 49,000 张训练图像进行训练,并留出 1,000 张用于验证。 这个验证集本质上用作一个假测试集来调整超参数。

# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before
# recall Xtr_rows is 50,000 x 3072 matrix
Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train
Ytr = Ytr[1000:]# find hyperparameters that work best on the validation set
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:# use a particular value of k and evaluation on validation datann = NearestNeighbor()nn.train(Xtr_rows, Ytr)# here we assume a modified NearestNeighbor class that can take a k as inputYval_predict = nn.predict(Xval_rows, k = k)acc = np.mean(Yval_predict == Yval)print 'accuracy: %f' % (acc,)# keep track of what works on the validation setvalidation_accuracies.append((k, acc))

但是当训练集数量很少的时候,我们没有办法提取出验证集的时候,就可以采用交叉验证(Cross-validation)的方法。

例如,在5倍交叉验证中,我们将训练数据分成5倍,其中4倍用于训练,1倍用于验证。然后我们进行迭代,从之前的训练集中抽一份用做验证,而之前当作验证集的数据又称为验证集,这样我们就可以得到五个准确率,然后将其进行平均。

 参数 k 的 5 折交叉验证运行示例。 对于 k 的每个值,我们训练 4 次并在第 5 次评估。 因此,对于每个 k,我们在交叉验证上收到 5 个精度(精度是 y 轴,每个结果是一个点)。 趋势线是通过每个 k 的结果的平均值绘制的,误差线表示标准偏差。 请注意,在此特定情况下,交叉验证表明,大约 k = 7 的值在此特定数据集上效果最佳(对应于图中的峰值)。 如果我们使用超过 5 次折叠,我们可能会期望看到更平滑(即噪声更少)的曲线。

但是在实际操作中,一般情况下不会选择交叉验证,因为这种方法的计算代价很昂贵,只有在训练集数量实在不够的情况下再选择这种方法。

五、分析

最邻近分类算法在低维度的时候可能是一个很好的选择,但是在高维度的情况下,最邻近算法就表现的很差。

 最左边这个图是原图。后面三张图与原图的L2-distance距离是一致的。

采用一种可视化技术叫做t-SNE 对数据集CIFAR-10 images进行操作。图中,图片距离越近就代表着两者之间的L2-distance值越小。在这个结果中,我们可以清楚的知道图片的背景对最邻近分类器的结果的影响很大。

因此我们在进行图像分类时,不能仅仅局限于图像上看得见的像素信息,还要挖掘更深层的信息。


http://chatgpt.dhexx.cn/article/COKoB6Ab.shtml

相关文章

遗传算法(Genetic Algorithm)解析

00 目录 遗传算法定义生物学术语问题导入大体实现具体细节代码实现 01 什么是遗传算法? 1.1 遗传算法的科学定义 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一…

遗传算法的手工模拟计算示例(通俗易懂)(包含遗传算法原理、遗传算法代码)

下面是关于“遗传算法”的几个不错的学习资源 遗传算法介绍及手工模拟计算示例(文字版) 遗传算法介绍及手工模拟计算示例(视频讲解版) 遗传算法原理介绍(包含二进制编码、解码原理,算法实现,视…

神经网络中的遗传算法

简 介: 人工神经网络是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。遗传算法是一种引入自然选择和进化思想的优化算法,具有优良的全局寻优性能。在神经网络中借助遗传算法进行网络优化,可以充分利用两者…

遗传算法(Genetic Algorithm)

1、遗传算法的基本思想 遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法(Genetic Algorithm, GA)起…

遗传算法基本原理

遗传算法基本原理 1.遗传算法 GA是基于“物竞天择、适者生存”原理的一种高度并行、随机和自适应优化算法,它将问题的求解表示成“染色体"(chromosome)适者生存的进化过程,通过种群(population)的一代代不断进化,通过选择(selection)、交叉(cross…

多目标遗传算法NSGA-II原理详解及算法实现

在接触学习多目标优化的问题上,经常会被提及到多目标遗传算法NSGA-II,网上也看到了很多人对该算法的总结,但真正讲解明白的以及配套用算法实现的文章很少,这里也对该算法进行一次详解与总结。会有侧重点的阐述,不会针对…

一文搞懂什么是遗传算法Genetic Algorithm【附应用举例】

代码链接放文末。 本文参考了很多张军老师《计算智能》的第四章内容。 本文来源:https://blog.csdn.net/qq_44186838/article/details/109181453 遗传算法 1.1 遗传算法简介 1.1.1 基本原理 重温高中生物哈哈! 遗传算法(Genetic Algor…

遗传算法的基本原理和matlab实现

2016年9月7日星期三 T.s.road 总结笔记 遗传算法解决全局优化(即为最值点如图中C,D),而局部最优解决的是极值点问题(如图中A,B) 1. 遗传算法流程; %遗传算法的伪代码描述&…

遗传算法(三)——基本遗传算法

目录 2.基本遗传算法 2.1基本遗传算法描述 2.1.1基本遗传算法的构成要素 2.1.2基本遗传算法描述 2.1.3基本遗传算法的形式化定义 2.2基本遗传算法的实现 2.2.1个体适应度评价 2.2.2比例选择算子 2.2.3单点交叉算子 2.2.4基本位变异算子 2.3基本遗传算法应用举例 2.3…

遗传算法原理以及matlab代码

目录 1,算法原理以及形象解释 2,参数编码 3,算法框架 4,代码 MATLAB 1,算法原理以及形象解释 遗传算法(Genetic Algorithm, GA)是仿生物智能优化算法,是模拟达尔文生物进化论中…

遗传算法的基本原理

1、简介 遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖、杂交和突变现象.再利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解).在遗传算法开始时,总是随机的产生一些…

遗传算法原理介绍

前言 遗传算法( genetic algorithm,GA)是模拟自然界生物进化机制的一种算法,即遵循适者生存、优胜劣汰的法则,也就是寻优过程中有用的保留无用的则去除。在科学和生产实践中表现为在所有可能的解决方法中找出最符合该问题所要求的条件的解决方法,即找出一个最优解。…

遗传算法原理及其matlab程序实现

遗传算法原理及其matlab实现 一、遗传算法背景二、遗传算法原理及其数学模型2.1 编码方式2.1.1 二进制编码2.1.2 浮点数编码 2.2 种群初始化2.3 计算初始种群的适应度函数值2.4 对初始种群个体进行筛选—天泽(以轮盘赌方式进行选择)2.5 个体染色体交叉及…

遗传算法原理及其python实现

遗传算法原理 基本思想: 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则,它最初由美国Michigan大学的J. Holland教授于1967年提出。遗传算法…

智能算法——遗传算法原理、应用汇总

一、遗传算法原理 遗传算法(GA)是一种基于生物界规律和自然遗传机制的并行搜索算法。1975 年,J. Holland 教授首次在书中提出“自然组合人工智能系统的适应性”。它是一种多参数,多组合同时优化方法,模拟自然进化过程中…

遗传算法原理

一、遗传算法简介 遗传算法是进化算法的一个分支. 它将达尔文的进化理论搬进了计算机. 科学定义如下: **遗传算法(Genetic Algorithm, GA)**起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优…

遗传算法

目录 一、算法原理 二、代码实现 三、结果分析 优化目标函数为Rastrigin(x) 目标函数为Schaffer(x) 目标函数为Griewank(x) 总结 一、算法原理 1、基本原理 遗传算法是一种典型的启发式算法,属于非数值算法范畴。其目的是抽象和严谨地解释自然界的适应过程以…

遗传算法(GA)详解

遗传算法(GA)详解 遗传算法主要作用是求解最优解,例如求函数极值,或是飞机巡航问题中的最短巡航路线的求解等,其作用与模拟退火算法的作用较为相似。本文将从GA算法的原理,结构与两个实践应用进行比较详细…

html中热区如何设置,Dreamweaver中如何设置热区?DW设置热区方法图解

Dreamweaver中如何设置热区?下面小编就为大家详细介绍一下,一起来看看吧! 方法/步骤 向平时一样,这里我们在设置Dreamweaver热区的时候。同样这里是需要建立一个新的HTML界面的。 建立完毕,如下图中所示的一个新的文档(HTML) 按照…

用html编写或在dw中完成,Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码

Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码,代码,教程,标签,光标,文本 Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码 易采站长站,站长之家为您整理了Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码的相关内容。 1.启动 Dreamweaver CS5 2.点击左上角…