医学图像分割

您所在的位置:网站首页 图像识别入门学什么专业 医学图像分割

医学图像分割

2024-06-26 23:35| 来源: 网络整理| 查看: 265

综述 写在前面入门背景知识- PyTorch- 医学图像- 深度学习方法- 评估方法

写在前面

博主目前(至2021-4)研究 脑部 MRI 图像(Brain MRI),医学图像分割工作或者定位工作,基本差不太多,以下文章如有问题或错误,请指正。

入门

入门看 “Deep Learning for Brain MRI Segmentation: State of the Art and Future Directions” 一文基本就足够了,文中从当前常用的深度学习框架,到医学图像的描述,再到当年现有的公共数据集,再到深度学习处理方法,对分割结果的评估方法。

深度学习框架:TensorFlow、PyTorch、Caffe、Theano、Keras等等。医学图像:MRI(核磁共振)、CT(断层扫描)等等。公共数据集(脑部分割):BraTS、Isles、mTOP、MSSEG、NeoBrainS12、MRBrainS深度学习方法:图像预处理 + 深度学习模型 + 后处理。评估方法:Dice系数,Sensiticity(敏感性),Specificity(特异性),真、假阳性,真、假阴性 等等。

本系列,基本使用PyTorch + MRI + BraTS dataset + Deep Learning。

背景知识 - PyTorch

深度学习框架,不多赘述。直接安装,打开 PyTorch官网 ,首页下方。 PyTorch安装 安装按照自己的操作系统、CUDA版本、安装工具(pip、conda);注意:安装时,要考虑自己使用训练的电脑的配置情况,选择跟显卡型号和显卡驱动相配的CUDA版本,然后再对应相应的PyTorch版本。建议,先去Nvidia官网下载与显卡硬件适配的驱动(如果没有驱动的话),然后去Nvidia CUDA网站,下载相应版本的CUDA,最后再安装PyTorch。

CUDA是在这里用来跑高密度并行程序,通俗的来讲,就是把在CPU上计算的程序代码,放到显卡(GPU)上计算,GPU的计算能力要比CPU强大的多,尤其是在深度学习中高密度的矩阵计算。

这里的环境搭建可能会比较繁琐,如果出现版本不相配的情况,请多次尝试其他版本。

PyTorch安装反而比较简单,在控制台输入上图Run This Command中的指令就可以安装了。安装后还需要测试一下PyTorch能不能使用CUDA进行GPU计算,写一个简短的代码就可以测试。

import torch print(torch.cuda.is_available()) # 如果输出True,则表示CUDA可以正常使用 # 如果输出False,那么还需要检查这一步出现的问题

一般不推荐使用自己的电脑训练程序,比如博主使用Mac笔记本进行写代码,然后上传到服务器(3台8 * 2080Ti)进行训练。为什么呢?因为一般训练时间都比较长,比如一次实验要跑好几天才能完成,如果用自己电脑运行程序,风扇太响不说,还不安全,如果散热不充足还容易起火;再加上万一出现断电的现象,简直崩溃;电脑还会很卡。

- 医学图像

核磁共振图像(MRI)是最常见的,当然在计算机里一张图像是以一定的文件格式出现的,大部分为.nii.gz,图像在程序里其实就是一种矩阵。

这种格式的图像图和访问呢?需要一个Python库—nibabel。使用pip、conda都可以安装,pip或pip3为例:

pip3 install nibabel # 嫌安装慢或者加个速 pip3 install nibabel -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com import nibabel as nib def load_nii_to_array(path): image = nib.load(path) affine = image.affine image = image.get_data() return image, affine image, aff = load_nii_to_array('C:\\balabala...') # 输出image大小和aff大小 print('image.shape: {}, aff.shape: {}'.format(image.shape, aff.shape))

aff在这里是必须的,里面存放的图像的对齐信息,比如尺寸、旋转等等;image和aff都是numpy类型。

- 深度学习方法

图像分割为例,一般流程:1、图像预处理。2、深度学习模型。3、图像后处理与输出。该部分,后面的博客会详细说明。

图像预处理:深度学习模型一般使用固定大小的图像作为模型输入,预处理时需要把图像大小统一;标准化是必备的,一张图像像素值范围很多,常见的(-255,255),数字太大,在模型中矩阵计算时,数值太大,容易溢出,标准化为(-1,1)的范围,标准化方法也有很多,如Z-Score。深度学习模型:可以自己搜别人的论文模型,CNN,U-Net,ResNet之类,最近Transformer太火了,博主也写了一个Transformer用于医学图像分割的代码,后面会分享。后处理:往往不是必备的,按需设计。 - 评估方法

这里直接给代码吧,公式网上一大堆。注意:以下只用于onehot任务。如果用于非onehot,标签可能会出现0和1,之外的值,那么 [某俩矩阵相乘].sum() 就会出现问题(标签出现1个1和1个2的评估结果应该会相同50%,非onehot的评估结果为1个2的结果偏大66.7%),导致结果不准确。

def dice(predict, target, val=1.0): predict = (predict==val).float() target = (target==val).float() smooth = 0.00000001 batch_num = target.shape[0] target = target.view(batch_num, -1) predict = predict.view(batch_num, -1) intersection = float((target * predict).sum()) return (2.0 * intersection + smooth) / (float(predict.sum()) + float(target.sum()) + smooth) def sensitivity(predict, target): """ :param predict: 4D Long Tensor Batch_Size * 16(volume_size) * height * weight :param target: 4D Long Tensor Batch_Size * 16(volume_size) * height * weight :return: """ smooth = 0.00000001 batch_num = target.shape[0] target = target.view(batch_num, -1) predict = predict.view(batch_num, -1) intersection = float((target * predict).sum()) return (intersection + smooth) / (float(target.sum()) + smooth) def specificity(predict, target): """ :param predict: 4D Long Tensor Batch_Size * 16(volume_size) * height * weight :param target: 4D Long Tensor Batch_Size * 16(volume_size) * height * weight :return: """ smooth = 0.00000001 batch_num = target.shape[0] target = target.view(batch_num, -1) predict = predict.view(batch_num, -1) target = (target == 0) predict = (predict == 0) tn = float((target * predict).sum()) predict = (predict == 0) fp = float((target * predict).sum()) return (tn + smooth) / (tn + fp + smooth)

本节内容就到这里,环境搭建与大体流程,有了这些工具,相信读者内心已经有了答题的脉络,接下来就可以正式进入医学图像分割的研究啦。

下一篇,博主用一个简单的3D U-Net的例子,带大家进行正式入门,包括:代码架构,代码技巧等等,用极简的代码跑通整个程序。

说正事!

求关注,求点赞,求打赏,求三连~~~~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3