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 12 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 Python
python dumps和loads区别详解
Feb 04 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
python合并多个excel文件的示例
Sep 23 Python
python 获取域名到期时间的方法步骤
Feb 10 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 Stream_*系列函数
2010/08/01 PHP
php生成随机密码的几种方法
2011/01/17 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
PHP可变函数学习小结
2015/11/29 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
js控制input输入字符解析
2013/12/27 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
canvas的神奇用法
2017/02/03 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
介绍一下write命令
2012/09/24 面试题
考试作弊被抓检讨书
2014/01/10 职场文书
土木工程求职信
2014/05/29 职场文书
教师工作总结范文2014
2014/11/10 职场文书
检讨书大全
2015/01/27 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
python本地文件服务器实例教程
2021/05/02 Python
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers