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

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

概述

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

在这个例子中,来自Flowers数据集[5]的图像通过使用从图像中提取的CNN特征训练的多类线性SVM进行分类。这种图像分类方法遵循了使用从图像中提取的特征训练现成分类器的标准做法。例如,利用特征包进行图像分类示例使用SURF特征包框架内训练多类支持向量机。这里的区别是,不是使用像HOG或SURF这样的图像特征,而是使用CNN来提取特征。

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

强烈建议使用计算能力为3.0或更高的支持cuda的NVIDIA™GPU运行本示例。使用GPU需要并行计算工具箱™。

下载图像数据

类别分类器将来自一个数据集的花[5]的图像进行训练。

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

注:数据的下载时间取决于你的互联网连接。下一组命令的使用MATLAB来下载数据,并会阻止MATLAB。另外,您也可以使用Web浏览器对数据集先下载到本地磁盘。要使用从网上下载的文件,更改上面下载的文件的位置“outputFolder”变量。

%非压缩数据组imageFolder =完整文件(downloadFolder,“flower_photos”);如果~存在(imageFolder“目录”)%只下载一次DISP(“下载花集(218 MB)......”);websave(文件名、url);解压(文件名,downloadFolder)结束

载入图像

使用加载数据集ImageDatastore来帮助您管理数据。因为ImageDatastore对图像文件位置进行操作后,图像直到读取后才加载到内存中,这使得它对于大型图像集合的使用非常有效。

IMDS = imageDatastore(imageFolder,'LABELSOURCE',“foldernames”,'IncludeSubfolders',真正的);

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

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

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

TBL = countEachLabel(IMDS)
台=5×2表标签数量__________ _____菊花633蒲公英898个玫瑰641个向日葵699个郁金香799

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

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

加载预训练网络

有迹象表明,已经得到普及的几个预训练网络。这些大部分接受过培训的ImageNet数据集,其中有1000个对象类别和120万个训练图像[1]。“RESNET-50”是一个这样的模型,并且可以使用被加载resnet50来自神经网络工具箱™的函数。使用resnet50要求您先安装resnet50

%加载预先训练好的网络净= resnet50();

上训练ImageNet其他流行网络包括AlexNet,GoogLeNet,VGG-16和VGG-19 [3],可以装载使用alexnet,googlenet,vgg16vgg19从深度学习工具箱™。

使用情节以可视化的网络。因为这是一个大的网络中,调整显示窗口只显示所述第一部分。

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

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

%检查第一层net.Layers (1)
ans = ImageInputLayer with properties: Name: 'input_1' InputSize: [224 224 3] Hyperparameters DataAugmentation: 'none' Normalization: 'zerocenter' NormalizationDimension: 'auto' Mean:[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数据集上解决一个不同的分类任务。

准备训练和测试图像集

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

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

CNN的预处理图像

正如前面所提到的,只能处理224 * 224的RGB图像。为避免将所有图像重新保存为此格式,请使用augmentedImageDatastore调整大小和转换任何灰度图像的RGB动态。的augmentedImageDatastore可用于额外的数据增强作为用于网络的训练很好时。

%从训练和测试集创建augmentedImageDatastore来调整大小在IMDS的大小%图像所需由网络。图象尺寸= net.Layers (1) .InputSize;augmentedTrainingSet = augmentedImageDatastore'ColorPreprocessing',“gray2rgb”);augmentedTestSet = augmentedImageDatastore(IMAGESIZE,测试集,'ColorPreprocessing',“gray2rgb”);

提取培训功能使用CNN

一个CNN的每一层产生的响应,或活化,以输入图像。然而,也有只适合于图像特征提取一个CNN内几层。在的网络捕获基本图像特征的开始处的层,例如边缘和斑点。看到这一点,可视化从第一卷积层网络滤波器权重。这有助于建立一个直觉,为什么从细胞神经网络提取工作这么好图像识别任务的功能。请注意,从更深一层的权重可视化功能,可以做到用deepDreamImage来自深度学习工具箱™。

%获取第2卷积层的网络权值W1 = net.Layers(2).Weights;%缩放和调整可视化的权重W1 = mat2gray(W1);W1 = imresize(w1,5);显示网络权重的蒙太奇。有96个单独的集合%重量在第一层。图蒙太奇(w1)标题(“第一卷积层的权重”)

请注意如何在网络的第一层已经学会过滤器捕捉BLOB和边缘特征。这些“原始”特征,然后通过网络更深层,其结合早期特征以形成更高级别的图像特征进行处理。这些更高级的功能更适用于识别任务,因为他们将所有的原始特征到更丰富的图像表示[4]。

属性可以轻松地从更深的层中提取特性激活方法。选择选择哪个深层的是一个设计选择,但通常与权利之前分级层是一个良好的开端层开始。在,该层命名为“fc1000”。让我们使用这一层来提取训练特性。

featureLayer ='fc1000';trainingFeatures =激活(净,augmentedTrainingSet,featureLayer,“MiniBatchSize”,32,'OutputAs',“列”);

请注意,激活自动功能使用用于处理的GPU如果有一个可用,否则,使用CPU。

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

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

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

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

评价分类

重复早先用于提取规程,从图像特征testSet。然后将测试特征传递给分类器,以衡量经过训练的分类器的准确性。

%提取物测试特征使用CNNtestFeatures =激活(净,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.8571 0.0286 0.0286 0.0714 0.0143 0.0571 0.8286 0.0571 0 0.0571 0.0143 0 0.7714 0.0714 0.1429 0.0286 0.0571 0.0571 0.8000 0.0571 0 0 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 =激活(net, ds, featureLayer,'OutputAs',“列”);

使用分类器进行预测。

%使用分类器进行预测(分类器,图像特征,'ObservationsIn',“列”)
predictedLabel =明确的黛西

参考

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

Krizhevsky, Alex, Ilya Sutskever和Geoffrey E. Hinton。用深度卷积神经网络进行Imagenet分类。Advances in neural information processing systems. 2012.

西蒙扬,凯伦和安德鲁·泽斯曼。用于大规模图像识别的非常深的卷积网络>。arXiv预印本:1409.1556(2014)。

多纳休,杰夫等人。脱咖啡因:用于一般视觉识别的深度卷积激活特性>,《arXiv》预印本:1310.1531(2013)。

[5] Tensorflow:如何重新训练一个图像分类器以获得新的分类

另请参阅

||||||||||||

相关话题