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实现连接mongodb的方法
May 08 Python
简单介绍使用Python解析并修改XML文档的方法
Oct 15 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
基于Python实现的ID3决策树功能示例
Jan 02 Python
python3实现字符串操作的实例代码
Apr 16 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Python实现石头剪刀布游戏
Jan 20 Python
Python闭包的定义和使用方法
Apr 11 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
JpGraph php柱状图使用介绍
2011/08/23 PHP
php页面防重复提交方法总结
2013/11/25 PHP
php中的strpos使用示例
2014/02/27 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
json 实例详细说明教程
2009/10/31 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
python实现中文输出的两种方法
2015/05/09 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
物业管理个人自我评价
2013/11/08 职场文书
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA