b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

五种图像分类技术,总结和总结算法和实现方法,并进行实验验证

电脑杂谈  发布时间:2020-05-01 03:03:39  来源:网络整理

图像特征提取算法代码_图像特征识别_图像识别算法代码

本文向您介绍了五种图像分类技术,总结并总结了算法和实现方法,并进行了实验验证.

图像分类是为来自一组固定分类的输入图像分配标签的任务. 这是计算机视觉的核心问题之一. 尽管看似简单,但它在现实生活中具有多种应用.

传统方式: 功能描述和检测.

也许此方法对某些示例任务更有用,但实际情况要复杂得多.

因此,我们将使用机器学习为每个类别提供许多示例,然后开发一种学习算法来查看这些示例并理解每个类的视觉外观,而不是尝试直接在代码中指定每个示例. 什么是类别.

但是,图像分类问题是一项非常复杂的任务,总是从诸如卷积神经网络(CNN)的深度学习模型中借用. 但是我们也知道,我们通常在课堂上学习的许多算法,例如KNN(邻近算法)和SVM(支持向量机),在数据挖掘问题上都表现出色,但似乎有时它们并不是图像分类的最佳选择. 问题的选择.

因此,我们想将在课堂上学习的算法与CNN和转移学习算法的性能进行比较.

目标

我们的目标是:

将KNN,SVM和BP神经网络与行业中常见的图像分类问题(例如CNN和转移学习)中使用的算法进行比较.

获得深度学习经验.

探索Google的TensorFlow,探索机器学习框架.

算法和工具

我们在该项目中使用的五种方法是KNN,SVM,BP神经网络,CNN和转移学习.

整个项目主要分为3种方法.

第一种方法: 使用KNN,SVM和BP神经网络,这是我们在课堂上学到的算法,功能强大且易于实现. 我们主要使用sklearn来实现这些算法.

第二种方法: 尽管传统的多层感知器(MLP)模型已成功应用于图像识别,但是节点之间的完全连接受到尺寸灾难的影响,因此无法将其扩展到更高的水平. 分辨率图像. 因此,在这一部分中,我们使用Google的TensorFlow深度学习框架来构建CNN.

第三种方法: 重新训练经过预训练的深度神经网络(称为Inception V3)的最后一层,这也是由TensorFlow实现的. Inception V3正在接受ImageNet的视觉识别挑战的培训,并且自2012年以来已经收集了数据. 这是计算机视觉的标准任务,该模型试图将整个图像分为1000个类别,例如“ Zebra”,“达尔马提亚”和“洗碗机”. 为了重新训练这个经过预先训练的网络图像识别算法代码,我们需要确保自己的数据集没有经过预先训练.

如何实现

第一种方法:

预处理数据集并使用sklearn运行KNN,SVM和BP神经网络.

首先,我们使用openCV包定义两个不同的预处理功能: 第一个称为图像特征向量,调整图像大小,然后将图像展平为行像素列表. 第二种方法称为提取颜色直方图,使用cv2.normalize从HSV颜色间距中提取3D颜色直方图,然后将结果展平.

然后,我们构造了几个需要解析的参数,因为我们不仅要针对整个数据集,而且还要针对具有不同数量标签的子数据集测试该部分的准确性,因此,将数据集Parse构造为程序中的参数. 同时,我们还构造了k-NN方法中使用的相邻数作为解析参数.

完成此操作后,我们开始提取数据集中的每个图像特征并将其放入数组中. 我们使用cv2.imread读取每个图像,并通过从图像名称中提取字符串来分割标签. 在我们的数据集中,我们使用相同的格式来设置名称: “类标签”. “图片编号” .jpg,因此我们可以轻松提取每个图片的类别标签. 然后,我们使用先前定义的2个函数来提取2个要素,并将它们附加到数组rawImages和要素中,并将我们先前提取的标签附加到数组标签中.

下一步是使用从sklearn包导入的函数train_test_split拆分数据集. 后缀为RI和RL的集合是rawImages和标签对的分割结果,另一个是要素和标签对的分割结果. 我们将数据集的85%作为训练集,将15%作为测试集.

最后,我们使用KNN,SVM和BP神经网络功能来评估数据. 对于KNN,我们使用KNeiorsClassifier;对于SVM,我们使用SVC;对于BP神经网络,我们使用MLPClassifier.

