医学图像分割-入坑准备(入门)


写在前面

博主目前(至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在这里是必须的,里面存放的图像的对齐信息,比如尺寸、旋转等等;imageaff都是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的例子,带大家进行正式入门,包括:代码架构,代码技巧等等,用极简的代码跑通整个程序。

说正事!

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

  • 15
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JalexDooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值