主要内容

基于小波散射的数字分类

这个例子展示了如何使用小波散射进行图像分类。这个例子需要小波工具箱™、深度学习工具箱™和并行计算工具箱™。

对于分类问题,通常有用的方法是将数据映射到一些替代表示,丢弃不相关的信息,同时保留每个类的判别属性。小波图像散射构造了对平移和小变形不敏感的低方差图像表示。由于图像中的平移和小变形不会影响类成员关系,散射变换系数提供了可以构建健壮分类模型的特征。

小波散射的工作原理是通过一系列小波变换、非线性和平均[1][3][4]级联图像。结果是特征提取是在散射变换表示中,同一类别的图像彼此移动得更近,而属于不同类别的图像之间移动得更远。虽然小波散射变换与深度卷积神经网络在架构上有许多相似之处,包括卷积算子、非线性和平均,但散射变换中的滤波器是预定义的和固定的。

数字图像

本例中使用的数据集包含10,000张从0到9的数字合成图像。这些图像是通过对用不同字体创建的数字图像进行随机转换而生成的。每个数字图像是28乘28像素。数据集每个类别包含相同数量的图像。使用imageDataStore阅读图片。

digitDatasetPath = fullfile(matlabroot,“工具箱”“nnet”“nndemos”“nndatasets”“DigitDataset”);Imds = imageDatastore(digitDatasetPath,“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

从数据集中随机选择并绘制20张图像。

figure numImages = 10000;rng (100);perm = randperm(numImages,20);Np = 1:20 subplot(4,5, Np);imshow (Imds.Files{烫发(np)});结束

你可以看到,所有的8都表现出相当大的变化,而所有的8都可以被识别为8。样本中其他重复的数字也是如此。这与自然笔迹是一致的,在个人之间,甚至在同一个人的笔迹中,任何数字在平移、旋转和其他小变形方面都有很大的不同。使用小波散射,我们希望建立这些数字的表示,以掩盖这种不相关的可变性。

小波图像散射特征提取

合成图像是28 * 28。创建一个小波图像散射框架,并设置不变尺度等于图像的大小。在两个小波散射滤波器组中分别设置旋转数为8。小波散射框架的构造只要求我们设置两个超参数:小波散射InvarianceScale而且NumRotations

sf =小波散射2(“图象尺寸”28 [28],“InvarianceScale”28岁...“NumRotations”[8]);

本例使用MATLAB™的并行处理能力数组接口。如果并行池当前未运行,则可以通过执行以下代码启动一个并行池。或者,第一次创建Array,则创建并行池。

如果parpool isempty (gcp);结束
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:6)。

为了重现性,设置随机数发生器。的文件imageDatastore然后把10000张图片分成两组,一组用于训练,一组用于测试。将80%的数据(即8000张图像)分配给训练集,并保留剩余的2000张图像进行测试。创建来自训练和测试数据集的数组。使用helper函数helperScatImages根据散射变换系数创建特征向量。helperScatImages获得散射变换特征矩阵的对数以及每个图像的行维和列维的平均值。的代码helperScatImages在这个例子的最后。对于本例中的每张图像,helper函数都会创建一个217 × 1的特征向量。

rng (10);Imds = shuffle(Imds);[trainImds,testImds] = splitEachLabel(Imds,0.8);Ttrain =高(trainImds);Ttest = tall(testImds);trainfeatures = cellfun(@(x)helperScatImages(sf,x),Ttrain,“UniformOutput”、假);testfeatures = cellfun(@(x)helperScatImages(sf,x),Ttest,“UniformOutput”、假);

使用收集能够连接所有的培训和测试功能。

Trainf = gather(训练特征);
使用并行池“本地”评估tall表达式:-通过1 / 1:在3分51秒内完成评估,在3分51秒内完成
trainfeatures = cat(2,Trainf{:});Testf = gather(testfeatures);
使用并行池“本地”评估tall表达式:-通过1 / 1:在49秒内完成评估
testfeatures = cat(2,Testf{:});

前面的代码生成两个矩阵,行维数为217,列维数分别等于训练集和测试集中的图像数量。因此,每一列都是对应图像的特征向量。原始图像包含784个元素。散射系数表示每个图像的大小大约减少了4倍。

PCA模型与预测

本例基于每个类的散射特征向量的主成分构造了一个简单的分类器。分类器在函数中实现helperPCAModel而且helperPCAClassifierhelperPCAModel根据散射特征确定每个数字类的主成分。的代码helperPCAModel在这个例子的最后。helperPCAClassifier通过在每个测试特征向量的主成分与训练集之间找到最接近的匹配(最佳投影)并相应地分配类,对保留的测试数据进行分类。的代码helperPCAClassifier在这个例子的最后。

model = helppcamodel (trainfeatures,30,trainImds.Labels);predlabels = helperPCAClassifier(testfeatures,model);

在构建模型并对测试集进行分类后,确定测试集分类的准确性。

精度= sum(testImds. sum)。标签== predlabels)./numel(testImds.Labels)*100
准确度= 99.6000

测试数据的分类正确率达到99.6%。要查看2,000张测试图像是如何分类的,请绘制混淆矩阵。这10个类中的每一个在测试集中都有200个例子。