图像识别算法代码_图像特征识别_图像特征提取算法代码

第二种方法:

使用TensorFlow构建CNN. TensorFlow的目的是让您构建一个计算图(使用任何类似Python的语言),然后使用C ++执行图形操作,这比直接在Python中直接执行相同的计算要有效得多.

TensorFlow还可以自动计算优化图形变量所需的梯度,以使模型更好地运行. 这是因为该图是简单的数学表达式的组合,因此可以使用导数的链式规则来计算整个图的梯度.

TensorFlow图由以下部分组成:

用于在图表中输入数据的占位符变量.

需要优化的变量,以便卷积网络可以更好地运行.

卷积网络的数学公式.

可用于指导变量优化的费用指标.

一种更新变量的优化方法.

CNN架构是由不同层的堆叠形成的,该层通过可区分的函数将输入量转换为输出量(例如类别得分).

因此,在我们的实现操作中,第一层是保存图像,然后构造3个卷积层,这些卷积层具有2×2的最大池和修改后的线性单位(ReLU).

输入是具有以下尺寸的四维张量:

图片编号.

每张图片的Y轴.

每个图像的X轴.

每个图像的频道.

输出是另一个具有以下尺寸的四维张量:

图像编号,与输入相同.

每个图像的

Y轴. 如果使用2×2池,则将输入图像的高度和宽度除以2.

每个图像的

X轴. 同上.

卷积滤波器生成的通道.

然后,我们在网络末端构建了2个完全连接的层. 输入是形状为[num_images,num_inputs]的二维张量. 输出是形状为[num_images,num_outputs]的二维张量.

但是,为了连接卷积层和完全连接层,我们需要一个平坦的层,将4D张量减小为2D,以便可以将其用作完全连接层的输入.

CNN的最后一个始终是softmax层,该层对来自完全连接层的输出进行归一化,以便将每个元素限制在0到1之间,并且所有元素的总和为1.

为了优化训练结果,我们需要一个成本指标并最小化每次迭代. 我们在这里使用的成本函数是交叉熵(从tf.nn.oftmax_cross_entropy_with_logits()中调用),并且交叉熵的平均值用于所有图像分类. 优化方法是tf.train.AdamOptimizer(),它是Gradient Descent的高级形式. 这是调整后的参数学习率.

第三种方法:

图像特征识别_图像识别算法代码_图像特征提取算法代码

再训练Inception V3对象识别模型具有数百万个参数,可能需要数周才能完全训练. 转移学习是一种可以通过对一组类别(例如ImageNet)使用经过训练的模型并从新类别中的现有权重进行训练来快速完成的技术. 尽管它不能像完整的培训那样运行良好,但是对于许多应用程序来说非常有效,并且可以在笔记本电脑上运行图像识别算法代码,只要它在没有GPU的情况下运行三十分钟即可. 对于这部分的实现,我们可以按照以下说明进行操作:

首先,我们需要获取预先训练的模型,删除旧的顶层,然后在我们拥有的数据集上训练新的模型. 在没有猫的原始ImageNet类中,需要对整个网络进行培训. 转移学习的神奇之处在于,经过训练以区分某些对象的较低层可以在没有任何更改的情况下用于许多识别任务. 然后我们分析磁盘上的所有图像并计算每个图像的瓶颈值. 点击此处查看瓶颈的详细信息(). 每个图像在训练过程中都会重复使用多次,因此计算每个瓶颈值需要花费大量时间,因此可以加快缓存这些瓶颈值的速度,因此不必重复计算.

此脚本将运行4000个训练步骤. 每个步骤都从训练集中随机选择十张图像,从缓存中找到其瓶颈,然后将其馈送到最后一层以获得预测. 然后将这些预测值与实际标签进行比较,以通过反向传播过程更新最终层的权重.

开始实验

数据集

Oxford IIIT宠物数据集(〜vgg /数据/宠物/)

有25个品种的狗和12个品种的猫. 每个品种有200张图像.

我们在该项目中只使用了10个猫品种.

我们在这里使用的类型是['Sphynx'(加拿大无毛猫,又称狮身人面像Cat),'Siamese'(暹罗猫),'Ragdoll'(木偶猫),'波斯人(波斯猫),'缅因浣熊(Maine-Coon),“英国短毛猫”(British shorthair),“孟买”孟买猫(孟买猫),“伯曼”(缅甸猫),“孟加拉猫”(孟加拉猫))].

