文章目录
前言
一般来说,深度学习的训练数据和训练后的参数都会保存为h5格式文件,对于训练数据来说,深度学习中当训练大量数据时,如果从硬盘中加载再预处理,再传递进网络,这是一个非常耗时的过程。其中从硬盘中读取图片会花费大量时间,更可行在方法是将其存在单个文件中,如h5文件。
那么h5文件对于深度学习训练具有什么优势呢?
- 可以支持大量数据,其中数据集大小大于RAM大小
- 可以增加训练的batch size
- 不用指定数据和数据的shape
HDF与h5
简介
那么什么是HDF5文件呢?
H5文件是层次数据格式第5代的版本(Hierarchical Data Format,HDF5),它是用于存储科学数据的一种文件格式和库文件。
- H5是一种开源文件格式,支持大型、复杂的异构数据。
- H5使用类似“文件目录”的结构,允许以多种不同的结构化方式组织文件中的数据,就像处理计算机上的文件一样。
- H5格式还允许嵌入元数据,使其具有自描述性。
数据组织方式
h5文件中有两个主要结构:组“group”和数据集“dataset”。 一个h5文件就是 “group” 和 “dataset” 二合一的容器。
- group:一种分组结构,包含零个或多个dataset(数据集) 或group(组)的实例,以及支持的元数据。
- dataset :类似数组组织形式的数据集合,像 numpy 数组一样工作,一个dataset即一个numpy.ndarray。具体的dataset可以是图像、表格,甚至是pdf文件和excel。
处理group和dataset在许多方面类似于处理 UNIX 中的目录和文件。 与 UNIX 目录和文件一样,H5 文件中的对象通常通过提供完整(或绝对)路径名来描述。
H5 group
H5 group是包含0个或者多个h5对象的结构。一个group有两部分组成:
- group header:包含名称和属性列表
- group 符号表:属于该group对象的列表
H5 datasets
数据集以两部分存储在文件中:header和数据数组
header包含数据集的数组部分所需的信息,以及描述或注释数据集的元数据。header信息包括对象的名称、维度、数据类型、有关数据本身如何存储在磁盘上的信息以及库用于加快对数据集的访问或维护文件完整性的其他信息。
HDFView
HDFView是H5文件的可视化工具。
下载与安装
在HDFView官网link点击Create Free Account创建一个账户(只有创建了账户,才能免费下载该网站上的东西),然后点击Downloads下载与你电脑对应的HDFView版本。
比如,我的电脑是64位Windows系统,我下载了HDFView-3.1.2-win10_64-vs16.zip 这个文件,下载后解压,双击.exe文件按步骤安装(依次点击下一步即可,可以自定义安装目录,需要注意的是安装目录不能是中文,后面使用过程中会报错)。
在WIN10系统安装后打开出现黑框闪退的解决方法
安装完后,发现一直打不开软件,出现闪退现象,也找不出问题出在哪里,百度了一下,大部分说是环境变量配置的问题,于是乎就去配置环境变量,步骤如下所示。
配置环境路径:右键我的电脑-属性-高级系统设置-高级-环境变量-系统变量-变量名为“PATH”,点击编辑,在路径后面继续添加:
C:\Users\Administrator\AppData\Local\HDF_Group\HDFView\runtime\bin
一直确认,再次打开HDFView则不会闪退。
python对h5文件的操作
批量制作h5文件
以深度学习制作训练集h5文件为例:
输入训练集(图片)的原图和label,输出h5文件
import h5py
import SimpleITK as sitk
import os
def GetHDF5File(imgpath, labelpath, name='HDF5Filename'):
f = h5py.File(os.path.join('E:\\result', name +".h5"),'w')//根据需要修改h5存放路径
imglist = os.listdir(imgpath)//获取训练集原图路径下所有的文件名for i in imglist://依次遍历所有的图片
groupname = i.split('.nii.gz')[0]//根据需求给文件命名
new_group = f.create_group(groupname)//creat group
image = sitk.ReadImage(os.path.join(imgpath, i))//读取图片
arr = sitk.GetArrayFromImage(image)//将图片转换为数组形式
Afterarr =(((arr- arr.min())/(arr.max()- arr.min()))*255).astype('uint8')//进行归一化
new_group.create_dataset('volume', dtype='uint8', data=Afterarr)//create dataset
labellist = os.listdir(labelpath)//获取训练集label路径下所有的文件名for j in labellist:if i == j:
label = sitk.ReadImage(os.path.join(labelpath, j))
label_arr = sitk.GetArrayFromImage(label)
label = label_arr.astype('uint8')
new_group.create_dataset('segmentation', dtype='uint8', data=label)//根据需求命名
f.close()
imgpath ='E:\\imageTr'//训练集原图的路径
labelpath ='E:\\labelTr'//训练集label的路径GetHDF5File(imgpath, labelpath,'HDF5Filename')//根据需要修改h5的文件名,//这里是HDF5Filename
h5文件的提取,另存为nii文件
import h5py
import os
import numpy as np
import SimpleITK as sitk
dataset = h5py.File('F:\\xxx.h5','r')//指定h5文件的路径
savepath ="F:\\..."//另存为nii文件的路径
first_level_keys =[key for key in dataset.keys()]for first_level_key in first_level_keys:if not os.path.exists(os.path.join(savepath, first_level_key)):
os.makedirs(os.path.join(savepath, first_level_key))
second_level_keys =[key for key in dataset[first_level_key].keys()]for second_level_key in second_level_keys:if not os.path.exists(os.path.join(savepath, first_level_key, second_level_key)):
os.makedirs(os.path.join(savepath, first_level_key, second_level_key))
image_arr = np.array(dataset[first_level_key][second_level_key])
img = sitk.GetImageFromArray(image_arr)
img.SetSpacing([1.0,1.0,1.0])//根据需求修改spacing
sitk.WriteImage(img, os.path.join(savepath, first_level_key, second_level_key, second_level_key +".nii.gz"))print(first_level_key)
版权归原作者 Jiaxxxxxx 所有, 如有侵权,请联系我们删除。