首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

利用深度学习检测疟疾

"健康就是财富"已经是一个陈词滥调,但是,却非常真实!

本文我们将研究如何利用AI来检测疟疾,这是一种致命的疾病,并且有望建立一个低成本,有效和准确的开放源代码解决方案。本文的目的是双重的 -了解疟疾的原因和重要性以及深度学习在检测疟疾方面的有效性。我们将在本文中介绍以下主要主题。

· 这个项目的动机

· 疟疾检测方法

· 疟疾检测的深度学习

· 卷入神经网络(CNN)从头开始训练

· 使用预训练模型进行转学习

在我们开始之前,我想说明我既不是医生也不是医疗保健研究员。本文的目的不是要深入了解人工智能将取代医疗工作和接管世界的宣传,而是要展示人工智能如何有助于疟疾检测,诊断和减少手工劳动,以低成本有效和准确开放源代码解决方案。

Python和TensorFlow - 构建开放源代码深度学习解决方案的绝佳组合

由于Python的强大功能和TensorFlow等深度学习框架,我们可以构建强大,可扩展且有效的深度学习解决方案。这些工具的额外好处是开放源代码和免费,使我们能够构建真正具有成本效益的解决方案,并且每个人都可以轻松采用和使用。

疟疾致病原因

疟疾是由疟原虫寄生虫引起的一种致命的传染性蚊子传播疾病。这些寄生虫通过被感染的雌性按蚊的叮咬传播。

有五种主要类型的疟疾。现在让我们来看看这种疾病在以下情节中的致命性的重要性。

疟疾估计风险健康地图

很明显,疟疾在全球普遍存在,特别是在热带地区。然而,这个病的原因是基于这种疾病的性质和致命性。最初,如果被感染的蚊子叮咬你,蚊子携带的寄生虫会进入你的血液并开始摧毁携氧的红细胞。通常,当你在蚊虫叮咬后几天或几周内感觉不适时,疟疾的第一个症状类似于流感或病毒。

然而,这些致命的寄生虫可以在你的身体中存活超过一年没有任何问题!因此,正确治疗的延迟可能导致并发症甚至死亡。因此,早期有效的疟疾检测和检测可以挽救生命。

世界卫生组织已经发布了几个关于疟疾的重要事实,简而言之,世界上将近一半的人口面临疟疾风险,每年有超过2亿疟疾病例和大约40万人死于疟疾。这使我们更有动力使疟疾检测和诊断快速、简便和有效。

疟疾检测方法

有几种方法和测试可用于疟疾检测和诊断。简要介绍一下这些方法。这些包括但不限于厚和薄的血涂片检查,聚合酶链反应(PCR)和快速诊断测试(RDT)。虽然我们不会详细介绍这里的所有方法,但要记住的一点是,后两种测试是通常使用的替代方法,特别是在无法提供高质量显微镜服务的情况下。

基于典型的血液涂片工作流程,我们将简要讨论标准疟疾诊断。

疟疾检测的血涂片工作流程

根据WHO方案的指导原则,该程序包括在100倍放大倍数下对血涂片进行深入检查,人们手动计算含有5000个细胞中寄生虫的红细胞。厚血涂片有助于检测寄生虫的存在,而薄血涂片有助于识别引起感染的寄生虫种类。诊断准确性在很大程度上取决于人类的专业知识,并且可能受到观察者间差异和疾病流行受限区域大规模诊断所造成的不利影响。因此应该使用替代技术,例如聚合酶链反应(PCR)和快速诊断测试(RDT)。然而,PCR分析的表现受到限制,而RDT在疾病流行地区的成本效益较低。

所以,疟疾检测绝对是一个劳动密集的手动过程,但我们也许可以使用深度学习自动化,这构成了本文的基础。

用于疟疾检测的深度学习

定期手动诊断血涂片,这是一个密集的手动过程,需要适当的专业知识来分类和计数寄生和未感染的细胞。通常情况下,如果我们在世界各地的特定地区没有合适的专业知识,这可能无法很好地解决并可能导致问题。

在利用最先进的(SOTA)图像处理和分析技术提取手工设计的特征和构建基于机器学习的分类模型方面取得了一些进展。然而,由于手工设计的特征需要花费大量时间,因此这些模型无法扩展,需要提供更多数据用于训练。

深度学习模型,或更具体地说,卷积神经网络(CNN)已被证明在各种计算机视觉任务中非常有效。如果你不了解CNN,请随时通过查看本头条号文章深入了解它们。简而言之,CNN模型中的关键层包括卷积和池化层,如下图所示。

典型的CNN架构

卷积层从数据中学习空间分层模式,这些模式也是平移不变的。因此,他们能够学习图像的不同方面。例如,第一卷积层将学习诸如边缘和角落的小和局部图案,第二卷积层将基于来自第一层的特征来学习更大的图案,等等。这允许CNN自动化特征工程并学习有效的特征,这些特征很好地概括了新的数据点。池层有助于下采样和降维。

因此,CNN帮助我们实现自动化和可扩展的特征工程。此外,在模型末端插入密集层使我们能够执行图像分类等任务。使用像CNN这样的深度学习模型进行自动疟疾检测可能非常有效,简便且可扩展,特别是随着迁移学习和预训练模型的出现,这些模型即使在数据量较少等限制条件下也能很好地工作。

我们的重点是从头开始尝试一些简单的CNN模型和一些预先训练的模型,使用传递学习来查看我们在同一数据集上得到的结果!我们将使用包含Python和TensorFlow的开放源代码工具和框架来构建我们的模型。

数据集详细信息

我们来谈谈我们将在分析中使用的数据集。我们很幸运有收集并注释了这个健康和感染血涂片图像的数据集。

包括来自150只恶性疟原虫感染的和50名健康患者的Giemsa染色的薄血涂片载玻片并在孟加拉国吉大港医学院医院拍照。智能手机的内置摄像头为每个微观视野获取了图像。图像由泰国曼谷Mahidol-Oxford热带医学研究单位的专家幻灯片阅读器手动注释。让我们简要地看一下我们的数据集结构。我们首先根据使用的操作系统安装一些基本依赖项。

我在云上使用基于Debian的系统,有GPU,所以我可以更快地运行我的模型。如果没有Install the tree,请先安装,以便我们可以查看目录结构(sudo apt install tree)。

我们有两个文件夹,其中包含受感染和健康的细胞图像。我们可以使用以下代码进一步了解图像总数。

我们有一个13779 疟疾和非疟疾(未感染)细胞图像的平衡数据集。让我们从中构建一个数据帧,这将在我们开始构建数据集时对我们很有用。

构建和探索图像数据集

要构建深度学习模型,我们需要训练数据,但我们还需要测试模型在看不见的数据上的性能。我们将分别使用60:10:30分割列车,验证和测试数据集。我们将在训练期间利用训练和验证数据集,并检查模型在测试数据集上的性能。

现在显然,由于血涂片和细胞图像将根据人、测试方法和拍摄照片的方向而变化,因此图像的尺寸不同。让我们得到一些训练数据集的摘要统计数据,以确定最佳图像尺寸。

我们应用并行处理来加速图像读取操作,并且基于汇总统计,我们决定将每个图像调整为125x125像素。让我们加载所有图像并将它们调整为这些固定尺寸。

我们再次利用并行处理来加速与图像加载和调整大小相关的计算。最后,我们得到了所需尺寸的图像张量,如前面的输出所示。我们现在可以查看一些样本单元格图像,以了解我们的数据是如何形成的。

基于上面的示例图像,我们可以注意到疟疾和健康细胞图像之间的一些细微差别。我们将基本上使我们的深度学习模型尝试并学习这些模式。在开始训练模型之前,我们设置了一些基本配置。

我们修复图像尺寸,批量大小,时间并编码我们的分类标签。

深度学习模式训练阶段

在模型训练阶段,我们将构建几个深度学习模型,并根据我们的训练数据进行训练,并比较它们在验证数据上的表现。然后,我们将保存这些模型,并在模型评估阶段再次使用它们。

模型1:CNN

我们的第一个疟疾检测模型将从头开始构建和训练基本的卷积神经网络(CNN)。首先让我们定义我们的模型架构。

基于前面代码中的体系结构,我们的CNN模型有三个卷积和池化层,后面是两个密集层和丢失用于正则化。让我们现在训练我们的模型吧!

我们得到的验证准确率为95.6%,这是非常好的,尽管我们的模型看起来过于拟合,略微看我们的训练准确率为99.9%。通过绘制训练和验证准确度和损失曲线,我们可以对此有清晰的认识。

基本CNN的学习曲线

因此,我们可以看到在第五代之后,事情似乎并没有改善整体。让我们保存这个模型以备将来评估。

model.save( 'basic_cnn.h5')

深度迁移学习

就像人类具有能够跨任务传递知识的固有能力一样,迁移学习使我们能够利用先前学习的任务中的知识,并将其应用于更新的相关任务,即使在机器学习或深度学习的环境中也是如此。

深度迁移学习的想法

我们将应用两种最受欢迎的深度迁移学习策略。

· 预训练模型作为特征提取器

· 具有微调的预训练模型

我们将使用由牛津大学视觉组(VGG)开发的预训练VGG-19深度学习模型进行实验。像VGG-19这样的预训练模型是一个已经预先训练过的模型,它位于具有大量不同图像类别的大型数据集(ImageNet)上。考虑到这一事实,该模型应该已经学习了一个强大的特征层次结构,这些特征是关于CNN模型学习的特征的空间,旋转和平移不变量。因此,该模型已经学习了超过一百万个图像的特征,可以作为适合计算机视觉问题的新图像的良好特征提取器,就像疟疾检测一样!在释放我们问题的迁移学习的力量之前,让我们简要讨论一下VGG-19模型架构。

