无所不能的 MATLAB
糖尿病性视网膜病变 (DR) 是导致失明的一大元凶,全世界有 9,300 万人受此疾病困扰。DR 是一种与糖尿病有关的眼部疾病。在早期对 DR 进行检测和分级有助于预防永久性视力丧失。在视网膜病变筛查过程中进行自动检测和分级,则有助于提供宝贵的第二诊疗意见。来自代顿大学研究院(UDRI))的 Barath Narayanan 博士将为我们介绍使用深度卷积神经网络 (CNN) 来实现一种简单的基于迁移学习的 DR 检测方法。
作者:Barath%20Narayanan,代顿大学研究院%20(UDRI)。
合著者:Russell%20C.%20Hardie%20博士,代顿大学%20(UD)。
Barath%20Narayanan%20博士毕业于代顿大学%20(UD),分别于%202013%20年和%202017%20年获得理学硕士学位和电气工程博士学位。他目前担任%20UDRI%20软件系统小组研究科学家,兼任代顿大学%20(UD)%20电子和计算机工程%20(ECE)%20系客座教授。他的研究方向包括深度学习、机器学习、计算机视觉和模式识别。
数据集
Kaggle%20失明检测竞赛数据集(APTOS%202019%20Datasetwww.kaggle.com/c/aptos2019-blindness-detection)包含单独的训练和测试用例。在这篇博文中,我们只利用训练数据集来研究和估计性能。这些影像采集于印度亚拉文眼科医院。训练数据集中包含%203,662%20张影像,这些影像由临床专家标记为不同的类别(正常、轻度%20DR、中度%20DR、重度%20DR%20和增殖性%20DR)。请注意,在这篇博文中,我们只关注%20DR%20的检测,如需分级架构的详细信息,请参见我们的论文。
按类别进行数据分组
我们从%20Excel%20工作表中提取标签,将这些影像分到"Yes"和"No"两个文件夹中,因为本文只关注%20DR%20的检测。用于划分数据类别的辅助函数代码位于本文结尾处。
加载数据库首先,使用
imageDatastore(www.mathworks.com/help/matlab/ref/matlab.io.datastore.imagedatastore.html)%20加载数据库。该函数用于加载影像及其标签以执行分析,具有较高的计算效率。
算效率。
%Two-classDatapathtwo_class_datapath%20='Train%20Dataset%20Two%20Classes';%ImageDatastoreimds=imageDatastore(two_class_datapath,...%20%20%20%20'IncludeSubfolders',true,...%20%20%20%20'LabelSource','foldernames');%Determine%20the%20split%20uptotal_split=countEachLabel(imds)
影像可视化
可视化影像,了解各个类之间的影像差异。这也有助于我们确定采用何种分类方法来区分两个类。根据影像,我们可以确定有助于完成分类的预处理方法。根据类内相似性及类间差异性,我们可以确定可用于研究的%20CNN%20架构类型。在这篇文章中,我们将使用%20inception-v3%20架构来实现迁移学习。您可以阅读我们的论文,了解各种预处理操作和其他现有架构的性能。
%Number%20of%20Imagesnum_images=length(imds.Labels);%Visualize%20random%2020%20imagesperm=randperm(num_images,20);figure;for%20idx=1:20%20%20%20%20%20%20%20%20subplot(4,5,idx);%20%20%20%20imshow(imread(imds.Files{perm(idx)}));%20%20%20%20title(sprintf('%s',imds.Labels(perm(idx))))%20%20%20%20end
训练、测试和验证
我们将数据集分为训练、验证和测试三个部分。首先,我们将数据集中的%2080%%20分为一组(训练和验证),20%%20分为另一组(测试)。确保各组中两类的数量均衡。
%Split%20the%20TrainingandTestingDatasettrain_percent=0.80;[imdsTrain,imdsTest]=splitEachLabel(imds,train_percent,'randomize');%20%Split%20the%20TrainingandValidationvalid_percent=0.1;[imdsValid,imdsTrain]=splitEachLabel(imdsTrain,valid_percent,'randomize');
这样,我们就得到以下计数:%20
深度学习方法
我们采用迁移学习方法来对视网膜影像进行分类。在这篇文章中,我将利用%20Inception-v3%20进行分类。您可以利用这篇论文中提到的其他迁移学习方法,或者您认为可能适合此应用的其他架构。如需使用其他现有网络进行迁移学习,可以参考我的%20MathWorks%20博文:AlexNet、ResNet。
训练我们将验证容忍度设为%203,作为停止条件。训练最开始,我们将"MaxEpochs"设为%202,但可以根据训练进度进一步调整。理想情况下,我们希望在训练过程停止时达到较高的验证性能。我们根据硬件内存限制将小批量大小设为%2032,您也可以选更大的值,但要确保相应更改其他参数。
%Converting%20images%20to%20299%20x%20299%20to%20suit%20the%20architectureaugimdsTrain%20=%20augmentedImageDatastore([299299],imdsTrain);augimdsValid%20=%20augmentedImageDatastore([299299],imdsValid);%Set%20the%20training%20optionsoptions%20=%20trainingOptions('adam','MaxEpochs',2,'MiniBatchSize',32,...'Plots','training-progress','Verbose',0,'ExecutionEnvironment','parallel',...'ValidationData',augimdsValid,'ValidationFrequency',50,'ValidationPatience',3);netTransfer%20=%20trainNetwork(augimdsTrain,incepnet,options);
测试和性能评估
%Reshape%20the%20test%20images%20match%20with%20the%20network%20augimdsTest%20=%20augmentedImageDatastore([299299],imdsTest);%PredictTestLabels[predicted_labels,posterior]=%20classify(netTransfer,augimdsTest);%ActualLabelsactual_labels%20=%20imdsTest.Labels;%ConfusionMatrixfigureplotconfusion(actual_labels,predicted_labels)title('Confusion%20Matrix:%20Inception%20v3');
%%20ROC%20Curvetest_labels=double(nominal(imdsTest.Labels));[fp_rate,tp_rate,T,AUC]=%20perfcurve(test_labels,posterior(:,2),2);figure;plot(fp_rate,tp_rate,'b-');hold%20on;grid%20on;xlabel('False%20Positive%20Rate');ylabel('Detection%20Rate');
类激活映射结果
使用以下代码,将不同%20DR%20病例经过这些网络处理后得到的类激活映射%20(CAM)%20结果可视化:www.mathworks.com/help/deeplearning/examples/investigate-network-predictions-using-class-activation-mapping.html。这有助于医生了解算法决策背后的依据。以下是不同病例的相应结果:%20
结论本文介绍了一种基于深度学习的简单分类方法,可用于视网膜影像%20DR%20的计算机辅助诊断%20(CAD)。在没有任何预处理的情况下,使用%20Inception-v3%20的分类算法表现相对出色,总体准确度为%2098.0%,AUC%20为%200.9947(结果可能会因随机拆分而异)。在这篇论文中,我们研究了各种现有%20CNN%20架构在不同预处理条件下用于同一组训练和测试用例集时的性能。综合各种架构的结果,将有助于从%20AUC%20和总体准确度两方面提高性能。如果能就计算量(内存和时间)和性能两方面综合研究这些算法,将有助于相关专家有所侧重地选择算法。此外,我们还在这篇论文中提出了%20DR%20检测和分级的创新架构方法。
辅助函数代码
按%20DR%20类别(Yes%20或No)进行数据分组的代码从网站下载%20ZIP%20文件并解压到名为%20train_images%20的文件夹中。确保下载的是包含临床专家提供的真值标签的%20Excel%20工作表%20train.csv,将其转换为%20.xlsx%20以用于此代码。我们从%20Excel%20工作表中提取标签,将这些影像分到"Yes"和"No"两个文件夹中,因为本文只关注%20DR%20的检测。
%%20Training%20Data%20pathdatapath='train_images\';%%20Two-class%20Data%20pathtwo_class_datapath='Train%20Dataset%20Two%20Classes\';%%20Class%20Namesclass_names={'No','Yes'};mkdir(sprintf('%s%s',two_class_datapath,class_names{1}))mkdir(sprintf('%s%s',two_class_datapath,class_names{2}))%%20Read%20the%20Excel%20Sheet%20with%20Labels[num_data,text_data]=xlsread('train.xlsx');%%20Determine%20the%20Labelstrain_labels=num_data(:,1);%%20Merge%20all%20labels%20marked%20into%20Mild,%20Medium,%20Severe%20and%20Proliferative%20DR%20%%20into%20a%20single%20category%20'Yes'%20train_labels(train_labels~=0)=2;%%20Rest%20of%20the%20dataset%20belongs%20to%20'No'%20categorytrain_labels(train_labels==0)=1;%%20Filenamefilename=text_data(2:end,1);%%20Now,%20write%20these%20images%202-folders%20'Yes'%20or%20'No'%20for%20us%20to%20develop%20a%20deep%%20learning%20architecture%20utilizing%20Deep%20learning%20toolbox%%20Determine%20the%20Files%20put%20them%20in%20separate%20folderfor%20idx=1:length(filename)%20%20%20%20%20%20%20%%20You%20could%20uncomment%20if%20you%20would%20like%20to%20see%20live%20progress%20%20%20%20%%20%20fprintf('Processing%20%d%20among%20%d%20files:%s%20\n',idx,length(filename),filename{idx})[/%]%20%20%20%20%20%20%20%20%%20Read%20the%20image%20%20%20%20current_filename=strrep(filename{idx},%20char(39),%20'');%20%20%20%20img=imread(sprintf('%s%s.png',datapath,current_filename)); % Write the image in the respective folder imwrite(img,sprintf('%s%s%s%s.png',two_class_datapath,class_names{train_labels(idx)},'\',current_filename)); clear img; end
#医疗##科技##科技快讯##科技曼曼谈##matlab#
版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除