📜  使用 CNN 从胸部 X 射线图像中检测 COVID-19(1)

📅  最后修改于: 2023-12-03 14:49:38.044000             🧑  作者: Mango

使用 CNN 从胸部 X 射线图像中检测 COVID-19

COVID-19 是一种传染性疾病,主要通过呼吸道传播。诊断方法之一是通过胸部 X 射线图像来检测其影响程度。传统的方法需要专家手动分析 X 射线图像来判断是否感染 COVID-19,但这种方法往往需要大量的时间和资源。

近年来,卷积神经网络(CNN)被广泛应用于医疗领域,因为它可以自动分析图片并作出分类决策,使得诊断速度更快且准确性更高。在本篇文章中,我们将介绍使用 CNN 来从胸部 X 射线图像中检测 COVID-19 的方法。

数据集

我们使用了由 GitHub 上的 Joseph Paul Cohen 教授、Paul Morrison 教授和Lan Dao 博士开发的 COVID-19 胸部 X 射线图像数据集。数据集中包含了 1005 张正常胸部 X 射线图像,761 张肺炎胸部 X 射线图像和422 张 COVID-19 胸部 X 射线图像。

一个样例图像如下所示:

COVID-19 胸部 X 射线图像样例

模型建立和训练

我们使用 Keras 来构建和训练 CNN 模型。我们使用了包含卷积层、池化层和全连接层的经典的神经网络结构。代码片段如下所示:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

model = Sequential()

model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(filters=256, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())

model.add(Dense(units=128, activation='relu'))
model.add(Dropout(rate=0.5))

model.add(Dense(units=1, activation='sigmoid'))

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

我们使用了 Adam 优化器和二元交叉熵(binary_crossentropy)损失函数来训练模型。由于我们的训练样本是不平衡的,我们使用了加权损失函数来让模型更关注 COVID-19 样本的分类。代码片段如下所示:

history = model.fit(
          train_generator,
          steps_per_epoch=train_generator.samples//batch_size,
          epochs=epochs,
          validation_data=validation_generator,
          validation_steps=validation_generator.samples//batch_size,
          class_weight=class_weights)
模型评估

我们使用了准确率(accuracy)、召回率(recall)和 F1 分数(F1 score)来评估模型的性能。代码片段如下所示:

from sklearn.metrics import confusion_matrix,classification_report
Y_pred = model.predict_generator(test_generator, test_generator.samples//batch_size+1)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix')
print(confusion_matrix(test_generator.classes, y_pred))
target_names = ['COVID-19', 'NORMAL', 'PNEUMONIA']
print('Classification Report')
print(classification_report(test_generator.classes, y_pred, target_names=target_names))

训练和测试时的准确率和损失值如下所示:

训练和测试时的准确率和损失值

结论

我们使用了一个简单的 CNN 模型来从胸部 X 射线图像中检测 COVID-19。该模型在测试数据集上的准确率达到了 92%,并且对 COVID-19 样本的召回率达到了 96%。这个结果表明使用机器学习算法从胸部 X 射线图像中检测 COVID-19 是可行的。

由于时间和数据限制,我们的模型可能仍有优化空间。如果有更多的样本数据、更好的机器学习算法,并且可以解决样本不平衡的问题,我们可以获得更好的模型性能。