主要内容

与小波散射数字分类

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

对于分类问题,通常是有用的数据映射到一些备选表示,丢弃无关信息,同时保留每个类的区别的性质。图像的小波图像散射结构低温度差的表示这是对翻译和小变形。因为翻译和小变形图像中不影响类会员,散射变换系数提供功能,您可以构建健壮的分类模型。

小波散射是通过级联通过一系列的图像小波变换,非线性,平均[1][3][4]。这样的结果特征提取是图像在同一类相互靠拢的散射变换表示,虽然属于不同的类的图像移动的距离。虽然建筑的小波散射变换有许多的相似之处与深卷积神经网络,包括卷积运算符、非线性、平均,过滤器在散射变换是预定义的,固定的。

数字图像

在这个例子中使用的数据集包含10000合成图像的数字从0到9。应用随机转换生成的图像是图像的数字创建不同的字体。每个数字图像28-by-28像素。数据集包含一个相同数量的图像每一类。使用imageDataStore读取图像。

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

随机选择和20个图像数据集的阴谋。

图numImages = 10000;rng (100);烫= randperm (numImages 20);np = 1:20次要情节(4、5、np);imshow (Imds.Files{烫发(np)});结束

你可以看到8年代表现出相当大的可变性而被识别为一个8。其他的也是如此重复样本中位数。这是符合自然的笔迹,任何数字非平凡的不同个体之间,甚至在同一个人的笔迹对翻译、旋转和其他小变形。使用小波散射,我们希望构建表示这些数字掩盖这个无关紧要的可变性。

小波图像散射特征提取

合成图像28-by-28。创建一个小波图像散射框架和设置不变性规模等于图像的大小。旋转的数量设置为8的两个小波滤波器。小波散射的建设框架要求我们组只有两个hyperparameters:InvarianceScaleNumRotations

科幻小说= waveletScattering2 (“图象尺寸”28 [28],“InvarianceScale”28岁“NumRotations”[8]);

这个示例使用通过MATLAB™的并行处理能力数组接口。如果一个平行池不是当前运行,你可以通过执行下面的代码。另外,第一次您创建一个创建数组,平行池。

如果parpool isempty (gcp);结束
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。

再现性,设置随机数发生器。洗牌的文件imageDatastore把10000张图片分成两组,一个用于培训和一个伸出设置进行测试。分配数据的80%,或8000图片,训练集,其余2000图像进行测试。创建数组的训练和测试数据集。使用辅助函数helperScatImages创建从散射变换系数特征向量。helperScatImages获取日志散射变换的特征矩阵以及平均在每个图像的行和列维度。的代码helperScatImages在这个例子中。对于每一个图像在这个例子中,helper函数创建了一个217 - 1的特征向量。

rng (10);imd = shuffle (imd);[trainImds, testImds] = splitEachLabel (imd, 0.8);Ttrain =高(trainImds);tt =高(testImds);trainfeatures = cellfun (@ (x) helperScatImages(科幻,x), Ttrain,“UniformOutput”、假);testfeatures = cellfun (@ (x) helperScatImages(科幻,x), tt,“UniformOutput”、假);

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

Trainf =收集(trainfeatures);
评估高表达式使用并行池“当地”:通过1对1:3分51秒完成评估完成3分51秒
trainfeatures =猫(2,Trainf {:});Testf =收集(testfeatures);
评估高表达式使用并行池“当地”:通过1对1:在49秒评价完成49秒完成
testfeatures =猫(2,Testf {:});

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

主成分分析模型和预测

这个例子构建一个简单的分类器基于散射的主成分特征向量为每个类。分类器实现的功能helperPCAModelhelperPCAClassifierhelperPCAModel确定主成分对每个数字类基于散射特性。的代码helperPCAModel在这个例子中。helperPCAClassifier分类伸出测试数据通过寻找最接近的匹配(最佳投影)之间的每个测试的主成分的特征向量训练集和分配相应的类。的代码helperPCAClassifier在这个例子中。

模型= helperPCAModel (trainfeatures 30 trainImds.Labels);predlabels = helperPCAClassifier (testfeatures模型);

构建分类模型和测试集后,确定测试集分类的准确性。

=总和(testImds准确性。标签= = predlabels)。/元素个数(testImds.Labels) * 100
精度= 99.6000

我们已经实现了99.6%的测试数据的正确分类。看看2000年的测试图像分类,绘制混淆矩阵。有200个例子测试集的10类。

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

美国有线电视新闻网

在本节中,我们培养一个简单的卷积神经网络(CNN)识别数字。构造由一层卷积的CNN 20 5-by-5过滤器1×1的进步。按照卷积层RELU激活和最大池层。使用一个完全连接层,其次是softmax层完全规范化的输出层连接概率。学习使用交叉熵损失函数。

图象尺寸= [28 28 1];层= [imageInputLayer([1] 28日28日)convolution2dLayer (5、20) reluLayer maxPooling2dLayer (2“步”,2)fullyConnectedLayer (10) softmaxLayer classificationLayer];

使用随机梯度下降势头和培训学习速率为0.0001。时代的最大数量设置为20。再现性,设置ExecutionEnvironment“cpu”

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

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

