3D U-Net脑胶质瘤分割BraTs + Pytorch实现

原论文地址: 连接

一、网络模型的分析和对比

原始2D-Unet网络模型

v2-cf0ead284f68d91a42cd3908cf793956_b.jpg

我的2D-Unet网络模型

1、和原来的2D-Unet网络不同的是,我输入通道为4,我这里应该改为4个通道,对应四个模态图像,而输出通道为3,我对应的是三个嵌套子区域标签(WT、TC、ET)

2、另外,最大不同的是我的3X3卷积后的图像尺寸与卷积前一致,所以不用像原来2D-Unet那样因为编码和解码的尺寸不一致,需要裁剪后再拼接.问题来了,为什么原来2D-Unet的卷积会导致卷积前后图尺寸发生改变,因为原来的卷积操作为 kernelsize = 3 ,stride =1 ,padding=0,此卷积为valid方式,这种卷积只能使得图的尺寸越卷越小.而我这里为 kernelsize = 3 ,stride =1 ,padding=1.根据公式可以得出卷积前后的特征图尺寸一致.这种卷积方式为same卷积.

[概念]卷积的三种模式:valid、same、full_程序猿的养生馆-CSDN博客

关于2D-Unet的讲解和Pytorch代码实现前面我也做了详细地讲解.

玖零猴:U-Net+与FCN的区别+医学表现+网络详解+创新 玖零猴:2D-UNet脑胶质瘤分割BraTs + Pytorch实现


原始3D-Unet网络模型

v2-b96c16ddee163ebfe2542cc13c074a17_b.jpg

1、和原始的2D-Unet对比,最显著的不同就是3D-Unet池化下采样共3次,所以这里一共有4个尺度,而原来2D-Unet有5个尺度

3、另外,需要注意的是在编码部分中每个尺度的两次卷积后特征图的通道数变化,很明显和2D-Unet不同.而解码部分却一样.

我的3D-Unet网络模型

1、原来3D-Unet输入通道为3,我这里应该改为4个通道,对应四个模态图像,而输出通道一样都为3,我对应的是三个嵌套子区域标签(WT、TC、ET).这里根据自己的需求设置自己网络的输入和输出通道.

2、原来3D-Unet和原来2D-Unet一样都采用了valid卷积,为了保证网络的输入输出分辨率一致,因此我的2D-Unet和3D-Unet都采用same卷积,所以就不用裁剪了,同时可以保证网络的输入输出分辨率一致

其余都是和原始3D-Unet一样的,为了更加好看,我把网络标注清晰点,如下图

v2-31891a71999bfe4a119c599000461936_b.jpg

二、预处理与数据的获取

玖零猴:(3D网络)医学三维数据且又多模态多标签该如何预处理

三、环境的配置

1、系统环境 WIN10 + CUDA 92 + CUDNN7 + ANACONDA

2、ANACONDA指令快速配置环境,先下载下面文件

https:// download.csdn.net/downl oad/weixin_40519315/12394604 

v2-1e6ab2b0230d510b9f6685399508900f_b.jpg

四、工程代码下载

from torch import nn
from torch import catclass pub(nn.Module):def __init__(self, in_channels, out_channels, batch_norm=True):super(pub, self).__init__()inter_channels = out_channels if in_channels > out_channels else out_channels//2layers = [nn.Conv3d(in_channels, inter_channels, 3, stride=1, padding=1),nn.ReLU(True),nn.Conv3d(inter_channels, out_channels, 3, stride=1, padding=1),nn.ReLU(True)]if batch_norm:layers.insert(1, nn.BatchNorm3d(inter_channels))layers.insert(len(layers)-1, nn.BatchNorm3d(out_channels))self.pub = nn.Sequential(*layers)def forward(self, x):return self.pub(x)class unet3dEncoder(nn.Module):def __init__(self, in_channels, out_channels, batch_norm=True):super(unet3dEncoder, self).__init__()self.pub = pub(in_channels, out_channels, batch_norm)self.pool = nn.MaxPool3d(2, stride=2)def forward(self, x):x = self.pub(x)return x,self.pool(x)class unet3dUp(nn.Module):def __init__(self, in_channels, out_channels, batch_norm=True, sample=True):super(unet3dUp, self).__init__()self.pub = pub(in_channels//2+in_channels, out_channels, batch_norm)if sample:self.sample = nn.Upsample(scale_factor=2, mode='nearest')else:self.sample = nn.ConvTranspose3d(in_channels, in_channels, 2, stride=2)def forward(self, x, x1):x = self.sample(x)#c1 = (x1.size(2) - x.size(2)) // 2#c2 = (x1.size(3) - x.size(3)) // 2#x1 = x1[:, :, c1:-c1, c2:-c2, c2:-c2]x = cat((x, x1), dim=1)x = self.pub(x)return xclass unet3d(nn.Module):def __init__(self, args):super(unet3d, self).__init__()init_channels = 4class_nums = 3batch_norm = Truesample = Trueself.en1 = unet3dEncoder(init_channels, 64, batch_norm)self.en2 = unet3dEncoder(64, 128, batch_norm)self.en3 = unet3dEncoder(128, 256, batch_norm)self.en4 = unet3dEncoder(256, 512, batch_norm)self.up3 = unet3dUp(512, 256, batch_norm, sample)self.up2 = unet3dUp(256, 128, batch_norm, sample)self.up1 = unet3dUp(128, 64, batch_norm, sample)self.con_last = nn.Conv3d(64, class_nums, 1)#self.sigmoid = nn.Sigmoid()def forward(self, x):x1,x = self.en1(x)x2,x= self.en2(x)x3,x= self.en3(x)x4,_ = self.en4(x)x = self.up3(x4, x3)x = self.up2(x, x2)x = self.up1(x, x1)out = self.con_last(x)return outdef _initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv3d):nn.init.kaiming_uniform(m.weight.data)if m.bias is not None:m.bias.data.zero_()elif isinstance(m, nn.BatchNorm3d):m.weight.data.fill_(1)m.bias.data.zero_()

完整代码

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

五、训练

        python train.py --arch=“unet3d” --dataset=“Jiu0Monkey”

六、测试

        python test.py --name="jiu0Monkey_unet3d_woDS"

七、和2D U-Net对比

在此之前,本专栏中的2D网络预测的时候,是把所有的切片预测完指标再求平均值,这样测的值极容易收到一些差的切片而影响整体的指标.所以以后的2D网络预测都采用下面方式进行计算指标,即把所有预测的切片拼接回3D,然后对3D数据整体进行计算指标.这样计算的值会偏高点.不只是2D网络这样,3D网络也是如此,把所有分块拼接后再对整体进行指标的计算.这样统一之后,我们就可以将2D和3D网络进行对比了.此外,代码预测生成的数据都是NII格式的,可以通过ITK-SNAP软件查看三维的分割效果,如果想看2D切片的分割效果,可以用该软件导出即可.

2D网络新的预测代码(test.py)如下

https://download.csdn.net/download/weixin_40519315/12466322​download.csdn.net

通过实验得出,2D U-Net、3D U-Net分割指标表如下:

分割效果对比图如下,可见3D网络提高了肿瘤周围的预测,少了很多小渣点.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/67674.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习(一)——MP神经元模型, BP算法, 神经元激活函数, Dropout

https://antkillerfarm.github.io/ 前言 神经网络本质上不是什么新东西。十年前,我还在上学的时候,就接触过皮毛。然而那时这玩意更多的还是学术界的屠龙之术,工业界几乎没有涉及。 及至近日重新拾起,方才发现,这十…

单个人工神经元模型示意图,人体神经元模型制作

人工神经元的基本构成 人脑的神经元模型如图8.6所示。图中一个神经元由细胞核、一个轴突、多个树突、突触组成。生物电信号从树突传入,经过细胞核处理,从轴突输出一个电脉冲信号。 神经元通过树突与轴突之间的突触与其他神经元相连构成一个复杂的大规模…

神经元的细胞体内有什么,神经元的细胞体在哪里

神经元细胞体位于哪里? 谷歌人工智能写作项目:神经网络伪原创 你知道神经元在我们身体的哪个部位吗? 神经元的基本结构包括细胞体和突起.神经元的突起一般包括一条长而分枝少的轴突和数条 短而呈树状分枝的树突.轴突以及套在外面的髓鞘,叫做神经纤维.…

03 神经元多输入

神经元多输入 上一篇博客介绍了二分类的逻辑回归模型。如果我们想要多分类的逻辑回归模型,我们该怎么做呢? 很显然,我们在只有一个神经元的时候可以做二分类的问题。如果我们想要多分类的话,直接加神经元的个数就好了,…

人脑部神经网络分布特点,人脑部神经网络分布图

人的大脑的怎么分配的 大脑(Brain)包括左、右两个半球及连接两个半球的中间部分,即第三脑室前端的终板。大脑半球被覆灰质,称大脑皮质,其深方为白质,称为髓质。髓质内的灰质核团为基底神经节。在大脑两半球间由巨束纤维—相连。 …

人体内数量最多的神经元,人体内有多少个神经元

人体内平均有多少神经元? 。 约含有140亿个神经元胞体虽然神经元形态与功能多种多样,但结构上大致都可分成胞体(cellbody,orsoma)和突起(neurite)两部分.突起又分树突(dendrite)和…

【计量经济学】【高教版】第二次作业

第二次作业: 教材:伍德里奇。计量经济学导论:现代观点(第五版)。 第三章习题:必做 1,2,5,6,11,选做13 第四章习题:必做2,3,4,5,8,选做9,10,11 第三章 1.多元线性回归模型的基本假设是什么?在证明最小二乘估计量的无偏性和有效性的过程中,哪些基本假设起…

【计量经济学】【高教版】第一次作业(7、8、10)

第二次 7.假设有人做了如下的回归: y i = β 0 ^ + β 1 ^ x i + e i y_i=\widehat{\beta_0}+\widehat{\beta_1}x_i+e_i yi​=β0​ ​+β1​ ​xi​+ei​ 其中, y i , x i y_i,x_i yi​,xi​分别为 Y i , X i Y_i,X_i Yi​,Xi​关于各自均值的离差。问 β 0 ^ 和 β 1 ^ \…

软件工程经济学作业5-7

1.什么是生产函数? 其主要特征是什么? 答:生 产函数是指一定时期内生产要素的数量与某种组合同其所能出产的最大产量之间存在的函数关系。 生产函数通常满足以下三个特征: (1 ) 资本 与劳动力的边际产出总是为正值, 在…

2020年12月程序员工资统计,平均14222元(转载)

2020年12月全国招收程序员394699人。2020年12月全国程序员平均工资14222元,工资中位数12500元,其中96%的人的工资介于3250元到62500元。 从图上看,工资是真的降了,吓得我瑟瑟发抖。希望明年涨回来。 城市 排名city平均工资最低工资…

每日一题-13(员工薪水中位数)

题13: 根据下表,在不使用任何内置的SQL函数的情况下编写SQL查询来查找每个公司的薪水中位数。 解题思路:题目要求是不使用任何内置的SQL函数,因此使用HAVING的妙用。 (1)先做自连接,之后根据ID…

《2020年全球程序员收入报告》字节跳动高居全球第七,年薪中位数高达40万美元!

速读2分钟,今天看到一份特别有意思的报告,是 《2020 年全球程序员收入报告》 。 大家谨慎观看,我感觉大家看完这份报告,在感受到拖后腿之后,容易丧心病狂,产生病态的嫉妒心理。 日前,Levels.f…

上半年薪资统计,数据岗中位数接近20K!

大家应该都和我一样,经常看到类似于《XXX入职大厂数据分析师,年薪50W》之类的标题。 数据分析师的薪资真的有这么夸张吗?我特意去查了下数据: (数据来源:职友集) 最近的数据显示,全国…

2021年3月程序员工资统计,平均15189元,又涨了

2021年3月采集数据124176条。2021年3月全国程序员平均工资15189元,工资中位数12500元,其中95%的人的工资介于5250元到37500元。 工资K线图: 这个月涨了一点点,一点点也是涨呀。 程序员的工资虽然不高,但是涨幅还是超…

2019年一线城市程序员工资大调查

转载声明:转载不得篡改文章内容。必须注明出处,必须注明Github源代码地址。 保留要求转载者删除文章的权力。 欢迎转载,提供本文markdown: https://github.com/juwikuang/china_job_survey/blob/master/articles/2019年一线城市…

2020年1月全国程序员工资统计,平均工资13632元。

趋势 2020年1月,中国大陆程序员平均工资13632员,比上个月增加。具体趋势如图: 各主要程序员城市工资变化 城市 北京,上海,深圳,杭州,广州四地的工资最高。 city平均工资最低工资中位数最高…

2020年9月程序员工资统计,平均14469元

目录 平均工资主要城市工资Java程序员按职能 统一回复,我9月1日爬的数据,当然是9月的程序员工资了。总不能说是8月的吧。 平均工资 2020年9月全国招收程序员352733人。2020年9月全国程序员平均工资14469元,工资中位数12500元,其…

2020年11月程序员工资统计,平均14327元

2020年11月全国招收程序员340579人。2020年11月全国程序员平均工资14327元,工资中位数12500元,其中96%的人的工资介于3000元到85000元。 工资好像又降低了,吓得我瑟瑟发抖。《权力的游戏》里面的一句话又回荡在我的耳边:winter is…

2020年8月程序员工资统计,平均14401元,下跌势头止住了

统一回复,我8月1日爬的数据,当然是8月的程序员工资了。总不能说是7月的吧。 平均工资 2020年8月全国招收程序员346036人。2020年8月全国程序员平均工资14401元,工资中位数12500元,其中95%的人的工资介于5250元到35000元。 主要城…

2020年6月程序员工资统计,平均14404元,又跌了,扎心

本文已过时 都7月了,你该看7月的数据去了: 2020年7月中国编程语言排行榜 2020年7月程序员工资统计,平均14357元,又跌了,扎心 见了鬼 本月的平均收入为14404, 本文的articleId为106503404,真…