h5py,在SVHN中访问Datasets中的数据
h5py, access data in Datasets in SVHN
我想使用 h5py
阅读 the Street View House Numbers (SVHN) Dataset
In [117]: def printname(name):
...: print(name)
...:
In [118]: data['/digitStruct'].visit(printname)
bbox
name
数据中有两组,bbox
和name
,name
是文件名数据对应的组名,bbox
是组name对应width,height,top,left和label数据
如何访问name
和bbox
组中的所有数据?
我尝试使用 Docs 中的以下代码,但它只是 return HDF5 对象引用。
In [119]: for i in data['/digitStruct/name']:
...: print(i[0])
...:
...:
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
Python 版本:3.5 和 OS:Windows 10.
我会在这里回答我的问题,阅读h5py
的文档后,这是我的代码
def get_box_data(index, hdf5_data):
"""
get `left, top, width, height` of each picture
:param index:
:param hdf5_data:
:return:
"""
meta_data = dict()
meta_data['height'] = []
meta_data['label'] = []
meta_data['left'] = []
meta_data['top'] = []
meta_data['width'] = []
def print_attrs(name, obj):
vals = []
if obj.shape[0] == 1:
vals.append(obj[0][0])
else:
for k in range(obj.shape[0]):
vals.append(int(hdf5_data[obj[k][0]][0][0]))
meta_data[name] = vals
box = hdf5_data['/digitStruct/bbox'][index]
hdf5_data[box[0]].visititems(print_attrs)
return meta_data
def get_name(index, hdf5_data):
name = hdf5_data['/digitStruct/name']
return ''.join([chr(v[0]) for v in hdf5_data[name[index][0]].value])
这里的hdf5_data
是train_data = h5py.File('./train/digitStruct.mat')
,效果很好!
更新
下面是使用上述两个函数的示例代码
mat_data = h5py.File(os.path.join(folder, 'digitStruct.mat'))
size = mat_data['/digitStruct/name'].size
for _i in tqdm.tqdm(range(size)):
pic = get_name(_i, mat_data)
box = get_box_data(_i, mat_data)
以上函数展示了如何获取数据的每一个条目的名称和bbox数据!
我做了一个类似的函数来根据你的回答获取边界框的元数据,但没有使用 visititems()
因为我仍然不熟悉它。相反,它利用 h5py.File
.
的字典属性
f = h5py.File(digi_file, 'r')
bboxs = f['digitStruct/bbox']
def get_img_boxes(f, idx=0):
"""
get the 'height', 'left', 'top', 'width', 'label' of bounding boxes of an image
:param f: h5py.File
:param idx: index of the image
:return: dictionary
"""
meta = { key : [] for key in ['height', 'left', 'top', 'width', 'label']}
box = f[bboxs[idx][0]]
for key in box.keys():
if box[key].shape[0] == 1:
meta[key].append(int(box[key][0][0]))
else:
for i in range(box[key].shape[0]):
meta[key].append(int(f[box[key][i][0]][()].item()))
return meta
要获取特定图像的边界框信息,只需调用带有索引的函数:
boxes = get_img_boxes(f, 2)
我想使用 h5py
阅读 the Street View House Numbers (SVHN) DatasetIn [117]: def printname(name):
...: print(name)
...:
In [118]: data['/digitStruct'].visit(printname)
bbox
name
数据中有两组,bbox
和name
,name
是文件名数据对应的组名,bbox
是组name对应width,height,top,left和label数据
如何访问name
和bbox
组中的所有数据?
我尝试使用 Docs 中的以下代码,但它只是 return HDF5 对象引用。
In [119]: for i in data['/digitStruct/name']:
...: print(i[0])
...:
...:
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
<HDF5 object reference>
Python 版本:3.5 和 OS:Windows 10.
我会在这里回答我的问题,阅读h5py
的文档后,这是我的代码
def get_box_data(index, hdf5_data):
"""
get `left, top, width, height` of each picture
:param index:
:param hdf5_data:
:return:
"""
meta_data = dict()
meta_data['height'] = []
meta_data['label'] = []
meta_data['left'] = []
meta_data['top'] = []
meta_data['width'] = []
def print_attrs(name, obj):
vals = []
if obj.shape[0] == 1:
vals.append(obj[0][0])
else:
for k in range(obj.shape[0]):
vals.append(int(hdf5_data[obj[k][0]][0][0]))
meta_data[name] = vals
box = hdf5_data['/digitStruct/bbox'][index]
hdf5_data[box[0]].visititems(print_attrs)
return meta_data
def get_name(index, hdf5_data):
name = hdf5_data['/digitStruct/name']
return ''.join([chr(v[0]) for v in hdf5_data[name[index][0]].value])
这里的hdf5_data
是train_data = h5py.File('./train/digitStruct.mat')
,效果很好!
更新
下面是使用上述两个函数的示例代码
mat_data = h5py.File(os.path.join(folder, 'digitStruct.mat'))
size = mat_data['/digitStruct/name'].size
for _i in tqdm.tqdm(range(size)):
pic = get_name(_i, mat_data)
box = get_box_data(_i, mat_data)
以上函数展示了如何获取数据的每一个条目的名称和bbox数据!
我做了一个类似的函数来根据你的回答获取边界框的元数据,但没有使用 visititems()
因为我仍然不熟悉它。相反,它利用 h5py.File
.
f = h5py.File(digi_file, 'r')
bboxs = f['digitStruct/bbox']
def get_img_boxes(f, idx=0):
"""
get the 'height', 'left', 'top', 'width', 'label' of bounding boxes of an image
:param f: h5py.File
:param idx: index of the image
:return: dictionary
"""
meta = { key : [] for key in ['height', 'left', 'top', 'width', 'label']}
box = f[bboxs[idx][0]]
for key in box.keys():
if box[key].shape[0] == 1:
meta[key].append(int(box[key][0][0]))
else:
for i in range(box[key].shape[0]):
meta[key].append(int(f[box[key][i][0]][()].item()))
return meta
要获取特定图像的边界框信息,只需调用带有索引的函数:
boxes = get_img_boxes(f, 2)