全国服务热线:

15861139266

使用OpenCV进行肺炎诊断检测,苏州机器视觉培训,苏州工业机器人培训
发布时间:2024-03-22 14:06:06 点击次数:157

肺炎是一种由感染引起的严重呼吸道疾病,特别是在高危人群中,可能会出现危及生命的并发症。必须尽快诊断和治疗肺炎,以最大限度地提高患者康复的机会。


诊断过程并不容易,需要一些医学实验室工具和先进的医疗技能,但我们可以使用深度学习和计算机视觉来构建一个快速简便的工具,帮助医生检测肺炎。


我们可以使用称为OpenCV(https://opencv.org/)(开源计算机视觉)的开源计算机视觉和机器学习软件库创建用于图像和视频分析的应用程序,例如 X 射线结果。Open CV 是一个用于执行计算机视觉、机器学习和图像处理的开源库。


在本课中,我们将了解如何使用 OpenCV 识别胸部 X 光图像中的肺炎。


安装 OpenCV

安装 OpenCV 是初始阶段。根据你的操作系统,有多种安装 OpenCV 的方法。以下是一些受欢迎的选择:


Windows:在OpenCV (https://opencv.org/releases/) 主网站上使用预构建的二进制文件。


Linux:可以使用 Linux 发行版中包含的包管理器安装 OpenCV。在终端中运行以下指令,例如,在 Ubuntu 上:


Install libopencv-dev with sudo apt-get

Mac OS:可以使用 Homebrew 设置 OpenCV,应在终端中输入以下代码。


Brew install opencv

加载 OpenCV 后,你可以使用以下 Python 代码检查它是否正常工作。


import cv2

print(cv2.__version__)

如果正确安装了 OpenCV,你应该会在终端中看到版本号。


下载数据集

接下来可以下载将用于训练我们的肺炎检测算法的数据集。在本练习中,我们将使用来自 Kaggle 的胸部 X 光图片(肺炎)数据集。


数据集:https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia


数据集中共有 5,856 张胸部 X 光图像,分为肺炎和正常两类。


你必须注册 Kaggle 帐户并同意数据集的条款才能获取数据集。完成后,在终端中键入以下命令以获取数据集:


kaggle datasets download -d paultimothymooney/chest-xray-pneumonia

将下载包含信息的 ZIP 文件。在你的本地计算机上创建一个子文件夹并提取 ZIP 文件。


准备数据

然后必须为我们的肺炎识别模型的训练准备数据。为了从当前样本中创建更多训练样本,我们将采用一种称为数据增强的方法。


这样做是为了提高模型的性能并更快地构建模型。为了创建同一图片的不同版本,数据增强涉及对图像应用随机变换,例如旋转、缩放和翻转。


我们将制作两个目录来准备数据:一个用于训练图片,一个用于验证图像。80%的图片将用于训练,20%用于验证。


这是准备信息的代码:


import os

import shutil

import random


# Define the paths

input_dir = 'path/to/input/dir'

train_dir = 'path/to/train/dir'

val_dir = 'path/to/val/dir'


# Create the directories

os.makedirs(train_dir, exist_ok=True)

os.makedirs(val_dir, exist_ok=True)


# Get the list of images

image_paths = []

for root, dirs, files in os.walk(input_dir):

    for file in files:

        if file.endswith('.jpeg'):

            image_paths.append(os.path.join(root, file))


# Shuffle the images

random.shuffle(image_paths)


# Split


split_idx = int(0.8 * len(image_paths))

train_image_paths = image_paths[:split_idx]

val_image_paths = image_paths[split_idx:]

现在将图像复制到目录中。将“path/to/input/dir”更改为你在此代码中提取信息的目录路径。要分别保存训练和验证图像的目录的路径应替换为“path/to/train/dir”和“path/to/val/dir”。


努力跟踪和重现复杂的实验参数?工件是 Comet 工具箱中帮助简化模型管理的众多工具之一。


阅读我们的 PetCam 场景以了解更多信息:https://www.comet.com/site/blog/debugging-your-machine-learning-models-with-comet-artifacts/?utm_source=heartbeat&utm_medium=referral&utm_campaign=AMS_US_EN_AWA_heartbeat_CTA


训练模型

使用我们在前一阶段创建的训练图像,我们现在必须训练肺炎检测模型。我们模型的核心将是一个名为 VGG16 的预训练卷积神经网络 (CNN) 。


流行的 CNN 架构 VGG16 在经过大量图像数据集的训练后,在众多图像识别任务上取得了最先进的成功。


下面是训练模型的代码:


from tensorflow.keras.models import Model

from tensorflow.keras.layers import Dense, GlobalAveragePooling2D

from tensorflow.keras.applications import VGG16

from tensorflow.keras.preprocessing.image import ImageDataGenerator


# Define the input shape of the images

input_shape = (224, 224, 3)


# Load the VGG16 model

base_model = VGG16(weights='imagenet', include_top=False, input_shape=input_shape)


# Add a global average pooling layer

x = base_model.output

x = GlobalAveragePooling2D()(x)


# Add a fully connected layer

x = Dense(128, activation='relu')(x)


# Add the output layer

output = Dense(1, activation='sigmoid')(x)


# Define the model

model = Model(inputs=base_model.input, outputs=output)


# Freeze the layers of the VGG16 model

for layer in base_model.layers:

    layer.trainable = False


# Compile the model

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


# Define the data generators for training and validation

train_datagen = ImageDataGenerator(rescale=1./255,

                                   rotation_range=10,

                                   width_shift_range=0.1,

                                   height_shift_range=0.1,

                                   shear_range=0.1,

                                   zoom_range=0.1,

                                   horizontal_flip=True,

                                   fill_mode='nearest')


val_datagen = ImageDataGenerator(rescale=1./255)


train_generator = train_datagen.flow_from_directory(train_dir,

                                                    target_size=input_shape[:2],

                                                    batch_size=32,

                                                    class_mode='binary')


val_generator = val_datagen.flow_from_directory(val_dir,

                                                target_size=input_shape[:2],

                                                batch_size=32,

                                                class_mode='binary')


# Train the model

model.fit(train_generator,

          steps_per_epoch=len(train_generator),

          epochs=10,

          validation_data=val_generator,

          validation_steps=len(val_generator))

首先,我们将 ImageNet 数据集中的预训练权重加载到 VGG16 模型中。我们还包括一个具有 sigmoid 激活函数的输出层、一个具有 128 个神经元的完全连接层和一个全局平均池化层。VGG16 模型的层被冻结,使用 Adam 算法和二元交叉熵损失来构建模型。之后,我们指定用于训练和验证的数据生成器,以扩充数据并将像素值重新缩放到 [0, 1] 范围。


使用拟合方法以及训练和验证数据生成器,我们训练模型 10 个时期。


评估模型

为了确定模型在训练后对新数据的泛化能力如何,我们必须评估其在测试集上的表现。为了评估模型,我们将使用数据集的测试集。此外,我们将显示一些正确和错误分类图像的插图。


使用下面的代码评估模型并显示一些实例。


import numpy as np

import matplotlib.pyplot as plt


# Define the path to the test directory

test_dir = 'path/to/input/dir/chest_xray/test'


# Define the data generator for test

test_datagen = ImageDataGenerator(rescale=1./255)


test_generator = test_datagen.flow_from_directory(test_dir,

                                                  target_size=input_shape[:2],

                                                  batch_size=32,

                                                  class_mode='binary',

                                                  shuffle=False)


# Evaluate the model on the test set

loss, accuracy = model.evaluate(test_generator, steps=len(test_generator))

print(f'Test accuracy: {accuracy:.2f}')


# Get the predictions and true labels

predictions = model.predict(test_generator, steps=len(test_generator))

predictions = np.squeeze(predictions)

true_labels = test_generator.labels


# Get the image filenames

filenames = test_generator.filenames


# Find the indices of the correctly and incorrectly classified images

correct_indices = np.where((predictions >= 0.5) == true_labels)[0]

incorrect_indices = np.where((predictions >= 0.5) != true_labels)[0]


# Plot some correctly classified images

plt.figure(figsize=(10, 10))

for i, idx in enumerate(correct_indices[:9]):

    plt.subplot(3, 3, i+1)

    img = plt.imread(os.path.join(test_dir, filenames[idx]))

    plt.imshow(img, cmap='gray')

    plt.title('PNEUMONIA' if predictions[idx] >= 0.5 else 'NORMAL')

    plt.axis('off')


# Plot some incorrectly classified images

plt.figure(figsize=(10, 10))

for i, idx in enumerate(incorrect_indices[:9]):

    plt.subplot(3, 3, i+1)

    img = plt.imread(os.path.join(test_dir, filenames[idx]))

    plt.imshow(img, cmap='gray')

    plt.title('PNEUMONIA' if predictions[idx] >= 0.5 else 'NORMAL')

    plt.axis('off')


plt.show()

在这段代码中,我们创建了一个测试和评估集数据生成器来评估模型。我们还获得了测试集的预测和真实标签,并找到了正确和错误分类图像的索引。然后,使用 Matplotlib,我们绘制了一些正确和错误分类图像的实例。


结论

在本教程中,我们使用 OpenCV 和 TensorFlow 构建了一个肺炎检测模型。我们使用 OpenCV 读取、处理和可视化图像,并使用 TensorFlow 训练和测试模型。该模型成功地以高精度对大多数测试集的图像进行了分类。


立即咨询
  • 品质服务

    服务贴心周到

  • 快速响应

    全天24小时随时沟通

  • 专业服务

    授权率高,保密性强

  • 完善售后服务

    快速响应需求,及时性服务

直播课程
软件开发基础课程
上位机软件开发课
机器视觉软件开发课
专题课
联系方式
电话:15861139266
邮箱:75607082@qq.com
地址:苏州吴中区木渎镇尧峰路69号
关注我们

版权所有:江苏和讯自动化设备有限公司所有 备案号:苏ICP备2022010314号-1

技术支持: 易动力网络