使用 Monai Bundle 和 Model Zoo 对医学影像数据进行分类-全脑133个结构分割

使用 Monai Bundle 和 Model Zoo 对医学影像数据进行分类-全脑133个结构分割

导读

本系列涵盖从 3D Slicer 医学图像查看器的基础使用到高级自动分割扩展程序的内容(从入门到高阶!),具体包括软件安装、基础使用教程,自动分割扩展(totalsegmentator, monai label)快速标注数据。

在本系列第三部分中,我们在工作站上安装了 MONAILabel 服务端和 MONAILabel 3D Slicer 客户端。在第四部分内容中,我们从一个简单的腹部CT脾脏分割案例开始,介绍了monai label使用的一些基础用法。在第五部分中,使用radiology app进行全脊柱的分割,并且详细介绍了radiology app所有用法。

本节重点:在这一节中,我们将尝试使用monai bundle 和model zoo里面的分割模型来分割其他结构。

该系列之前的内容如下:
【添加链接】

如果你没看过系列之前的内容,以下是monai label一个简单的介绍

[ MONAI Label 是一个服务器-客户端系统,它利用 AI 促进交互式医学图像注释。它是一个开源且易于安装的生态系统,可以在具有单个或多个 GPU 的机器上本地运行。服务器和客户端都在同一台/不同的机器上工作。它与MONAI共享相同的原理。

MONAI Label 减少了注释新数据集的时间和精力,并通过不断从用户交互和数据中学习,使 AI 能够适应手头的任务。MONAI Label 允许研究人员和开发人员以用户的方式与他们的应用程序交互,从而不断改进他们的应用程序。最终用户(临床医生、技术人员和一般注释者)受益于 AI 的不断学习,并更好地理解最终用户试图注释的内容。]

Monai Bundle 和 Model Zoo简单介绍

MONAI Model Zoo 提供了一系列由社区开发的医学影像模型,采用 Monai Bundle 格式。Monai Bundle 允许您轻松获取任何来自 MONAI Model Zoo 的模型并将其导入 MONAILabel。

Model Zoo提供的模型包括MRI脑肿瘤分割,CT肺结节检测,病理细胞核分割分类,CT胰腺分割,MRI前列腺分割,CT肾脏分割,CT脾脏分割,MRI脑切片生成等20几个模型。后面会用单独的篇幅分别介绍这些预训练模型的使用。

MONAI Bundle 是一种基于规范和文件结构的方式,用于分发经过训练的 MONAI 模型以及相关元数据、代码、文档和其他资源。这些旨在让您更轻松地以某种格式分发模型,该格式说明了模型的用途、如何使用它、如何重现您用它完成的科学研究,并将其用于 Label 和 Deploy 等其他应用程序。详细的使用教程可以去monai bundle github

接下来我们将用很多案例来演示monai bunlde在3D slicer中的用法

基于monai bundle的MRI全脑分割

模型简介

  • 名称:Wholebrainseg large unest segmentation
  • 概述:基于3D transformer的全脑分割模型,适用于T1W MRI图像
  • 作者:范德堡大学 + MONAI团队
  • 参考文献:Xin 等人. 使用3D块聚合变换器表征肾脏结构. arXiv 预印本 arXiv:2203.02430 (2022). https://arxiv.org/pdf/2203.02430.pdf
  • 版本:0.2.3

模型描述

详细的全脑分割是一种重要的定量技术,在医学影像分析中提供了一种非侵入性的方法来测量临床获取的结构性磁共振成像(MRI)中的脑部区域。我们提供了一个预训练模型,用于训练和推理具有133个结构的全脑分割。提供的训练管道支持在 MONAI Label 中的主动学习和使用 bundle 进行训练

模型训练细节

一个预训练的 UNEST base model,用于 T1w MR 图像的体积(3D)全脑分割。为了利用嵌入序列中的信息,提出了“shifted window” transformers,用于密集预测和建模多尺度特征。然而,这些旨在复杂化 self-attention 范围的尝试往往会导致高计算复杂度和数据低效。受 nested ViT 中的 aggregation function 启发,我们提出了一种新的设计,即具有 Nested Transformers (UNesT) 的 3D U-shape 医学分割模型,通过 3D block aggregation function 层次化地学习小结构或小数据集的 locality behaviors。该设计保留了原始的 global self-attention mechanism,并通过层次化堆叠 transformer encoders 实现跨 patches 的信息通信。

The network architecture of UNEST Base model

训练数据

