2D UNet++ ResBlock脑胶质瘤分割BraTs + Pytorch实现

本文深入解读UNet++网络结构及其对UNet的改进,分享作者研究态度与方法。使用ResBlock作为编码器,VGGBlock作为解码器,探讨BraTs2018和2019数据集在医学图像分割任务中的预处理、训练与测试流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UNet++讲解

玖零猴:UNet++解读 + 它是如何对UNet改进 + 作者的研究态度和方式

网络结构

v2-696a1266603294353a88b8146a7d4150_b.jpg

        Encoder BackBone = ResBlock
Decoder BackBone = VGGBlock
通道数[32, 64, 128, 256, 512]
      

v2-f954d44d569240432afcc2ff8a94fd6a_b.jpg
ResBlock
v2-f071f137d426b2d497c7ba8a0bc99d65_b.jpg
VGGBlock

玖零猴:凯明之作Resnet + 心路历程[超详] + 解决退化问题 + 让网络变得更深成为现实

BraTs数据准备

数据来源

本文用的训练集和验证集均来自BraTs2018的训练集(其中HGG:210个病人,LGG:75个病人)

但由于BraTs只公开训练集数据,没有测试集数据,如果在训练集中再拆一部分用来作测试集的话,那训练集便少了许多,训练数据如果过少,容易出现过拟合现象,即在训练集中表现好,而在测试集中表现差,此时的网络泛化能力变差了.为了解决数据少的问题,灵机一动的我想出了一个办法.

因为BraTs2019的训练集在BraTs2018的基础上增多了,其中HGG增加了49例,LGG增加了1例,那么我就把这些新增的作为我的测试集

下面我提供百度云盘给大家下载,这是原始数据

        BraTs18数据集下载地址(不包含测试集,提供的验证集无GT) 
链接:https://pan.baidu.com/s/1Ry41OVl9VLOMzhQQR9qXuA 提取码:qvmo
BraTs19数据集下载地址如下(不包含测试集,提供的验证集无GT) 
链接: https://pan.baidu.com/s/1S5XGTdHkwFnagKS-5vWYBg 提取码: 2333
      

数据的预处理以及实现代码

把上面两年的数据下下来,然后我对数据的预处理方法是链接

完整的实现代码(jupyter notebook打开)

https://github.com/Merofine/BraTS2Dpreprocessing

  1. GetTrainingSets.ipynb——>训练集和验证集
  2. GetTestingSetsFrom2019.ipynb-—>测试集

代码执行完后,获得npy数据

v2-31cb53c7a1a959205b2a5c4682bb0c2f_b.png

<如果大家嫌麻烦,我这里提供预处理好的npy数据>

        链接:https://pan.baidu.com/s/1iIBvqrXIx2JAvoyt3FcuYw  密码:4qua
      

训练集、验证集和测试集——预处理之区别

它们的预处理除了是否要去除没有病灶切片外,别无区别

训练集是去除的,以缓解类别不均衡问题,类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况,但若差别很大,则会对学习过程造成困扰.我们的任务是分割,分割是一种对像素级别的分类,一个切片假如病灶很少甚至没有,那么就会出现严重的类别不均衡,学习的时候网络就会偏向于多的那一类靠,为了缓解这种情况,应该剔除没有病灶的切片

而验证集我也是去除的,因为验证集其实在训练过程中扮演了另一角色,虽然并没有直接参与训练,可是却是为了防止过拟合现象,也就是说防止网络将这些有病灶的切片学得太过头了,这是个人理解,具体到底是否去除,还得通过实验证明

测试集当然是不用去除的,因为这个时候就是考验它的时候到了,让它自己判断是否有病灶(提示:这里我还是去了,去了之后测出来的Dice会稳一点0.0)

运行环境的安装

windows10 64 bits、nvidia驱动、CUDA8.0、cudnn、anaconda

        打开命令窗口, 分别输入以下指令:

conda create -n jiu0Monkey python=3.6

conda activate jiu0Monkey

pip install simpleitk

pip install opencv-python==3.4.2.16

pip install scipy

pip install scikit-learn==0.20

pip install scikit-image==0.14

conda  install numpy  mkl cffi

安装pytorch,选择与cuda版本对应的进行安装,python版本也要对应
下载链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
我选择的是win-64 pytorch-0.4.0-py36_cuda80_cudnn7he774522_1.tar.bz2
下载完毕后进行安装,找到下载目录并执行:
conda install --offline .\pytorch-0.4.0-py36_cuda80_cudnn7he774522_1.tar.bz2

