一. 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镜像
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