基于卷积神经网络ResUnet 多模态融合实验、BraTS 3d数据集(nii.gz)4模态融合分割

ops/2024/10/19 3:25:31/

1、前言

之前介绍了unet对BraTS 3d数据集的2d图片分割,实现思路如下:

1、对BraTS 3d数据集进行切片,沿着某个模态的横断面切割

2、划分数据集、包括训练集、验证集等等

3、网络训练

4、评估模型性能等等

具体的可以参考本文:基于Unet的BraTS 3d 脑肿瘤医学图像分割,从nii.gz文件中切分出2D图片数据_brats2020unet分割-CSDN博客

看了评论和私信,不少人问可不可以将四个模态融合进去,而非单独某个模态分割。

因为多模态本人没有接触过,不过要是仅仅把四个模态融合还是很简单的

一般CNN网络的输入是3通道的RGB,而我们想要把BraTS 3d四个模态融合,其实就是变成

了4个通道的输入而已


这里不用纠结4通道的数据是啥,反正是四种形态,每个形态都是h*w的灰度图像而已

事实上,CNN的隐藏层都把数据卷积成几百个维度了,都是语义信息罢了

2、数据集介绍

BRATS 脑肿瘤分割数据(brain tumor segmentation challenge,BraTS Chanllenge)

标签如下:

这里原始数据集要很多G,这里为了方便仅用十个样本来实验

数据是nii格式,维度如下:数据、gt的维度

可以用ITK-SNAP打开,箭头所指的就是不同模态,可以更换

3、数据集转换

因为数据的维度是这种的

data的维度是4,其中分别为4个模态、x、y、z方向的size

gt 是没有模态的,因为病变区域是不变的

需要注意的是,我们实验的是多模态的信息融合,而非3D的语义分割,请记住这一点,防止下面会混淆

事实上,语义分割的2D领域很多,而3D貌似没有2d分割实用

虽然3d分割要比2d分割效果好,毕竟3d能把握数据的空间体素信息。类似于卷积相比于线性的图像识别,卷积感受野是图像的一个patch,而线性分类仅仅把握像素点。毕竟一般图像来看,像素点的灰度值往往与周围邻域的区域有关

但是3d分割消耗的资源远超2d分割,而且3d的数据采集也很麻烦。等等原因,一般来说我们接触的都是2d图像的分割,基本上sam模型也是以2d图像分割为主

所以,我们想要把BRATS数据集的 (4, 155, 240, 240) 维度先分片,这里还是沿着x轴,也就是155这个方向,所以会变成 (4, 240, 240)的shape

一般的图像维度是(240,240,3)------->3 RGB

这里的4是四种模态,也可以理解成四个channel,每一个都是240*240的灰度图像

本来写了一个dataset直接把nii.gz文件切片后输入网络,不过考虑到对gpu资源可能消耗过大,这里就先生成数据。但是jpg、png图像都是3通道的,不能保存4通道的数据,所以这里用npy保存

3.1 nii.gz 转成 npy 文件

这里需要把一开始的nii.gz的BRATS数据集摆放成这样:

生成的npy如下,这里做了归一化的操作

3.2 npy 文件可视化

可以用下面代码对 npy 可视化

import numpy as np
import matplotlib.pyplot as pltim_path = 'ResUnet/data_npy/train/images/50.npy'
mk_path = 'ResUnet/data_npy/train/labels/50.npy'image = np.load(im_path)
mask = np.load(mk_path)
print('image:',image.shape)
print('mask:',mask.shape,np.unique(mask))plt.figure(figsize=(12,8))
plt.subplot(2,2,1)
plt.imshow(image[0],cmap='gray')
plt.title('FLAIR')plt.subplot(2,2,2)
plt.imshow(image[1],cmap='gray')
plt.title('T1w')plt.subplot(2,2,3)
plt.imshow(image[2],cmap='gray')
plt.title('t1gd')plt.subplot(2,2,4)
plt.imshow(image[3],cmap='gray')
plt.title('T2w')plt.show()plt.imshow(mask)
plt.show()

如下:

可以看到image的维度是3维的

数据

4、ResUnet 多模态融合分割

这里采用的的ResUnet网络

需要注意的是,这里的网络可以任意更换,只要网络的输入维度和输出维度改成4即可

 # 实例化模型model = UResnet(num_classes=args.nc,input_channels=args.input)model.to(device)

这里训练了50个epoch,训练集的dice有0.94左右,测试集的dice有0.67左右

看样子,确实融合分割的效果好,不过这里只用了十个数据集,导致数据不足,所以过拟合了

5、推理

推理的话,这里输入是nii.gz文件,生成的也是nii.gz文件

实现逻辑是把nii文件沿着横断面逐层切片,然后推理完把结果融合成nii文件,输出

推理的结果:

真实标签:

6、下载、其他

实验下载:ResUnet网络对BRATS脑肿瘤多模态融合的语义分割项目实现资源-CSDN文库

ResUnet网络毕竟很久了,换成SwinUnet、TransUnet、DenseUnet之类的效果估计会好点

或者对数据进行增广、扩充数据集等等

像这种尺度的融合很简单,不管是灰度图、RGB图像还是4通道的模态融合,其实就是数据的为敌就是(x,h,w)罢了。几通道就是x变成几罢了,然后在dataset里面把加载数据的代码改一下,网络的输入部分其实就是改个数字。

从这次实验,我也有很多启发,sam分割不考虑大模型其实就是加了个bbox的维度,后面可以尝试尝试把unet和sam进行融合做医学图像语义分割。


http://www.ppmy.cn/ops/93442.html

相关文章

C语言问答进阶--6、函数(1)

A:现在我们将研究函数这个概念。 其实这个概念很简单,和中学的时候学的yf(x)来对照着看,对于一个参数x,会得到一个值y,就会发现它和C中的函数是一个道理。 只是C函数中可以包含不传入任何参数的函数。 A:函…

C#学习总结

文章目录 C# 介绍C#和.NET Framework对象定向统一型系统类和接口类型安全内存管理C#和CLR C# 封装C# 方法定义方法调用方法:参数传递:按值传递参数按引用传递参数 ref按输出传递参数 out 多返回值 C# 可空类型(Nullabl…

CentOS7.6 HAproxy-7层负载均衡集群——实施方案

目录 1、前期环境准备 1.准备4台主机 1. 设置主机名 2. 设置IP地址然后重启网卡 3. 关闭防火墙和selinux 4. 全部的服务器完成时间统一 二、配置haproxy(192.168.200.11)服务器 1. 安装haproxy 2. haproxy 配置中分成五部分内容 3. 配置HAproxy(192.168.2…

PHP开启多进程

amphp/parallel是一个可以在PHP中并行处理任务的库。你可以使用它来启动和管理子进程。 核心代码&#xff1a; <?php $phpCode <<<PHP <?php // 子进程&#xff1a;初始化状态 $status "wait";// 子进程&#xff1a;创建一个循环&#xff0c;等…

Oracle 19c 中的_b_tree_bitmap_plans参数详解

在Oracle 19c中&#xff0c;_b_tree_bitmap_plans是一个内部隐式参数&#xff0c;用于控制优化器是否考虑使用B-tree索引转换为位图索引的执行计划。当这个参数被设置为TRUE时&#xff0c;Oracle优化器可能会选择将B-tree索引扫描转换成位图索引扫描&#xff0c;以期获得更好的…

springboot多数据源配置

Spring Boot 支持多数据源配置&#xff0c;这在需要同时操作多个数据库或者需要将读写分离的应用场景中非常有用。下面我将详细介绍如何在 Spring Boot 应用程序中配置和使用多数据源。 基础概念 数据源: 数据源是用于连接数据库的对象&#xff0c;Spring Boot 默认使用 Hika…

猫咪掉毛清洁不用愁,希喂、352宠物空气净化器大PK,数据揭秘!

随着养宠人群的增多&#xff0c;市场关注到铲屎官们的需要&#xff0c;带来了新的科技产品——宠物空气净化器。宠物空气净化器是在普通空气净化器基础上&#xff0c;调整服务对象&#xff0c;为吸附宠物毛发而设计的。不少消费者被它的功能所吸引&#xff0c;打算购入使用。然…

Spring Boot读取配置的几种方式

文章目录 Value 注解读取配置ConfigurationProperties 绑定配置Environment 对象读取配置PropertySource 注解读取外部配置文件ApplicationArguments 读取命令行参数Bean 方法和 ConfigurationProperties 结合 在 Spring Boot 中&#xff0c;可以通过多种方式读取配置。Spring …