在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测

在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

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测_数据集_02

训练数据

本示例中我们使用的实验数据集是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

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测_计算机视觉_03


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

  • 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": [
    "$@detector.set_target_keys(box_key='box', label_key='label')",
    "$@detector.set_box_selector_parameters(score_thresh=0.02, topk_candidates_per_level=1000, nms_thresh=0.22, detections_per_img=300)",
    "$@detector.set_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.5score_thresh=0.6甚至更高。

  • step6:启动 3D Slicer

启动3D Slicer和MONAI Label插件,绿色刷新符号连接服务端,点解nextsample加载数据,最后点击run等待自动勾画检测框:如不会请参考系列之前的内容

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测_3D_04

重要提示:如果您的MONAI Label插件来自较旧版本,请更新和使用最新的MONAI Label插件。检测任务需要在3D Slicer标记中绘制ROI节点。

该过程在mac上勾画的时间为14分钟,建议使用GPU。

  • step7: 编辑结果和提交

用户可以使用3D Slicer的ROI框编辑器手动编辑推理标签,点击顶部的Markups选项卡,使用调整ROI的工具。

  1. 手动编辑推理标签:
  • 打开3D Slicer,点击顶部的Markups选项卡。
  • 使用ROI框编辑器调整和编辑ROI。
  1. 保存注释:
  • 编辑完成后,返回MONAI Label插件界面。
  • 点击Submit Label按钮,将注释保存到文件系统中。
  1. 注释存储路径:
  • 注释将保存到研究数据集中的labels/final文件夹。
  • 例如,在此用例中,真实标签将保存到datasets/Task06_Lung/imagesTr/labels/final文件夹中。
  1. 加载注释:
  • 保存的注释将以JSON文件形式存储,使用3D Slicer的ROINode格式。
  • 可以使用3D Slicer加载该JSON文件,以查看和编辑注释。

通过这些步骤,您可以使用3D Slicer手动编辑和保存肺结节检测的注释标签,并在需要时重新加载进行查看和进一步编辑。

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测_数据_05


从图中可以看到,预测的检测框有12个,而真正肺结节只有一个,假阳性太高,可以使用step5的方法降低假阳性。

  • step8:主动学习

MONAI Label中的主动学习(active learning)和交互式微调模型具有突出功能,用户可以在保存新的注释标签时随时训练他们的模型。点击“Train”按钮,MONAI Label服务器将获取保存的最终真实标签,并微调之前的模型。

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测_计算机视觉_06

以下是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检测任务。教程介绍了主动学习过程、自动推理、检测编辑器、提交标签和保存模型。
具体步骤总结如下:

  1. 安装和启动3D Slicer和MONAI Label插件:
  • 参考“Hello World”教程安装3D Slicer和MONAI Label插件。
  1. 选择模型并获取数据:
  • 在MONAI Label插件中选择lung_nodule_ct_detection模型。
  • 加载数据,进行标记和注释。
  1. 手动编辑推理标签:
  • 使用3D Slicer中的ROI框编辑器手动调整和编辑标签。
  • 返回MONAI Label插件,点击“Submit Label”按钮保存注释。
  1. 主动学习和微调模型:
  • 每次保存新的注释标签后,点击“Train”按钮微调模型。
  • 主动学习过程选择未标记数据进行新一轮训练。
  1. 自动分割:
  • 使用最新微调的模型进行自动分割。
  • 使用主动学习策略选择未标记数据,确保新数据被用来改进模型。
  1. 重复直到所有数据都被注释和训练:
  • 持续进行数据获取和主动学习过程,直到所有数据都被标记和训练。
  • 每次训练循环中,保存新的最佳模型到指定路径。

通过这些步骤,您可以高效地使用MONAI Label和monaibundle应用进行肺结节检测任务,利用主动学习和自动分割功能不断改进模型性能。

注意:3D slicer是系列课程,很多讲过的知识点没有反复强调。你如果对其中的某一个过程不是很了解,一定要去看之前的内容。

可以关注微公【医学图像人工智能实战营】

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

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

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

在3D Slicer中使用 Monai Bundle 和 Model Zoo 标注医学影像数据-CT肺结节检测_3D_07