一. Totalsegmentator简介:

Totalsegmentator是一个用于分割任何CT或MR图像中大多数主要解剖结构的工具。它接受了各种不同CT和MR图像(不同扫描仪、机构、协议等)的训练。因此它在大多数CT和MRI图像的分割任务中表现良好。

totalsegmentator使用了比较大量的数据(通常称为total数据集)使用nnUnet框架训练了一个预训练模型,并开放训练权重,以及相应代码,以供其他医学影像相关工作者使用,在本文中,我主要体验了他们打包好的python包,直接调库完成分割任务。更多介绍请阅读文献:https://arxiv.org/abs/2208.05868 以及代码仓库:https://github.com/wasserth/TotalSegmentator

二、安装及使用:

1.安装准备:

需要有一个python>=3.7 且 没有安装nnUnet的环境。(建议使用conda来进行管理)

并且需要预先安装配置好pytorch环境,这个之后有时间再谈谈吧🙃

安装:

pip install TotalSegmentator

由于我的需求是批量完成脑实质的提取,因此接下来我都是用的Python写的程序完成的我的任务。TotalSegmentator也提供了命令行的方式,以及有3Dslicer的插件,但是我没有使用过,故不拓展。

import nibabel as nib
from totalsegmentator.python_api import totalsegmentator
​
if __name__ == "__main__":
    # option 1: provide input and output as file paths
    totalsegmentator(input_path, output_path)
    
    # option 2: provide input and output as nifti image objects
    input_img = nib.load(input_path)
    output_img = totalsegmentator(input_img)
    nib.save(output_img, output_path)
2. 输入准备

以上是一个官方的推理Demo,输入的数据必须是nii文件,后缀通常为nii.gz。医院的影像数据通常为DICOM文件,这需要我们从DICOM转为nii后再进行使用。

最简单的方式是将你的dicom图像导入ITK-Snap后file--save image-- main image 然后选择nii.gz保存就行。

另外的方式是使用Python脚本完成这一过程,以下是一个自用的很简便的脚本函数():

import SimpleITK as sitk
def nii_return(dicom_folder,save_path): #输入 dicom 文件夹,返回一个文件夹的nii.gz
    reader = sitk.ImageSeriesReader()
    dicom_names = reader.GetGDCMSeriesFileNames(dicom_folder)
    reader.SetFileNames(dicom_names)
    image = reader.Execute()
    nii_image = sitk.Cast(image, sitk.sitkFloat32)
    sitk.WriteImage(nii_image,save_path)
    return save_path
## dicom_folder 必须是一个单独一个人的一个序列数据

如果你稍懂一点代码,就能自己写一个循环完成批量数据的dicom转nii

3. 模型权重下载 ‼️

total的模型权重是保存在github的,GitHub国内连接很不稳定,因此下载权重——慢且容易失败。

这里需要手动修改模型的权重下载地址为github镜像

修改totalsegmentator下的lib.py文件,

lib.py文件可以在vscode或者pycharm等编辑器,在Demo代码中control + 右键totalsegmentator 找到lib这个引用。

查找到以下行,大概在169行左右

url = "https://github.com/wasserth/TotalSegmentator/releases/download"

修改地址为: https://github.moeyy.xyz/https://github.com/wasserth/TotalSegmentator/releases/download

前面的 https://github.moeyy.xyz/ 为镜像地址,如果失效可以换其他的镜像。

配置好后,修改运行上面的demo代码会自动开始下载需要的权重。

4.其他
totalsegmentator(input_path, output_path)

demo代码会完成所有任务的分割,且仅支持GPU,很多时候,我们并不需要分割所有的物体。

totalsegmentator(input_path, output_path,devcie="CPU") # 使用CPU进行推理分割
totalsegmentator(input_path,output_path,task="total",roi_subset="brain") # 仅仅使用total库,分割brain。(这两个具体可用参数有点多)

task 可选参数为:"total", "body",

"lung_vessels", "cerebral_bleed", "hip_implant", "coronary_arteries",

"pleural_pericard_effusion", "test",

"appendicular_bones", "tissue_types", "heartchambers_highres",

"face", "vertebrae_body"

大部分部位都在total中,roi_subset 可设置值相应需要改变,具体见

https://github.com/wasserth/TotalSegmentator?tab=readme-ov-file#class-details

其他有什么问题,就再留言吧! 见必回!


怀揣梦想,翻越山海