每日热闻!Nipype学习记录(1): Concepts
我得了看见 .sh 和 .m 文件就会心动过速的绝症,逆天语法和逆天GUI总有一款适合你
因为最近要处理的影像数据太多,各个软件包又是有的用matlab,有的有自己的gui和cli,所以不得不写一堆批处理脚本,散落在各个目录下,名字大多为test.m,ttest.sh,test1.py……
于是出于对自身精神健康状况的考量,我从网上找到了这个Python库: Nipype 。它的官网介绍大意是这样的:
(资料图片)
Nipype 是一个Python开源项目,将大量神经影像处理工具集成为Python下统一的接口,包括ANTS, SPM, FSL, FreeSurfer, Camino, MRtrix, MNE, AFNI, Slicer, DIPY等,从而使用户可以仅仅通过Python让这些工具协同工作,对影像数据进行处理。
当然,说是学习记录,其实就是按照这个教程复刻一下(
1. Installation
呃……安装就不说了吧,如果连上面那些软件包都装不上,那应该不是这东西的目标用户(
不过有两点需要注意的地方可以提一下:
pip install 装的只是这个库,并不自带上述软件包。所有需要使用的工具需要事先装好,且环境变量配置正确。
非要在Windows下使用的话还是考虑一下Docker吧(感觉不如虚拟机……简单……)
2. Concepts
Interface
如图所示,Interface可以简单理解为将各软件包函数进行封装后暴露在Python中的接口,也就是将各种不同形式、不同平台的函数抽象为了一组类似的方法(大概学过OOP会好理解一点?)。
举个例子, BET 是FSL中进行skullstrip的函数,一般需要用bash脚本实现批处理。对于处理完的数据,如果想要用SPM进行分割,又需要编写matlab脚本调用 spm_segment 进行处理。而为了保证影像文件在这两次处理时的对应关系,还需要编写冗余的脚本或者配置文件。
引入 Nipype 后, BET 和 spm_segment 就都成了同等地位的Interface,可以在Python中统一到同一套流程下:
Interface的概念对应于class,在具体使用中需要将其实例化,比如 bet=BET()。
Node
上面实例化的 bet 已经可以在Python下对影像进行处理了,但是为了后续不同Interface之间的数据传输,我们需要将它们装进同一规格的箱子中,按照抽象程度更高的方式进行交互,这就是Node。
一个Node需要具有以下几项属性:
IN:Node的输入
OUT:Node的输出
Name:Node的名称
Interface Category:代表Node的具体功能,也就是“箱子”中真正装着的东西
在定义了多个不同功能的Node后,我们可以将它们按照IN→OUT的顺序连接起来实现一条pipeline(实际上就是后面Workflow的概念):
比如我们可以假设node1代表FSL的 BET 函数,node2代表SPM的 spm_segment 函数,那么上面这张图的意义就是在对输入的原始影像数据进行skullstrip处理后,将输出文件作为node2的输入,进行segment处理并输出结果。与最开始的做法相比,这样一套流程有效地将处理代码全部统一到了Python下,也方便了后续修改。
Workflow
Workflow的基本概念其实就是上面将多个Node连接到一起。对于简单的任务,其实定义多个Node按顺序进行处理就已经足够了,无非是需要多维护一张表来记录各个结果对应的subject。但是对于复杂任务,就需要使用Workflow明确输入输出,并通过cache机制减少处理时长:
3. Quickstart
先尝试一个简单的任务:
比较一下处理前后影像(没有修改参数所以会有点奇怪,不过可以看出头骨被去掉了):
后面的留给下次罢
关键词: