niftynet Demo分析 -- brain_parcellation
brain_parcellation
论文详细介绍
通过从脑部MR图像中分割155个神经结构来验证该网络学习3D表示的效率
目标:设计一个高分辨率和紧凑的网络架构来分割体积图像中的精细结构
特点:大多数存在的网络体系结构都遵循完全卷积下行-向上采样路径。具有高空间分辨率的低层次特征首先被下采样用于更高层次的特征抽象;然后对特征图进行上采样,以实现高分辨率分割。本论文提出了一种新的3D架构,它包含了整个层的高空间分辨率特征图,并且可以在广泛的接受领域中进行训练
验证:通过从T1加权MR图像中自动进行脑区分割成155个结构的任务来验证网络,验证了采用蒙特卡罗方法对实验中存在漏失的网络进行采样来对体素水平不确定度估计的可行性
结果:经过训练的网络实现了通用体积图像表示的第一步,为其他体积图像分割任务的迁移学习提供了一个初始模型
3D卷积网络的要素
卷积和扩张卷积
为了使用较小的参数,为所有的卷积选用小的3D卷积核,只拥有3 * 3 * 3 的参数
扩张卷积的优点是特征可以在高空间分辨率下计算,接受域的大小可以任意放大。扩张卷积可以用于产生精确的密集预测和沿着对象边界的详细分割映射
论文提出采用扩张卷积的方法进行体积图像分割:用于进行上采样的卷积核使用膨胀系数r,对于输入特征图I的M通道,在扩张时生成的输出特征通道O为:

其中,(x,y,z)表示空间位置;w包含33 * M个可训练参数
该扩张卷积拥有3 * 3 * 3的参数,保留了空间分辨率,同时提供了(2r + 1)3的体素接收域
在实现中使用分拆合并策略来实现3D扩张卷积以从GPU受益
残差连接
残差连接可以使信息传播顺畅,提高训练速度,提高深度网络的效率,关键思想是创建标识映射连接,以绕过网络中的参数化层
示例:

有效的接受域
对于有n个残块的网络有2n个唯一路径的集合,因此,特征可以通过大量不同的接受域来学习
由于深度卷积网络的接受域相对较大,分割映射将避免卷积边界的畸变。进行了实验,证明了所提出的网络在边界附近只产生了很小的失真,畸变边界的宽度远小于最大接受域,因此,在测试时,在每个输入卷中填充一个0的边框,并在分割输出中丢弃相同数量的边框
损失函数
网络的最后一层是softmax函数,它为每个体素的所有标签打分
为处理处理训练数据不平衡的问题,不直接根据类别频率重新加权每个体素,而是使用直接最大化平均骰子系数(mean Dice coefficient)的解决方案

表示N体素的图片向量,C为数据类别数,
为分割结果,
为狄拉克函数(Dirac delta function),Fc(xn)为在C类别中xn的softmax分类得分
函数介绍文献
用差值法估计不确定度
预测的不确定性可以用M个样本的样本方差来估计
在最后一个卷积层之前增加一个1 * 1 * 1的卷积层来扩展分割网络。该被扩展的网络被训练时拥有一个带有0.5的dropout比率的新插入的层。在测试时,使用dropout对网络进行N次采样。最后的分割通过多数投票获得。在每个体素上被计算的与投票结果不一致的样本百分比作为不确定性估计
网络架构与实现
体系架构
网络包括20层卷积。前7层使用3 * 3 * 3的体素卷积,这些层用来捕获如边缘、拐角之类的低级图像特征。在随后的卷积层中,内核被放大两到四倍,这些具有扩展内核的深层编码中、高级图像特征。利用残差连接对每两个卷积层进行分组。在每个残块中,每个卷积层都与元素级的ReLU层和批规格化层相关联。ReLU、批规格化和卷积层按预激活顺序排列
架构图

