Pytorch 使用 nii数据做输入数据的操作


Posted in Python onMay 26, 2020

使用pix2pix-gan做医学图像合成的时候,如果把nii数据转成png格式会损失很多信息,以为png格式图像的灰度值有256阶,因此直接使用nii的医学图像做输入会更好一点。

但是Pythorch中的Dataloader是不能直接读取nii图像的,因此加一个CreateNiiDataset的类。

先来了解一下pytorch中读取数据的主要途径——Dataset类。在自己构建数据层时都要基于这个类,类似于C++中的虚基类。

自己构建的数据层包含三个部分

class Dataset(object):
"""An abstract class representing a Dataset.
All other datasets should subclass it. All subclasses should override
``__len__``, that provides the size of the dataset, and ``__getitem__``,
supporting integer indexing in range from 0 to len(self) exclusive.
"""
def __getitem__(self, index):
 raise NotImplementedError
def __len__(self):
 raise NotImplementedError
def __add__(self, other):
 return ConcatDataset([self, other])

根据自己的需要编写CreateNiiDataset子类:

因为我是基于https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

做pix2pix-gan的实验,数据包含两个部分mr 和 ct,不需要标签,因此上面的 def getitem(self, index):中不需要index这个参数了,类似地,根据需要,加入自己的参数,去掉不需要的参数。

class CreateNiiDataset(Dataset):
 def __init__(self, opt, transform = None, target_transform = None):
  self.path1 = opt.dataroot # parameter passing
  self.A = 'MR' 
  self.B = 'CT'
  lines = os.listdir(os.path.join(self.path1, self.A))
  lines.sort()
  imgs = []
  for line in lines:
   imgs.append(line)
  self.imgs = imgs
  self.transform = transform
  self.target_transform = target_transform

 def crop(self, image, crop_size):
  shp = image.shape
  scl = [int((shp[0] - crop_size[0]) / 2), int((shp[1] - crop_size[1]) / 2)]
  image_crop = image[scl[0]:scl[0] + crop_size[0], scl[1]:scl[1] + crop_size[1]]
  return image_crop

 def __getitem__(self, item):
  file = self.imgs[item]
  img1 = sitk.ReadImage(os.path.join(self.path1, self.A, file))
  img2 = sitk.ReadImage(os.path.join(self.path1, self.B, file))
  data1 = sitk.GetArrayFromImage(img1)
  data2 = sitk.GetArrayFromImage(img2)

  if data1.shape[0] != 256:
   data1 = self.crop(data1, [256, 256])
   data2 = self.crop(data2, [256, 256])
  if self.transform is not None:
   data1 = self.transform(data1)
   data2 = self.transform(data2)

  if np.min(data1)<0:
   data1 = (data1 - np.min(data1))/(np.max(data1)-np.min(data1))

  if np.min(data2)<0:
   #data2 = data2 - np.min(data2)
   data2 = (data2 - np.min(data2))/(np.max(data2)-np.min(data2))

  data = {}
  data1 = data1[np.newaxis, np.newaxis, :, :]
  data1_tensor = torch.from_numpy(np.concatenate([data1,data1,data1], 1))
  data1_tensor = data1_tensor.type(torch.FloatTensor)
  data['A'] = data1_tensor # should be a tensor in Float Tensor Type

  data2 = data2[np.newaxis, np.newaxis, :, :]
  data2_tensor = torch.from_numpy(np.concatenate([data2,data2,data2], 1))
  data2_tensor = data2_tensor.type(torch.FloatTensor)
  data['B'] = data2_tensor # should be a tensor in Float Tensor Type
  data['A_paths'] = [os.path.join(self.path1, self.A, file)] # should be a list, with path inside
  data['B_paths'] = [os.path.join(self.path1, self.B, file)]
  return data

 def load_data(self):
  return self

 def __len__(self):
  return len(self.imgs)

注意:最后输出的data是一个字典,里面有四个keys=[‘A',‘B',‘A_paths',‘B_paths'], 一定要注意数据要转成FloatTensor。

其次是data[‘A_paths'] 接收的值是一个list,一定要加[ ] 扩起来,要不然测试存图的时候会有问题,找这个问题找了好久才发现。

然后直接在train.py的主函数里面把数据加载那行改掉就好了

data_loader = CreateNiiDataset(opt)
dataset = data_loader.load_data()

Over!

补充知识:nii格式图像存为npy格式

我就废话不多说了,大家还是直接看代码吧!

import nibabel as nib
import os
import numpy as np
 
img_path = '/home/lei/train/img/'
seg_path = '/home/lei/train/seg/'
saveimg_path = '/home/lei/train/npy_img/'
saveseg_path = '/home/lei/train/npy_seg/'
 
img_names = os.listdir(img_path)
seg_names = os.listdir(seg_path)
 
for img_name in img_names:
 print(img_name)
 img = nib.load(img_path + img_name).get_data() #载入
 img = np.array(img)
 np.save(saveimg_path + str(img_name).split('.')[0] + '.npy', img) #保存
 
for seg_name in seg_names:
 print(seg_name)
 seg = nib.load(seg_path + seg_name).get_data()
 seg = np.array(seg)
 np.save(saveseg_path + str(seg_name).split('.')[0] + '.npy

以上这篇Pytorch 使用 nii数据做输入数据的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python按照多个字符对字符串进行分割的方法
Mar 17 Python
Python基于动态规划算法解决01背包问题实例
Dec 06 Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
基于python绘制科赫雪花
Jun 22 Python
基于python3实现socket文件传输和校验
Jul 28 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
Python程序控制语句用法实例分析
Jan 14 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
如何理解Python中的变量
Jun 01 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
python变量的作用域是什么
May 26 #Python
Python3 pywin32模块安装的详细步骤
May 26 #Python
什么是python的列表推导式
May 26 #Python
python中列表的含义及用法
May 26 #Python
初学者学习Python好还是Java好
May 26 #Python
python函数map()和partial()的知识点总结
May 26 #Python
Python selenium使用autoIT上传附件过程详解
May 26 #Python
You might like
php下使用以下代码连接并测试
2008/04/09 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
vue的mixins属性详解
2018/03/14 Javascript
jquery获取img的src值实例介绍
2019/01/16 jQuery
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
python简单分割文件的方法
2015/07/30 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
基于python绘制科赫雪花
2018/06/22 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
非常详细的C#面试题集
2016/07/13 面试题
人事主管的岗位职责
2013/11/16 职场文书
土建施工员岗位职责
2014/07/16 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
会计出纳岗位职责
2015/03/31 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
python使用pygame创建精灵Sprite
2021/04/06 Python
Go 中的空白标识符下划线
2022/03/25 Golang