【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】

二、使用我们自己的数据集–冠脉数据集
11. 从此开始,尝试带入我们自己的数据集进行训练和测试。(Q3,项目中虽然输入的5125123的数据,但是会裁剪成2442443的,看GitHub上的issues里面,有人询问过作者这个问题,作者回复大概意思是,如果想要自适应图片尺寸,除了要改变输入图片的尺寸大小,或许还需要更改网络。作者并没有给明确的答复。因此先抛开数据的尺寸问题,先将我们的数据可以扔进去,尺寸问题后面再进行研究)

13.我们的数据train和test都是png格式的,而项目需要的原始数据是(img.nii.gz和label.nii.gz)格式的,因此首先要了解原始数据的格式。.gz是对.nii文件的压缩。而.nii文件是NIFTI格式的文件,主要包含三部分:hdr, ext, img。为了详细了解里面都有什么,通过代码的方式进行了了解:
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第1张图片
对我来说,最有用的两个信息是:

  • 512512171,因此推测,这是一个三维的数据,将512*512的切片堆叠了171份,因此按照这个推测,可以把我们png的数据集,也进行堆叠压缩转换成.nii.gz格式的数据。
  • 上图是label.nii.gz的信息,可以看到image value range为[0,13],所一这也就解释了为什么训练的时候,分类的类别为14类。

13.于是根据12的思路,去找将png转为.nii.gz的代码,先测试将一个患者的203张img和label转化为对应的img.nii.gz和label.nii.gz
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第2张图片
转化出来的nii.gz中的维度512512203是正确的,挺高兴的,但是当我将数据集经过预处理以后,放入模型中,进行训练的时候,出现了问题。
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第3张图片
经过查阅资料发现,是由于num_class, 即训练中分类的数量少于label数据中的标签数量导致的。通过增加num_class的值,知道256才可以进行训练,说明label数据中的标签数量为256个,分为了256类,这明显不对的,我们只有两类。但是为什么会这么多呢?返回头去看.nii.gz的信息,可以看到原始数据的label中image value range为[0,13],包含0-13,14个数据。而我们的image value range为[0,255],包含0-255,256个数据。因此推测,这14和256就是label数据中标签的数量。虽然我们用png转化的.nii.gz只有0和255两个值,但是范围仍是[0,255].

14.经过13中的分析,我可以修改label.nii.gz中的标签255为1,来使label数据中标签的类别只有两类。但是我没有找到可以直接修改label.nii.gz中标签值的方法,但是我得到了另一个信息:“通过png转为为.nii.gz”文件时,png的像素值会转变为标签值。这也就解释了为什么label.nii.gz中标签值是[0,255]和png中像素值对应的现象。因此,我可以先将我们的label的png中像素值为255的像素的值全部改为1。我想到了两种解决办法:

  • 遍历512*512的png的每一个像素值,若像素值==255,则重新设置成1
  • 将512*512的png像素值归一化到[0,1]的范围内。

后面我采用了1)的方法,因为label的png的图像的像素值只有0和255两个值,Q4:因此我认为这两种方法是等效的,所以没尝试第二种。不知道这样想对不对?

15.通过采用14中1)的方法以后,成功将png的像素值为255的部分改为了1,然后将png转化为xxx.nii.gz格式,接着对xxx.nii.gz进行预处理,转化为xxx.npz用于训练和xxx.npy.h5用于测试。(预处理的到的xxx.npz和xxx.npy.h5都包含[image]和[label]两部分数据,分别用于训练和测试使用)

16.对数据处理好之后,设置batch_size=2,size=(244,244,3),epoch=100 r=0.0001(每一轮衰减0.01),class=2进行训练。结果如下图,dice很高,而且100轮还没趋于稳定,之所以这么高,后面发现是因为签名提到的Q2的问题,即发现预处理数据时出现了些问题,导致训练和测试使用的同一组数据。

17.在这个模型中,测试出来的结果为下图.nii.gz格式的,因此我们可以使用ITK-SNAP软件来查看。
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第4张图片
下面时使用ITK-SNAP软件来查看的结果图:
Img.nii.gz
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第5张图片
pre.nii.gz
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第6张图片
Img.nii.gz+ pre.nii.gz
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第7张图片
Img.nii.gz+ gt.nii.gz
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第8张图片
因为这组数据的dice有86%,所以效果还不错。

19.由于我们以前使用的模型比如unet,跑出来的结果都是png,但是此为.nii.gz,因此下面时想将.nii.gz转化为png.因此就去查找了相关的代码,并进行了简单的修改。将.nii.gz 转化为了png格式,如下图所示,转化过来的png存在一些问题(Q5:猜测是像素值的区间出现了问题,例如边缘部分的像素值本来是0,但是现在是80.这个问题还未解决)
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第9张图片
【二、整理--加上数据图片】MT-Unet模型训练自己的冠脉数据集【个人记录学习】_第10张图片

  1. 利用转化的gt和pre图像,计算dice、recall、precision结果如下(这里我训练和测试的数据集搞错了,用的是相同的。):
    在这里插入图片描述

三、总结

  • 总结,训练我们自己的数据的基本流程已经走通,目前存在四个问题如下:
    Q1:至于为什么没有val的部分,还没时间研究
    Q2:训练和测试的数据集用的同一组,这个容易解决
    Q3:用MT-Unet训练我们的数据的尺寸问题:只能用244*244的图像,这个要仔细研究甚至修改网络架构,才能判断是否能够结果。
    Q5: 训练出来的.nii.gz偏白色,猜测是像素值的区间出现了问题,应该可以通过归一化到[0,255]的区间的方式解决,但我想去找到出现问题的源头,看能否在出现问题的源头处解决。

你可能感兴趣的:(深度学习,python,计算机视觉,pytorch,服务器,linux)