背景
笔者正在 Datawhale 举办的 AI 夏令营中参与 CV 方向的学习,研究课题为发布在讯飞 AI 开发者大赛上的脑PET图像分析和疾病预测挑战赛,需要对 nii 格式的医学影像文件进行学习,并进行疾病预测
第一轮学习中,Datawhale 团队给出了基于logistic回归进行预测的baseline,但其中并没有对 nii 文件进行详细介绍;且为了适配 logistic 回归模型,并缩小数据规模,其数据处理过程(个人认为)产生了不可忽视的信息丢失,直接导致预测的准确度仅略高于0.5——这跟瞎猜也没啥区别了吧……
鉴于此,笔者在探索中,总结出一篇对nii文件进行数据处理,并采用学习能力更强的简单CNN模型进行训练的教程
nii文件
数据格式
nii 文件是医学图像处理中经常使用的一种 NIFTI 格式图像,关于 nii 文件具体的底层原理,这里不做详细介绍,有兴趣的同学可以参见:Brainder.org的讲解。我们今天主要聚焦于,如何合理地处理 nii 文件中的数据,以便模型训练
数据集中的nii文件对一个人脑进行了三维建模。python 的 nibabel 库专门用于处理 nii 文件,我们可以通过 load() 函数读取 nii 文件,获取其信息:
#1.py
import nibabel as nib
import numpy as np
im=nib.load('脑PET图像分析和疾病预测挑战赛数据集/Train/NC/1.nii')
im_data=np.array(im.get_fdata()) #获取文件中的所有数值,并转换为numpy数组便于后续处理
print(im_data.shape) #查看数据的形状
#返回:(128, 128, 63, 1)
可以看到,数据集中的 nii 文件包含四维数据:其中前三维确定某一个像素点的空间位置,其中左右和前后方向各分128层,上下方向分63层;第四维记录了该点的状态值(类似图片的灰度)
数据处理
在整份 nii 数据中,所有的数值均为正整数,随便挑出一个值看一看:
#1.py
print(im_data[64,64,55,0])
#返回:10550.0
如此多这么大的数值,如果直接将其投入模型进行训练,效果会很差,必须对数据进行预处理,减小其规模。前面提到的 baseline 中的示例代码给出的方法是人工进行特征提取:
#1.py
feat = [(im_data != 0).sum(), # 非零像素的数量
(im_data == 0).sum(), # 零像素的数量
im_data.mean(),