这个例子展示了如何使用预先训练的卷积神经网络(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朵
有几个预先训练过的网络受到了欢迎。其中大多数已经在ImageNet数据集上进行了训练,该数据集有1000个对象类别和120万张训练图像[1]。“ResNet-50”就是这样一个模型,可以使用resnet50
函数来自Neural Network Toolbox™。使用resnet50
要求您首先安装resnet50
(深度学习工具箱).
%负载预训练网络网= resnet50 ();
接受ImageNet培训的其他流行网络包括AlexNet、GoogLeNet、VGG-16和VGG-19[3],可以使用alexnet
,googlenet
,vgg16
,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,“随机”);
正如前面所提到的,净
只能处理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提取的特征在图像识别任务中如此有效。注意,可以使用下面的方法来实现更深层次权重的可视化特性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分类器。采用快速随机梯度下降求解器进行训练,通过设置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:如何为新类别重新训练图像分类器.
alexnet
(深度学习工具箱)|countEachLabel
|imageInputLayer
(深度学习工具箱)|convolution2dLayer
(深度学习工具箱)|reluLayer
(深度学习工具箱)|maxPooling2dLayer
(深度学习工具箱)|classificationLayer
(深度学习工具箱)|fullyConnectedLayer
(深度学习工具箱)|激活
(深度学习工具箱)|预测
(深度学习工具箱)|deepDreamImage
(深度学习工具箱)|fitcecoc
(统计学和机器学习工具箱)|confusionmat
(统计学和机器学习工具箱)