人工智能

应用机器学习和深度学习

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

我很高兴发表另一篇文章Barath Narayanan代顿大学研究所(UDRI),LinkedIn的资料
作者:博士。罗素·c·哈迪美国代顿大学
博士。Barath Narayanan2013年和2017年分别毕业于美国代顿大学(UD),获得电气工程硕士和博士学位。他目前担任联合任命的研究科学家UDRI的软件系统组并作为附属教员ECE部门在特拉华大学。他的研究方向包括深度学习、机器学习、计算机视觉和模式识别。
在这篇博客中,我们将应用基于深度学习(DL)的技术,使用MATLAB在胸片上检测COVID-19。

背景

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

加载数据集

让我们从使用加载数据库开始imageDatastore.它是一个计算效率很高的函数,可以加载图像及其标签进行分析。
清理工作区清晰;关闭所有;clc;%图像数据路径-请相应地修改您的路径datapath公司=“数据集”;%镜像数据存储imd = imageDatastore (datapath公司,……“IncludeSubfolders”,真的,…“LabelSource”、“foldernames”);决定拆分total_split = countEachLabel (imd)

视觉化图像

让我们可视化这些图像,看看每个类的图像有什么不同。它还将帮助我们确定可以用于区分这两个类别的分类技术的类型。基于这些图像,我们可以识别有助于我们分类过程的预处理技术。我们还可以根据类内的相似性和类间的差异来确定可以用于研究的CNN体系结构的类型。
%图像数量num_images =长度(imds.Labels);%可视化随机图像烫= randperm (num_images 6);图;对于idx=1:长度(perm) subplot(2,3,idx);imshow (imread (imds.Files{烫发(idx)}));标题(sprintf(“% s”,imds.Labels(烫发(idx))))
为了简化DL体系结构的分类过程,我们应用了简单的预处理技术,本文最后附上了该函数。

K-fold验证

正如您已经知道的那样,这个数据集中可用的图像集有限,我们将数据集分成10个部分进行分析,即使用数据集中的不同图像集训练10种不同的算法。与典型的保留验证方法相比,这种类型的验证研究将为我们提供更好的性能评估。
我们在本博客中采用ResNet-50架构,因为它已被证明对各种医学成像应用非常有效[1,2]。
褶数%num_folds = 10;%循环为每个折叠forfold_idx =1:num_folds fprintf('处理%d在%d折叠\n',fold_idx,num_folds);%当前折度测试指标test_idx = fold_idx: num_folds: num_images;%当前折叠的测试用例imdsTest =子集(imds,test_idx);%当前折叠的训练指数train_idx = setdiff(1:长度(imds.Files) test_idx);%为当前折叠训练案例imdsTrain =子集(imds,train_idx);% ResNet架构网= resnet50;lgraph = layerGraph(net);清楚净;类别数量%numClasses = numel(categories(imdsTrain.Labels));%新的可学习层newLearnableLayer = fullyConnectedLayer(numClasses,…“名称”、“new_fc’,……“WeightLearnRateFactor”10…“BiasLearnRateFactor”,10);用新的图层替换最后的图层lgraph = replaceLayer(lgraph,'fc1000',newLearnableLayer);newsoftmaxLayer = softmaxLayer('Name','new_softmax');lgraph = replaceLayer(lgraph,'fc1000_softmax',newsoftmaxLayer);newClassLayer = classificationLayer('Name','new_classoutput');lgraph = replaceLayer(lgraph,'ClassificationLayer_fc1000',newClassLayer);预处理技术imdsTrain。ReadFcn = @(filename)preprocess_Xray(filename);imdsTest。ReadFcn = @(filename)preprocess_Xray(filename);%训练选项,我们选择一个小的迷你批量大小,因为有限的图像选项= trainingOptions('adam',…‘MiniBatchSize MaxEpochs, 30日,8日……“洗牌”、“every-epoch’,……“InitialLearnRate”,1的军医,…“详细”,假的,…“阴谋”,“训练进步”);数据扩充imageDataAugmenter(…“RandRotation”,5[5],“RandXReflection”,1,…RandYReflection, 1,“RandXShear”,[-0.05 - 0.05],“RandYShear”,[-0.05 - 0.05]);ResNet架构将所有训练图像大小调整为[224 224]auimds = augmentedImageDatastore([224 224],imdsTrain,'DataAugmentation',augmenter);%的培训netTransfer = trainNetwork(auimds,lgraph,options);ResNet架构将所有测试图像大小调整为[224 224]augtestimds = augmentedImageDatastore([224 224],imdsTest);%测试及其对应的标签和每个案例的后验性[predicted_labels(test_idx),posterior(test_idx,:)] = category (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 predicted_labels后验imds netTransfer;结束

每次折叠都将在训练时显示一个训练图,为简洁起见,这只显示最终的训练图,折叠10 / 10。

性能研究

让我们从混淆矩阵的角度来衡量我们算法的性能——这个指标也能很好地反映精度和召回率方面的性能。我们认为总体准确性是一个很好的指标,因为本研究中使用的测试数据集是均匀分布的(就属于每个类别的图像而言)。
混淆矩阵
%实际标签actual_labels = imds.Labels;%混淆矩阵图;plotconfusion(actual_labels,predicted_labels') title('混淆矩阵:ResNet');
ROC曲线
ROC将根据假阳性和检出率协助医生选择手术点。
test_labels =双(名义(imds.Labels));% ROC曲线-我们的目标类是这个场景中的第一个类[fp_rate tp_rate T, AUC] = perfcurve (test_labels后(:1)1);图;情节(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分类方法。基于ResNet的分类算法总体精度和AUC较高,分类效果较好。迁移学习方法的表现清楚地重申了基于CNN的分类模型在提取特征方面的良好效果。算法可以很容易地用新的标记图像集重新训练,以进一步提高性能。将这些结果与其他现有架构相结合,将在AUC和整体精度方面提高性能。在计算(内存和时间)和性能方面对这些算法进行全面研究,为主题专家根据他们的选择选择算法提供了依据。CAD将为医生进行COVID-19筛查提供很大帮助,并有助于提供有价值的第二意见。

参考文献

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

预处理功能

函数Iout = preprocess_Xray(filename)此函数对给定的x射线图像进行预处理,将其转换为%的灰度,如果需要,后期转换为3通道图像适应%现有的深度学习架构%作者:Barath Narayanan日期:3/17/2020读取文件名I = imread(文件名);%有些图像可能是RGB,将它们转换为灰度if ~ismatrix(I) I=rgb2gray(I);结束%复制镜像3次,创建RGB镜像Iout = cat(3,I,I,I);结束
关于这篇文章,你有什么问题要问Barath吗?请在下方评论
|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。