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 不关闭控制台的实现方法
Oct 23 Python
TensorFlow打印tensor值的实现方法
Jul 27 Python
用Python shell简化开发
Aug 08 Python
Python中创建二维数组
Oct 17 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
keras之权重初始化方式
May 21 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
Python图像处理之图像拼接
Apr 28 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 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中英混合字符串截取函数代码
2011/07/17 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
JavaScript小技巧 2.5 则
2010/09/12 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
python多线程使用方法实例详解
2019/12/30 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
C语言中break与continue的区别
2012/07/12 面试题
经典c++面试题二
2015/08/14 面试题
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
什么是URL
2015/12/13 面试题
市场营销个人求职信范文
2014/02/02 职场文书
工程安全员岗位职责
2014/03/09 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS