主要内容

寄生虫的分类使用小波散射和深度学习

这个例子展示了如何在吉姆沙染色剂分类寄生虫感染图像利用小波图像散射和深度学习。深层网络的数据集是具有挑战性的,因为它只包含48个图像。图像均匀地划分为三个类别的寄生虫感染:巴贝西虫病,plasmodium-gametocyte和锥虫病。

数据

解压BloodSmearImages。压缩文件到一个文件夹你有写权限。下面的例子使用了目录对应的值tempdir在MATLAB。使用另一个文件夹,设置dataFolder在以下代码等于价值。

dataFolder = tempdir;解压缩(“BloodSmearImages.zip”,dataFolder);

在BloodSmearImages文件夹中,您可以找到一个README。txt文件的原始图像的细节。

创建一个ImageDatastore管理访问吉姆沙染色剂的图像。RGB格式的图像与一个共同的大小300 - 300 - 3。

imagedir = fullfile (dataFolder,“BloodSmearImages”);imd = imageDatastore (imagedir,“IncludeSubFolders”,真的,“FileExtensions”,“jpg”,“LabelSource”,“foldernames”);总结(Imds.Labels)
巴贝西虫病16 plasmodium-gametocyte 16锥虫病

有16个图像的三种寄生虫。将数据分为训练和抵抗测试集,以70%的图像训练集和测试集的30%。再现性的随机数字生成器。

rng默认的[trainImds, testImds] = splitEachLabel (imd, 0.7);

验证相同数量的每个寄生虫类都包含在训练集和测试集。

总结(trainImds.Labels)
巴贝西虫病11 plasmodium-gametocyte 11锥虫病11
%执行相同的测试集。总结(testImds.Labels)
巴贝西虫病5 plasmodium-gametocyte 5锥虫病5

因为这是一个小的数据集,整个训练集和测试集装入内存。为两组读所有图片。

trainImages = readall (trainImds);testImages = readall (testImds);

一些示例图像训练数据的阴谋。

33岁的idx = randperm (6);图2 = 1:长度(idx) im = trainImages {idx (ii)};次要情节(3 2 2)imshow (im,[])标题(string (trainImds.Labels (idx (ii))));结束

小波散射网络

在本例中,您使用小波散射变换的特征提取器的机器学习方法。小波散射变换有助于减少数据的维数,提高组内的不同。构建一个两层的图像包含40×40像素散射网的不变性。使用两个小波每倍频程在第一层和第二层小波每八度。使用两个旋转的每层小波。

sn = waveletScattering2 (“图象尺寸”(300 300),“InvarianceScale”现年40岁的“QualityFactors”(2 - 1),“NumRotations”(2 - 2));[~,npaths] =路径(sn);总和(npaths)
ans = 27
coefficientSize (sn)
ans =1×238 38

指定的小波散射网络有27个路径。每个散射路径上的图像是38-by-38-by-3减少。即使没有进一步平均散射系数,这是一个减少每个图像的大小的内存超过2倍。然而,对于我们形成特征向量分类平均散射系数的空间和通道尺寸。这导致特征向量只有27个元素,一个实值标量散射路径。这意味着降低了10000倍的元素数量为每个图像。

下面的代码计算小波的散射特征向量训练集和测试集。连接特征向量,这样N了27个矩阵,N例子的数量在培训或测试集,每一行是一个向量小波散射特性的一个例子。

trainfeatures = cellfun (@ (x) helperScatImages_mean (sn, x) trainImages,“大学”,0);testfeatures = cellfun (@ (x) helperScatImages_mean (sn, x) testImages,“大学”,0);trainfeatures =猫(1,trainfeatures {:});testfeatures =猫(1,testfeatures {:});

支持向量机分类

使用一个支持向量机分类器的散射特性。选择一个三次多项式的内核。使用one-vs-all编码方案。

模板= templateSVM (“KernelFunction”,多项式的,“PolynomialOrder”3,“KernelScale”, 1“BoxConstraint”,314,“标准化”,真正的);classificationSVM = fitcecoc (trainfeatures trainImds.Labels,“学习者”模板,“编码”,“onevsall”);

估计的准确性训练集使用与5折交叉验证。

kfoldmodel = crossval (classificationSVM,“KFold”5);损失= kfoldLoss (kfoldmodel) * 100;crossvalAccuracy = 100 -损失
crossvalAccuracy =81.8182

交叉验证精度约为80%。现在检查了测试集上的准确性和情节混乱图表。

[predLabels,分数]=预测(classificationSVM testfeatures);testAccuracy =总和(分类(predLabels) = = testImds.Labels) /元素个数(testImds.Labels) * 100
testAccuracy = 80
图cchart = confusionchart (testImds.Labels predLabels);cchart。Title ={“小波混乱图”;的散射特性,使用支持向量机};cchart。RowSummary =“row-normalized”;cchart。ColumnSummary =“column-normalized”;

