h5py,访问SVHN

时间:2016-12-16 02:10:20

标签: python h5py

我想使用h5py

阅读the Street View House Numbers (SVHN) Dataset
In [117]: def printname(name):
     ...:     print(name)
     ...:

In [118]: data['/digitStruct'].visit(printname)
bbox
name

数据中有两个组bboxnamename是与文件名数据对应的组名,bbox是对应的组名到宽度,高度,顶部,左侧和标签数据。

如何访问namebbox群组中的所有数据?

我尝试使用Docs中的以下代码,但它只返回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和操作系统:Windows 10。

2 个答案:

答案 0 :(得分: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_datatrain_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数据!

答案 1 :(得分:0)

我做了一个类似的功能来根据您的答案获取边界框的元数据,但由于我仍然不熟悉,所以不使用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)