主要内容

利用深度学习进行图像类别分类

这个例子展示了如何使用预处理卷积神经网络(CNN)作为特征提取器来训练图像类别分类器。

概述

卷积神经网络(Convolutional Neural Network, CNN)是深度学习领域的一种强大的机器学习技术。cnn使用大量不同的图像集合进行训练。从这些大的集合,cnn可以学习丰富的特征代表广泛的图像。这些功能表现通常优于手工制作的功能,如HOG、LBP或SURF。利用CNN的力量的一个简单的方法是使用预先训练过的CNN作为特征提取器,而无需投入时间和精力进行训练。

在这个例子中,来自Flowers Dataset[5]的图像使用多类线性支持向量机分类,并从图像中提取CNN特征。这种图像类别分类的方法遵循了使用从图像中提取的特征训练现成分类器的标准实践。例如,利用特征包进行图像类别分类example使用一个特征框架包中的SURF特征来训练一个多类SVM。这里的不同之处在于,不是使用HOG或SURF等图像特征,而是使用CNN来提取特征。

注意:此示例需要深度学习工具箱™、统计和机器学习工具箱™和深度学习工具箱™模型ResNet-50网络

强烈建议使用支持cuda的NVIDIA™GPU运行此示例。使用GPU需要使用并行计算工具箱™。有关支持的计算功能的信息,请参见金宝app各版本的金宝appGPU支持(并行计算工具箱)

下载图像数据

分类器将对来自Flowers Dataset[5]的图像进行训练。

%压缩数据集的位置url =“http://download.tensorflow.org/example_images/flower_photos.tgz”将输出存储在一个临时文件夹中downloadFolder = tempdir;文件名= fullfile (downloadFolder,“flower_dataset.tgz”);

注意:数据的下载时间取决于你的互联网连接。下一组命令使用MATLAB下载数据并将MATLAB块。或者,您可以使用web浏览器先将数据集下载到本地磁盘。要使用从网上下载的文件,请将上面的'outputFolder'变量更改为下载文件的位置。

%未压缩数据集imageFolder = fullfile (downloadFolder,“flower_photos”);如果~存在(imageFolder“dir”%只下载一次disp (下载花卉数据集(218mb)…);websave(文件名、url);解压(文件名,downloadFolder)结束

加载图片

方法加载数据集ImageDatastore来帮助您管理数据。因为ImageDatastore对图像文件位置进行操作,图像在读取之前不会加载到内存中,这使得它可以有效地用于大型图像集合。

imd = imageDatastore (imageFolder,“LabelSource”“foldernames”“IncludeSubfolders”,真正的);

下面,您可以看到数据集中包含的其中一个类别的示例图像。显示的图像为by马里奥

找到每个类别的第一个图像实例黛西=找到(imd)。标签= =“黛西”1);黛西图imshow (readimage (imd))

洛桑国际管理发展学院变量现在包含图像和与每个图像相关联的类别标签。标签是根据图像文件的文件夹名称自动分配的。使用countEachLabel来总结每个类别的图像数量。

台= countEachLabel (imd)
台=5×2表标签数__________ _____雏菊633朵蒲公英898朵玫瑰641朵向日葵699朵郁金香799朵

因为洛桑国际管理发展学院上面每个类别包含的图像数量是不相等的,让我们先对它进行调整,使训练集中的图像数量平衡。

确定一个类别中最小的图像数量minSetCount = min(台{:2});%限制图像的数量,以减少所需的时间%运行此示例。maxNumImages = 100;minSetCount = min (maxNumImages minSetCount);%使用splitachlabel方法修剪集合。imds = splitachlabel (imds, minSetCount, minSetCount)“随机”);注意,每个集合现在有完全相同数量的图像。countEachLabel (imd)
ans =5×2表标签数__________ _____雏菊100朵蒲公英100朵玫瑰100朵向日葵100朵郁金香100朵

负载pretrained网络

有几个经过预先训练的网络已经变得流行起来。其中大部分都是在ImageNet数据集上训练的,该数据集有1000个对象类别和120万训练图像[1]。“ResNet-50”就是这样一个模型,可以使用resnet50功能从神经网络工具箱™。使用resnet50要求您首先安装resnet50(深度学习工具箱)

%加载预训练网络网= resnet50 ();

其他在ImageNet上训练过的流行网络包括AlexNet, GoogLeNet, VGG-16和VGG-19[3],它们可以使用alexnetgooglenetvgg16,vgg19来自深度学习工具箱™。

使用情节使网络形象化。因为这是一个大型网络,所以调整显示窗口以只显示第一部分。

可视化网络的第一部分。图绘制(净)标题(ResNet-50第一部分甘氨胆酸)组(,“YLim”170年[150]);

第一层定义输入维度。每个CNN都有不同的输入大小要求。本例中使用的方法要求图像输入为224乘224乘3。

%检查第一层net.Layers (1)
ans = ImageInputLayer with properties: Name: 'input_1' InputSize: [224 224 3] Hyperparameters DataAugmentation: 'none'归一化:' zercenter ' NormalizationDimension: 'auto' Mean: [224×224×3 single]

中间层构成了CNN的主要部分。这是一系列卷积层,中间穿插着精整线性单元(ReLU)和最大池层[2]。在这些层之后是3个完全连接的层。

最后一层是分类层,其属性取决于分类任务。在这个例子中,加载的CNN模型被训练来解决一个1000路分类问题。因此,分类层有来自ImageNet数据集的1000个类。

检查最后一层net.Layers(结束)
ans = ClassificationOutputLayer with properties: Name: 'ClassificationLayer_fc1000' class: [1000×1 category] OutputSize: 1000 Hyperparameters LossFunction: ' crosssentropyex '
% ImageNet分类任务的类名数量元素个数(net.Layers(结束).ClassNames)
ans = 1000

注意,CNN模型不会用于原始的分类任务。它将被重新用于解决花卉数据集上的一个不同的分类任务。

准备训练和测试图像集

将集合分成训练数据和验证数据。从每组图像中选取30%作为训练数据,其余70%作为验证数据。随机拆分以避免结果的偏差。训练集和测试集将通过CNN模型进行处理。

[trainingSet, testSet] = splitachlabel (imds, 0.3,“随机”);

为CNN预处理图像

正如前面所提到的,只能处理224乘224的RGB图像。若要避免将所有图像重新保存为这种格式,请使用augmentedImageDatastore调整大小,并将任何灰度图像转换为RGB动态。的augmentedImageDatastore可以用于额外的数据增强,以及当用于网络培训。

%从训练集和测试集创建扩展的dimagedatastore以调整大小% imds中图像的大小为网络所需的大小。图象尺寸= net.Layers (1) .InputSize;augmentedTrainingSet = augmentedImageDatastore(imageSize, trainingSet,“ColorPreprocessing”“gray2rgb”);augmentedTestSet = augmentedImageDatastore(imageSize, testSet,“ColorPreprocessing”“gray2rgb”);

使用CNN提取训练特征

CNN的每一层都对输入图像产生响应或激活。然而,在CNN中只有少数几个层适合图像特征提取。网络开始的层捕获基本的图像特征,如边缘和斑点。为了看到这一点,可以从第一卷积层看到网络过滤器权重。这有助于建立一种直觉,即为什么从cnn提取的特征在图像识别任务中如此有效。注意,可以使用下面的方法来实现更深层次权重的可视化特性deepDreamImageDeep Learning Toolbox™。

%获取第二个卷积层的网络权值w1 = net.Layers (2) .Weights;%缩放和调整权重的可视化w1 = mat2gray (w1);w1 = imresize (w1, 5);显示网络权重的蒙太奇。有96套独立的%权重在第一层。图蒙太奇(w1)标题('First convolutional layer weights'

注意网络的第一层是如何学习捕捉斑点和边缘特征的过滤器的。然后,这些“原始”特征被更深层次的网络层处理,这些网络层将早期特征结合起来,形成更高层次的图像特征。这些高级特征更适合于识别任务,因为它们将所有基本特征组合成更丰富的图像表示[4]。

控件可以轻松地从一个更深的层中提取特性激活方法。选择要选择的深层层是一种设计选择,但通常从分类层之前的层开始是一个很好的开始。在,这个图层被命名为fc1000。让我们使用该层提取训练特征。

featureLayer =“fc1000”;trainingFeatures =激活(net, augmentedTrainingSet, featureLayer,...“MiniBatchSize”32岁的“OutputAs”“列”);

注意,激活功能自动使用GPU进行处理,如果有可用的GPU,否则使用CPU。

在上面的代码中,“MiniBatchSize”设置为32,以确保CNN和图像数据适合GPU内存。如果你的GPU耗尽内存,你可能需要降低“MiniBatchSize”。而且,激活输出被安排为列。这有助于加速随后的多类线性支持向量机训练。

利用CNN特征训练多类SVM分类器

接下来,利用CNN图像特征训练一个多类SVM分类器。一个快速的随机梯度下降求解器被用来训练通过设置fitcecoc函数的“学习者”参数改为“线性”。这有助于在使用高维CNN特征向量时加速训练。

%从trainingSet中获取训练标签trainingLabels = trainingSet.Labels;%使用快速线性求解器训练多类SVM分类器,并设置% 'ObservationsIn'到'columns'以匹配用于培训的安排%的特性。分类器= fitcecoc(trainingFeatures, trainingLabels,...“学习者”“线性”“编码”“onevsall”“ObservationsIn”“列”);

评估分类器

重复前面提取图像特征的过程testSet.然后,测试特征可以传递给分类器,以衡量训练分类器的准确性。

%使用CNN提取测试特征testFeatures = activations(net, augmentedTestSet, featureLayer,...“MiniBatchSize”32岁的“OutputAs”“列”);%将CNN图像特征传递给训练的分类器predictedLabels = predict(分类器,testFeatures,“ObservationsIn”“列”);%获取已知的标签testLabels = testSet.Labels;使用混淆矩阵将结果制成表格。confMat = confusionmat(testLabels, predictedLabels);将混淆矩阵转换为百分比形式confMat = bsxfun (@rdivide confMat, sum (confMat, 2))
confMat =5×50.08571 0.0286 0.0714 0.0143 0.0571 0.8286 0 0.0571 0.0571 0.0143 0 0.7714 0.0714 0.1429 0.0286 0.0571 0.0571 0.0571 0.8000 0.0571 00 0.2000 0.0286 0.7714
%显示平均精度意思是(诊断接头(confMat))
ans = 0.8057

将训练好的分类器应用到一幅测试图像上

应用训练好的分类器对新图像进行分类。阅读“雏菊”测试图像之一。

testImage = readimage (testSet, 1);testLabel = testSet.Labels (1)
testLabel =分类黛西

使用CNN提取图像特征。

%创建augmentedImageDatastore以自动调整映像大小时%图像特征提取使用激活。增强的数据存储(imageSize, teestimage,“ColorPreprocessing”“gray2rgb”);%使用CNN提取图像特征imageFeatures =激活(net, ds, featureLayer,“OutputAs”“列”);

使用分类器进行预测。

使用分类器进行预测predictedLabel = predict(分类器,imageFeatures,“ObservationsIn”“列”
predictedLabel =分类黛西

参考文献

邓,贾等。Imagenet:一个大规模的分层图像数据库。计算机视觉与模式识别,2009。CVPR 2009。IEEE会议。IEEE 2009。

Krizhevsky, Alex, Ilya Sutskever,和Geoffrey E. Hinton。“图像分类与深度卷积神经网络。”神经信息处理系统进展。2012.

西蒙尼安,凯伦,还有安德鲁·齐瑟曼。“用于大规模图像识别的非常深度卷积网络”。

多纳休、杰夫等人。Decaf:一种用于通用视觉识别的深度卷积激活特征>,arXiv预印本arXiv:1310.1531(2013)。

[5] Tensorflow:如何再培训一个图像分类器的新类别

另请参阅

(深度学习工具箱)||(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(统计和机器学习工具箱)|(统计和机器学习工具箱)

相关的话题