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

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

加载数据

解压缩并加载示例图像作为图像数据存储。imageDatastore根据文件夹名称自动标记图像,并将数据存储为ImageDatastore对象。图像数据存储允许存储大型图像数据,包括无法装入内存的数据。将数据分成70%的训练数据和30%的测试数据。

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

现在有55个训练图像和20个验证图像在这个非常小的数据集。显示一些样本图像。

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

加载预训练网络

加载一个预训练的RESNET-18网络。如果深度学习工具箱型号ResNet-18网络万博1manbetx支持包没有安装,那么该软件提供了下载链接。RESNET-18训练上超过一百万的图像,并可以将图像分为1000个对象的类别,如键盘,鼠标,笔,和许多动物。其结果是,该模型已经学会了丰富的功能表示为各种图像。

净= resnet18
净= DAGNetwork与属性:层:[71x1 nnet.cnn.layer.Layer]连接:[78x2表] InputNames:{ '数据'} 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
名称大小字节类属性featuresTrain 55x512 112640单

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

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

适合图像分类器

利用从训练图像中提取的特征作为预测变量,拟合一个多类支持向量机万博1manbetxfitcecoc(统计和机器学习工具箱)。

分类器= fitcecoc (featuresTrain YTrain);

分类测试图片

利用从测试图像中提取的特征,使用经过训练的SVM模型对测试图像进行分类。

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

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

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

算上测试集的分类精度。准确性是标签,网络正确地预测分数。

准确度=均值(YPred == YTest)
精度= 1

基于较浅特征的训练分类器

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

层=“res3b_relu”;featuresTrain =激活(净、augimdsTrain层);featuresTest =激活(净、augimdsTest层);谁featuresTrain
名称大小字节类属性featuresTrain 28x28x128x55 22077440单

在本实施例的第一部分中使用所提取的特征合并在由全局池层中的所有空间位置。在早期的层中提取特征时达到相同的结果,手动平均值所有空间位置的激活。为了获取表单上的功能N-通过-C,在那里N是观测值的数量和C是特性的数量,去除单维和转置。

featuresTrain =挤压(平均值(featuresTrain,[1 2]))';featuresTest =挤压(平均值(featuresTest,[1 2]))';谁featuresTrain
名称大小字节类属性featuresTrain 55x128 28160单

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

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

两种svm都具有较高的精度。如果使用特征提取的准确率不够高,那么可以尝试迁移学习。例如,请参阅火车深学习网络分类新形象。对于名单和预训练的网络比较,看预训练深层神经网络

另请参阅

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

相关话题