训练数据来自范德堡大学和范德堡大学医疗中心,并使用了公开发布的 OASIS 和 CANDI 数据集。训练和测试数据是来自三个不同站点的 MRI T1w图像。

任务涉及 133 类全脑分割。在 OASIS 数据集中,50 个 T1w MRI 扫描中,45 个用于训练,5 个用于验证。测试队列包括 Colin27 T1w 扫描和 CANDI 数据集的 13 个 T1w MRI 扫描。所有数据均注册到 MNI 空间,并按特定方法进行预处理,输入图像随机裁剪至 96 × 96 × 96 尺寸。

注意事项

请将你的数据配准到相同空间,训练用的脑部 MRI 图像通过 NiftyReg 工具进行仿射配准,以将目标图像注册到 MNI305 模板。在推理前,数据应处于 MNI305 空间。如果图像已经在 MNI 空间,则可以跳过配准步骤。可以使用任何配准工具将图像注册到 MNI 空间,以下是一个使用 ANTs 的示例建议。

pip install antspyx

#Sample ANTS registration

import ants
import sys
import os

fixed_image = ants.image_read('<fixed_image_path>')
moving_image = ants.image_read('<moving_image_path>')
transform = ants.registration(fixed_image,moving_image,'Affine')

reg3t = ants.apply_transforms(fixed_image,moving_image,transform['fwdtransforms'][0])
ants.image_write(reg3t,output_image_path)

电脑配置

The training and inference was performed with at least one 24GB-memory GPU.

完整的133个脑结构列表

由于列表较长,我放在文末了

在3D slicer使用全脑结构分割模型

  • step1: 激活环境
conda activate monailabel
  • step2: 下载monaibundle app
monailabel apps --name monaibundle --download --output apps


可以前往图片上地址查看下载了什么

  • step3: 下载实验数据

我直接在3D slicer 里面下载的示例数据,保存在了datasets/mrihead文件夹。

其他的T1w 数据也可以,最好是配准到了标准空间,和训练数据一致,准确度会更高。

  • step4: 启动服务端

服务端启动,使用的模型为:wholeBrainSeg_Large_UNEST_segmentation,注意大小写

monailabel start_server --app apps/monaibundle --studies datasets/mrihead --conf models wholeBrainSeg_Large_UNEST_segmentation


如图,第一次启动的时候会去下载预训练模型。

  • step5: 打开3D slicer,连接服务端

第四步启动好后,打开3D slicer,点击monailabel模块,点击绿色刷新符号就可以连接上服务端了。我们从下图可以看到使用的app和model。点击next sample加载数据,再点击run就可以自动分割了。

我在mac上分割花了20分钟左右,建议在GPU上运行可以加速。由于我的数据和训练数据差异太大,分割效果一般


不过,对于脖子部分,可以在segment editor模块中,拿把剪刀剪了。

事实证明,这个预训练模型的泛化性能不是很好
。不过有这个需求的同学可以试试。

其余的保存步骤,训练过程等操作可以查看之前的脾脏分割教程,有详细的介绍。

Tina姐:monai bundle也可以命令行调用,本次只演示了在 3D Slicer中的应用

完整的133个脑结构列表

