基于Unet的BraTS 3d 脑肿瘤医学图像分割,从nii.gz文件中切分出2D图片数据

这篇具有很好参考价值的文章主要介绍了基于Unet的BraTS 3d 脑肿瘤医学图像分割,从nii.gz文件中切分出2D图片数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

3D图像分割一直是医疗领域的难题,在这方面nnunet已经成为了标杆,不过nnunet教程较少,本人之前跑了好久,一直目录报错、格式报错,反正哪里都是报错等等。并且,nnunet对于硬件的要求很高,一般的电脑配置或者低配置的服务器完全带不起来

或者定义conv.3D的unet网络模型,但对显卡的要求也很高...

之前实现了unet的自适应多类别分割任务,博文如下

Unet 实战分割项目、多尺度训练、多类别分割_unet进行多类分割-CSDN博客

代码根据数据集的mask,可以自动计算出mask前景的类别,这样就能为unet的输出自动调整,不需要更改别的操作。

而3d的图像其实就是2d拼接起来的,或许可以将nii格式的3d图片切分,这样根据上文的代码就可以实现医疗图像3d的分割

提示:这里切分的2d分割,效果肯定不如3d图像的分割

就比如线性回归对图像的分类,忽略了像素点的空间信息。那么3D切割出2D,其实也是忽略了图像的空间信息,效果肯定不如3d的直接分割

2、 nii 文件的切分

import SimpleITK as sitk 

这里用itk 对3d数据进行读取

2.1 数据集

这里的3d数据是 BRATS 脑肿瘤分割数据(brain tumor segmentation challenge,BraTS Chanllenge),这里只对训练集进行操作

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

需要注意的是,一般的nii图像都是3D的,这里数据是4D的,好像是每个3D图像的模态,类似于官方的增强?

T1 成像,利于观察解剖结构,病灶显示不够清晰

T1gd 在受试者做磁共振之前向血液内注射造影剂,使成像中血流活跃的区域更加明显,是增强肿瘤的重要判据

T2 成像,病灶显示较为清晰,判断整颗肿瘤

FLAIR(抑制脑脊液的高信号),含水量大则更亮眼,可以判断瘤周水肿区域

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

mask模板是四分类的:

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

2.2 slice 切片代码

代码放在这里:

这里参考之前的博文:nii 文件的相关操作(SimpleITK)_如何使用nii文件做深度学习-CSDN博客

import SimpleITK as sitk
import numpy as np
import os
from tqdm import tqdm
import shutil
import cv2


# 新建目录
def mkdir(rt):
    ret_path = rt + '_ret2D'
    if os.path.exists(ret_path):        # 删除之前的切片目录
        shutil.rmtree(ret_path)

    os.mkdir(ret_path)
    os.mkdir(os.path.join(ret_path,'images'))
    os.mkdir(os.path.join(ret_path,'labels'))


def get_image_from_nii(x,y,name,thre):  # 传入nii文件,对nii进行切片
    img = sitk.ReadImage(x)
    img_array = sitk.GetArrayFromImage(img)  # nii-->array

    label = sitk.ReadImage(y)
    label_array = sitk.GetArrayFromImage(label)  # nii-->array

    for index,i in enumerate(range(img_array.shape[1])):    # TODO 需要根据img维度更改,4D设定为1,3D设置为0
        img_select = img_array[0,i, :, :]       # TODO 需要根据img维度更改,从x轴切分,[:,i,:]从y轴切分
        label_select = label_array[i, :, :]

        # 图片保存目录
        img_save_name = os.path.join(root+'_ret2D','images',name+'_'+str(index)+'.png')
        label_save_name = os.path.join(root+'_ret2D','labels',name+'_'+str(index)+'.png')

        h,w = label_select.shape
        total_pixel = h*w           # 总的像素点个数

        if label_select.max() == 0:     # 没有前景的像素点不保存
            continue

        else:
            # 归一化
            img_select = (img_select - img_select.min()) / (img_select.max() - img_select.min())*255

            img_select = img_select.astype(np.uint8)
            label_select = label_select.astype(np.uint8)

            if (np.sum(label_select !=0 ) / total_pixel) > thre:
                cv2.imwrite(img_save_name,img_select)
                cv2.imwrite(label_save_name,label_select)


# 切片函数
def sliceMain(rt,imgf,labf,thre):
    # 删除之前的切片目录,建立新的目录
    mkdir(rt)

    nii_list = [i for i in os.listdir(os.path.join(rt,imgf))]

    for image_nii in tqdm(nii_list):      # 遍历所有的nii文件
        name = image_nii.split('.nii.gz')[0]

        image_nii = os.path.join(rt,imgf,image_nii)
        label_nii = image_nii.replace(imgf,labf)       # 自动获取nii 的标签

        get_image_from_nii(image_nii,label_nii,name,thre)