为了在多个尺度上合并特征,当层越深时,膨胀曲的膨胀系数逐渐增大。具有标识映射的残块使不同尺度的特征能够直接融合。在整个网络中保持输入量的空间分辨率
在训练阶段,向网络中输入96 * 96 * 96的体素图像。最终,softmax层为96 * 96 * 96个体素都给出了基于分类标签的分类得分
实现细节
在训练阶段,预处理步骤包括输入数据的标准化以及在图像和子体素水平上的增强。在图像层面,采用基于直方图的尺度标准化方法对强度直方图进行规范化。对随机采样的96 * 96 * 96的子体素的随机拟合
为了做一个公平的比较,我们对所有的方法使用固定超参数的Adam优化方法
学习率设置为0.01,步长(step size)
设置为0.9,
设置为0.999,而对于V-Net选择了训练算法收敛的最大的学习率0.0001
为了获得更好的分割结果,没有添加后处理步骤,而是将重点放在由网络生成的密集分割图上
实验和结果
数据
网络从ADNI数据集中学习543张t1加权MR图像的高粒度分割,每卷的平均体素的为182 * 244 * 246,平均每卷尺寸为1.18mm * 1.05mm * 1.05mm。所有卷都经过偏压校正并重新定向到标准的右前向或上向。采用GIF框架对155个脑结构和5个非脑外部组织进行了青铜(brozen)标准分割。分别随机选择443卷、50卷和50卷进行训练、测试和验证
总体评价
采用平均骰子系数相似度(Dice Coefficient Similarity -- DCS)作为性能指标
输入图片信息
格式为Nifty格式的.gz压缩文件,解压后查看图片信息为:
Header:

Summary:

运行流程
假定我们已经下载好了demo
使用命令
python net_segment inference -c ~/niftynet/extensions/highres3dnet_brain_parcellation/highres3dnet_config_eval.ini
来运行网络
主流程
- 进入net_segment.py
- 进入niftynet.main()
- 获取用户参数 *1
- 参数更新
- 更新模型路径
- 将参数打印出并写入模型路径下的settings_inference.txt
- 定位日志文件并设置日志打印器
- 设置所有模型文件相关参数
设置网络映射文件
设置推断输出文件
设置系统数据分割文件
设置评估文件夹
- 设置驱动器
- 使用参数初始化应用程序 *2
- 驱动程序调用应用程序运行 *3
- 清理工作
关闭TensorFlow会话
重置图
关闭日志
参考流程
*1 获取用户参数
- 进入utilities.user_parameters_parser.py,运行run()
- 初始化参数解释器
- 读取配置文件
- 得到应用程序名字
- 创建应用程序
- 检测应用程序参数完整
- 解析命令行参数并重写配置文件选项
- 将解析的结果整理为system_args和input_data_args
- 如果不存在,设置csv列表的输出路径
- 维护config_file和action_parameter
- 设置action参数
- 设置模型目录
*2 使用参数初始化应用程序
- 进入engine.application_driver.py,运行initialise_application(self,workflow_param,data_param)
配置参数通过之前的步骤都存放在了workflow_param和data_param中
- 可以直接得到应用程序所需的系统参数、网络参数、训练参数、推测参数和应用程序的参数
- 设置模型路径
- 设置硬件参数
- 根据action类型来设置训练或推断参数
- 从模型文件推断初始迭代
- 由参数名从应用程序工厂中得到应用程序
- 使用参数初始化应用程序
- 重置数据分割器的所有字段,清空缓存的文件列表
- 设置数据的参数
- 初始化数据加载器
- 加载事件处理器实例
- 设置迭代器
*3 驱动程序调用应用程序运行
- 进入engine.application_driver.py,运行run()
- 根据应用程序和行为等其它参数创建TensorFlow图
- 广播会话开始
- 创建迭代信息生成器
- 循环运行应用程序 **1
- 停止应用程序的运行
**1 运行应用程序
- engine.application_driver.py模块的ApplicationDriver.loop_step()函数负责运行应用程序
- 广播开始迭代信息
- 运行一次迭代
- 广播一次迭代终止信息
niftynet Demo分析 -- brain_parcellation的更多相关文章
- qml demo分析(threadedanimation-线程动画)
一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...
- qml demo分析(maskedmousearea-异形窗口)
一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...
- 【RxJava Demo分析】(二)Schedulers线程调度器 · Hans Zone
用Schedulers(调度器)实现多任务(并发,Concurrency)的例子 废话不多说我们看一下有关于RxJava的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- google closure--继承模块二:goog.base()demo分析
昨天已经讲到了goog.inherits(),主要负责通过为子构造函数原型对象通过原型链继承父构造函数的原型对象的方法,完成继承.这样继承只完成了原型对象的继承,看看之前的那张图: 是不是感觉父构造函 ...
- 阿里react整合库dva demo分析
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "Helvetica Neue"; color: #404040 } p. ...
- qml demo分析(maroon-小游戏)
1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1 游戏开始 图2 游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...
- qml demo分析(abstractitemmodel-数据分离)
一.概述 qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析.这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面, ...
- (原创)cocos2dx-lua TableView官方demo分析
本来是想看看网上的教程文章,结果看了好几篇,复制代码各种报错,有很多不存在的类和变量,根本用不了. 所以干脆自己去看官方demo,经过自己分析测试,已经大概会用了,顺便记录一下. 以下是代码,复制粘贴 ...
- windows环境libevent搭建和demo分析
libevent框架之前有做过分析,这次是谈谈如何将libevent搭建在vs工作环境下, 并且编写一个demo进行测试.测试过程中会再一次带大家分析消息是怎么传递 的. 我的libevent版本li ...
随机推荐
- openresty + lua 4、openresty kafka
kafka 官网: https://kafka.apache.org/quickstart zookeeper 官网:https://zookeeper.apache.org/ kafka 运行需要 ...
- bootstrap4相关文档
本节课我们主要学习一下Bootstrap的两个个组件功能:输入框组件和导航导航条组件. 一.输入框组件 文本输入框就是可以在<input>元素前后加上文字或按钮,可以实现对表单控件的扩 展 ...
- Python基础语法-内置数据结构之列表
列表的一些特点: 列表是最常用的线性数据结构 list是一系列元素的有序组合 list是可变的 列表的操作, 增:append.extend.insert 删:clear.pop.remove 改:r ...
- Devexpress中Gridcontrol查找分组
private void button1_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns. ...
- 魔方Newlife.Cube权限系统的使用及模版覆盖详解
讲人:大石头 时间:2018-11-14 晚上20:00 地点:钉钉群(组织代码BKMV7685)QQ群:1600800 内容:魔方Newlife.Cube权限系统的使用及模版覆盖详解 准备 源码地址 ...
- ASP.NET MVC NPOI导入Excel DataTable批量导入到数据库
使用NPOI导入Excel 首先在MVC项目中导入NPOI 查询NPOI安装,排序依据,选择:最高下载量,选择第一个. 在控制器中创建ExcelController 在Index视图中写入代码: @u ...
- CentOS 7 - 安装MySQL 5.7
CentOS 7的默认yum仓库中并没有MySQL5.7,我们需要手动添加,好在MySQL官方提供了仓库的地址,所以我们能够比较简单地安装MySQL. 本文我们将介绍CentOS 7下MySQL5.7 ...
- springBoot2 基础语法
请求响应 request对象 request 对象其实是HttpServletRequest 类型, 通过它可以获取请求相关的一切信息, 包含请求信息 . 以及请求参数 ,甚至可以当成往里面存储数据[ ...
- IO相关1(io类/流状态)
IO类: iostream 定义了用于读写流的基本类型,fstream 定义了读写命名文件的类型,sstream 定义了读写内存 string 对象的类型. IO 库类型和头文件: 头文件 类型 io ...
- ubuntu下wps无法使用搜狗输入法输入中文
sudo vim /usr/bin/et sudo vim /usr/bin/wps sudo vim /usr/bin/wpp 以上三个文件,都加入如下内容后重新打开文档即可 export XMOD ...