用pytorch处理医学图像(以nifity图像为例)----持续更新中

      在这之前,要安装一些常用的包:

         pip install nibabel----安装用于读写影像数据文件的程序包

         pip install --trusted-host pypi.python.org SimpleITK-----安装ITK包

  • 图像读取

法1:

import SimpleITK as sitk #导入itk
import numpy as np
import torch

.... 

imagenames = [os.path.join(datapath, 'patient%02d_C0.nii.gz' % i) for i in indcs] #图像路径

....     
   
itkimage = sitk.ReadImage(imagenames[subjectid]) #读取数据
numpyimage = sitk.GetArrayFromImage(itkimage) #转为numpy
tensorimage = torch.from_numpy(numpyimage ).type(torch.FloatTensor) #转为tensor

....

法2:

import numpy as np
import nibabel as nib

nibimage = nib.load(imagenames[subjectid])
imagedata = nibimage.get_data() 
header = nibimage.get_header() #读取图像信息,后面save result in NIFITY format要用到
ref_affine = nibimage.get_affine()
numpyimage = np.array(imagedata)
  •   图像常用基本操作
tensor_label = tensor.squeeze(tensor_label) #对tensor_label所有维度为1的维度压缩

tensor_label = tensor_label.squeeze(0) #可以在指定维度对numpy进行压缩

torch.cat((torchimage1, torchimage2), dim=0) #可以在指定维度上对tensor进行拼接


out = np.squeeze(out.numpy(), axis=0) #可以在指定维度上对numpy进行压缩
numpylabel = np.concatenate((numpylabel, pre), axis=2) #可以在指定维度上对numpy进行拼接


  •   图像存储
predictlabel = nib.Nifti1Image(predictnumpylabel, ref_affine, header)
savefold = os.path.join(Result_DIR_PATH, 'patient%02d_C0_predict.nii.gz' % (subjectid + 31)) #存储路径
nib.save(predictlabel, savefold)
  •   如何输出多个label?
#--------------training data的label处理--------------
numpy2Dlabel = (numpy2Dlabel == 200) * 1 + (numpy2Dlabel == 500) * 2 + (numpy2Dlabel == 600) * 3  #输入label处理

#--------------loss function的定义--------------
loss_func = nn.CrossEntropyLoss() # the target label is NOT an one-hotted



#--------------网络结构的最后输出--------------
outmax, a = torch.max(c10, dim=1, keepdim=True) #c10是网络的最后输出一层
outmax = outmax.repeat(1, 4, 1, 1) #一共输出4个label
c10 = c10 - outmax
out = torch.exp(c10)
outsum = torch.sum(out, dim=1, keepdim=True)
outsum = outsum.repeat(1, 4, 1, 1)
out = torch.div(out, outsum)
return out


#--------------test的时候对output处理--------------
out = test_net(image)

loss_output = loss(out, label) #计算predict error
loss_sum += loss_output.item()

out = out.data.cpu()
out = np.squeeze(out.numpy(), axis=0)

pre = np.argmax(out, axis=0) #最终predict的结果
  •    如何自定义loss

参考知乎上一个回答,做如下笔记:

猜你喜欢

转载自blog.csdn.net/qq_37471316/article/details/86217476