图;confusionchart (testImds.Labels predlabels)标题(“测试集混淆矩阵—小波散射”

美国有线电视新闻网

在本节中,我们训练一个简单的卷积神经网络(CNN)来识别数字。构造CNN,使其由一个具有20个5乘5滤波器的卷积层组成,其步长为1乘1。卷积层后面是RELU激活层和最大池化层。使用一个全连接层,然后是一个softmax层,将全连接层的输出归一化为概率。使用交叉熵损失函数进行学习。

imageSize = [28 28 1];层= [...imageInputLayer([28 28 1]) convolution2dLayer(5,20) reluLayer maxPooling2dLayer(2,“步”,2) fullyConnectedLayer(10) softmaxLayer classificationLayer];

使用动量随机梯度下降,学习率为0.0001进行训练。将最大epoch数设置为20。对于再现性,设置ExecutionEnvironment“cpu”

选项= trainingOptions(“个”...“MaxEpochs”, 20岁,...“InitialLearnRate”1的军医,...“详细”假的,...“阴谋”“训练进步”“ExecutionEnvironment”“cpu”);

培训网络。对于训练和测试,我们使用在散射变换中使用的相同的数据集。

重置(trainImds);重置(testImds);net = trainNetwork(trainImds,layers,options);

在训练结束时,CNN在训练集上的表现接近100%。使用训练过的网络对保留的测试集进行预测。

YPred =分类(net,testImds,“ExecutionEnvironment”“cpu”);DCNNaccuracy = sum(YPred == testImds.Labels)/ nummel (YPred)*100
DCNNaccuracy = 95.5000

简单CNN在hold -out测试集上的分类正确率为95.5%。为CNN绘制困惑图。

图;confusionchart (testImds.Labels YPred)标题(“考试混乱图——CNN”

总结

本例使用小波图像散射来创建用于分类的数字图像的低方差表示。使用具有固定滤波权值的散射变换和简单的主成分分类器,我们在保留的测试集上实现了99.6%的正确分类。用一个简单的CNN学习滤波器,我们达到了95.5%的正确率。这个例子并不是为了直接比较散射变换和cnn。在每种情况下都可以进行多个超参数和体系结构更改,这将显著影响结果。这个示例的目的只是为了演示像小波散射变换这样的深度特征提取器在生成用于学习的数据的稳健表示方面的潜力。

参考文献

[1]布鲁娜,J.和S.马拉特。不变散射卷积网络模式分析与机器智能汇刊.第35卷,第8期,2013年,第1872-1886页。

[2]南卡罗来纳州马拉特“群不变散射。”纯粹数学与应用数学交流“,.Vol. 65, no . 10, 2012, pp. 1331-1398。

[3]西弗尔,L.和S.马拉特。“旋转,缩放和变形不变散射纹理识别。”2013年IEEE计算机视觉与模式识别会议.2013, pp 1233-1240。10.1109 / CVPR.2013.163。

附录-配套功能金宝app

helperScatImages

函数features = helperScatImages(sf,x)此函数仅支持小波工具箱中的示例。金宝app它可能会在未来的版本中被更改或删除。。版权所有2018 MathWorkssmat = featureMatrix(sf,x,“转换”“日志”);特征= mean(mean(smat,2),3);结束

helperPCAModel

函数model = helppcamodel(特征,M,标签)此函数仅支持小波图像散射的例子金宝app小波工具箱。它可能会在未来的版本中被更改或删除。% model = helppcamodel(特征,M,标签)版权所有2018 MathWorks初始化结构数组以保存仿射模型模型= struct(“暗”[],“亩”[],“U”[],“标签”分类([]),“年代”[]);模型。Dim = M;获取类的数量LabelCategories =类别(标签);Nclasses = number(类别(标签));kk = 1:Nclasses类= LabelCategories{kk};找到每个类对应的索引idxClass =标签==类;提取每个类的特征向量tmpFeatures = features(:,idxClass);确定每个类的平均值模型。mu{kk} = mean(tmpFeatures,2);[model.U {kk},模型。S{kk}] = scatPCA(tmpFeatures);如果size(model. u {kk},2) > M型号。U{kk} = model.U{kk}(:,1:M);模型。S{kk} = model.S{kk}(1:M);结束model.Labels(kk) = Class;结束函数[u,s,v] = scatPCA(x,M)计算x沿二次元的主成分。如果nargin > 1 && M > 0如果M非零,计算前M个主成分。[u,s,v] = svds(x-sig_mean(x),M);S = abs(diag(S)/根号(size(x,2)-1)).^2;其他的%否则,计算所有主成分。每一行是一个观测值,即散射路径的数量每一列都是一个类观察值[u,d] = eig(cov(x'));[s,ind] = sort(diag(d),“下”);U = U (:,ind);结束结束结束

helperPCAClassifier

函数标签= helperPCAClassifier(特征,模型)此函数仅支持小波图像散射的例子金宝app小波工具箱。它可能会在未来的版本中被更改或删除。% model是一个结构数组,包含字段M、mu、v和Labels% features为测试数据的Ns × l矩阵,Ns为的个数%散射路径,L为测试样例数。的每一列% features是一个测试示例。版权所有2018 MathWorkslabelIdx = determineClass(特征,模型);labels = model.Labels(labelIdx);%作为列向量返回,以与imageDatastore Labels一致标签=标签(:);%--------------------------------------------------------------------------函数labelIdx = determineClass(特征,模型)确定类的数量Nclasses = numel(model.Labels);初始化错误矩阵errMatrix = Inf(Nclasses,size(features,2));nc = 1:表示Nclasses形心%Mu = model.mu{nc};u = model.U{nc};% 1-by-LerrMatrix(nc,:) = projectionError(features,mu,u);结束沿类维确定最小值[~,labelIdx] = min(errMatrix,[],1);%--------------------------------------------------------------------------函数totalerr = projectionError(特征,mu,u)Npc = size(u,2);L =尺寸(特征,2);减去类均值:Ns-by-L - Ns-by-1S = features-mu;% 1-by-LnormSqX = sum(abs(s).^2,1)';err = Inf(Npc+1,L);err(1,:) = normSqX;Err (2:end,:) = -abs(u'*s).^2;% 1-by-LTotalerr =√(sum(err,1));结束结束结束

另请参阅

相关的例子

更多关于