我正在与python争夺一个学校项目。我从this post,复制并粘贴了一些代码,仅更改了变量名。我正在尝试将h5的两个文件转换为jpg。这是我的代码:
import h5py
import numpy as np
from PIL import Image
hdf = h5py.File("train_happy.h5",'r')
array = np.array(list(hdf.get("train_happy.h5")))
img = Image.fromarray(array.astype('uint8'), 'RGB')
img.save("train_happy.jpg", "JPEG")
hdf2 = h5py.File("test_happy.h5",'r')
array = np.array(list(hdf2.get("test_happy.h5")))
img = Image.fromarray(array.astype('uint8'), 'RGB')
img.save("test_happy.jpg", "JPEG")
training = 'train_happy.jpg'
testing = 'test_happy.jpg'
我对h5文件或使用python转换文件一无所知。请帮忙!
编辑:这是错误所在的行:
array = np.array(list(hdf.get("train_happy.h5")))
如果我不得不猜测,我会说在这条线上也会发生同样的错误:
array = np.array(list(hdf2.get("test_happy.h5")))
此外,命令:
print(list(hdf.keys()))
提供以下输出:
['list_classes', 'train_set_x', 'train_set_y']
答案 0 :(得分:1)
在链接的帖子中查看示例! 您的最初错误是这样的:
array = np.array(list(hdf.get("train_happy.h5")))
train_happy.h5
是HDF5文件的名称。您需要使用HDF5文件中的图像数据集名称(使用组/数据集命名法)。 list(hdf.keys())
的输出表明您在根级别有3个节点。每个节点可以是一个组或一个数据集(一个图像)。如果不确切知道您拥有什么,很难编写下一步。理想情况下,您将使用.isinstance()
获取节点类型。下面提供了一个非常简单的示例来遍历您的节点名称:
for node in list(hdf.keys()) :
print ('working on node %s' % node)
object = hdf[node]
if (isinstance(object, h5py.Group)):
print ('%s is a Group' % node )
elif (isinstance(object, h5py.Dataset)):
print ('%s is a Dataset' % node )
或者,您可以简单地破解并尝试一下(适当地调整下游代码):[下面的代码根据hpaulj的注释进行了修改]
array_x = hdf.get["train_set_x"][:]
array_y = hdf.get["train_set_y"][:]
上面的代码假定train_set_x
和train_set_y
是图像数据集(类似于链接中的"Photos/Image 1"
)。
此外,您不需要第二个hdf2声明(hdf2 = h5py.File("test_happy.h5",'r')
)来处理第二个图像。您可以每次重复使用hdf
,并更改组/数据集引用的名称,如上面array_y
所示。