主要内容

基于深度学习的图像分类

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

概述

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

在本例中,来自Flowers数据集[5]的图像使用多类线性支持向量机分类,使用从图像中提取的CNN特征进行训练。这种图像分类方法遵循标准做法,即使用从图像中提取的特征训练现成的分类器。例如,基于特征包的图像分类示例使用一个特征包框架中的SURF特征来训练多类支持向量机。不同之处在于,它不是使用HOG或SURF等图像特征,而是使用CNN提取特征。

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

强烈推荐使用支持cuda的NVIDIA™GPU来运行本示例。使用GPU需要使用并行计算工具箱™。有关支持的计算能力的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱)

下载图像数据

类别分类器将根据来自Flowers数据集[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);%使用splitEachLabel方法修剪集合。imds = splitachlabel (imds, minSetCount,“随机”);%注意,现在每个集合有完全相同的图像数量。countEachLabel (imd)
ans =5×2表标签数__________ _____雏菊100蒲公英100朵玫瑰100朵向日葵100朵郁金香100朵

负载pretrained网络

有几个预先训练过的网络受到了欢迎。其中大多数已经在ImageNet数据集上进行了训练,该数据集有1000个对象类别和120万张训练图像[1]。“ResNet-50”就是这样一个模型,可以使用resnet50函数来自Neural Network Toolbox™。使用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 dataugmentation: 'none' NormalizationDimension: 'auto' Mean: [224×224×3 single]

中间层构成了CNN的大部分。这是一系列卷积层,点缀着整流线性单元(ReLU)和最大池化层[2]。接下来是3个完全连通的层。

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

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

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

准备训练和测试图像集

将集合分割为训练和验证数据。从每组图像中选取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提取的特征在图像识别任务中如此有效。注意,可以使用下面的方法来实现更深层次权重的可视化特性deepDreamImage来自深度学习工具箱™。

%得到第二层卷积层的网络权值w1 = net.Layers (2) .Weights;%缩放权重并调整其大小以实现可视化w1 = mat2gray (w1);w1 = imresize (w1, 5);%显示网络权重的蒙太奇。有96组独立的%权重在第一层。图蒙太奇(w1)标题(“第一个卷积层权重”

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

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

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

需要注意的是,激活功能会自动使用GPU进行处理,否则会使用CPU。

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

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

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

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

评估分类器

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

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

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

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

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

利用CNN提取图像特征。

%创建augmentedImageDatastore来自动调整图像的大小%图像特征提取使用激活。ds = augmentedImageDatastore(imageSize, testestimate,“ColorPreprocessing”“gray2rgb”);%使用CNN提取图像特征imageFeatures =激活(net, ds, featureLayer,“OutputAs”“列”);

使用分类器进行预测。

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

参考文献

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

[2] Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。用深度卷积神经网络进行图像网络分类神经信息处理系统的进展。2012.

[3] Simonyan, Karen和Andrew Zisserman。“用于大规模图像识别的非常深度卷积网络”。

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

[5] Tensorflow:如何为新类别重新训练图像分类器

另请参阅

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

相关的话题