深度学习

理解和使用深度学习网络

糖尿病性视网膜病变检测

Post博士。Barath Narayanan代顿大学研究所(UDRI)与合作作者:Dr。拉塞尔·c·难的,代顿大学,Manawduge Supun De Silva、UD和纳撒尼尔·k·KuetermanUD。

介绍

糖尿病性视网膜病变(DR)是致盲的主要原因之一,影响着全世界9300多万人。DR是一种与糖尿病相关的眼病。早期检测和分级DR将有助于防止永久性视力丧失。视网膜筛选过程中的自动检测和分级将有助于提供有价值的第二意见。在这篇博客中,我们使用深度卷积神经网络(CNN)实现了一种简单的基于迁移学习的方法检测博士
请引用以下文章,如果您正在使用任何部分的代码为您的研究:Kaggle盲检测挑战数据集(APTOS 2019数据集)包含单独的培训和测试用例。在本博客中,我们仅利用训练数据集来研究和评估性能。这些照片是在印度的阿拉文德眼科医院拍摄的。训练数据集包含3662幅由临床专家划分为不同类别的图像(正常、轻度DR、中度DR、重度DR和增生性DR)。请注意,在这个博客中,我们只专注于检测DR,你可以在我们的

按类别分组数据

我们从excel表格中提取标签,并将图像分成“否”或“是”两个文件夹,因为我们在这个博客中只专注于检测DR。将数据划分为类别的helper代码在本文的末尾。

加载数据库

让我们从使用加载数据库开始imageDatastore.它是一个计算效率很高的函数,可以加载图像及其标签进行分析。
%两舱Datapath公司two_class_datapath = '训练数据集两个类';%的图像数据存储imd = imageDatastore (two_class_datapath,……“IncludeSubfolders”,真的,…“LabelSource”、“foldernames”);确定分割total_split = countEachLabel (imd)

可视化图像

让我们将图像可视化,看看每个类的图像有何不同。它也将帮助我们确定可用于区分这两个类别的分类技术的类型。根据图像,我们可以确定预处理技术,以帮助我们的分类过程。我们还可以根据类内的相似性和类间的差异来确定可以用于研究的CNN架构的类型。在本文中,我们使用inception-v3架构实现迁移学习。你可以我们的论文看到了不同的预处理操作和其他已建立的体系结构的性能。
%图像数量num_images =长度(imds.Labels);%可视化随机图像20烫= randperm (num_images 20);图;idx = 1:20次要情节(4、5、idx);imshow (imread (imds.Files{烫发(idx)}));标题(sprintf(“% s”,imds.Labels(烫发(idx))))

培训、测试和验证

让我们将数据集分成训练、验证和测试。首先,我们将数据集分成80%(训练和验证)和20%(测试)两组。确保每个班级的人数相等。
%分割训练和测试数据集train_percent = 0.80;[imdsTrain, imdsTest] = splitEachLabel (imd, train_percent“随机”);%拆分培训和验证valid_percent = 0.1;[imdsValid, imdsTrain] = splitEachLabel (imdsTrain valid_percent,“随机”);
这给我们留下了以下几点:
是的 没有
训练集: 1337 1300
验证设置: 144 149
测试集: 361 371

深度学习的方法

我们采用迁移学习的方法对视网膜图像进行分类。在本文中,我将使用Inception-v3进行分类,您可以使用其他迁移学习方法或您认为可能适合此应用程序的任何其他体系结构。我的MathWorks关于使用其他已建立的网络进行迁移学习的博客可以在这里找到:AlexNetResNet

培训

我们将使用验证耐心3作为停止标准。首先,我们使用“MaxEpochs”作为训练2,但我们可以根据训练进度进一步调整它。理想情况下,我们希望在训练过程停止时验证性能较高。我们根据硬件内存的限制选择一个32的迷你批处理大小,你可以选择一个更大的迷你批处理大小,但要确保相应地改变其他参数。
%将图像转换为299 x 299以适应体系结构augimdsTrain = augmentedImageDatastore([299 299],imdsTrain);augimdsValid = augmentedImageDatastore([299 299],imdsValid);%设置培训选项选择= trainingOptions(“亚当”、“MaxEpochs”2“MiniBatchSize”,32岁的……“阴谋”,“训练进步”、“详细”,0,“ExecutionEnvironment”、“平行”,…augimdsValid‘ValidationData’,‘ValidationFrequency’,50岁“ValidationPatience”,3);netTransfer = trainNetwork (augimdsTrain、incepnet选项);

