Python 中使用 CNN 进行肺炎检测

2024 年 8 月 29 日 | 阅读 6 分钟

肺炎是一种可能危及生命的肺部感染,由细菌、病毒或真菌引起。肺炎的早期检测和诊断至关重要。

对于有效的治疗和更好的患者预后。近年来,深度学习技术,如卷积神经网络 (CNN),在医学图像中早期诊断肺炎方面显示出有希望的结果。

本文将讨论如何使用 Python 中的 CNN 构建肺炎检测系统。我们将首先解释 CNN 的基础知识及其架构,然后是用于训练我们模型的数据集,最后,我们将逐步介绍构建和训练模型所涉及的步骤。

卷积神经网络

卷积神经网络 (CNN) 是常用于图像识别和计算机视觉任务的深度神经网络。CNN 旨在自动和自适应地从图像中学习特征的空间层次结构。它们由多个层组成,包括卷积层、池化层和全连接层。

卷积层对输入图像执行称为卷积的数学运算以提取特征图。

这些特征图表示图片中的特定模式和结构。池化层通过执行最大池化或平均池化等操作来减少特征图的空间维度。最后,全连接层使用提取的特征将图像分类为不同的类别。

数据集

我们将使用来自 Kaggle 的胸部 X 射线图像数据集来训练和测试我们的肺炎检测模型。该数据集包含 5,863 张 JPEG 格式的胸部 X 射线图像,分为正常和肺炎。肺炎类别包括细菌性和病毒性肺炎病例。

我们将使用 80% 的数据集进行训练,20% 进行模型测试。在训练之前,

我们将通过将图像大小调整为 224x224 像素并对像素值进行归一化。

在 0 和 1 之间。

构建和训练模型

我们将使用 Keras(一个流行的深度学习框架)来构建和训练我们的 CNN 模型。我们将首先导入所需的库并定义我们的模型架构。

我们的模型由四个卷积层组成,每个卷积层之后是一个最大池化层,以减少特征图的空间维度。然后我们扁平化输出并将其通过两个全连接层。最后一层有一个 sigmoid 激活函数,用于将输入图像分类为正常或肺炎。

我们将使用二元交叉熵损失函数和 Adam 优化器编译我们的模型。我们还将在训练期间监控准确性指标。

接下来,如前所述,我们将加载数据集并对图像进行预处理。

我们使用 `flow_from_directory()` 函数从各自的目录加载训练和测试图像。该过程还对训练图像执行数据增强,例如随机旋转和翻转,以提高模型的泛化能力。

最后,我们使用 `fit()` 函数训练我们的模型,并将训练好的模型保存到文件中以备将来使用。

我们将模型训练 10 个 epoch,并在每个周期后评估其在验证集上的性能。我们将训练好的模型保存到名为 pneumonia_detection_model.h5 的文件中。

评估模型

训练模型后,我们可以使用 evaluate() 函数评估其在测试数据集上的性能。

我们在测试数据集上的准确率约为 85%。我们还可以使用 matplotlib 库可视化训练和验证期间的准确率和损失。

上面的代码绘制了训练和验证准确率和损失随 epoch 数量的变化。我们可以看到我们的模型在训练集和验证集上都取得了很高的准确率。

现在,让我们定义我们的 CNN 模型。我们将定义一个包含四个卷积层和随后的最大池化层的序贯模型。我们还将使用批量归一化来归一化每个批次中前一层的激活。

我们将使用二元交叉熵损失作为我们的损失函数,因为我们有一个二元分类问题(肺炎或非肺炎)。我们还将使用学习率为 0.0001 的 Adam 优化器。

接下来,我们将使用 fit 生成器函数训练我们的模型。我们将使用 0.0001 的初始学习率,并在每五个 epoch 后将其降低 0.1,以帮助模型更快地收敛。我们还将使用早期停止来防止过拟合。

训练模型后,我们可以在测试集上评估它并打印分类报告和混淆矩阵,以查看其表现如何。

定义 CNN 模型架构

在此步骤中,我们定义了 CNN 模型的架构。我们首先使用 Keras 库中的 Sequential() 函数初始化模型。然后,我们使用 Conv2D() 过程向模型添加卷积层,然后使用 MaxPooling2D() 函数添加最大池化层。最后,我们使用 Flatten() 部分展平卷积层的输出,并使用 Dense() 函数添加全连接层。

我们首先使用 Sequential() 函数初始化 CNN 模型。然后我们添加三个卷积层,每个卷积层后面都跟着一个最大池化层。第一个卷积层有 32 个过滤器,而第二个和第三个卷积层分别有 64 和 128 个过滤器。所有卷积层都具有 (3,3) 的核大小并使用 ReLU 激活函数。

在卷积层之后,我们使用 Flatten() 函数展平输出并添加两个全连接层。第一个全连接层有 128 个单元并使用 ReLU 激活函数,而第二层有一个单元并使用 sigmoid 激活函数,因为这是一个二元分类问题。

最后,我们使用 Adam 优化器、二元交叉熵损失函数和准确率作为评估指标编译模型。

数据增强是一种通过对现有模型应用随机变换来生成新训练样本的技术。这在我们拥有小型数据集时非常有用,因为它有助于增加数据集的大小并减少过拟合。

结论

本教程讨论了如何使用 Python 中的 CNN 构建肺炎检测系统。我们使用胸部 X 射线图像数据集来训练和测试我们的模型,并在测试数据集上实现了约 85% 的准确率。CNN 在医学图像分析中显示出有希望的结果,可用于各种医疗保健应用,例如疾病诊断和药物发现。