conda install  torchvision  -c pytorch

conda install Pillow=6.1

conda install tqdm

conda install pandas

pip install -U scikit-image

        
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numba
pip install hausdorff
      

代码下载链接

【闲鱼】https://m.tb.cn/h.UH72xqd?tk=q9RVdPn83UX CZ3457 「我在闲鱼发布了【入门【医学图像分割】,有资料+数据+代码】」

训练:

将train.py的img_paths和mask_paths修改为自己的trainImage和trainMask的路径

训练前会通过train_test_split函数将数据集划分为训练集和验证集,只要参数random_state一样,划分的结果就是一样的

每一次epoch训练结束,都会对验证集进行测试Iou指标,如果比之前最好的还要好就保存本次训练模型,如果超过args.early_stop这个参数还没有训练更好的话,便结束训练,这个原理就是early_stop,主要还是防止网络训练过度,造成过拟合现象,这也就是验证集虽然没有直接参与训练,但是却在其中扮演了一个非常重要的角色!

[过拟合]早停法 (Early Stopping)

如果要训练Unet++,则运行下面指令

        python .\train.py --arch="ResNetUnetPlus" --dataset=“Jiu0Monkey”
      

其它参数根据自己的情况进行配置

预训练模型及测试数据获取途径:知乎付费咨询后可获得,训练不易,体谅下0.0

预测:

将test.py的img_paths和mask_paths修改为自己的testImage和testMask的路径

运行下面指令获得测试结果以及GT文件:

        python .\test.py --name="jiu0Monkey_ResNetUnetPlus_woDS" --mode="GetPicture"
      

想了解更多指标的信息包括Dice、Hausdorff、IOU、PPV等,可以参考我这一篇(分割常用评价指标)

玖零猴:分割常用评价指标Dice、Hausdorff_95、IOU、PPV等(打马)

        python .\test.py --name="jiu0Monkey_ResNetUnetPlus_woDS" --mode="Calculate"
      

运行结果:

v2-c464e5b5ddf2f0c28ecdbd943c85e196_b.jpg

v2-b97fafc668d7d17b219c051e84491989_b.jpg

### UNet在医学图像分割中的最新研究进展 U-Net作为一种经典的卷积神经网络架构,在医学图像分割领域取得了显著的成功[^1]。该模型通过引入跳跃连接,有效地解决了下采样过程中信息丢失的问题,从而提高了分割精度。 近年来的研究进一步优化了这一基础框架: #### 1. 改进型UNet变体 研究人员提出了多种改进版本的U-Net来应对不同类型的医学成像挑战。例如,Residual U-net结合残差学习机制增强了特征表达能力;Attention U-net则利用注意力机制突出显示目标区域,改善了复杂背景下的分割效果[^4]。 #### 2. 多模态融合技术 为了充分利用不同类型医学影像的优势,多模态联合建模成为热点方向之一。这类方法通常会集成来自多个扫描设备的数据(如CT、MRI),并通过设计特定的网络层实现跨模态的信息交互与互补[^2]。 #### 3. 半监督/弱标签学习策略 鉴于高质量标注样本稀缺且成本高昂的特点,如何有效利用少量标记数据成为了亟待解决的问题。一些工作探索了基于自适应权重调整或者伪标签生成的方法来进行半监督训练,降低了对大规模精确标注的需求。 ```python import torch.nn as nn class AttentionBlock(nn.Module): """定义一个简单的注意力模块""" def __init__(self, F_g, F_l, n_coefficients): super().__init__() self.W_g = nn.Sequential( nn.Conv2d(F_g, n_coefficients, kernel_size=1), nn.BatchNorm2d(n_coefficients) ) self.W_x = nn.Sequential( nn.Conv2d(F_l, n_coefficients, kernel_size=1), nn.BatchNorm2d(n_coefficients) ) self.psi = nn.Sequential( nn.Conv2d(n_coefficients, 1, kernel_size=1), nn.BatchNorm2d(1), nn.Sigmoid() ) self.relu = nn.ReLU(inplace=True) def forward(self, g, x): g1 = self.W_g(g) x1 = self.W_x(x) psi = self.relu(g1 + x1) psi = self.psi(psi) return x * psi ``` 上述代码展示了用于增强U-Net性能的一个简单注意力模块实例,能够帮助聚焦于重要的局部细节。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玖零猴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值