编号英文描述中文翻译
0background背景
13rd-Ventricle第三脑室
24th-Ventricle第四脑室
3Right-Accumbens-Area右侧伏隔核区
4Left-Accumbens-Area左侧伏隔核区
5Right-Amygdala右侧杏仁核
6Left-Amygdala左侧杏仁核
7Brain-Stem脑干
8Right-Caudate右侧尾状核
9Left-Caudate左侧尾状核
10Right-Cerebellum-Exterior右侧小脑皮层
11Left-Cerebellum-Exterior左侧小脑皮层
12Right-Cerebellum-White-Matter右侧小脑白质
13Left-Cerebellum-White-Matter左侧小脑白质
14Right-Cerebral-White-Matter右侧大脑白质
15Left-Cerebral-White-Matter左侧大脑白质
16Right-Hippocampus右侧海马
17Left-Hippocampus左侧海马
18Right-Inf-Lat-Vent右侧下外侧脑室
19Left-Inf-Lat-Vent左侧下外侧脑室
20Right-Lateral-Ventricle右侧侧脑室
21Left-Lateral-Ventricle左侧侧脑室
22Right-Pallidum右侧苍白球
23Left-Pallidum左侧苍白球
24Right-Putamen右侧壳核
25Left-Putamen左侧壳核
26Right-Thalamus-Proper右侧丘脑
27Left-Thalamus-Proper左侧丘脑
28Right-Ventral-DC右侧腹侧DC
29Left-Ventral-DC左侧腹侧DC
30Cerebellar-Vermal-Lobules-I-V小脑蚓部叶I-V
31Cerebellar-Vermal-Lobules-VI-VII小脑蚓部叶VI-VII
32Cerebellar-Vermal-Lobules-VIII-X小脑蚓部叶VIII-X
33Left-Basal-Forebrain左侧基底前脑
34Right-Basal-Forebrain右侧基底前脑
35Right-ACgG–anterior-cingulate-gyrus右侧前扣带回
36Left-ACgG–anterior-cingulate-gyrus左侧前扣带回
37Right-AIns–anterior-insula右侧前岛叶
38Left-AIns–anterior-insula左侧前岛叶
39Right-AOrG–anterior-orbital-gyrus右侧前眶回
40Left-AOrG–anterior-orbital-gyrus左侧前眶回
41Right-AnG—angular-gyrus右侧角回
42Left-AnG—angular-gyrus左侧角回
43Right-Calc–calcarine-cortex右侧距状皮质
44Left-Calc–calcarine-cortex左侧距状皮质
45Right-CO----central-operculum右侧中央盖
46Left-CO----central-operculum左侧中央盖
47Right-Cun—cuneus右侧楔叶
48Left-Cun—cuneus左侧楔叶
49Right-Ent—entorhinal-area右侧内嗅区
50Left-Ent—entorhinal-area左侧内嗅区
51Right-FO----frontal-operculum右侧额盖
52Left-FO----frontal-operculum左侧额盖
53Right-FRP—frontal-pole右侧额极
54Left-FRP—frontal-pole左侧额极
55Right-FuG—fusiform-gyrus右侧颞下回
56Left-FuG—fusiform-gyrus左侧颞下回
57Right-GRe—gyrus-rectus右侧直回
58Left-GRe—gyrus-rectus左侧直回
59Right-IOG—inferior-occipital-gyrus右侧下枕回
60Left-IOG—inferior-occipital-gyrus左侧下枕回
61Right-ITG—inferior-temporal-gyrus右侧下颞回
62Left-ITG—inferior-temporal-gyrus左侧下颞回
63Right-LiG—lingual-gyrus右侧舌回
64Left-LiG—lingual-gyrus左侧舌回
65Right-LOrG–lateral-orbital-gyrus右侧外侧眶回
66Left-LOrG–lateral-orbital-gyrus左侧外侧眶回
67Right-MCgG–middle-cingulate-gyrus右侧中扣带回
68Left-MCgG–middle-cingulate-gyrus左侧中扣带回
69Right-MFC—medial-frontal-cortex右侧内侧额叶皮层
70Left-MFC—medial-frontal-cortex左侧内侧额叶皮层
71Right-MFG—middle-frontal-gyrus右侧中额回
72Left-MFG—middle-frontal-gyrus左侧中额回
73Right-MOG—middle-occipital-gyrus右侧中枕回
74Left-MOG—middle-occipital-gyrus左侧中枕回
75Right-MOrG–medial-orbital-gyrus右侧内侧眶回
76Left-MOrG–medial-orbital-gyrus左侧内侧眶回
77Right-MPoG–postcentral-gyrus右侧后中央回
78Left-MPoG–postcentral-gyrus左侧后中央回
79Right-MPrG–precentral-gyrus右侧前中央回
80Left-MPrG–precentral-gyrus左侧前中央回
81Right-MSFG–superior-frontal-gyrus右侧上额回
82Left-MSFG–superior-frontal-gyrus左侧上额回
83Right-MTG—middle-temporal-gyrus右侧中颞回
84Left-MTG—middle-temporal-gyrus左侧中颞回
85Right-OCP—occipital-pole右侧枕极
86Left-OCP—occipital-pole左侧枕极
87Right-OFuG–occipital-fusiform-gyrus右侧枕颞回
88Left-OFuG–occipital-fusiform-gyrus左侧枕颞回
89Right-OpIFG-opercular-part-of-the-IFG右侧岛状前额叶盖部
90Left-OpIFG-opercular-part-of-the-IFG左侧岛状前额叶盖部
91Right-OrIFG-orbital-part-of-the-IFG右侧岛状前额叶眶部
92Left-OrIFG-orbital-part-of-the-IFG左侧岛状前额叶眶部
93Right-PCgG–posterior-cingulate-gyrus右侧后扣带回
94Left-PCgG–posterior-cingulate-gyrus左侧后扣带回
95Right-PCu—precuneus右侧前楔叶
96Left-PCu—precuneus左侧前楔叶
97Right-PHG—parahippocampal-gyrus右侧海马旁回
98Left-PHG—parahippocampal-gyrus左侧海马旁回
99Right-PIns–posterior-insula右侧后岛叶
100Left-PIns–posterior-insula左侧后岛叶
101Right-PO----parietal-operculum右侧顶盖
102Left-PO----parietal-operculum左侧顶盖
103Right-PoG—postcentral-gyrus右侧后中央回
104Left-PoG—postcentral-gyrus左侧后中央回
105Right-POrG–posterior-orbital-gyrus右侧后眶回
106Left-POrG–posterior-orbital-gyrus左侧后眶回
107Right-PP----planum-polare右侧极平面
108Left-PP----planum-polare左侧极平面
109Right-PrG—precentral-gyrus右侧前中央回
110Left-PrG—precentral-gyrus左侧前中央回
111Right-PT----planum-temporale右侧颞平面
112Left-PT----planum-temporale左侧颞平面
113Right-SCA—subcallosal-area右侧次眶区
114Left-SCA—subcallosal-area左侧次眶区
115Right-SFG—superior-frontal-gyrus右侧上额回
116Left-SFG—superior-frontal-gyrus左侧上额回
117Right-SMC—supplementary-motor-cortex右侧辅助运动皮层
118Left-SMC—supplementary-motor-cortex左侧辅助运动皮层
119Right-SMG—supramarginal-gyrus右侧缘上回
120Left-SMG—supramarginal-gyrus左侧缘上回
121Right-SOG—superior-occipital-gyrus右侧上枕回
122Left-SOG—superior-occipital-gyrus左侧上枕回
123Right-SPL—superior-parietal-lobule右侧上顶叶
124Left-SPL—superior-parietal-lobule左侧上顶叶
125Right-STG—superior-temporal-gyrus右侧上颞回
126Left-STG—superior-temporal-gyrus左侧上颞回
127Right-TMP—temporal-pole右侧颞极
128Left-TMP—temporal-pole左侧颞极
129Right-TrIFG-triangular-part-of-the-IFG右侧三角前额叶
130Left-TrIFG-triangular-part-of-the-IFG左侧三角前额叶
131Right-TTG—transverse-temporal-gyrus右侧横颞回
132Left-TTG—transverse-temporal-gyrus左侧横颞回

文章持续更新,可以关注微公【医学图像人工智能实战营】获取最新动态。人手有限,文中涉及的链接前往微公对应文章查看。关注Tina姐,一起学习进步~

我是Tina, 我们下篇博客见~

白天工作晚上写文,呕心沥血

觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连

在这里插入图片描述

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,首先需要导入monai和numpy库: ```python import monai import numpy as np ``` 接着,我们需要定义一个函数,使用`monai.transform`中的`Rotate`来实现旋转操作。该函数需要输入标签数据和旋转角度,输出旋转后的标签数据。 ```python def rotate_label(label, angle): # 将标签数据转换为numpy数组 label_np = label.numpy() # 找到标签为1的位置 indices = np.where(label_np == 1) # 如果没有标签为1的位置,则返回原始标签数据 if len(indices[0]) == 0: return label # 计算旋转中心点 center = [np.mean(indices[0]), np.mean(indices[1]), np.mean(indices[2])] # 定义旋转操作 rotate = monai.transforms.Rotate(angle=angle, center=center, reshape=False) # 执行旋转操作 label_np_rot = rotate(label_np) # 将旋转后的标签数据转换为tensor并返回 return torch.from_numpy(label_np_rot) ``` 在这个函数中,我们首先将标签数据转换为numpy数组,然后找到标签为1的位置,并计算旋转中心点。接着,我们使用`monai.transforms.Rotate`定义旋转操作,其中`angle`表示旋转角度,`center`表示旋转中心点,`reshape=False`表示不改变数组形状。最后,我们执行旋转操作得到旋转后的标签数据,并将其转换为tensor返回。 接下来,我们可以使用定义好的函数来对标签为1的数据做旋转,例如: ```python # 假设label是一个形状为(1, 1, 64, 64, 64)的tensor,其中1表示batch size label_rotated = rotate_label(label[0, 0], angle=30) ``` 这样,我们就可以得到旋转30度后的标签数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tina姐

我就看看有没有会打赏我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值