brain_parcellation

论文详细介绍

通过从脑部MR图像中分割155个神经结构来验证该网络学习3D表示的效率

目标:设计一个高分辨率和紧凑的网络架构来分割体积图像中的精细结构

特点:大多数存在的网络体系结构都遵循完全卷积下行-向上采样路径。具有高空间分辨率的低层次特征首先被下采样用于更高层次的特征抽象;然后对特征图进行上采样,以实现高分辨率分割。本论文提出了一种新的3D架构,它包含了整个层的高空间分辨率特征图,并且可以在广泛的接受领域中进行训练

验证:通过从T1加权MR图像中自动进行脑区分割成155个结构的任务来验证网络,验证了采用蒙特卡罗方法对实验中存在漏失的网络进行采样来对体素水平不确定度估计的可行性

结果:经过训练的网络实现了通用体积图像表示的第一步,为其他体积图像分割任务的迁移学习提供了一个初始模型

3D卷积网络的要素

卷积和扩张卷积

为了使用较小的参数,为所有的卷积选用小的3D卷积核,只拥有3 * 3 * 3 的参数

扩张卷积的优点是特征可以在高空间分辨率下计算,接受域的大小可以任意放大。扩张卷积可以用于产生精确的密集预测和沿着对象边界的详细分割映射

论文提出采用扩张卷积的方法进行体积图像分割:用于进行上采样的卷积核使用膨胀系数r,对于输入特征图IM通道,在扩张时生成的输出特征通道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

来运行网络

主流程

  1. 进入net_segment.py
  2. 进入niftynet.main()
  3. 获取用户参数 *1
  4. 参数更新
  5. 更新模型路径
  6. 将参数打印出并写入模型路径下的settings_inference.txt
  7. 定位日志文件并设置日志打印器
  8. 设置所有模型文件相关参数

设置网络映射文件

设置推断输出文件

设置系统数据分割文件

设置评估文件夹

  1. 设置驱动器
  2. 使用参数初始化应用程序 *2
  3. 驱动程序调用应用程序运行 *3
  4. 清理工作

关闭TensorFlow会话

重置图

关闭日志

参考流程

*1 获取用户参数

  1. 进入utilities.user_parameters_parser.py,运行run()
  2. 初始化参数解释器
  3. 读取配置文件
  4. 得到应用程序名字
  5. 创建应用程序
  6. 检测应用程序参数完整
  7. 解析命令行参数并重写配置文件选项
  8. 将解析的结果整理为system_args和input_data_args
  9. 如果不存在,设置csv列表的输出路径
  10. 维护config_file和action_parameter
  11. 设置action参数
  12. 设置模型目录

*2 使用参数初始化应用程序

  1. 进入engine.application_driver.py,运行initialise_application(self,workflow_param,data_param)

配置参数通过之前的步骤都存放在了workflow_param和data_param中

  1. 可以直接得到应用程序所需的系统参数、网络参数、训练参数、推测参数和应用程序的参数
  2. 设置模型路径
  3. 设置硬件参数
  4. 根据action类型来设置训练或推断参数
  5. 从模型文件推断初始迭代
  6. 由参数名从应用程序工厂中得到应用程序
  7. 使用参数初始化应用程序
  8. 重置数据分割器的所有字段,清空缓存的文件列表
  9. 设置数据的参数
  10. 初始化数据加载器
  11. 加载事件处理器实例
  12. 设置迭代器

*3 驱动程序调用应用程序运行

  1. 进入engine.application_driver.py,运行run()
  2. 根据应用程序和行为等其它参数创建TensorFlow图
  3. 广播会话开始
  4. 创建迭代信息生成器
  5. 循环运行应用程序 **1
  6. 停止应用程序的运行

**1 运行应用程序

  1. engine.application_driver.py模块的ApplicationDriver.loop_step()函数负责运行应用程序
  2. 广播开始迭代信息
  3. 运行一次迭代
  4. 广播一次迭代终止信息