了解VGG-19模型

VGG-19模型是一个19层(卷积和完全连接)深度学习网络,建立在ImageNet数据库上,该数据库是为图像识别和分类而构建的。这个模型由Karen Simonyan和Andrew Zisserman建造,并在他们的题为《用于大规模图像识别的超深度卷积网络》的论文中提到。VGG-19型号的架构如下图所示

VGG-19模型架构

你可以清楚地看到我们总共有16卷积层使用3 x 3卷积滤波器以及用于下采样的最大池层,并且每层中总共有两个完全连接的隐藏层4096单元,后面是密集的1000单元层,其中每个单元代表一个ImageNet数据库中的图像类别。我们不需要最后三层,因为我们将使用我们自己的完全连接的密集层来预测疟疾。我们更关注前五个块,以便我们可以利用VGG模型作为有效的特征提取器。

对于其中一个模型,我们将它作为一个简单的特征提取器,通过冻结所有五个卷积块来确保它们的权重在每个时期之后不会更新。对于最后一个模型,我们将对VGG模型应用微调,我们将解冻最后两个块(块4和块5),以便在我们训练我们的每个时期(每批数据)时更新它们的权重自己的模特。

模型2:预训练模型作为特征提取器

为了构建这个模型,我们将利用TensorFlow加载VGG-19模型,并冻结卷积块,以便我们可以将其用作图像特征提取器。我们将在末尾插入我们自己的密集层以执行分类任务。

因此,从前面的输出可以看出,我们的模型中有很多层,我们将仅使用VGG-19模型的冻结层作为特征提取器。你可以使用以下代码来验证我们模型中有多少层确实可以训练,以及我们的网络中存在多少层。

我们现在将使用我们之前模型中使用的类似配置和回调来训练我们的模型。我们观察以下图表,显示模型的准确性和损失。

用于冷冻预训练CNN的学习曲线

这向我们展示了我们的模型并不像我们的基本CNN模型那样过度拟合,但性能并不是真的更好,实际上比我们的基本CNN模型更小。我们现在保存此模型以供将来评估。

model.save( 'vgg_frozen.h5')

模型3:具有图像增强的微调预训练模型

在我们的最终模型中,我们将微调我们预训练的VGG-19模型的最后两个区块中存在的层的权重。除此之外,我们还将介绍图像增强的概念。

图像增强背后的想法与名称听起来完全一样。我们从训练数据集加载现有图像并对它们应用一些图像变换操作,例如旋转,剪切,平移,缩放等,以生成现有图像的新的、更改的版本。

由于这些随机变换,我们每次都不会得到相同的图像。我们将利用所谓的一个很好的工具ImageDataGenerator中tf.keras,它可以帮助我们建立形象。

除了缩放图像之外,我们不对我们的验证数据集应用任何转换,因为我们将使用它来评估每个时期的模型性能。我们来看一批图像增强变换的一些样本结果。

样本增强图像

你可以清楚地看到前面输出中图像的轻微变化。我们现在将构建我们的深度学习模型,确保VGG-19模型的最后两个块可以训练。

我们降低了模型中的学习率,因为我们不希望在微调时对预训练的层进行大的权重更新。由于我们使用的是数据生成器,因此该模型的训练过程略有不同,因此我们将利用该fit_generator(…) 函数。

这看起来是我们最好的模型,但我们的验证精度几乎达到了96.5%,并且基于训练精度,我们的模型看起来并不像我们的第一个模型那样过度拟合。这可以通过以下学习曲线进行验证。

学习曲线用于经过微调的预训练CNN

现在让我们保存这个模型,以便我们可以很快将它用于我们的测试数据集的模型评估。

model.save( 'vgg_finetuned.h5')

这完成了我们的模型训练阶段,现在我们已准备好在实际测试数据集上测试模型的性能!

深度学习模型评估阶段

我们现在将通过对测试数据集中的数据进行预测来评估我们刚刚在训练阶段构建的三种不同模型,因为仅仅验证是不够的!我们还构建了一个漂亮的实用程序模块model_evaluation_utils,我们将使用它来评估具有相关分类指标的深度学习模型的性能。这里的第一步是显然缩放我们的测试数据。

下一步是加载我们保存的深度学习模型并对测试数据进行预测。

最后一步是利用我们的model_evaluation_utils模块,并使用相关的分类指标检查每个模型的性能。

看起来我们的第三个模型在测试数据集上的所有三个模型中表现最好,给出了模型精度96%以及f1分数!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190426A0BQ5J00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券