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操作Word批量生成文章的方法
Jul 28 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Django开发中的日志输出的方法
Jul 02 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
Python 3.8新特征之asyncio REPL
May 28 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
Python 中如何写注释
Aug 28 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
pycharm无法导入lxml的解决办法
Mar 31 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/24 PHP
PHP编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
Python中 map()函数的用法详解
2018/07/10 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
python如何实现数据的线性拟合
2019/07/19 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
python中time、datetime模块的使用
2020/12/14 Python
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
财务主管的岗位职责
2013/12/30 职场文书
初中化学教学反思
2014/01/23 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
委托书范本格式
2019/04/18 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
你真的会用Mysql的explain吗
2022/03/31 MySQL