niftynet Demo分析 -- brain_parcellation的更多相关文章

  1. qml demo分析(threadedanimation-线程动画)

    一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...

  2. qml demo分析(maskedmousearea-异形窗口)

    一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...

  3. 【RxJava Demo分析】(二)Schedulers线程调度器 · Hans Zone

    用Schedulers(调度器)实现多任务(并发,Concurrency)的例子 废话不多说我们看一下有关于RxJava的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  4. google closure--继承模块二:goog.base()demo分析

    昨天已经讲到了goog.inherits(),主要负责通过为子构造函数原型对象通过原型链继承父构造函数的原型对象的方法,完成继承.这样继承只完成了原型对象的继承,看看之前的那张图: 是不是感觉父构造函 ...

  5. 阿里react整合库dva demo分析

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "Helvetica Neue"; color: #404040 } p. ...

  6. qml demo分析(maroon-小游戏)

    1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1  游戏开始 图2  游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...

  7. qml demo分析(abstractitemmodel-数据分离)

    一.概述 qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析.这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面, ...

  8. (原创)cocos2dx-lua TableView官方demo分析

    本来是想看看网上的教程文章,结果看了好几篇,复制代码各种报错,有很多不存在的类和变量,根本用不了. 所以干脆自己去看官方demo,经过自己分析测试,已经大概会用了,顺便记录一下. 以下是代码,复制粘贴 ...

  9. windows环境libevent搭建和demo分析

    libevent框架之前有做过分析,这次是谈谈如何将libevent搭建在vs工作环境下, 并且编写一个demo进行测试.测试过程中会再一次带大家分析消息是怎么传递 的. 我的libevent版本li ...

随机推荐

  1. poj 2352 stars 【树状数组】

    题目 题意:按y递增的顺序给出n颗星星的坐标(y相等则x递增),每个星星的等级等于在它左边且在它下边(包括水平和垂直方向)的星星的数量,求出等级为0到n-1的星星分别有多少个. 因为y递增的顺序给出, ...

  2. Scala_特质

    特质 特质概述 Java中提供了接口,允许一个类实现任意数量的接口 在Scala中没有接口的概念,而是提供了“特质(trait) ”,它不仅实 现了接口的功能,还具备了很多其他的特性 Scala的特质 ...

  3. Scala_对象

    对象 单例对象 Scala并没有提供Java那样的静态方法或静态字段,但是,可以采用 object关键字实现单例对象,具备和Java静态方法同样的功能. 可以看出,单例对象的定义和类的定义很相似,明显 ...

  4. Android Studio-引用jar及so文件

    一.引用jar文件    1.将jar文件复制.粘贴到app的libs目录中:    2.右键点击jar文件,并点击弹出菜单中的“Add As Library”,将jar文件作为类库添加到项目中:  ...

  5. .net core 与ELK(2)安装Elasticsearch可视化工具

    elasticsearch-head是els的界面插件,地址https://github.com/mobz/elasticsearch-head 1.进入github并下载 wget https:// ...

  6. HttpWebRequest 跳转后(301,302)ResponseUri乱码问题

    问题: 目标地址: http://www.baidu.com/baidu.php?url=a000000aa.7D_ifdr1XkSUzuBz3rd2ccvp2mFoJ3rOUsnx8OdxeOeOL ...

  7. 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制

    [源码下载] 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制 作者:webabcd 介绍背水一战 Windows 10 之 控件(集 ...

  8. centos下配置nginx遇到的一些基本的坑

    作为一个用.net的渣渣,常年混迹在window平台下,对Linux啥都不懂.随着.net core开源.跨平台后,也开始学习下linux. 在Desktop/Webs下放了一个index.html的 ...

  9. C# Winform下一个热插拔的MIS/MRP/ERP框架(简介)

    Programmer普弱哥们都喜欢玩自己的框架,我也不例外. 理想中,这个框架要易于理解.易于扩展.易于维护:最重要的,易于CODING. 系统是1主体框架+N模组的多个EXE/DLL组成的,在主体框 ...

  10. 深入理解String类

    1.String str = "eee" 和String str = new String("eee")的区别 先看一小段代码, public static v ...