探究肺癌患者的CT图像的图像特征并构建一个诊断模型

简介: 探究肺癌患者的CT图像的图像特征并构建一个诊断模型

目标

探究肺癌患者的CT图像的图像特征并构建一个诊断模型

效果图

操作说明

代码中我以建立10张图为例,多少你自己定

准备工作:

1.准备肺癌或非肺癌每个各10张图,在本地创建一个名为“data”的文件夹,用于存放数据集。在“data”文件夹下创建两个子文件夹,分别命名为“cancer”和“non_cancer”,用于存放肺癌和非肺癌图像。将10张肺癌图像命名为“cancer_1.jpg”到“cancer_10.jpg”,并将它们放入“cancer”文件夹中。将10张非肺癌图像命名为“non_cancer_1.jpg”到“non_cancer_10.jpg”,并将它们放入“non_cancer”文件夹中。


在开始编写和执行代码之前,请确保已经安装完成以下库:

TensorFlow:用于构建和训练深度学习模型

Keras:用于快速构建和训练模型

scikit-learn:用于评估模型和数据预处理

numpy:用于数组和矩阵操作

OpenCV:用于处理和操作图像数据

matplotlib:用于可视化结果

安装命令

pip install tensorflow 
pip install keras 
pip install scikit-learn 
pip install numpy 
pip install opencv-python 
pip install matplotlib

确保在本地创建了一个名为“data”的文件夹,并在其中创建了名为“cancer”和“non_cancer”的子文件夹。

将肺癌和非肺癌图像分别放入对应的子文件夹,并确保它们的命名正确

3.然后就可以复制上txt里面的代码进行执行了(记得改代码里面路径)

注意事情:

4. 图像大小:在load_images()函数中,已将图像调整为150x150大小。您可以根据实际情况更改此尺寸,但请注意,较大的图像可能会增加计算成本和训练时间。

例如,将图像大小调整为224x224:。

5.灰度图像:如果您的图像是灰度图像,可以将图像从单通道灰度转换为3通道灰度,以适应模型。在load_images()函数中添加如下代码

代码

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
from tensorflow.keras.preprocessing.image import ImageDataGenerator


from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical

# 加载图像并调整大小
def load_images(data_dir, img_size): #从指定目录加载图像文件,并将它们转换成统一大小
    images = []
    labels = []
    for folder in os.listdir(data_dir): #遍历指定路径下的文件夹,其中 os.listdir(data_dir) 返回指定目录中所有文件和文件夹的名称列表
        for file in os.listdir(os.path.join(data_dir, folder)):
            img_path = os.path.join(data_dir, folder, file)
            img = cv2.imread(img_path)
            img = cv2.resize(img, img_size)
            images.append(img)
            labels.append(folder)
    return np.array(images), np.array(labels)

# 构建模型
def create_model(input_shape, num_classes): #创建神经网络模型。函数接受输入数据的形状 input_shape 和分类数量 num_classes 作为参数
    model = Sequential() #将各个神经网络层按照顺序逐层叠加起来,构成一个“线性”模型
    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape)) #添加了一个卷积层 Conv2D 到模型中 (3,3是滤波器大小)
    #接受输入张量(特征图),尺寸为 input_shape;
    #将每个滤波器应用于输入张量;
    #对每个输出结果应用 ReLU 非线性激活;
    #输出包括32张空间特征图通道
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes, activation='softmax'))
    model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
    #optimizer=Adam() 指定使用 Adam 优化算法;
    #loss='categorical_crossentropy' 表示采用交叉熵作为损失函数,适合多分类问题;
    #metrics=['accuracy'] 说明度量模型性能时以准确率作为衡量标准
    return model

# 主程序
def main():
    data_dir = r'F:\code_test\data'
    img_size = (150, 150)#这是图片的大小根据自己图片修改
    num_classes = 2
    batch_size = 4
    epochs = 50

    # 加载图像数据
    images, labels = load_images(data_dir, img_size)

    # 数据预处理
    images = images.astype('float32') / 255.0
    labels = (labels == 'cancer').astype(int)
    labels = to_categorical(labels, num_classes)

    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2, random_state=42)

    # 数据增强
    datagen = ImageDataGenerator(horizontal_flip=True, vertical_flip=True)
    datagen.fit(X_train)

    # 创建模型
    model = create_model((img_size[0], img_size[1], 3), num_classes)

    # 训练模型
    history = model.fit(datagen.flow(X_train, y_train, batch_size=batch_size),
                        validation_data=(X_test, y_test),
                        steps_per_epoch=len(X_train) // batch_size,
                        epochs=epochs)

    # 评估模型
    y_pred = model.predict(X_test)
    y_pred_classes = np.argmax(y_pred, axis=1)
    y_test_classes = np.argmax(y_test, axis=1)

    print("Classification Report:")
    print(classification_report(y_test_classes, y_pred_classes))

    print("Confusion Matrix:")
    print(confusion_matrix(y_test_classes, y_pred_classes))

    # 绘制训练过程的准确率和损失曲线
    def plot_training_history(history):
        plt.figure(figsize=(12, 4))

        plt.subplot(1, 2, 1)
        plt.plot(history.history['accuracy'], label='Training Accuracy')
        plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
        plt.xlabel('Epoch')
        plt.ylabel('Accuracy')
        plt.legend()

        plt.subplot(1, 2, 2)
        plt.plot(history.history['loss'], label='Training Loss')
        plt.plot(history.history['val_loss'], label='Validation Loss')
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.legend()

        plt.show()

    plot_training_history(history)

if __name__ == '__main__':
    main()
相关文章
|
机器学习/深度学习 传感器 人工智能
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
本文对现有的全景分割方法进行了第一次全面的综述。因此,基于所采用的算法、应用场景和主要目标的性质,对现有全景技术进行了定义良好的分类。此外,还讨论了全景分割在通过伪标记标注新数据集中的应用。接下来,进行消融研究,以从不同角度了解全景方法。此外,还讨论了适用于全景分割的评估指标,并对现有解决方案的性能进行了比较,以了解最新技术并确定其局限性和优势。最后,阐述了当前主题技术面临的挑战以及近期吸引大量关注的未来趋势,这可以作为未来研究的起点。
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
|
机器学习/深度学习 传感器 编解码
史上最全 | BEV感知算法综述(基于图像/Lidar/多模态数据的3D检测与分割任务)
以视觉为中心的俯视图(BEV)感知最近受到了广泛的关注,因其可以自然地呈现自然场景且对融合更友好。随着深度学习的快速发展,许多新颖的方法尝试解决以视觉为中心的BEV感知,但是目前还缺乏对该领域的综述类文章。本文对以视觉为中心的BEV感知及其扩展的方法进行了全面的综述调研,并提供了深入的分析和结果比较,进一步思考未来可能的研究方向。如下图所示,目前的工作可以根据视角变换分为两大类,即基于几何变换和基于网络变换。前者利用相机的物理原理,以可解释性的方式转换视图。后者则使用神经网络将透视图(PV)投影到BEV上。
史上最全 | BEV感知算法综述(基于图像/Lidar/多模态数据的3D检测与分割任务)
|
1月前
|
编解码 算法 自动驾驶
【计算机视觉】基于光流特征的目标跟踪算法LK光流法的讲解(图文解释 超详细)
【计算机视觉】基于光流特征的目标跟踪算法LK光流法的讲解(图文解释 超详细)
232 0
|
传感器 机器学习/深度学习 安全
3D点云识别安全吗? 密歇根大学等提出稳健性分析数据集应对严重失真
3D点云识别安全吗? 密歇根大学等提出稳健性分析数据集应对严重失真
126 0
3D点云识别安全吗? 密歇根大学等提出稳健性分析数据集应对严重失真
|
数据可视化
maftools|TCGA肿瘤突变数据的汇总,分析和可视化
maftools|TCGA肿瘤突变数据的汇总,分析和可视化
172 0
|
数据库
3-华大时空组学分析软件 Spateo 细胞分割示例
本分示例了使用 华大时空组学分析软件 Spateo 基于SSDNA和 表达谱进行圈细胞的用法,以供参考
178 0
|
机器学习/深度学习 人工智能 算法
基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
531 1
|
机器学习/深度学习 数据可视化 计算机视觉
详解分析 | ViT如何在医疗图像领域替代CNNs?
详解分析 | ViT如何在医疗图像领域替代CNNs?
226 0
|
传感器 机器学习/深度学习 存储
登顶KITTI和NuScenes | 2DPASS:2D先验辅助的激光雷达点云语义分割!ECCV2022
语义分割在大规模室外场景理解中起着至关重要的作用,在自动驾驶和机器人技术中有着广泛的应用[1-3]。在过去几年中,研究界投入了大量精力,使用相机图像[4-7]或激光雷达点云[2,8-12]作为输入来理解自然场景。
登顶KITTI和NuScenes | 2DPASS:2D先验辅助的激光雷达点云语义分割!ECCV2022
|
数据挖掘
实验三:遥感影像目视解译与非监督分类
实验三:遥感影像目视解译与非监督分类
206 0