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科学计算环境推荐——Anaconda
Jun 30 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
python实现简单的文字识别
Nov 27 Python
原生python实现knn分类算法
Oct 24 Python
Python变量作用域LEGB用法解析
Feb 04 Python
Python enumerate内置库用法解析
Feb 24 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 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的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
2020/03/17 Javascript
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
Python获取央视节目单的实现代码
2015/07/25 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
python小项目之五子棋游戏
2019/12/26 Python
python scatter函数用法实例详解
2020/02/11 Python
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
2015年教师节慰问信
2015/03/23 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis