数据科学是当前计算机科学领域的热点之一。机器学习(ML)在自动驾驶、制造业、医学成像等各种应用领域中一直处于上升趋势。计算机辅助检测与诊断(CAD)在医学影像中的应用一直是一个备受关注的研究领域。全世界有32亿人面临感染疟疾的风险(
https://www.childfund.org/infographic/malaria/).检测和诊断工具为医生提供了有价值的第二意见,并协助他们进行筛查。在这篇博客中,我们将应用基于深度学习(DL)的技术,使用MATLAB在细胞图像上检测疟疾。疟原虫疟疾是一种寄生原生动物,可引起人类疟疾,细胞图像上的疟原虫CAD将有助于显微镜工作人员并增强他们的工作流程。
如果您正在使用代码的任何部分进行研究,请引用下面的文章。
疟疾数据集由美国国立卫生研究院(NIH)公开提供。该数据集包含27,558张图像,属于两个类别(13,779张属于被感染的,13,799张属于未感染的)。所有这些图片都是由Mahidol-Oxford热带医学研究单位的一位专家手动注释的。从网站下载ZIP文件并将它们解压缩到名为“cell_images”的文件夹后,我们在“cell_images”中每个类都有一个子文件夹。寄生表明疟原虫的存在,疟原虫是一种寄生原生动物,表明疟疾的存在。因为两个职业的分配是平等的,所以不存在职业不平衡的问题。
datapath公司=“cell_images”;imd = imageDatastore (datapath公司,……“IncludeSubfolders”,真的,…“LabelSource”、“foldernames”);total_split = countEachLabel (imd)
total_split =2×2表
|
标签 |
数 |
1 |
寄生 |
13779 |
2 |
未受感染的 |
13779 |
视觉化图像
让我们可视化这些图像,看看每个类的图像有什么不同。它还将帮助我们确定可以用于区分这两个类别的分类技术的类型。基于这些图像,我们可以识别有助于我们分类过程的预处理技术。我们还可以根据类内的相似性和类间的差异来确定可以用于研究的CNN体系结构的类型。例如,如果我们看到两个类之间有一个简单的区别(比如区分三角形和正方形),我们可以使用具有最小层的简单CNN架构。我们已经为这个应用程序提出了一个简单的CNN体系结构
纸.
在本文中,我们强调迁移学习。
num_images =长度(imds.Labels);烫= randperm (num_images 20);图;为idx = 1:20次要情节(4、5、idx);imshow (imread (imds.Files{烫发(idx)}));标题(sprintf (' % s 'imds.Labels(烫(idx))))结束
您可以观察到,大多数被寄生的图像都包含一个“红色点”,这表明疟原虫的存在。然而,有一些图像是很难区分的。您可以深入研究数据集以检查一些复杂的示例。此外,由于这些图像是使用不同的显微镜以不同的分辨率捕获的,因此图像颜色也有一个光谱。金宝搏官方网站在下一节中,我们将通过预处理图像来解决这些问题。
预处理
为了简化我们的深度学习架构的分类过程,我们应用颜色恒定技术来解决基于颜色的问题,并根据我们的深度学习架构的需要将图像调整为所需的大小。我们的预处理函数附在本文的末尾。
可视化预处理图像
图;对于idx=1:20 subplot(4,5,idx);imshow(preprocess_malaria_images(imds.Files{perm(idx)},[250 250]) title(sprintf('%s',imds.Labels(perm(idx)))) end . txt)
颜色恒常性有助于保持图像颜色的一致性,并有助于我们的分类算法。
培训、测试和验证
让我们把数据集分成训练、验证和测试。首先,我们将数据集分为80%(训练和验证)和20%(测试)两组。确保每个班级分成等量。
train_percent = 0.80;[imdsTrain, imdsTest] = splitEachLabel (imd, train_percent“随机”);valid_percent = 0.1;[imdsValid, imdsTrain] = splitEachLabel (imdsTrain valid_percent,“随机”);train_split = countEachLabel (imdsTrain);
这为每个类别提供了9921张火车图像、1102张验证图像和2756张测试图像:被感染的和未感染的。
深度学习方法
让我们采用迁移学习方法对细胞图像进行分类。在本文中,我使用AlexNet进行分类,您可以使用本文中提到的其他迁移学习方法
纸或者您认为可能适合此应用程序的任何其他体系结构。
网= alexnet;layersTransfer = net.Layers (1: end-3);清楚净;numClasses =元素个数(类别(imdsTrain.Labels));layers=[layersTransfer fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20) softmaxLayer classificationLayer];
预处理训练和验证数据集
imdsTrain.ReadFcn = @(文件名)preprocess_malaria_images(文件名,(层(1).InputSize(1)层(1).InputSize (2)));imdsValid.ReadFcn = @(文件名)preprocess_malaria_images(文件名,(层(1).InputSize(1)层(1).InputSize (2)));
培训网络
我们将使用验证耐心为4作为停止标准。首先,我们将使用“MaxEpochs”作为我们训练的10,我们可以根据我们的训练进度进一步调整它。理想情况下,当训练过程停止时,我们希望验证性能较高。我们根据我们电脑的内存限制选择了128个迷你批量大小,你可以选择一个更大的迷你批量大小,但一定要相应地改变其他参数。
选择= trainingOptions(“亚当”,…“MiniBatchSize”,128年,…“MaxEpochs”10…“洗牌”、“every-epoch’,……“InitialLearnRate”,1的军医,…ValidationData, imdsValid,……“ValidationFrequency”,50岁,“ValidationPatience”,4,……“详细”,假的,…“阴谋”,“训练进步”);netTransfer = trainNetwork (imdsTrain层,选项);
看看训练进度,我们的模型没有欠拟合或过拟合的问题,而且训练得很好。训练和验证数据集的准确性约为96-97%。
imdsTest.ReadFcn = @(文件名)preprocess_malaria_images(文件名,(层(1).InputSize(1)层(1).InputSize (2)));[predicted_labels,后]= (netTransfer imdsTest)进行分类;
性能研究
让我们从混淆矩阵的角度来衡量我们算法的性能-这个指标也能很好地反映精度和查全率方面的性能。我们认为总体准确性是一个很好的指标,因为本研究中使用的测试数据集是均匀分布的(就属于每个类别的图像而言)。
actual_labels = imdsTest.Labels;图;plotconfusion(actual_labels,predicted_labels) title('混淆矩阵:AlexNet');
ROC曲线
ROC将根据假阳性和检出率协助显微镜师选择其操作点。
test_labels =双(名义(imdsTest.Labels));[fp_rate tp_rate T, AUC] = perfcurve (test_labels后(:1)1);图;情节(fp_rate tp_rate, ' b - ');坚持;网格;xlabel('假阳性率');ylabel(检出率);
AUC
请查看演示这里有一些测试用例!我们使用类激活映射来可视化结果,以分析我们的网络所做的决定,并为显微镜学家提供见解。
结论
在这篇博客中,我们提出了一种简单的基于深度学习的疟原虫CAD分类方法。使用AlexNet的分类算法和使用颜色恒定性的预处理算法表现相对较好,总体准确率为96.4%,AUC为0.992(由于随机分裂,数值会有所不同)。在
纸,我们研究了我们自己的简单CNN, AlexNet, ResNet, VGG-16和DenseNet在同一组训练和测试用例中的性能。迁移学习方法的性能清楚地重申了基于CNN的分类模型在提取特征方面的良好表现。算法可以很容易地用新的标记图像集重新训练,以进一步提高性能。结合所有这些架构的结果,在AUC和整体精度方面都提供了性能的提升。在计算(内存和时间)和性能方面对这些算法进行全面研究,为主题专家根据他们的选择选择算法提供了依据。CAD将极大地帮助显微镜学家进行疟疾筛查,并有助于提供有价值的第二意见。
预处理功能
函数Iout = preprocess_malaria_images(文件名,desired_size)I = imread(文件名);if ismatrix(I) I=cat(3,I,I,I);结束我=双(I);Ir =我(::1);mu_red =意味着(Ir (:));Ig =我(:,:2);mu_green =意味着(Ig (:));Ib =我(:,:,3);mu_blue =意味着(Ib (:));mean_value = (mu_red + mu_green + mu_blue) / 3;Iout(:: 1) =我(:,:1)* mean_value / mu_red;Iout(:: 2) =我(:,:2)* mean_value / mu_green;Iout(:: 3) =我(:,:,3)* mean_value / mu_blue;Iout = uint8 (Iout);Iout = imresize (Iout [desired_size (1) desired_size (2)));结束
我要感谢Barath花时间撰写这篇博文,并与我们分享他的详细代码。特别感谢共同作者Redha阿里,Russell C. Hardie博士,代顿大学(UD)。请查看信号与图像处理实验室网页,以了解更多关于这个小组的工作。
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。