重置(trainImds);重置(testImds);网= trainNetwork (trainImds层,选项);

年底前培训,CNN是训练集上执行近100%。使用训练网络伸出测试集进行预测。

testImds YPred =分类(净,“ExecutionEnvironment”,“cpu”);DCNNaccuracy = (YPred = = testImds.Labels) /元素个数之和(YPred) * 100
DCNNaccuracy = 95.5000

简单的CNN取得95.5%正确伸出测试集分类。CNN情节混乱图表。

图;confusionchart (testImds.Labels YPred)标题(“测试集混淆图表——CNN”)

总结

这个例子使用小波图像散射创建低温度差表示数字图像的分类。用散射变换固定滤波器权重和一个简单的主分量分类器,我们实现了99.6%的正确伸出测试集分类。用一个简单的过滤器是学会了CNN,我们实现了95.5%的正确。这个示例并不打算直接比较的散射变换和cnn。有多个hyperparameter和架构变化你可以在每种情况下,显著影响结果。这个例子的目的只是为了演示的潜力深特征提取器的小波散射变换产生强劲的表现数据进行学习。

引用

[1]布鲁纳,J。,和S. Mallat. "Invariant Scattering Convolution Networks."IEEE模式分析与机器智能。35卷,8号,2013年,页1872 - 1886。

[2]Mallat, S。“集团不变的散射。”通信在纯和应用数学。10号卷。65年,2012年,页1331 - 1398。

[3]Sifre, L。,和S. Mallat. "Rotation, scaling and deformation invariant scattering for texture discrimination."2013年IEEE计算机视觉与模式识别会议。2013年,页1233 - 1240。10.1109 / CVPR.2013.163。

附录-支持功能万博1manbetx

helperScatImages

函数特点= helperScatImages(科幻,x)%这个函数在小波工具箱只支持的例子。万博1manbetx%,它可能改变或在将来的版本中被删除。% 2018年版权MathWorkssmat = featureMatrix(科幻,x,“转换”,“日志”);特点=平均(平均(smat, 2), 3);结束

helperPCAModel

函数模型= helperPCAModel(特性、M标签)%这个函数只支持小波图像散射的例子万博1manbetx%小波工具箱。它可能改变或在将来的版本中被删除。% = helperPCAModel模型(特性、M标签)% 2018年版权MathWorks%初始化结构数组以保存仿射模型模型=结构(“暗”[],“亩”[],“U”[],“标签”分类([]),“年代”[]);模型。昏暗的= M;%获得类的数量LabelCategories =类别(标签);类=元素个数(类别(标签));kk = 1:类类= LabelCategories {kk};%找到对应于每个类的指标idxClass = = =类标签;%提取特征向量为每个类tmpFeatures =特性(:,idxClass);%确定每个类的意思模型。μ{kk} =意味着(tmpFeatures, 2);[model.U {kk},模型。年代{kk}] = scatPCA (tmpFeatures);如果大小(model.U {kk}, 2) > M模型。U {kk} = model.U {kk} (:, 1: M);模型。年代{kk} = model.S {kk} (1: M);结束model.Labels (kk) =类;结束函数(u, v) = scatPCA (x, M)%计算沿二维x的主要组件。如果输入参数个数> 1 & & M > 0%如果M是零,计算第一主成分。(u, v) =圣言(x-sig_mean (x) M);s = abs(诊断接头(s) /√(大小(x, 2) 1)) ^ 2;其他的%否则,计算的所有主要组件。%每一行是一个观察,即散射路径的数量%每一列是一个类的观察(u, d) = eig (x (x '));位于[s] =排序(诊断接头(d),“下”);u = u(:,印第安纳州);结束结束结束

helperPCAClassifier

函数标签= helperPCAClassifier(特性,模型)%这个函数只支持小波图像散射的例子万博1manbetx%小波工具箱。它可能改变或在将来的版本中被删除。%模型是一个结构数组字段,M,μ,v,标签%的功能是测试数据的矩阵Ns-by-L, Ns的数量%散射路径和L是测试例子的数量。每一列的%的特性是一个测试的例子。% 2018年版权MathWorkslabelIdx = determineClass(特性,模型);标签= model.Labels (labelIdx);%的回报是列向量同意imageDatastore标签标签=标签(:);% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -函数labelIdx = determineClass(特性,模型)%确定类的数量类=元素个数(model.Labels);%初始化误差矩阵errMatrix =正(类、尺寸(功能,2));数控= 1:类%类质心μ= model.mu{数控};u = model.U{数控};% 1-by-L:errMatrix (nc) = projectionError(特性、μu);结束%确定最小类维度[~,labelIdx] = min (errMatrix [], 1);% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -函数totalerr = projectionError(特性、μu)%人大=大小(u, 2);L =大小(功能,2);%减去类的意思是:Ns-by-L - Ns-by-1s = features-mu;% 1-by-LnormSqX =总和(abs (s)。^ 2, 1) ';呃=正(人大+ 1,L);:犯错(1)= normSqX;犯错(2:,:)= abs (u ' *。^ 2;% 1-by-Ltotalerr =√sum(呃,1));结束结束结束

另请参阅

相关的例子

更多关于