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中的XML 工具
Apr 13 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
python实现内存监控系统
Mar 07 Python
python绘制多个曲线的折线图
Mar 23 Python
用Python读取几十万行文本数据
Dec 24 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
Python银行系统实战源码
Oct 25 Python
python环境下安装opencv库的方法
Mar 05 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 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 + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
详解Python3.1版本带来的核心变化
2015/04/07 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
Django 实现图片上传和下载功能
2020/12/31 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
文员个人求职自荐信
2013/09/21 职场文书
物业保安岗位职责
2014/07/02 职场文书
五四演讲稿范文
2014/09/03 职场文书
武侯祠导游词
2015/02/04 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
大队委员竞选稿
2015/11/20 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python