基于深度学习的图像分类
这个例子展示了如何使用预先训练的卷积神经网络(CNN)作为特征提取器来训练图像分类器。
概述
卷积神经网络(CNN)是深度学习领域的一种强大的机器学习技术。cnn使用大量不同的图像集合进行训练。从这些大型集合中,cnn可以学习到广泛图像的丰富特征表示。这些特征表示通常优于手工制作的特征,如HOG、LBP或SURF。利用CNN的强大功能的一种简单方法是使用预先训练的CNN作为特征提取器,而不需要投入时间和精力进行培训。
在本例中,使用从图像中提取的CNN特征训练的多类线性支持向量机将Flowers数据集[5]中的图像分类。这种图像分类方法遵循从图像中提取特征来训练现成分类器的标准实践。例如,利用特征袋进行图像分类示例使用特征包框架中的SURF特征来训练多类支持向量机。不同之处在于,这里不是使用HOG或SURF等图像特征,而是使用CNN提取特征。
注意:本示例需要深度学习工具箱™、统计和机器学习工具箱™和深度学习工具箱™模型ResNet-50网络.
强烈建议使用支持cuda的NVIDIA™GPU来运行这个示例。使用GPU需要并行计算工具箱™。有关支持的计算功能的信息,请参见GPU计算的需求(并行计算工具箱).
下载图像数据
类别分类器将根据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 (“正在下载花卉数据集(218 MB)…”);websave(文件名、url);解压(文件名,downloadFolder)结束
加载图片
方法加载数据集ImageDatastore
帮助您管理数据。因为ImageDatastore
操作图像文件位置,图像在读取之前不会加载到内存中,这使得它可以有效地用于大型图像集合。
imd = imageDatastore (imageFolder,“LabelSource”,“foldernames”,“IncludeSubfolders”,真正的);
下面,您可以看到来自数据集中包含的一个类别的示例图像。显示的图像为马里奥.
为每个类别找到图像的第一个实例黛西=找到(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 = splitEachLabel(imds, 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],它们可以使用alexnet
,googlenet
,vgg16
,vgg19
从深度学习工具箱™。
使用情节
把网络可视化。因为这是一个很大的网络,所以调整显示窗口,只显示第一部分。
想象网络的第一部分。图绘制(净)标题(ResNet-50的第一部分甘氨胆酸)组(,“YLim”170年[150]);
第一层定义输入维度。每个CNN都有不同的输入大小要求。本例中使用的方法需要224 × 224 × 3的图像输入。
检查第一层net.Layers (1)
名称:'input_1' InputSize: [224 224 3] Hyperparameters DataAugmentation: 'none'归一化:'zerocenter' NormalizationDimension: 'auto'含义:[224×224×3 single]
中间层构成了CNN的大部分。这是一系列卷积层,中间穿插着整流线性单元(ReLU)和最大池化层[2]。在这些层之后是3个完全连接的层。
最后一层是分类层,它的属性取决于分类任务。在这个例子中,加载的CNN模型被训练来解决一个1000种分类问题。因此,分类层有来自ImageNet数据集的1000个类。
检查最后一层net.Layers(结束)
类:[1000×1 categorical] OutputSize: 1000 Hyperparameters LossFunction: 'crossentropyex'
ImageNet分类任务的类名的数量元素个数(net.Layers(结束).ClassNames)
ans = 1000
注意,CNN模型不会用于原始的分类任务。它将被重新使用,以解决Flowers Dataset上的一个不同的分类任务。
准备训练和测试图像集
将数据集分成训练数据和验证数据。从每组图像中选取30%作为训练数据,其余70%作为验证数据。随机分割以避免结果的偏差。训练集和测试集将由CNN模型处理。
[trainingSet, testSet] = splitEachLabel(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”;(net, augmentedTrainingSet, featureLayer,...“MiniBatchSize”32岁的“OutputAs”,“列”);
注意:激活功能会自动使用GPU进行处理,否则使用CPU。
在上面的代码中,'MiniBatchSize'被设置为32,以确保CNN和图像数据适合GPU内存。如果你的GPU内存不足,你可能需要降低“MiniBatchSize”。此外,激活输出按列排列。这有助于加快接下来的多类线性支持向量机训练。
利用CNN特征训练多类支持向量机分类器
接下来,使用CNN图像特征训练多类SVM分类器。一个快速的随机梯度下降求解器被用于训练设置fitcecoc
函数的' learner '参数设置为'Linear'。这有助于在处理高维CNN特征向量时加速训练。
从trainingSet中获取训练标签trainingLabels = trainingSet.Labels;训练多类支持向量机分类器使用快速线性求解器,并设置'ObservationsIn'到'columns'以匹配用于训练的排列%的特性。分类器= fitcecoc(trainingFeatures, trainingLabels,...“学习者”,“线性”,“编码”,“onevsall”,“ObservationsIn”,“列”);
评估分类器
重复前面用于提取图像特征的过程testSet
.然后,可以将测试特征传递给分类器,以度量经过训练的分类器的准确性。
使用CNN提取测试特征testFeatures =激活(net, augmentedTestSet, featureLayer,...“MiniBatchSize”32岁的“OutputAs”,“列”);将CNN图像特征传递给训练有素的分类器。predictedLabels = predict(分类器,testFeatures,“ObservationsIn”,“列”);获取已知的标签testLabels = testSet.Labels;使用混淆矩阵将结果制成表格。confMat = confemat (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.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以自动调整图像的大小%的图像特征提取使用激活。ds = augmentedImageDatastore(imageSize, testImage,“ColorPreprocessing”,“gray2rgb”);%提取图像特征使用CNNimageFeatures = activation (net, ds, featureLayer,“OutputAs”,“列”);
使用分类器进行预测。
使用分类器进行预测。predictedLabel = predict(分类器,imageFeatures,“ObservationsIn”,“列”)
predictedLabel =分类黛西
参考文献
[1]邓佳,等。Imagenet:一个大规模的分级图像数据库。计算机视觉与模式识别,2009。CVPR 2009。IEEE会议。IEEE 2009。
Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。"用深度卷积神经网络进行图像网络分类"神经信息处理系统的进展。2012.
Simonyan, Karen和Andrew Zisserman。“用于大规模图像识别的非常深度卷积网络”,arXiv预印本:1409.1556(2014)。
[4]多纳休、杰夫等人。《Decaf:一种用于通用视觉识别的深度卷积激活特征》,arXiv预印本:1310.1531(2013)。
[5] Tensorflow:如何为新类别重新训练图像分类器.
另请参阅
alexnet
(深度学习工具箱)|countEachLabel
|imageInputLayer
(深度学习工具箱)|convolution2dLayer
(深度学习工具箱)|reluLayer
(深度学习工具箱)|maxPooling2dLayer
(深度学习工具箱)|classificationLayer
(深度学习工具箱)|fullyConnectedLayer
(深度学习工具箱)|激活
(深度学习工具箱)|预测
(深度学习工具箱)|deepDreamImage
(深度学习工具箱)|fitcecoc
(统计和机器学习工具箱)|confusionmat
(统计和机器学习工具箱)
相关的话题
- 利用特征袋进行图像分类
- MATLAB中的深度学习(深度学习工具箱)
- 预训练深度神经网络(深度学习工具箱)