主要内容

小波散射数字分类

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

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

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

数字图像

本例中使用的数据集包含从0到9的10,000张合成图像。这些图像是通过对用不同字体创建的这些数字图像进行随机变换而生成的。每张数字图像是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

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

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

如果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(trainfeatures);
使用Parallel Pool 'local'计算高表达式:-通过1 / 1:在3分51秒内完成计算
trainfeatures = cat(2,Trainf{:});Testf =集合(testfeatures);
使用并行池“local”计算高表达式:-通过1 / 1:在49秒内完成计算
testfeatures = cat(2,Testf{:});

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

PCA模型与预测

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

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

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

accuracy = sum(testImds.)label == predlabels)./numel(testImds.Labels)*100
准确度= 99.6000

我们对测试数据进行了99.6%的正确分类。要查看这2000张测试图像是如何分类的,绘制混淆矩阵。这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进行训练。设置最大代数为20。对于可再现性,请设置ExecutionEnvironment“cpu”

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

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

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

在训练结束时,CNN在训练集上的性能接近100%。使用训练过的网络对持有测试集进行预测。

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

在手持测试集上,简单CNN的分类正确率为95.5%。绘制CNN的混乱图表。

图;confusionchart (testImds.Labels YPred)标题(“考试集困惑图——CNN”

总结

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

参考文献

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

[2]南卡罗来纳州马拉特“群不变散射。”纯数学与应用数学通信“,.2012年第10期第65卷第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,“转换”“日志”);特征=均值(均值(smat,2),3);结束

helperPCAModel

函数model = helperpcammodel (features,M,Labels)此函数仅支持小波图像散射的例子金宝app%小波工具箱。它可能在未来的版本中更改或删除。% model = helperpcammodel (features,M,Labels)版权所有2018 MathWorks初始化结构数组以保存仿射模型模型= struct(“暗”[],“亩”[],“U”[],“标签”分类([]),“年代”[]);模型。Dim = M;%获取类的数量LabelCategories =类别(标签);Nclasses = numel(categories(Labels));k = 1:Nclasses Class = 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%小波工具箱。它可能在未来的版本中更改或删除。%模型是一个包含字段M、mu、v和标签的结构数组%的特征是测试数据的矩阵,它是Ns乘l, Ns是的个数%散射路径,L为测试样例数。每一栏% features是一个测试示例。版权所有2018 MathWorkslabelIdx = determineClass(特征,模型);labels = model.Labels(labelIdx);返回列向量以与imageDatastore标签一致标签=标签(:);%--------------------------------------------------------------------------函数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(features,mu,u)Npc = size(u,2);L = size(features,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));结束结束结束

另请参阅

相关的例子

更多关于