深度学习

理解和使用深度学习网络

医学影像的深度学习:COVID-19检测

我很高兴发表另一篇文章Barath Narayanan代顿大学研究所(UDRI),LinkedIn的资料
共同作者:博士拉塞尔C. Hardie.,代顿大学(UD)
博士。Barath Narayanan分别于2013年和2017年毕业于代顿大学(University of Dayton)电气工程硕士和博士学位。他目前担任联合任命为研究科学家UDRI的软件系统组同时也是哈佛大学的附属学院ECE部门在特拉华大学。主要研究方向为深度学习、机器学习、计算机视觉和模式识别。
在本博客中,我们使用MATLAB应用基于深度学习(DL)的技术来检测胸片上的COVID-19。

背景

冠状病毒病(COVID-19)是2019年发现的一种新的人类疾病,过去从未被发现。冠状病毒是一个大家庭的病毒,可以引起从普通感冒到中东呼吸综合征(MERS-COV)和严重急性呼吸综合征(SARS-COV)等晚期呼吸综合征患者的疾病。许多人目前受到影响,正在世界各地接受治疗,导致全球大流行。仅在美国,就可能有1.6亿至2.14亿人在COVID-19流行期间受到感染(https://www.nytimes.com/2020/03/13/us/coronavirus-deaths-estimate.html).几个国家已经宣布进入国家紧急状态,并隔离了数百万人。以下是一篇关于冠状病毒如何影响人类的详细文章:https://www.nytimes.com/article/coronavirus-body-symptoms.html
检测和诊断工具为医生提供有价值的第二意见,并在筛查过程中协助他们。这种机制也有助于迅速向医生提供结果。在本博客中,我们使用MATLAB应用基于深度学习(DL)的技术来检测胸片上的COVID-19。
Covid-19数据集在这个博客中使用的是由约瑟夫·科恩博士他是蒙特利尔大学的博士后研究员。多亏了文章通过艾德里安博士Rosebrock为全球的研究人员提供了胸片数据集,并使用DL展示了最初的工作。请注意,我们只使用x射线图像。您应该能够直接从本文中下载图像。在从网站下载ZIP文件并将它们解压缩到一个名为“covid19”的文件夹后,“dataset”中每个类都有一个子文件夹。“Covid”字样表示患者存在Covid -19,否则为“正常”。因为我们有两个阶级的平均分布(25张图片),所以这里没有阶级不平衡的问题。

加载数据集

让我们从使用加载数据库开始imageageAtastore..它是一个计算上有效的功能,可以将图像与其标签一起加载,以进行分析。
%清除工作区清除;关闭所有;CLC;% Images Datapath -请相应地修改您的路径datapath公司=“数据集”;%的图像数据存储IMDS = imageageAtastore(DataPath,...'uppordubfolders',true,...'labelsource','foldernames');确定分割total_split = countEachLabel (imd)

可视化图像

让我们来看看图像,并查看每个类的图像如何不同。它还可以帮助我们确定可以应用于区分两个类的分类技术的类型。基于图像,我们可以识别有助于我们分类过程的预处理技术。我们还可以根据类别内的相似性确定可以用于研究的CNN架构类型,以及跨类的差异。
%图像数量num_images = length(imds.labels);%可视化随机图像烫= randperm (num_images 6);图;idx = 1:长度(烫)次要情节(2、3、idx);imshow (imread (imds.Files{烫发(idx)}));标题(sprintf(“% s”,imds.Labels(烫发(idx))))
为了简化DL架构的分类过程,我们应用简单的预处理技术,并且在本文末尾括起来。

K-fold验证

正如你已经知道的,在这个数据集中有一个有限的图像集,我们将数据集分成10倍进行分析,即使用数据集中的不同图像集训练10种不同的算法。与典型的hold-out验证方法相比,这种类型的验证研究将为我们提供更好的绩效评估。
我们在这个博客中采用了ResNet-50架构,因为它已经被证明在各种医学成像应用中是非常有效的[1,2]。
%折叠数量num_folds = 10;%循环每次折叠对于fold_idx=1:num_folds fprintf('Processing %d among %d folds \n',fold_idx,num_folds);%当前折叠的测试指数test_idx = fold_idx: num_folds: num_images;当前折叠的%测试用例test_idx imdsTest =子集(imd);%当前折叠的训练指数train_idx = setdiff(1:长度(imds.Files) test_idx);%列车案件用于当前折叠IMDStrain =子集(IMDS,TRATH_IDX);% ResNet架构网= resnet50;lgraph = layerGraph(净);清楚净;%类别数量numClasses =元素个数(类别(imdsTrain.Labels));%新的可学习层newLearnableLayer = fulllyconnectedlayer (numClasses,…“名称”、“new_fc’,……“WeightLearnRateFactor”10…“BiasLearnRateFactor”,10);%用新图层替换最后一层LGRAPH = REPLAYELAYER(LGAPRAGE,'FC1000',NewLearnablayer);newsoftmaxlayer = softmaxlayer('name','new_softmax');Lgraph = ReployElayer(LGraph,'FC1000_Softmax',NewsoftmaxLayer);newclasslayer = classificationlayer('name','new_classoutput');LGRAPH = REPLAYELAYER(LGAPH,'ClassificationLayer_FC1000',NewClassLayer);%的预处理技术imdsTrain。ReadFcn = @(文件名)preprocess_Xray(文件名);imdsTest。ReadFcn = @(文件名)preprocess_Xray(文件名);% Training Options,由于图像有限,我们选择一个小的迷你批处理大小选项= TrainingOptions('adam',...'maxepochs',30,'minibatchsize',8,...'shuffle','near-epoch',...'italllearnrate',1e-4,...'verbose',false,...'plots','培训 - 进展');%数据共消沉augmenter = imageDataAugmenter(…“RandRotation”,5[5],“RandXReflection”,1,…RandYReflection, 1,“RandXShear”,[-0.05 - 0.05],“RandYShear”,[-0.05 - 0.05]);%培训所有培训图像大小到[224 224]对于Reset架构auimds = augmentedimagedataStore([224 224],Imdstrain,'dataaugmentation',增强者);% 训练nettransfer = trainnetwork(auimds,lgraph,选项);为Reset架构调整所有测试图像的大小大小[224 224]奥图斯蒂姆兹= upmentedimageGateSore([224 224],IMDSTEST);%检测及其相应的标签和后验[predicted_labels(test_idx),后退(test_idx,:)] =分类(NetTransfer,Augtestimds);%保存为每个折叠获得的独立resnet架构保存(sprintf (ResNet50_ % d_among_ % d_folds, fold_idx, num_folds),‘netTransfer’,‘test_idx’,‘train_idx’);%清除不必要的变量clearvars  -  except fold_idx num_folds num_images predge_labels后IMDs nettransfer;结束

每个折叠将在训练时显示训练图,因为简洁起见,这仅显示最终的训练图,折叠10的10。

性能研究

让我们用混淆矩阵来衡量算法的性能——这个度量也给出了在精确度和回忆率方面的性能。我们认为总体准确性是一个很好的指标,因为在本研究中使用的测试数据集是均匀分布的(就属于每个类别的图像而言)。
混乱矩阵
%实际标签实际_labels = imds.labels;%困惑矩阵图;plotconfusion(actual_labels,predicted_labels') title('Confusion Matrix: ResNet');
ROC曲线
ROC将帮助医生在误报和检测率方面选择他们的操作点。
test_labels =双(名义(imds.Labels));% ROC曲线-我们的目标类是这个场景中的第一个类[fp_rate,tp_rate,t,auc] = perfcurve(test_labels,后(:,1),1);图;plot(fp_rate,tp_rate,'b-');网格;Xlabel('假阳性率');ylabel('检测率');
% ROC曲线下面积AUC

类激活映射

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

在其他公开可用的数据集上进行测试

为了进一步研究和分析该算法的性能,我们确定了其他公共可用数据集没有任何COVID-19标签的COVID-19概率。我们利用在[2]中由放射科医生标记为正常、细菌性肺炎或病毒性肺炎的病例。如上所述,每个网络都使用来自COVID-19数据集的一组不同的图像进行训练。任何covid后验值大于0.5的图像都被认为是假阳性(FP)。结果表明,该算法具有较高的特异性和敏感性。在单核GPU上,每个测试用例花费的时间接近13毫秒。

结论

在本博客中,我们为Covid-19的CAD提出了一种简单的深度学习的分类方法。使用RESET的分类算法相对较好地执行高总体精度和AUC。转移学习方法的性能明确重申,基于CNN的分类模型良好的提取特征。算法可以轻松地用新的标记图像重新培训,以进一步增强性能。将这些结果与其他泄漏架构相结合将在AUC和整体准确性方面提供促进性能。在计算(内存和时间)和性能方面,对这些算法的全面研究提供了主题专家根据其选择选择算法。CAD对Covid-19筛选的医生有很大帮助,并有助于提供有价值的第二次意见。

参考

[1] Narayanan,B. N.,De Silva,M.S.,Hardie,R.C.,Kueterman,N.K.,&Ali,R。(2019)。“了解医学成像应用的深度神经网络预测”。Arxiv预印迹arxiv:1912.09621。
Narayanan, B. N., Davuluru, V. S. P. & Hardie, R. C.(2020年3月)。“胸部x线片肺炎诊断的两阶段深度学习体系”。《2020年医学成像:医疗保健、研究和应用的成像信息学》(第11318卷,第113180G页)。国际光学与光子学学会。

预处理功能

函数iout = preprocess_xray(文件名)这个函数通过将给定的x射线图像转换为%灰度如果需要,稍后转换为3通道图像以适应%存在的深度学习架构%作者:Barath Narayanan%日期:3/17/2020%读取文件名I = imread(文件名);%某些图像可能是RGB,将它们转换为灰度如果~ ismatrix(我)我= rgb2gray(我);结束复制图像3次,创建一个RGB图像iout =猫(3,我,我,我);结束
在这篇文章中为Barath有任何疑问吗?留言下面
|

注释

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