测试和性能评估

%重塑与网络匹配的测试图像augimdsTest = augmentedImageDatastore([299 299],imdsTest);预测测试标签[predicted_labels,后]= (netTransfer augimdsTest)进行分类;%实际标签actual_labels = imdsTest.Labels;%混淆矩阵figure plotconfusion(actual_labels,predicted_labels) title('Confusion Matrix: Inception v3');
% ROC曲线test_labels =双(名义(imdsTest.Labels));[fp_rate tp_rate T, AUC] = perfcurve (test_labels后(:,2)2);图;情节(fp_rate tp_rate, ' b - ');坚持;网格;包含(“假阳性率”);ylabel(检出率);

类激活映射结果

我们使用以下代码可视化不同DR情况下这些网络的类激活映射(CAM)结果://www.tatmou.com/help/deeplearning/examples/investigate-network-predictions-using-class-activation-mapping.html.这将有助于向医生提供算法决定背后的见解。
以下是在不同情况下获得的结果:

结论

在本博客中,我们提出了一种简单的基于深度学习的视网膜图像CAD和DR分类方法。使用Inception-v3而不进行任何预处理的分类算法性能相对较好,总体准确率为98.0%,AUC为0.9947(结果可能因随机分割而有所不同)。在,我们研究了不同已建立的CNN体系结构在不同预处理条件下对同一组训练和测试用例的性能。结合各种体系结构的结果可以在AUC和总体精度方面提高性能。对这些算法进行全面的研究,包括计算(内存和时间)和性能,可以让主题专家做出明智的选择。此外,我们在用于DR的检测和分级。

关于作者

博士。Barath Narayanan分别于2013年和2017年毕业于代顿大学(University of Dayton)电气工程硕士和博士学位。他目前担任联合任命为研究科学家UDRI的软件系统组同时也是哈佛大学的附属学院ECE部门在特拉华大学。主要研究方向为深度学习、机器学习、计算机视觉和模式识别。

辅助代码

按DR类别(yes或no)分组数据代码

从网站下载ZIP文件并解压到一个名为train_images的文件夹。请务必下载包含专业临床医生的真实标签的excel表格(train.csv -将其转换为.xlsx代码)。我们从excel表格中提取标签,并将图像分成“否”或“是”两个文件夹,因为我们在这个博客中只专注于检测DR。
%训练数据路径datapath公司= ' train_images \ ';%两类数据路径two_class_datapath='训练数据集两个类';%的类名class_names ={‘不’,‘是的’};mkdir (sprintf (% s % s, two_class_datapath, class_names {1})) mkdir (sprintf (% s % s, two_class_datapath, class_names {2}))%阅读带标签的Excel工作表[num_data, text_data] = xlsread(“train.xlsx”);%确定标签train_labels = num_data (: 1);%将所有标记为轻度、中度、严重和增殖DR的标签合并%归入单一类别“是”train_labels (train_labels ~ = 0) = 2;%其余数据集属于“否”类别train_labels (train_labels = = 0) = 1;%文件名文件名= text_data(2:最终,1);%现在,把这些图片写两个文件夹“是”或“否”,让我们开发一个深度%学习架构利用深度学习工具箱确定文件,将它们放在单独的文件夹中idx = 1:长度(文件名)如果你想看到现场进展,你可以取消评论。% fprintf('Processing %d among %d files:%s \n',idx,length(filename),filename{idx})[/%]%读取镜像current_filename = strrep (char(39),文件名{idx} ");img = imread (sprintf (% s % s.png, datapath公司,current_filename));%在相应的文件夹中写入图像imwrite (img sprintf (' % s % s % s % s.png ', two_class_datapath, class_names {train_labels (idx)},“\”,current_filename));清楚img;结束
|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。