主要内容

基于深度学习的图像分类

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

概述

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

在本例中,使用从图像中提取的CNN特征训练的多类线性SVM将来自Flowers数据集[5]的图像分类。这种图像类别分类方法遵循使用从图像中提取的特征来训练现成分类器的标准实践。例如,使用特征袋进行图像分类示例使用特征袋框架中的SURF特征来训练多类SVM。这里的不同之处在于,不是使用HOG或SURF等图像特征,而是使用CNN提取特征。

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

强烈建议使用支持cuda的NVIDIA™GPU来运行此示例。GPU的使用需要并行计算工具箱™。有关受支持的计算功能的信息,请参见万博1manbetxGPU计算要求(并行计算工具箱)

下载图像数据

分类分类器将在Flowers数据集[5]中的图像上进行训练。

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

注:资料下载时间视乎阁下的互联网连接而定。下一组命令使用MATLAB下载数据,并将阻塞MATLAB。或者,您可以使用web浏览器先将数据集下载到本地磁盘。要使用你从网上下载的文件,将上面的“outputFolder”变量更改为下载文件的位置。

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

加载图片

类加载数据集ImageDatastore帮助您管理数据。因为ImageDatastore操作图像文件位置,图像直到读取才加载到内存中,这使得它可以有效地用于大型图像集合。

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

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

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

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

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

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

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

负载预训练网络

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

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

其他在ImageNet上训练的流行网络包括AlexNet, GoogLeNet, vg -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]超参数DataAugmentation: 'none'归一化:'zerocenter' NormalizationDimension: 'auto' Mean: [224×224×3 single]

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

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

检查最后一层net.Layers(结束)
ans = ClassificationOutputLayer与属性:名称:'ClassificationLayer_fc1000'类:[1000×1 categorical] OutputSize: 1000超参数LossFunction: 'crossentropyex'
用于ImageNet分类任务的类名的百分比元素个数(net.Layers(结束).ClassNames)
Ans = 1000

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

准备训练和测试图像集

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

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

CNN的预处理图像

如前所述,只能处理224 * 224的RGB图像。要避免将所有图像重新保存为此格式,请使用augmentedImageDatastore调整大小,并将任何灰度图像转换为RGB实时。的augmentedImageDatastore当用于网络训练时,也可以用于额外的数据增强。

从训练集和测试集创建augmentedimagedastore以调整大小将imds中的%映像设置为网络所需的大小。imageSize = net.Layers(1).InputSize;augmentedTrainingSet = augmenteddimagedatastore (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,激活函数将自动使用GPU进行处理,否则将使用CPU。

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

使用CNN特征训练一个多类SVM分类器

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

从trainingSet中获取训练标签trainingLabels = trainingSet.Labels;使用快速线性求解器训练多类SVM分类器,并设置'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 = confusimat (testLabels, predictedLabels);将混淆矩阵转换为百分比形式= 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.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”);使用CNN提取图像特征imageFeatures =激活(net, ds, featureLayer,“OutputAs”“列”);

使用分类器进行预测。

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

参考文献

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

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

Simonyan, Karen, Andrew Zisserman。“用于大规模图像识别的非常深度卷积网络”arXiv预印本arXiv:1409.1556(2014)。

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

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

另请参阅

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

相关的话题