在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测
导读
本系列涵盖从 3D Slicer 医学图像查看器的基础使用到高级自动分割扩展程序的内容(从入门到高阶!),具体包括软件安装、基础使用教程,自动分割扩展(totalsegmentator, monai label)快速标注数据。
在本系列第三部分中,我们在工作站上安装了 MONAILabel 服务端和 MONAILabel 3D Slicer 客户端。在第四部分内容中,我们从一个简单的腹部CT脾脏分割案例开始,介绍了monai label使用的一些基础用法。在第五部分中,使用radiology app进行全脊柱的分割,并且详细介绍了radiology app所有用法。在第六部分中首次使用monai bundle 和model zoo里面的分割模型在MRI图像上分割全脑133个结构。
本节重点:在这一节中,我们不再进行分割,而是使用monai bundle做检测任务。识别CT胸部图像中可能存在结节的位置,并计算结节的概率。
该系列之前的内容如下:
【添加链接】
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的CT肺结节检测
在每一个教程开始前,会简单介绍这个预训练模型的基本信息,了解模型才能更好的适配模型,提高标注准确度。
模型简介
- 名称:Lung nodule ct detection
- 概述:在 LUNA16 数据集上训练的 CT 图像检测肺结节 3D 预训练模型
- 作者:MONAI 团队
- 参考文献:Lin, Tsung-Yi, 等人. “Focal loss for dense object detection.” ICCV 2017
- 版本:0.5.9
模型概述
预训练模型用于从CT图像中进行肺结节的体积(3D)检测。
该模型在LUNA16数据集上训练,使用了RetinaNet。
训练数据
本示例中我们使用的实验数据集是LUNA16,LUNA16是一个用于CT肺结节检测的公开数据集。使用原始CT扫描数据,目标是识别可能存在结节的位置,并为每个位置分配结节的概率。
在这些文件中,“box”的值是世界坐标中的真实值框。
数据重采样:LUNA16中的原始CT图像具有不同的体素大小。第一步是将它们重新采样为相同的体素大小。在此模型中,我们将它们重新采样为0.703125 x 0.703125 x 1.25毫米
请按照https://github.com/Project-MONAI/tutorials/tree/main/detection中第3.1节的说明进行重采样。
训练配置
- 实际模型输入:192 x 192 x 80
- 优化器:Adam
- 学习率:1e-2
- 损失函数:BCE loss and L1 loss
- input:1 channel - List of 3D CT patches
- output: 训练模式: classification and box regression loss.评估模式:预测框、分类标签和分类分数的字典列表。
如果想要自己训练,可以参考https://monai.io/model-zoo.html
注意事项
想要标注更精确,可以使用训练数据相同的分辨率。
在3D slicer中进行CT肺结节检测
- step1: 激活环境
conda activate monailabel
- step2: 下载monaibundle app
如在之前的教程中下载过请忽略此步骤
monailabel apps --name monaibundle --download --output apps
可以前往图片上地址查看下载了什么
- step3: 下载实验数据
提供三个数据集,看自己需要选择一个进行下载
- LUNA16数据集:
肺结节检测模型使用LUNA16数据集进行训练和评估。如果您打算使用LUNA16的完整数据集,请参考训练数据集中的说明下载数据,并按规范创建和预处理图像。 - monai示例数据:
在本教程中,我们准备了一个示例子集,已经重新采样并可以直接使用。该子集仅用于演示。点击此处下载monai sample data。
或者使用以下命令直接下载和解压。
mkdir datasets
wget "https://github.com/Project-MONAI/MONAILabel/releases/download/data/detection_dataset.zip" -O datasets/detection_dataset.zip
unzip datasets/detection_dataset.zip -d datasets/detection_dataset
- 十项全能挑战赛数据集:
该检测模型还支持MSD Task06_Lung数据集进行推理。请注意,此数据集是为结节分割任务创建的。我们不使用分割掩码,只使用图像进行推理。
使用以下monailabel API自动下载数据集。
monailabel datasets --download --name Task06_Lung --output datasets
Tina姐使用的是Task06_Lung,数据集有8G,下载不下来可以联系我。
- step4: 启动 MONAI Label Server
monailabel start_server --app apps/monaibundle --studies datasets/Task06_Lung/imagesTr --conf models lung_nodule_ct_detection
这个命令中,配置的预训练模型为lung_nodule_ct_detection
,注意大小写
- step5(可选步骤):修改包中的检测参数。
lung_nodule_ct_detection
包可以设置框预测的概率阈值。在apps/monaibundle/model/lung_nodule_ct_detection_v0.5.0/configs/inference.json
中,它定义了score_thresh=0.02
:
"detector_ops": [
"[email protected]_target_keys(box_key='box', label_key='label')",
"[email protected]_box_selector_parameters(score_thresh=0.02, topk_candidates_per_level=1000, nms_thresh=0.22, detections_per_img=300)",
"[email protected]_sliding_window_inferer(roi_size=@infer_patch_size, overlap=0.25, sw_batch_size=1, mode='constant', device='cpu')"
]
此参数将影响最终预测输出中的框数量。然后在3D Slicer中显示所有框的ROI。
如果用户希望限制在3D Slicer中显示的预测框数量,可以设置更高的score_thresh
,例如score_thresh=0.5
、score_thresh=0.6
甚至更高。
- step6:启动 3D Slicer
启动3D Slicer和MONAI Label插件,绿色刷新符号连接服务端,点解nextsample加载数据,最后点击run等待自动勾画检测框:如不会请参考系列之前的内容
重要提示:如果您的MONAI Label插件来自较旧版本,请更新和使用最新的MONAI Label插件。检测任务需要在3D Slicer标记中绘制ROI节点。
该过程在mac上勾画的时间为14分钟,建议使用GPU。
- step7: 编辑结果和提交
用户可以使用3D Slicer的ROI框编辑器手动编辑推理标签,点击顶部的Markups
选项卡,使用调整ROI的工具。
- 手动编辑推理标签:
- 打开3D Slicer,点击顶部的
Markups
选项卡。 - 使用ROI框编辑器调整和编辑ROI。
- 保存注释:
- 编辑完成后,返回MONAI Label插件界面。
- 点击
Submit Label
按钮,将注释保存到文件系统中。
- 注释存储路径:
- 注释将保存到研究数据集中的
labels/final
文件夹。 - 例如,在此用例中,真实标签将保存到
datasets/Task06_Lung/imagesTr/labels/final
文件夹中。
- 加载注释:
- 保存的注释将以JSON文件形式存储,使用3D Slicer的ROINode格式。
- 可以使用3D Slicer加载该JSON文件,以查看和编辑注释。
通过这些步骤,您可以使用3D Slicer手动编辑和保存肺结节检测的注释标签,并在需要时重新加载进行查看和进一步编辑。
从图中可以看到,预测的检测框有12个,而真正肺结节只有一个,假阳性太高,可以使用step5的方法降低假阳性。
- step8:主动学习
MONAI Label中的主动学习(active learning)和交互式微调模型具有突出功能,用户可以在保存新的注释标签时随时训练他们的模型。点击“Train”按钮,MONAI Label服务器将获取保存的最终真实标签,并微调之前的模型。
以下是JSON文件中注释框坐标的示例:
{
"ROINode": {
"label": "Lung Nodule",
"type": "Box",
"coordinates": [
{
"x": 32,
"y": 45,
"z": 20,
"width": 15,
"height": 15,
"depth": 10
},
{
"x": 60,
"y": 70,
"z": 40,
"width": 20,
"height": 20,
"depth": 15
}
]
}
}
通过这些步骤,您可以使用MONAI Label中的主动学习和交互式微调功能,在保存新的注释标签时不断改进您的模型。
用户可以使用最新微调的模型进行自动分割。主动学习过程将选择未标记的批次数据。
下一张图像被选中,已经训练过的图像将被标记为已标记数据,不会被选择用于下一次标记批次。主动学习策略如“first/random”将用于选择要获取的未标记数据。
- step9: 重复直到所有数据都被注释和训练
重复获取数据和主动学习过程,直到所有未标记的数据都被注释和训练。
每个训练循环中,新的最佳指标模型将保存到“model/model.pt”文件中,在这个用例中,模型将保存到“apps/monaibundle/lung_nodule_ct_detection/model/model.pt”。
结论
本教程演示了使用MONAI Label和monaibundle应用进行肺结节CT检测任务。教程介绍了主动学习过程、自动推理、检测编辑器、提交标签和保存模型。
具体步骤总结如下:
- 安装和启动3D Slicer和MONAI Label插件:
- 参考“Hello World”教程安装3D Slicer和MONAI Label插件。
- 选择模型并获取数据:
- 在MONAI Label插件中选择
lung_nodule_ct_detection
模型。 - 加载数据,进行标记和注释。
- 手动编辑推理标签:
- 使用3D Slicer中的ROI框编辑器手动调整和编辑标签。
- 返回MONAI Label插件,点击“Submit Label”按钮保存注释。
- 主动学习和微调模型:
- 每次保存新的注释标签后,点击“Train”按钮微调模型。
- 主动学习过程选择未标记数据进行新一轮训练。
- 自动分割:
- 使用最新微调的模型进行自动分割。
- 使用主动学习策略选择未标记数据,确保新数据被用来改进模型。
- 重复直到所有数据都被注释和训练:
- 持续进行数据获取和主动学习过程,直到所有数据都被标记和训练。
- 每次训练循环中,保存新的最佳模型到指定路径。
通过这些步骤,您可以高效地使用MONAI Label和monaibundle应用进行肺结节检测任务,利用主动学习和自动分割功能不断改进模型性能。
注意:3D slicer是系列课程,很多讲过的知识点没有反复强调。你如果对其中的某一个过程不是很了解,一定要去看之前的内容。
可以关注微公【医学图像人工智能实战营】
我是Tina, 我们下篇博客见~
白天工作晚上写文,呕心沥血
觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连