if __name__ == '__main__':

    root = 'BRATS'          # 待切分nii文件的父目录
    images_folder = 'imagesTr'      # 3d nii的数据
    labels_folder = 'labelsTr'       # 3d nii 的标签数据
    threshold = 0.03               # 分割的比例不超过阈值的数据删除

    # 切片函数
    sliceMain(
        rt=root,
        imgf=images_folder,
        labf=labels_folder,
        thre=threshold
    )

这里简单介绍一下:目录结构如下

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

具体数据的名称和后缀要严格对应!!!

 对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

threshold 是阈值处理,如果mask前景的像素点个数没有达到整个图片像素点的阈值,就不会被保存。这里默认是0.03

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

切分的时候,因为这里是4D的,所以img_array是四维的,我们默认取第一个维度的3D图像

同时,3D图像可以用x,y,z三个坐标表示,这里的shape1就是沿着x轴进行2D的切分

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

因为医学图像的灰度动态范围很多,可能到上千,因此这里将灰度值重新映射,变成np的uint8格式,再用cv保存

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

2.3 保存格式

图像的保存,这里搞了好久,要么格式问题,要么灰度有问题。这里做下总结

首先,png格式可以完整的保存2D切分的信息,而不会因为图像压缩导致mask灰度值改变。说人话就是,这里切分的2d像素值只有0 100 255,如果保存为其他格式,可能读取的时候,会产生0 1 2 3....等等灰度图像,而分割的mask是阈值图像!!

其次,plt保存的时候,会将图像重新映射,我们只想要0 1 2这种格式,但是他可能会把0变成0,1变成128.2变成255这样。虽说,这样看mask确实方便,不至于变成全黑的,但是本人测试的时候,总会莫名多出一个灰度。说人话就是,本来这里是四分类的,plt保存的时候,np.unique读取的时候,会变成5个类别

这里搞了半天,本人电脑太差,测试半天,只有这个代码是符合的。至于问题到底是不是我说的那样,可以自己测试

代码如下:

import os
from tqdm import tqdm
import numpy as np
import cv2


root = './BRATS_ret2D/labels'             # 训练 mask的路径
masks_path = [os.path.join(root ,i) for i in os.listdir(root)]
gray = []           # 前景像素点
for i in tqdm(masks_path,desc="gray compute"):
    img = cv2.imread(i,0)
    img_uni = np.unique(img)        # 获取mask的灰度值

    for j in img_uni:
        if j not in gray:
            gray.append(j)
print(gray)

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

2.4 切分好的数据

上述代码,切分后会生成root的返回目录

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

这里的mask并不是全黑的,只是0 1 2 3这样导致很黑而已。这里的目录名称按照切分索引,而没有从0开始,这样就能看出来BRATS_001 里面,49之前的要么没有mask前景,要么前景的区域不足我们设定的阈值!

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

 

3、划分数据集

参考之前的代码:关于图像分割任务中按照比例将数据集随机划分成训练集和测试集_图像分割数据集怎么划分-CSDN博客

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

 

这里可以可视化一下:关于图像分割项目的可视化脚本-CSDN博客

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

4、训练

unet训练如下:

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

训练时间太长了, 这里只简单训练了10个epoch用作测试,结果如下:

代码是这篇的代码:Unet 实战分割项目、多尺度训练、多类别分割_unet进行多类分割-CSDN博客

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

训练日志里面,有每个类别的指标:

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

推理结果:

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

4、项目总结

1、准备好3D的nii.gz数据,然后根据本章第二节摆放好数据切分。根据项目的实际要求设定好阈值或者沿着哪个轴切分

2、划分数据很简单

3、训练的 train 脚本

4、推理的时候,把待推理的数据放在inference目录下即可

对nii格式的3d图像进行切片生成2d图像,图像分割,计算机视觉,人工智能,深度学习,3d

5、说点废话

对于项目的改进的思考,项目下载:

深度学习Unet实战分割项目:BraTS3d脑肿瘤图像切分的2D图片分割项目(4分类)资源-CSDN文库

因为医学图像的灰度值都很低,往往图像会很暗,这样图像的梯度信息啊、边缘信息啊都很模糊,效果不太好,可以利用医学图像常用的windowing方法,其实就是对比度拉伸

医学图像处理的windowing 方法_医学图像常用windowing和histogram equalization-CSDN博客

而且,不同于正常的分类图像,这里的normalize可能直接 - 0.5 在除以 2效果不太好,这可以手动计算好图像的mean和std,可以有效提升网络的性能

怎么计算数据的均值和方差_计算数据集均值和方差-CSDN博客文章来源地址https://www.toymoban.com/news/detail-847229.html

到了这里,关于基于Unet的BraTS 3d 脑肿瘤医学图像分割,从nii.gz文件中切分出2D图片数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • RCS-YOLO快速高精度的用于脑肿瘤检测的目标检测模型学习实践

    最近看到了一篇有意思的论文,讲的是开发应用于医疗领域内的肿瘤检测的快速高精度的目标检测模型,论文地址在这里,如下所示:   凭借速度和准确性之间的良好平衡,尖端的YOLO框架已成为最有效的算法之一用于对象检测。然而,使用YOLO网络的性能很少在脑肿瘤检测中

    2024年02月14日
    浏览(32)
  • 论文阅读笔记——SMU-Net:面向缺失模态脑肿瘤分割的样式匹配U-Net

    论文地址:https://arxiv.org/abs/2204.02961v1 脑胶质瘤:https://baike.baidu.com/item/%E8%84%91%E8%83%B6%E8%B4%A8%E7%98%A4/7242862 互信息:https://zhuanlan.zhihu.com/p/240676850 Gram矩阵:https://zhuanlan.zhihu.com/p/187345192 背景: 绝大多数脑肿瘤都可以通过磁共振成像进行唯一的鉴别。 多模态MRI的好处: 每一种模态

    2024年01月25日
    浏览(35)
  • 【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 使用

    2024年02月15日
    浏览(33)
  • UNet-肝脏肿瘤图像语义分割

    目录 一. 语义分割 二. 数据集 三. 数据增强 图像数据处理步骤 CT图像增强方法 :windowing方法 直方图均衡化 获取掩膜图像深度 在肿瘤CT图中提取肿瘤 保存肿瘤数据  四. 数据加载 数据批处理 ​编辑​编辑 数据集加载   五. UNet神经网络模型搭建          单张图片预测图

    2024年02月04日
    浏览(61)
  • Python Unet ++ :医学图像分割,医学细胞分割,Unet医学图像处理,语义分割

    一,语义分割:分割领域前几年的发展 图像分割是机器视觉任务的一个重要基础任务,在图像分析、自动驾驶、视频监控等方面都有很重要的作用。图像分割可以被看成一个分类任务,需要给每个像素进行分类,所以就比图像分类任务更加复杂。此处主要介绍 Deep Learning-ba

    2024年02月16日
    浏览(37)
  • 手把手教你用UNet做医学图像分割系统

    兄弟们好呀,这里是肆十二,这转眼间寒假就要过完了,相信大家的毕设也要准备动手了吧,作为一名大作业区的UP主,也该蹭波热度了,之前关于图像分类和目标检测我们都出了相应的教程,所以这期内容我们搞波新的,我们用Unet来做医学图像分割。我们将会以皮肤病的数

    2024年02月03日
    浏览(55)
  • UNet深度学习模型在医学图像分割中的应用及其Python实现细节

    第一部分:引言和UNet架构简介 引言 : 医学图像分割是医疗图像处理的重要领域,它涉及将图像划分为多个区域,以标识和隔离感兴趣的区域(如器官、肿瘤等)。近年来,随着深度学习技术的发展,多种神经网络模型被应用于这一领域。其中,UNet模型因其出色的表现而受

    2024年02月12日
    浏览(27)
  • 文献速递:文献速递:基于SAM的医学图像分割--SAM-Med3D

    Title  题目 SAM-Med3D 01 文献速递介绍 医学图像分析已成为现代医疗保健不可或缺的基石,辅助诊断、治疗计划和进一步的医学研究]。在这一领域中最重要的挑战之一是精确分割体积医学图像。尽管众多方法在一系列目标上展现了值得称赞的有效性,但现有的分割技术倾向于专

    2024年04月23日
    浏览(27)
  • 医学图像分割方向优质的论文及其代码【Medical Image Segmentation】UNet、transformer、计算机视觉

      作者:Yifei Chen, Chenyan Zhang, Yifan Ke, Yiyu Huang, Xuezhou Dai, Feiwei Qin   中文摘要: 由于收集过程具有挑战性、标记成本高、信噪比低以及生物医学图像特征复杂,传统的监督学习方法在医学图像分割方面历来遇到一定的限制。 本文提出了一种半监督模型DFCPS,创新性地融合了

    2024年04月13日
    浏览(32)
  • 深度学习实验-3d医学图像分割

    实验四 基于nnU-Net模型的3D医学图像分割实验 腹部多器官分割一直是医学图像分析领域最活跃的研究领域之一,其作为一项基础技术,在支持疾病诊断,治疗规划等计算机辅助技术发挥着重要作用。近年来,基于深度学习的方法在该领域中获得了巨大成功。本实验数据集为多

    2024年02月07日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包