整体测试精度也大约80%与支持向量机模型。每个类的召回是80%。精度也有利于plasmodium-gametocyte和锥虫病的寄生虫,但对巴贝西虫病恶化。检查F1分数为每个类。

f1SVM = f1score (cchart.NormalizedValues);disp (f1SVM)
F1巴贝西虫病0.72727 0.8 0.88889 plasmodium-gametocyte锥虫病

F1的分数都是在大约0.7到0.9之间。

PCA具有散射特征的分类器

金宝app支持向量机的技术特性,不是线性可分的,但是他们是专为二进制分类和多类问题的可能是次优的。这里补充支持向量机分析通过使用简单的PCA(线性)分类器相同的小波散射特性。的helperPCAModel功能决定了numcomp协方差矩阵的最大特征值所对应特征向量小波散射的特性对于每个病原体在训练集和类的意思。

helperPCAClassifier将每个测试样本。它通过减去从每个小波散射特征向量模型类是指在测试数据集,将集中特征向量投影到每个类的协方差矩阵特征向量模型。helperPCAClassifier分配每一个测试例子的病原体与最小的错误,或残留。这是一个主成分分析(PCA)分类器。

删除从每个特征向量六月十阶散射特性。设置主成分的数量(特征向量)6。

numcomp = 6;模型= helperPCAModel (trainfeatures(:, 2:结束),numcomp trainImds.Labels);PCALabels = helperPCAClassifier (testfeatures(:, 2:结束),模型);testPCAacc = (PCALabels = = testImds.Labels) /元素个数之和(testImds.Labels) * 100
testPCAacc = 86.6667

测试与PCA分类器精度约为87%。情节混乱图和计算每个类的F1的分数。

图cchart = confusionchart (testImds.Labels PCALabels);cchart。Title ={“混乱波散射特性的图表”;“使用PCA分类器”};cchart。RowSummary =“row-normalized”;cchart。ColumnSummary =“column-normalized”;

f1PCA = f1score (cchart.NormalizedValues);disp (f1PCA)
F1巴贝西虫病0.90909 0.8 0.88889 plasmodium-gametocyte锥虫病

PCA的F1分数分类器与小波散射特性是相当强劲,与所有分数在0.8和1之间。

卷积深网络

在本节中,你尝试相同的分类使用深卷积网络。深层网络提供技术发展水平的结果与大型数据集分类问题和有能力学习复杂的非线性映射,但他们的表现常常遭受在小数据集。为了缓解这个问题,使用一个图像增压器。imageDataAugmenter扰乱数据在每一个时代,实际上创造了新的训练例子。

增量= imageDataAugmenter (“RandRotation”180年[0],“RandXTranslation”,5 [5],“RandYTranslation”5 [5]);augimds = augmentedImageDatastore (trainImds (300 300 3),“DataAugmentation”、增压器);

定义一个小CNN组成的两个卷积层批归一化层和RELU激活紧随其后。按照最终RELU激活与马克斯池、完全连接,softmax层。

层= [imageInputLayer ([300 300 3]) convolution2dLayer (7、16) batchNormalizationLayer reluLayer convolution2dLayer (20) batchNormalizationLayer reluLayer maxPooling2dLayer (4) fullyConnectedLayer (3) softmaxLayer classificationLayer);

使用随机梯度下降法minibatch大小为10。每个时代洗牌的数据。运行培训100时代。

选择= trainingOptions (“个”,“InitialLearnRate”,0.0001,“MaxEpochs”,100,“MiniBatchSize”10“洗牌”,“every-epoch”,“阴谋”,“训练进步”,“详细”假的,“ExecutionEnvironment”,“cpu”);

培训网络。

trainedNet = trainNetwork (augimds层,选择);

图培训进展(19 - 9 - 2022 10:23:08)包含2轴uigridlayout类型的对象和另一个对象。坐标轴对象1包含14块类型的对象,文本行。坐标轴对象2包含14块类型的对象,文本行。

检查了网络性能的测试集。

ypred = trainedNet.classify (testImds);cnnAccuracy = (ypred = = testImds.Labels) /元素个数之和(testImds.Labels) * 100
cnnAccuracy = 66.6667
图cchart = confusionchart (testImds.Labels ypred);cchart。Title =“深CNN混乱图”;cchart。RowSummary =“row-normalized”;cchart。ColumnSummary =“column-normalized”;

f1CNN = f1score (cchart.NormalizedValues);disp (f1CNN)
F1巴贝西虫病0.8 0.5 0.66667 plasmodium-gametocyte锥虫病

尽管使用一个增广数据集进行训练,CNN overfit训练集和F1得分明显比SVM或PCA模型与小波散射特性。

接下来,用SqueezeNet转移学习。修改最后卷积层来适应这一事实你有三个类型的病原体。SqueezeNet建于1000年认识到类。