因此,我们在数据集中共有2,000张图像,每张图像的大小不同. 但是我可以将它们调整为固定大小,例如64 x 64或128 x 128.

预处理

在此项目中,我们主要使用OpenCV处理图像数据,例如将图像读取到数组中并调整所需的大小.

改善图像训练结果的一种常用方法是随机变形,裁剪或增亮训练输入,其优点是可以扩大训练数据的有效大小,这是由于同一图像中所有可能的变化并有助于网络学习处理在分类器的实际使用中会出现的所有失真问题.

有关详细信息,请参阅链接: https://github.com/aleju/imgaug

评估

第一种方法:

第1部分: 对数据集进行预处理,并通过sklearn应用KNN,SVM和BP神经网络.

程序中有许多参数可以调整: 在image_to_feature_vector函数中,我们设置的大小为128x128,我们之前也尝试过使用8x8、64x64、256x256之类的大小. 因此,我们发现图像尺寸越大,精度越好. 但是,较大的图像大小也会增加执行时间和内存消耗. 因此我们最终决定图像尺寸为128x128,因为它不是太大,但同时也可以保证精度.

在extract_color_histogram函数中,我们将每个通道的bin数量设置为32、32、32. 像以前的函数一样,我们也尝试了8、8、8和64、64、64,更高的数字可以产生更高的结果,但同时也需要更长的执行时间. 因此我们认为32、32、32最合适.

对于数据集,我们尝试了三个数据集. 第一个是具有400个图像和2个标签的子数据集. 第二个是具有1000个图像和5个标签的子数据集. 最后一个是具有1997个图像和10个标签的整个数据集. 然后,我们将不同的数据集解析为程序中的参数.

在KNeiorsClassifier中,我们仅更改了邻居数,并将结果存储为每个数据集的最佳K. 然后初始化我们设置为默认值的所有其他参数.

在MLPClassifier中,我们用50个神经元设置了一个隐藏层. 我们测试了多个隐藏层,但最终结果似乎并没有太大变化. 最大迭代时间为1000,公差为1e-4,以确保收敛. L2惩罚参数α设置为默认值,随机状态为1,求解器为“ sgd”,学习率为0.1.

在SVC中,最大迭代时间为1000,并且类别权重值为“平衡”.

我们程序的运行时间不是很长,从2个标签数据集到10个标签数据集大约需要3到5分钟.

第二种方法:

使用TensorFlow构建CNN.

计算模型的梯度需要花费很长时间,因为该模型使用了整个大型数据集. 因此,我们在优化程序的每次迭代中仅使用少量图像. 批量大小通常为32或64. 数据集分为包含1600张图像的训练集,包含400张图像的验证集和包含300张图像的测试集.

图像特征提取算法代码_图像特征识别_图像识别算法代码

有很多参数可以调整.

首先是学习率. 只要它小到可以收敛并且大到不使程序变得太慢,仍然很容易找到一个好的学习率. 我们选择1×10 ^ -4.

第二个是我们提供给网络的图像的大小. 我们尝试了64 * 64和128 *128. 事实证明,图像越大,获得的精度越高,但是会增加运行时间.

然后是图层及其形状. 但是实际上有太多可以调整的参数,因此要找到这些参数的最佳值是非常困难的工作.

根据Internet上的许多资源,我们了解到,用于建立网络的参数的选择几乎取决于经验.

首先,我们尝试构建一个相对复杂的网络,参数如下:

我们使用3个卷积层和2个完全连接的层,它们相对复杂.

但是,结果是过度拟合. 只有经过一千次迭代,我们的程序才能获得100%的训练精度,而只有30%的测试精度. 起初,我很困惑为什么我们得到了过度拟合的结果,我尝试随机调整参数,但结果却从未得到改善. 几天后,我偶然看到了一篇有关中国研究人员进行的深度学习项目的文章(@ blaisea / physiognomys-new-clothes-f2d4b59fdd6a). 他们指出,他们进行的研究存在问题. “一个技术问题是您想训练和测试像AlexNet这样的CNN,结果不会过拟合. 仅使用少于2,000个示例是不够的. ”因此,我此时意识到,首先,我们的数据集实际上很小,其次,我们的网络太复杂了.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-194776-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...