H5文件简介以及python对h5文件的操作

前言

一般来说,深度学习的训练数据和训练后的参数都会保存为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)
  • 32
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: 要读取h5文件,需要使用h5py库。以下是一个简单的例子: ```python import h5py # 打开h5文件 f = h5py.File('file.h5', 'r') # 查看文件中包含的数据集 for key in f.keys(): print(key) # 读取数据集 dataset = f['dataset_name'] data = dataset[:] print(data) # 关闭文件 f.close() ``` 其中,'file.h5'是待读取的h5文件名,'dataset_name'是数据集名。读取数据集时,可以使用`[:]`将数据集中的所有数据读取出来。 ### 回答2: Python可以使用`h5py`库来读取HDF5(.h5文件。 首先,需要确保已经安装了`h5py`库。可以使用以下命令在终端或命令提示符中安装: ``` pip install h5py ``` 接下来,可以使用以下代码示例来读取HDF5文件: ```python import h5py # 打开HDF5文件文件名为example.h5) with h5py.File('example.h5', 'r') as file: # 查看文件中的数据集名称 print("数据集名称:", list(file.keys())) # 读取数据集中的数据 dataset = file['dataset_name'] data = dataset[()] # 打印数据 print("数据内容:\n", data) ``` 首先,我们使用`h5py.File()`函数打开HDF5文件,此处的`'example.h5'`为文件路径。读取文件时,需要以只读模式打开,所以第二个参数为`'r'`。 然后,可以通过`keys()`函数查看文件中所有的数据集名称,并使用`list()`函数将其转换为列表形式进行打印。 接下来,可以通过文件对象和数据集名称来读取具体的数据集内容。在上述代码中,数据集的名称为`'dataset_name'`,如果不清楚数据集名称,可以通过查看数据集名称列表来获取。 最后,可以通过`[()]`来获取整个数据集的数据,并将其打印出来。 以上就是使用Python读取HDF5文件的简单示例。希望对您有所帮助! ### 回答3: Python可以使用h5py库来读取h5文件h5py是一个Python库,用于提供对HDF5文件的访问和操作。下面是使用h5py库读取h5文件的基本步骤: 1. 首先,确保已经安装了h5py库,可以通过在终端或命令提示符中使用pip install h5py命令进行安装。 2. 在Python代码中,导入h5py库,可以使用import h5py语句。 3. 使用h5py库的File函数打开h5文件。可以使用以下代码:`f = h5py.File('filename.h5', 'r')`,这将打开名为filename.h5h5文件,并以只读方式访问。 4. 使用以下代码可以查看h5文件的内容:`print(f.keys())`,这将打印出文件中所有的键(datasets或groups)。 5. 要读取h5文件中的数据集,可以使用以下代码:`dataset = f['dataset_name']`,其中'dataset_name'是要读取的数据集的名称。 6. 使用以下代码可以将数据集的值读取到一个变量中:`data = dataset[()]`,这将将数据集中的所有值读取到名为data的变量中。 7. 在完成对h5文件的读取操作后,不要忘记使用以下代码关闭文件:`f.close()`。 总结来说,使用h5py库读取h5文件的步骤是打开文件、查看文件内容、选择要读取的数据集、读取数据集的值,并在完成操作后关闭文件。以上就是用Python读取h5文件的基本过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值