概述
MONAI是基于PyTorch的开源框架,用于医疗影像的深度学习领域。本文示范3D的脾脏分割,提供数据集和jupyter代码。
我找了好久类似的分割例程,还是MONAI最贴心最清晰,半天就出结果了,可以在jupyter notebook 里面看到分割的结果和手工标注的label的比较。
1. 安装: pip install monai
2. 代码&数据:
Project-MONAI/tutorialsgithub.com3. 对于数据的载入和预处理
3.1 首先注意数据路径,data_root要改成你自己的路径
3.2 目前MONAI只适用于Nifti格式的文件,Nrrd格式需要自行转换为nii/nii.gz 格式.(格式转换这个问题困惑了我好久,因为我们实验室只有nrrd格式的数据。最后使用sitk解决了这个问题。)
3.3 注意transform里面的重采样间隔[1.5,1.5,2],和sitk.GetSpacing的X.Y.Z的顺序不一样。例如:我的数据sitk.GetSpacing的间隔是:[0.7,0.7,2.5],但是在MONAI这里要设置成[0.7,2.5,0.7]
3.4 MONAI贴心的设计了 ScaleIntensityRanged,可以把CT里面的HU值限制在(-57,164)之间并标准化到(0,1)。因为脾脏的HU值在(50,70)之间,所以(-57,164)以外的HU值就不考虑了,我的liver分割设置到了(-100,200)。
3.5 这个功能要慎用,CropForegroundd(keys=['image', 'label'], source_key='image')。它直接把你CT的空白部分去掉了,造成CT的size变化。如果你想让分割的结果再重叠到原CT,这个功能就禁用了吧。
3.6 注意train_transforms 和val_transforms 的超参数要一致。
3.7 注意不要一次性载入太多数据train_loader到你的GPU,进程会被killed
4. 对于神经网络架构的理解
这个Unet居然用了残差结构和DiceLoss,整的有点像Vnet了,厉害厉害。DiceLoss就是把Dice这个metric放进了反向传播算法来更新参数。残差,我还没弄懂,哪个大神下场教一下我?
5. 分割结果的展示和导出
这个例程对分割结果的展示做的很好,一行的图像展示了CT/label/Segmentation,可是分割结果没提供导出的功能啊,看得到摸不到欸。
我自己写了一个代码,把分割生成的array导出成nii/nrrd文件,这样就可以用slicer观看3D观感下的分割性能。用sitk resample到CT的spacing/origin/direction,然后写成nii/nrrd文件就可以了。注意numpy.array的XYZ轴的顺序和Sitk.GetArray是不一样的,需要转一下顺序:
seg_array = np.transpose(seg_array,(2,1,0))
还有挺神奇的一点是,MONAI提供的CT和segmentation导出是可以直接map到一起的。但是我的CT和segmentation导出来居然方向是不对的,需要再让segmentation转一下:
seg_array = np.rot90(seg_array, axes=(1,2))
seg_array = np.rot90(seg_array, axes=(1,2))
希望MONAI能画出来这个model的结构,再把niftynet里面的dense-Vnet拿过来就好了。
Ref: https://github.com/Project-MONAI/Tutorials/blob/master/spleen_segmentation_3d.ipynb
最后
以上就是柔弱便当为你收集整理的jupyter分割代码块_3DUnet医学分割速成-MONAI的全部内容,希望文章能够帮你解决jupyter分割代码块_3DUnet医学分割速成-MONAI所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复