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判断端口是否打开的实现代码
Feb 10 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
pycharm 实现显示project 选项卡的方法
Jan 17 Python
Python实战购物车项目的实现参考
Feb 20 Python
python获取txt文件词向量过程详解
Jul 05 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
基于plt.title无法显示中文的快速解决
May 16 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
Pycharm配置autopep8实现流程解析
Nov 28 Python
Python更改pip镜像源的方法示例
Dec 01 Python
总结python多进程multiprocessing的相关知识
Jun 29 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 一元分词算法
2009/11/30 PHP
php查看网页源代码的方法
2015/03/13 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
2019/10/16 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
js初始化验证实例详解
2016/11/26 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python比较两个图片相似度的方法
2015/03/13 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
Python3 批量扫描端口的例子
2019/07/25 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
英国自行车商店:AW Cycles
2021/02/24 全球购物
校园报刊亭创业计划书
2014/01/02 职场文书
班级德育工作实施方案
2014/02/21 职场文书
法学专业毕业实习自我鉴定2014
2014/09/27 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
使用Ajax实现无刷新上传文件
2022/04/12 Javascript
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL