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

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 plt


im_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进行融合做医学图像语义分割。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵星人监护人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值