主要内容

利用预训练网络提取图像特征

这个例子展示了如何从预先训练的卷积神经网络中提取学习到的图像特征,并使用这些特征来训练图像分类器。特征提取是利用预先训练的深度网络的表征能力的最简单和最快的方法。例如,您可以使用以下方法训练支持向量机(SVM)金宝appfitcecoc(Statistics and Machine Learning Toolbox™)。因为特征提取只需要对数据进行一次遍历,所以如果你没有GPU来加速网络训练,这是一个很好的起点。

加载数据

将示例图像解压并作为图像数据存储加载。imageDatastore自动标签的图像基于文件夹名称和存储数据作为ImageDatastore对象。图像数据存储允许存储大的图像数据,包括内存中不合适的数据。将数据分成70%的训练数据和30%的测试数据。

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”“IncludeSubfolders”,真的,“LabelSource”“foldernames”);[imdsTrain, imdsTest] = splitEachLabel (imd, 0.7,“随机”);

现在在这个很小的数据集中有55张训练图像和20张验证图像。显示一些示例图像。

numTrainImages =元素个数(imdsTrain.Labels);idx = randperm (numTrainImages 16);数字i = 1:16 subplot(4,4,i) i = readimage(imdsTrain,idx(i));imshow(我)结束

图中包含16个轴对象。axis对象1包含一个image类型的对象。axis对象2包含一个image类型的对象。axis对象3包含一个image类型的对象。axis对象4包含一个image类型的对象。axis对象5包含一个类型为image的对象。axis对象6包含一个image类型的对象。axis对象7包含一个image类型的对象。axis对象8包含一个image类型的对象。axis对象9包含一个image类型的对象。 Axes object 10 contains an object of type image. Axes object 11 contains an object of type image. Axes object 12 contains an object of type image. Axes object 13 contains an object of type image. Axes object 14 contains an object of type image. Axes object 15 contains an object of type image. Axes object 16 contains an object of type image.

负载Pretrained网络

加载预训练的ResNet-18网络。如果是深度学习工具箱模型ResNet-18网络金宝app支持包未安装,则软件提供下载链接。ResNet-18可以训练超过100万幅图像,并可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。因此,该模型学习了丰富的特征表示范围广泛的图像。

网= resnet18
net = DAGNetwork with properties: Layers: [71x1 net.cnn.layer. layer] Connections: [78x2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_predictions'}

分析网络架构。第一层,图像输入层,要求输入尺寸为224 × 224 × 3的图像,其中3是彩色通道的数量。

inputSize = net.Layers (1) .InputSize;analyzeNetwork(净)

提取图像特征

网络需要大小为224 × 224 × 3的输入图像,但是图像数据存储中的图像大小不同。要在将训练和测试图像输入到网络之前自动调整其大小,请创建扩展的图像数据存储,指定所需的图像大小,并使用这些数据存储作为输入参数激活

augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);augimdsTest = augmentedImageDatastore (inputSize (1:2), imdsTest);

该网络构建了输入图像的层次表示。较深的层包含使用较早层的较低层次特性构造的较高层次特性。要获得训练和测试图像的特征表示,使用激活在全局池化层,“pool5”,在网络的末端。全局池化层将所有空间位置的输入特征汇集在一起,总共提供512个特征。

层=“pool5”;featuresTrain =激活(净、augimdsTrain层,“OutputAs”“行”);featuresTest =激活(净、augimdsTest层,“OutputAs”“行”);谁featuresTrain
名称大小字节类属性特性55x512 112640单

从训练和测试数据中提取类标签。

YTrain = imdsTrain.Labels;欧美= imdsTest.Labels;

适合图像分类器

利用从训练图像中提取的特征作为预测变量,拟合出多类支持向量机金宝appfitcecoc统计学和机器学习工具箱。

分类器= fitcecoc (featuresTrain YTrain);

测试图像进行分类

利用从测试图像中提取的特征,使用训练过的支持向量机模型对测试图像进行分类。

YPred =预测(分类器,featuresTest);

显示四个样本测试图像与他们的预测标签。

Idx = [1 5 10 15];数字i = 1:numel(idx) subplot(2,2,i) i = readimage(imdsTest,idx(i));标签= YPred (idx (i));imshow (I)标题(char(标签)结束

图中包含4个轴对象。标题为MathWorks Cap的轴对象1包含一个类型为image的对象。标题为MathWorks Cube的轴对象2包含一个类型为image的对象。标题为MathWorks Playing Cards的轴对象3包含一个类型为image的对象。标题为MathWorks螺丝刀的轴对象4包含一个类型为image的对象。

计算测试集上的分类精度。准确率是网络正确预测标签的比例。

精度=平均值(YPred == YTest)
精度= 1

基于浅特征的训练分类器

您还可以从网络中较早的一层提取特征,并根据这些特征训练分类器。较早的层通常提取较少、较浅的特征,具有较高的空间分辨率,激活总数较大。提取特征“res3b_relu”层。这是最后一层,输出128个特征,激活的空间大小为28乘28。

层=“res3b_relu”;featuresTrain =激活(净、augimdsTrain层);featuresTest =激活(净、augimdsTest层);谁featuresTrain
Name Size Bytes Class Attributes feature

本例第一部分中使用的提取特征由全局池化层在所有空间位置上池化。为了在较早的层中提取特征时获得相同的结果,手动对所有空间位置上的激活进行平均。来获取表单上的特征N——- - - - - -C,在那里N观察的次数是多少C为特征个数,去掉单维并进行转置。

featuresTrain = squeeze(mean(featuresTrain,[1 2]))';featuresTest = squeeze(mean(featuresTest,[1 2]))';谁featuresTrain
名称大小字节类属性特征55x128 28160单

在较浅的特征上训练SVM分类器。计算测试精度。

分类器= fitcecoc (featuresTrain YTrain);YPred =预测(分类器,featuresTest);精度=平均值(YPred == YTest)
精度= 0.9500

两种训练的支持向量机都具有较高的精度。如果使用特征提取的准确率不够高,那么可以尝试迁移学习。例如,请参见训练深度学习网络对新图像进行分类.有关预先训练的网络的列表和比较,请参见预先训练的深度神经网络

另请参阅

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

相关的话题