MRI机器学习工具箱nilearn: masker

masker 对象的概念

对于任何基于神经影像的研究来说, 第一步都是要加载数据. 由于通常MRI是3D的, fmri加上时间这个轴, 是4D的, 对于机器学习模型来说, 这种4D的数据结构不便于分析. nilearn中 masking data 本质上是将4D的fmri数据变形成2D(voxel * timepoints). 但是如何将4D数据转为2D的数据, 对于不同的问题来说, 要选择的脑区不同, 脑网络节点不同, 实际上在计算之前, 都要把3D的大脑数据进行选择, masker对象就是为了这个目标. 所以在官方帮助文档上把masker对象比喻为做3D脑影像做”雕刻”的瑞士军刀, 是非常形象的~. 具体来说, nilearn提供了NiftiMasker模块实现这一功能.

给定的mask

函数肚的加载和调用基本格式如下:

from nilearn.input_data import NiftiMasker
masker = NiftiMasker()
mask  = masker.fit(nifti_filename)
masked_data = masker.fit_transform(nifti_filename)

其中masker = NiftiMasker()用于生成masker对象, masker.fit(nifti_filename)根据给定的数据生成mask, 生成的mask可以用mask.mask_img_查看. masked_data = masker.fit_transform(nifti_filename)将masker应用在nifti_filename指定的mri数据上, 将4D的数据转为2D.
NiftiMasker 默认的方式是基于背景(background) , 另外还有基于模板或者基于epi三种方式, 分别对应mask_strategy= ‘background’,’template’或者’epi ’.
如果数据给定了mask, NiftiMasker可以自动应用该mask. 以Haxby数据库给出的ventral stream的mask为例:

from nilearn.input_data import NiftiMasker
mask_filename = haxby_dataset.mask_vt[0]
nifti_masker = NiftiMasker(mask_img=mask_filename, standardize=True)
func_filename=haxby_dataset.func[0]
fmri_masked = nifti_masker.fit_transform(func_filename)
fmri_masked = fmri_masked[condition_mask]

这里的standardize=True , 将会对每个体素上的时间序列数据做0-1归一化. 这对后续的机器学习模型的训练非常重要.

从背景生成mask: background模式

这种方式是NiftiMasker默认方式, 首先算法会通过边缘检测自动计算图像的背景信号强度, 生成masker. 具体内部会调用nilearn masking模块中的compute_background_mask生成masker.

from nilearn.input_data import NiftiMasker
import nilearn.image as image
from nilearn.plotting import plot_roi, plot_epi, show
from nilearn import datasets 
miyawaki_dataset = datasets.fetch_miyawaki2008()
print(miyawaki_dataset.func[0])
miyawaki_filename = miyawaki_dataset.func[0]
mean_img = image.mean_img(miyawaki_filename)
plot_epi(mean_img, title=’Mean EPI image’)

masker = NiftiMasker()
masker.fit(miyamaki_filename)
plot_roi(masker.mask_img_, miyawaki_mean_img, title=’Mask from already masked data’)

在这里插入图片描述
在这里插入图片描述

从原始fmri中生成mask: epi模式

对于原始的fmri图像,没有”干净”uniform的背景场,需要用到另一套的方案生成mask. 在epi模式下, 函数内部会调用compute_epi_mask() 函数生成masker.

直接调用

dataset = datasets.fetch_adhd(n_subjects=1)
epi_filename = dataset.func[0]
from nilearn.image import index_img
epi_img = index_img(epi_filename, slice(0,100)) # 截取一段
mean_img = image.mean_img(epi_img)
plot_epi(mean_img, title=’Mean EPI image’)
masker = NiftiMasker(mask_strategy=’epi’)
masker.fit(epi_img)
plot_roi(masker.mask_img_, mean_img, titile=’EPI automatic mask’)

在这里插入图片描述
在这里插入图片描述

mask 微调

从上面的结果可以看出,生成的mask与原始fmri的边缘贴合的非常好, 但是由于原始fmri图像上还有一些颅骨体素没有剥离干净, 好在NiftiMasker提供了微调设置, 帮助我们生成更好的mask.

masker = NiftiMasker(mask_strategy=’epi’, mask_args=dict(opening=10))
masker.fit(epi_img)
plot_roi(masker.mask_img_, mean_img, title=’EPI mask with strong opening’)

这里mask_args=dict(opening=10)调用了内置的”腐蚀”erosion和”扩张”dilation算法, 对mask边缘的voxel进行取舍, 实现去颅骨的目的.
在这里插入图片描述

通过数据统计分布生成mask

事实上, 对于fmri数据, NiftiMasker()内部调用的就是nilearn.masking.compute_epi_mask(). compute_epi_mask ()函数有两个非常重要的参数:

  • lower_cutoff
  • upper_cutoff

这两个参数可以用于设置masking算法搜索灰质(gray value)边界时的阈值, 0 是图像体素激活强度的最小值, 1是图像体素激活强度的最大值. 比如设置lower cutoff为0.8, 从而使得搜索选择留下的体素接近EPI信号的强度.

masker = NiftiMasker(mask_strategy=’epi’, mask_args = dict(upper_cutoff=0.9, lower_cutoff=0.8, opening=False))
masker.fit(epi_img)
plot_roi(masker.mask_img_, mean_img )

在这里插入图片描述

基于模板生成mask: template模式

也可以基于MNI152模板生成基于模板的masker. 该模式下, 内部调用的是compute_grey_matter_mask() 函数.


masker = NiftiMasker(mask_strategy=’template’)
masker.fit(fmri_filename)
plot_roi(masker.mask_img_, mean_img)

加粗样式

总结

为了NifTI数据进行机器学习, 首先需要对感兴趣数据进行选择, 数据降维(4D→ 2D), 这些预处理可以通过设置nilearn的makser对象实现. 通常可以直接调用input_data模块的NiftiMasker()函数, 也可以用masking模块的compute_background_mask( ), compute_epi_mask( ), compute_gray_matter_mask( ) 函数实现. 基本调用格式分别如下:

  • input_data.NiftiMasker
from nilearn.input_data import NiftiMasker

masker = NiftiMasker(mask_strategy=’xxx’, mask_args=dict(xxx))
masked= masker.fit(fmri_filename)
masked_data = masker.fit_transform(fmri_filename)

masked是NiftiMasker类型的数据, masked_data是ndarray类型.

  • masking.compute_background_mask
from nilearn.masking import compute_background_mask
mask_bg = compute_background_mask(fmri_filename)

生成的mask_bg是Nifti1Image类型.

发布了111 篇原创文章 · 获赞 118 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/happyhorizion/article/details/89513479
今日推荐