基于LIDC-IDRI肺结节肺癌数据集的放射组学机器学习分类良性和恶性肺癌(Python 全代码)全流程解析 (一)

这篇具有很好参考价值的文章主要介绍了基于LIDC-IDRI肺结节肺癌数据集的放射组学机器学习分类良性和恶性肺癌(Python 全代码)全流程解析 (一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


第二部分传送门

1 LIDC-IDRI数据集介绍

LIDC-IDRI数据集是用于医学影像分析的公开数据集,包含1010例低剂量CT扫描和人工标注的肺部结节信息。这些数据对于肺癌早期检测和算法开发至关重要。由美国国立卫生研究院(NIH)资助,该数据集为研究人员提供了宝贵资源,促进了医学影像处理和人工智能在肺部疾病诊断方面的进展,。
数据集下载地址如下:*https://www.cancerimagingarchive.net/collection/lidc-idri/*该数据集大小为133GB,数据集的下载需要下载器和稳定的网络,否则可能失败。
下载方面存在问题的私信我,我有完成数据集
lidc-idri-0001,医学图像处理+机器学习,图像处理,机器学习,python,scikit-learn,健康医疗,深度学习

1.1数据集预处理

数据集的预处理一共分为三个部分,图像的归一化,肺结节感兴趣区域分割,良恶性肺结节标注提取。
LIDC-IDRI数据结构如下:
lidc-idri-0001,医学图像处理+机器学习,图像处理,机器学习,python,scikit-learn,健康医疗,深度学习

1.1.1 图像读取-(python库pylidc安装)

在预处理图像过程中,我们不需要自己写程序去解析所有的文件。已经有人早就写好了免费的库文件去解析数据集。即为python的pylidc库。该库的安装如下:
打开anaconda prompt 输入
lidc-idri-0001,医学图像处理+机器学习,图像处理,机器学习,python,scikit-learn,健康医疗,深度学习

pip install pylidc

注意在安装完该库后,需要在系统用户文件夹下,新建pylidc.conf文件,为该库的运行指明文件存放的位置。
[dicom]
path = G:\dataset_zhang\LIDC-IDRI
将以上路径修改为数据集存放的路径。
测试该库是否安装成功代码如下:

import pylidc as pl
from pylidc.utils import consensus
import os

dataset_path = r'G:\dataset_zhang\LIDC-IDRI\\'#修改路径哦
dicom_name   = 'LIDC-IDRI-0001'
PathDicom = os.path.join(example)  # 构建当前病例文件夹的完整路径
# 查询当前病例的扫描数据,并将第一个扫描结果存储到scan变量中
scan = pl.query(pl.Scan).filter(pl.Scan.patient_id == example).first()
print(scan)

1.1.2图像读取-(读取CT图像的patch和分割标注)

我们以数据集中的’LIDC-IDRI-0001’病例数据为例,使用pylidc库中的按照病例文件夹名字的查询的方式,将该病例的所有的数据储存在scan中。而后提取所有专家对图像分割的标注坐标和肺结节的体素立方体。一个病例中含有多个肺结节默认提取第一个。使用的plt画图功能展示。代码如下

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as manim
from skimage.measure import find_contours
import cv2
import pylidc as pl
from pylidc.utils import consensus
import os

dataset_path = r'G:\dataset_zhang\LIDC-IDRI\\'
dicom_name   = 'LIDC-IDRI-0001'
print(dicom_name)  # 打印当前DICOM文件夹的名称
PathDicom = os.path.join(dataset_path, dicom_name)  # 构建当前DICOM文件夹的完整路径
# 查询当前病例的扫描数据,并将第一个扫描结果存储到scan变量中
scan = pl.query(pl.Scan).filter(pl.Scan.patient_id == dicom_name).first()
vol = scan.to_volume()# 将该扫描数据转换成数组形式的体积(volume)
# 聚类注释(nodule annotations)以获取一组注释
nods = scan.cluster_annotations()
try:
   anns = nods[0]   # 尝试获取第一个注释(annotation)
   Malignancy = anns[0].Malignancy   # 获取注释中的恶性程度(Malignancy)信息
except IndexError:
   # 如果没有注释,或者无法获取第一个注释,则继续下一个DICOM文件夹
   continue
# 执行共识合并(consensus consolidation)和50%的一致性水平(agreement level)。
# 我们在切片周围添加填充以提供上下文以进行查看。
cmask, cbbox, masks = consensus(anns, clevel=0.5, pad=[(0,0), (7,7), (20,20)])
# 提取相应的切片进行可视化
image = vol[cbbox]
k = int(0.5 * (cbbox[2].stop - cbbox[2].start))
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
ax.imshow(vol[cbbox][:, :, k], cmap=plt.cm.gray, alpha=1)
# 标记不同注释的边界
colors = ['r', 'g', 'b', 'y']
for j in range(len(masks)):
   for c in find_contours(masks[j][:, :, k].astype(float), 0.5):
       label = "Annotation %d" % (j+1)
       plt.plot(c[:, 1], c[:, 0], colors[j], label=label)
# 绘制50%共识轮廓线
for c in find_contours(cmask[:, :, k].astype(float), 0.5):
   plt.plot(c[:, 1], c[:, 0], '--k', label='50% Consensus')
ax.axis('off')  # 关闭坐标轴
ax.legend()  # 显示图例
plt.tight_layout()  # 调整布局以适应图像
plt.show()  # 显示图像

结果如下
图片中,一共有4个专家对图像的分割的结果。和黑色的所有的专家对图像分割的平均的结果,一般情况下我们使用平均结果作为我们的实验参考。
lidc-idri-0001,医学图像处理+机器学习,图像处理,机器学习,python,scikit-learn,健康医疗,深度学习

1.1.3图像归一化-(读取CT图像的patch和分割标注)

图像归一化是一种将图像的像素值重新缩放到特定范围的处理方法,通常是将像素值映射到

0,1或者−1,1之间。这有助于提高模型的稳定性和收敛速度,使得不同图像具有相似的数据分布,有利于深度学习模型的训练和性能提升。代码如下

#归一化
    def normalize_hu(image):
	#将输入图像的像素值(-4000 ~ 4000)归一化到0~1之间
        MIN_BOUND = -1000.0
        MAX_BOUND = 400.0
        image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
        image[image > 1] = 1.
        image[image < 0] = 0.
        return image

1.2 图像标注信息预处理-(读取肺结节是良性还是恶性)

这段代码根据变量Malignancy的不同取值(如"Highly Unlikely"、"Moderately Unlikely"等),为label1赋予相应的标签(1到5)。通过这个过程,将文本标签映射为数字标签,方便后续机器学习模型的处理和训练。

    if Malignancy == 'Highly Unlikely':
        label1 = 1
    elif Malignancy == 'Moderately Unlikely':
        label1 = 2
    elif Malignancy == 'Indeterminate':
        label1 = 3
    elif Malignancy == 'Moderately Suspicious':
        label1 = 4
    elif Malignancy == 'Highly Suspicious':
        label1 = 5
    print(label1)

1.2 肺结节图像切片处理处理-(切片并保存)

首先根据image和cmask创建了ArrayDicom和ArrayDicom_mask矩阵。然后通过定位x_、y_、z_的中心点,对图像进行切片。接着将切片后的图像和对应的掩膜图像分别保存为大小为50x50的JPEG文件。同时,将图像的标签label1与文件名写入label.txt文件中。最后,将计数器ii增加,并输出计数器的值。
将处理后的图像进行切片和保存,并生成相应的标签信息。其中,ArrayDicom是图像数据矩阵,ArrayDicom_mask是对应的掩膜矩阵。通过对中心点定位,将图像在x、y、z方向上的切片进行大小为50x50的重采样和保存。同时,将每个图像切片的标签信息与文件名写入label.txt文件中,方便后续的数据处理和训练。
结果如下:
在label
这个label文件记录了每个图像文件的标签信息。每一行包含两个部分,以空格分隔:

第一部分是图像文件名,如 0.jpg, 1.jpg 等。
第二部分是对应图像的标签,标签是一个整数,表示图像的类别或者属性。在这个文件中,标签的含义可能是:
5: 高度可疑 (Highly Suspicious)
3: 不确定 (Indeterminate)
2: 中度可疑 (Moderately Suspicious)lidc-idri-0001,医学图像处理+机器学习,图像处理,机器学习,python,scikit-learn,健康医疗,深度学习
lidc-idri-0001,医学图像处理+机器学习,图像处理,机器学习,python,scikit-learn,健康医疗,深度学习

1.3 总结

这样我们的就得到了我们需要训练的图像数据,它包括良性肺结节和恶性肺结节的2D图片和每一个肺结节的标签label。从三个不同方向上观察和处理图像,这在医学图像处理中是常见的。在这段代码中,每个方向的切片都被调整为大小为 (50, 50) 的图像,然后进行了插值以保持图像质量,并最终保存为 JPEG 图像文件。
lidc-idri-0001,医学图像处理+机器学习,图像处理,机器学习,python,scikit-learn,健康医疗,深度学习
“如果您有任何医学图像处理和机器学习项目需要技术支持,请随时私信我哦。”
有了这些文件我们就能够进行我们的放射组学特征的提取啦
完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as manim
from skimage.measure import find_contours
import cv2
import pylidc as pl
from pylidc.utils import consensus
import os

dataset_path = r'G:\dataset_zhang\LIDC-IDRI\\'
dicom_name   = 'LIDC-IDRI-0001'


#归一化
def normalize_hu(image):
	#将输入图像的像素值(-4000 ~ 4000)归一化到0~1之间
    MIN_BOUND = -1000.0
    MAX_BOUND = 400.0
    image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
    image[image > 1] = 1.
    image[image < 0] = 0.
    return image   

ii = 0
# Query for a scan, and convert it to an array volume.
for dicom_name in os.listdir(dataset_path):
    print(dicom_name)
    PathDicom = os.path.join(dicom_name)  
    scan = pl.query(pl.Scan).filter(pl.Scan.patient_id == dicom_name).first()
    vol = scan.to_volume()
# Cluster the annotations for the scan, and grab one.
    nods = scan.cluster_annotations()
    try :
        anns = nods[0]
        Malignancy = anns[0]
        Malignancy = Malignancy.Malignancy
    except :
        pass
# Perform a consensus consolidation and 50% agreement level.
# We pad the slices to add context for viewing.
    cmask,cbbox,masks = consensus(anns, clevel=0.5,
                          pad=[(0,0), (7,7), (20,20)])
    image = vol[cbbox]
    image = normalize_hu(image)
    k = int(0.5*(cbbox[2].stop - cbbox[2].start))

    if Malignancy == 'Highly Unlikely':
        label1 = 1
    elif Malignancy == 'Moderately Unlikely':
        label1 = 2
    elif Malignancy == 'Indeterminate':
        label1 = 3
    elif Malignancy == 'Moderately Suspicious':
        label1 = 4
    elif Malignancy == 'Highly Suspicious':
        label1 = 5
    print(label1)
    

    
    # 矩阵增广和传参
    ArrayDicom = image
    ArrayDicom_mask = cmask
    
    # 中心点定位
    x_, y_, z_ = np.shape(image)
    x_ = int(x_ / 2)
    y_ = int(y_ / 2)
    z_ = int(z_ / 2)
    
    # 图像进行切片处
    save_dir = r'F:\test\data\train'  # 修改为标签存放的位置 

# 检查并创建文件夹
    train_dirs = [ 'z', 'x',  'y']
    for directory in train_dirs:
        full_dir = os.path.join(save_dir, directory)
        if not os.path.exists(full_dir):
            os.makedirs(full_dir)
    
    # label信息保存
    txtfile = open(os.path.join(save_dir, 'label.txt'), mode='a')
    txtfile.writelines('%s %d \n' % (str(ii)+'.jpg', label1))
    txtfile.close()
    
    # z方向切片
    z_silc_50 = ArrayDicom[:, :, z_]
    z_silc_50 = cv2.resize(z_silc_50, (50, 50), interpolation=cv2.INTER_LINEAR) * 255
    z_silc_50 = z_silc_50.astype(np.uint8)  # 数据类型转换
    cv2.imwrite(os.path.join(save_dir,  'z', str(ii) + '.jpg'), z_silc_50)
    
    # x方向切片
    x_silc_50 = ArrayDicom[x_, :, :]
    x_silc_50 = cv2.resize(x_silc_50, (50, 50), interpolation=cv2.INTER_LINEAR) * 255
    x_silc_50 = x_silc_50.astype(np.uint8)  # 数据类型转换
    cv2.imwrite(os.path.join(save_dir,  'x', str(ii) + '.jpg'), x_silc_50)

    # y方向切片
    y_silc_50 = ArrayDicom[:, y_, :]
    y_silc_50 = cv2.resize(y_silc_50, (50, 50), interpolation=cv2.INTER_LINEAR) * 255
    y_silc_50 = y_silc_50.astype(np.uint8)  # 数据类型转换
    cv2.imwrite(os.path.join(save_dir,  'y', str(ii) + '.jpg'), y_silc_50)
    
    ii += 1
    print(ii)

请保护原创,转载不注明出处,将追究负法律责任!!!文章来源地址https://www.toymoban.com/news/detail-859623.html

到了这里,关于基于LIDC-IDRI肺结节肺癌数据集的放射组学机器学习分类良性和恶性肺癌(Python 全代码)全流程解析 (一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于kaggle数据集的猫狗识别(超详细版本)

    kaggle猫狗识别数据集共包含25000张JPEG数据集照片,其中猫和狗的照片各占12500张。数据集大小经过压缩打包后占543MB。 数据集可以从kaggle官方网站下载,链接如下: 如果嫌官网下载麻烦,也可以从博主之前分享的百度网盘链接中直接获取: 网盘分享—博客链接,点击 在下载

    2024年01月21日
    浏览(77)
  • 基于TensorFlow和Keras的狗猫数据集的分类实验

    解释什么是overfit(过拟合)? 简单理解就是训练样本得到的输出和期望输出过于一致,而测试样本输出与期望输出相差却很大。为了得到一致假设而使假设变得过度复杂称为过拟合。想像某种学习算法产生了一个过拟合的分类器,这个分类器能够百分之百的正确分类样本数据

    2024年02月12日
    浏览(36)
  • 【项目实战】三维重建:基于RGB-D数据集的TSDF算法

    主要流程: 计算每个体素在深度图像中的TSDF值,然后基于前一个体素的TSDF值更新后一个(加权平均),最后得到所有体素的结果,拼接为3D模型。 TSDF需要非常大的显存空间,GPU需要大概 2KB 存储单个体素的所有信息。因此, 只适用于小场景下的三维重建(如室内环境)。

    2024年02月12日
    浏览(55)
  • 基于DEAP数据集的四种机器学习方法的情绪分类

            在机器学习领域,KNN(K-Nearest Neighbors)、SVM(Support Vector Machine)、决策树(Decision Tree)和随机森林(Random Forest)是常见且广泛应用的算法。 1. KNN(K-Nearest Neighbors,K近邻) KNN算法是一种基本的分类和回归方法。对于分类任务,它基于特征空间中最接近的k个邻居

    2024年04月27日
    浏览(45)
  • 【深度学习】肺结节分割项目实战一:处理数据集

    主要参考此教程完成的实验 官方网站 肺图像数据库协会的图像收集(LIDC-IDRI)包括 诊断 和 带有病变注释标记的肺癌筛查胸部CT 。这是一个网络公开的国际资源,用于肺癌检测和诊断的计算机辅助诊断(CAD)方法的开发、培训和评估。 数据集包含1018个病例,每个病例包括来自临

    2024年02月05日
    浏览(84)
  • 【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载

    【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多关于深度学

    2024年03月11日
    浏览(46)
  • (论文加源码)基于deap数据集的transformer结合注意力机制脑电情绪识别

    本篇论文是2021年新发表的一篇论文。也是目前有源码的论文中唯一一篇使用transformer模型和注意力机制的论文源码(pytorch和tensorflow版本均有) 论文及源码见个人主页: https://download.csdn.net/download/qq_45874683/87658878 (论文加源码)基于deap数据集的transformer结合注意力机制脑电情

    2024年02月12日
    浏览(36)
  • 机器学习:基于逻辑回归和高斯贝叶斯对人口普查数据集的分类与预测

    机器学习:基于逻辑回归和高斯贝叶斯对人口普查数据集的分类与预测 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据

    2023年04月08日
    浏览(40)
  • 基于OpenPCDet实现自定义数据集的训练,狸花猫看完要打拳系列(一)!

      最近在学习如何基于 OpenPCDet框架进行PointPillars网络训练 ,由于对框架以及完整训练过程都不了解,因此打算记录下自己的学习过程,感谢学习过程中狸花猫sensei的大力支持,目标是实现自定义数据集(因为笔者 只有激光雷达的数据,仿照kitti格式进行标注 )的训练,然后

    2024年02月09日
    浏览(33)
  • PyTorch: 基于【MobileNet V2】处理MNIST数据集的图像分类任务【准确率99%+】

    PyTorch: 基于【VGG16】处理MNIST数据集的图像分类任务【准确率98.9%+】 在深度学习和计算机视觉的世界里,MNIST数据集就像一颗璀璨的明珠,被广大研究者们珍视并广泛使用。这个数据集包含了大量的手写数字图像,为图像分类任务提供了丰富的素材。今天,我们将带您一同探索

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包