niftynet Demo分析 -- brain_parcellation

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. 设置所有模型文件相关参数

    设置网络映射文件

    设置推断输出文件

    设置系统数据分割文件

    设置评估文件夹

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

    关闭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中

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

*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. 广播一次迭代终止信息

原文地址:https://www.cnblogs.com/zhhfan/p/9898196.html

时间: 2024-10-11 13:25:42

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

Cocos2d-x3.1TestCpp之MotionStreakTest Demo分析

1.构成代码 VisibleRect.h VisibleRect.cpp AppDelegate.h AppDelegate.cpp HelloWorldScene.h HelloWorldScene.cpp MotionStreakDemo.h MotionStreakDemo.cpp 2.代码分析 (1)VisibleRect.Appdelegate的代码均为TestCpp提供代码: (2)HelloWorldScene.cpp中只需把上一篇Cocos2d-x3.1TestCpp之NewRe

XMPP协议实现即时通讯底层书写 (二)-- IOS XMPPFramework Demo+分析

我希望,This is a new day! 在看代码之前,我认为你还是应该先整理一下心情,来听我说几句: 首先,我希望你是在早上边看这篇blog,然后一边開始动手操作,假设你仅仅是看blog而不去自己对照项目,作用不是非常大.一日之计在于晨,所以怀着一颗对技术渴望,激动的.亢奋的心情去学习.你才干有所得. 嗯,就拿鄙人当时做项目来说,每天早上起来的第一件事情.就是研究XMPPFramework作者的代码,依照模块来分析和模仿书写.睡觉的时候还在思考,分析.总结... 当然我并非说每一个Dev

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

昨天已经讲到了goog.inherits(),主要负责通过为子构造函数原型对象通过原型链继承父构造函数的原型对象的方法,完成继承.这样继承只完成了原型对象的继承,看看之前的那张图: 是不是感觉父构造函数好像没什么用处啊,还记得上篇文章,构建一个超级对象的设想吗?这个要依赖另一个API,goog.base(). 在看源代码之前让我们看看一个简单的demo,温习一下goog.inherit(),这个demo还可以帮助我们了解goog.base()可以做些什么. demo代码: 输出结果: 分析: 先

qml demo分析(clocks-时钟)

一.效果展示 效果如图1所示,时钟列表支持鼠标左右拖动,带有黑色背景的是晚上时钟,无黑色背景的是白天时钟 二.源码分析 1.main.cpp文件中只包含了一个宏,该宏的具体解释请看qml 示例中的关键宏文章 2.时钟项 1 Item { 2 id : clock 3 width: { 4 if (ListView.view && ListView.view.width >= 200) 5 return ListView.view.width / Math.floor(ListView

qml demo分析(rssnews-常见新闻布局)

一.效果展示 今儿来分析一篇常见的ui布局,完全使用qml编写,ui交互效果友好,如图1所示,是一个常见的客户端新闻展示效果,左侧是一个列表,右侧是新闻详情. 图1 新闻效果图 二.源码分析 首先先来总体分析下该示例代码的工程目录,如图2所示,总共有6个qml文件.其中BusyIndicator和组件是qml已经存在的组件,NewsDelegate组件是新闻详情页中的一项,CategoryDelegate组件是左侧列表中的一项,RssFeeds组件是左侧新闻列表数据源,rssnews文件是主程序

Cocos2d-x3.1TestCpp之NewRenderTest Demo分析

1.代码构成 VisibleRect.h VisibleRect.cpp AppDelegate.h AppDelegate.cpp HelloWorldScene.h HelloWorldScene.cpp NewRenderTest.h NewRenderTest.cpp 2.HelloWorld代码 #include "cocos2d.h" #include "ui/CocosGUI.h" USING_NS_CC; using namespace ui; cl

MATLAB R2016a computer vision toolbox 的 demo分析

2016/05/24 随便看了下几个demo,现在函数都搞的全部封装起来了,不太好,但是还是要借鉴demo里头的总体思路 Structure From Motion From Two Views 1,Read a Pair of Images 读入两幅图像 2,Load Camera Parameters 载入相机参数(用的相机标定app预先弄好的) 3,Remove Lens Distortion 纠正透镜畸变 4,Find Point Correspondences Between The

qml demo分析(photosurface-图片涅拉)

阅读qml示例代码已有一小段时间,也陆续的写了一些自己关于qml示例代码的理解,可能由于自己没有大量的qml开发经验,总感觉复杂的ui交互qml处理起来可能会比较棘手,但事实总是会出人意料,今天我们就来分析一个关于油耗交互的qml代码.从毕业后就一直从事qt的相关开发,一直在使用QWidget窗口做产品,看多了qml后才发现原来还有这么好的ui开发利器,完全的数据和展示分离,ui可以做到想怎么变怎么变,没有了QBoxLayout的帮助(同样是约束),ui再也不用那么死板,对于灵活.绚丽的桌面程序

iOS 3D 之 SceneKit框架Demo分析

Scene Kit 是Apple 向 OS X 开发者们提供的 Cocoa 下的 3D 渲染框架. Scene Kit 建立在 OpenGL 的基础上,包含了如光照.模型.材质.摄像机等高级引擎特性,这些组件都是面向对象的,你可以用熟悉的 Objective-C 或 Swift 语言来编写代码.假如你用过 OpenGL 最早的版本,那时还没有 shader,只能苦逼的使用各种底层受限制的 API 开发.而 Scene Kit 就好了很多,对于大多数需求 (甚至像动态阴影等高级特性),使用它提供的