网= squeezenet;lgraphSQZ = layerGraph(净);numClasses =元素个数(类别(trainImds.Labels));oldFinalConv = lgraphSQZ.Layers (end-4);numClasses newFinalConv = convolution2dLayer (1,“名字”,“new_conv”);setLearnRateFactor (newFinalConv“重量”10);setLearnRateFactor (newFinalConv“偏见”,10)
ans = Convolution2DLayer属性:名称:‘new_conv Hyperparameters FilterSize: [1] NumChannels:“汽车”NumFilters: 3步:[1]DilationFactor: [1] PaddingMode:“手动”PaddingSize: [0 0 0 0] PaddingValue: 0可学的参数权重:[]偏见:[]显示所有属性
lgraphSQZ = replaceLayer (lgraphSQZ oldFinalConv.Name newFinalConv);oldClassLayer = lgraphSQZ.Layers(结束);newClassLayer = classificationLayer (“名字”,“new_classoutput”);lgraphSQZ = replaceLayer (lgraphSQZ oldClassLayer.Name newClassLayer);

重置的训练和测试数据存储。修改数据存储读取函数来调整图像兼容SqueezeNet,预计227 - 227 - 3的图片。设置图像增压器和训练网络。

重置(trainImds);重置(testImds);trainImds。ReadFcn = @ (x) imresize (imread (x)“OutputSize”227年[227]);testImds。ReadFcn = @ (x) imresize (imread (x)“OutputSize”227年[227]);增量= imageDataAugmenter (“RandRotation”180年[0],“RandXTranslation”,5 [5],“RandYTranslation”5 [5]);augimds = augmentedImageDatastore (trainImds (227 227 3),“DataAugmentation”、增压器);trainedNet = trainNetwork (augimds lgraphSQZ,选择);

图培训进展(19 - 9 - 2022 10:28:15)包含2轴uigridlayout类型的对象和另一个对象。坐标轴对象1包含14块类型的对象,文本行。坐标轴对象2包含14块类型的对象,文本行。

获得SqueezeNet准确性,情节混乱图表,计算F1的分数。

ypred = trainedNet.classify (testImds);sqznetAccuracy = (ypred = = testImds.Labels) /元素个数之和(testImds.Labels) * 100
sqznetAccuracy = 73.3333
图cchart = confusionchart (testImds.Labels ypred);cchart。Title ={“混乱转移学习图表”;“与SqueezeNet”};cchart。RowSummary =“row-normalized”;cchart。ColumnSummary =“column-normalized”;

f1SqueezeNet = f1score (cchart.NormalizedValues);disp (f1SqueezeNet)
F1巴贝西虫病0.72727 0.66667 0.8 plasmodium-gametocyte锥虫病

SqueezeNet执行比简单的CNN,尤其是在F1的分数为锥虫病,但性能不匹配的准确性更简单的PCA具有小波散射特征的分类器。

总结

在这个例子中,小波散射变换和深度学习框架被用来病原体在吉姆沙染色剂图像进行分类。有限的数据集大小提供挑战培训深度学习分类器即使数据使用增加。小波散射变换的例子说明可以提供一个有用的替代深度网络在这种情况下。在形成特征向量小波散射变换,我们减少了每个从27-by-38-by-38-by-3张量变换输出27-element向量。因此,我们使用一个全球池的散射系数。可以利用其他池计划,这可能会产生更好的结果。

附录-支持功能金宝app

函数特点= helperScatImages_mean (sn, x) smat = featureMatrix (sn, x);特点=意味着(smat 2:4);特点=功能”;结束函数F1scores = f1score (cchartVal) N =总和(cchartVal,“所有”);probT = (cchartVal)。/ N;classProbEst =诊断接头(cchartVal)。/ N;Prec = classProbEst '。/ probT;probC = (5/15 5/15 5/15);回忆= classProbEst '。/ probC;F1scores = harmmean ([Prec;记得]);F1scores = F1scores ';F1scores =表(F1scores,“VariableNames”,{“F1”},“RowNames”,{“巴贝西虫病”,“plasmodium-gametocyte”,锥虫病的});结束函数标签= helperPCAClassifier(特性,模型)%这个函数只支持小波图像散射的例子金宝app%小波工具箱。它可能改变或在将来的版本中被删除。%模型是一个结构数组字段,M,μ,v,标签%的功能是测试数据的矩阵Ns-by-L, Ns的数量%散射路径和L是测试例子的数量。每一列的%的特性是一个测试的例子。% 2018 - 2021版权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));结束结束结束函数模型= helperPCAModel(特性、M标签)%这个函数只支持小波图像散射的例子金宝app%小波工具箱。它可能改变或在将来的版本中被删除。% = helperPCAModel模型(特性、M标签)% 2018 - 2021版权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)%计算沿二维x的主要组件。(u, d) = eig (x (x '));%的协方差矩阵特征值降序排序位于[s] =排序(诊断接头(d),“下”);%相应特征向量矩阵u = u(:,印第安纳州);结束结束

另请参阅

相关的例子

更多关于