h5py, доступ к данным в наборах данных в SVHN

Я хочу прочитать набор данных номеров домов (SVHN) Просмотра улиц с помощью h5py

In [117]: def printname(name):
     ...:     print(name)
     ...:

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

В данных есть две группы: bbox и name, name — это имя группы, соответствующее данным имени файла, а bbox — это имя группы, соответствующее данным ширины, высоты, верха, левого края и метки.

Как просмотреть все данные в группах name и bbox?

Я попытался использовать следующий код из документов, но он просто возвращает Ссылка на объект 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.


person GoingMyWay    schedule 16.12.2016    source источник


Ответы (2)


Я отвечу на свой вопрос здесь, после прочтения документов 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 каждой записи данных!

person GoingMyWay    schedule 21.12.2016
comment
В этом случае мы должны вводить 0 для индекса при вызове функции? А также не могли бы вы объяснить, как работает эта функция? - person Dhruv Marwha; 30.07.2017
comment
Спасибо. После использования вашего кода я тоже это понял. Не могли бы вы пролить свет на функцию print_attrs? - person Dhruv Marwha; 31.07.2017
comment
@DhruvMarwha, print_attrs — это функция для получения данных в каждом блоке. И вы можете прочитать документы visititems h5py, а также чтобы увидеть подробности box = hdf5_data['/digitStruct/bbox'][index] и hdf5_data[box[0]] узнать подробности кода. Обратите внимание, что h5py не является высокопроизводительной библиотекой, поэтому вы можете сначала выделить данные и использовать их. - person GoingMyWay; 01.08.2017
comment
Я предполагаю, что вы использовали этот набор данных @Alexander Yau. В нем, как вы знаете, есть длины линий для граничных прямоугольников. Я думал нарисовать эти прямоугольники вокруг символов. не могу нарисовать граничные рамки вокруг цифр. Любые мысли? - person Dhruv Marwha; 01.08.2017
comment
@DhruvMarwha, SVHN data содержит данные bbox, поэтому вы можете попробовать указанную выше функцию, чтобы получить данные box. - person GoingMyWay; 02.08.2017

Я делаю аналогичную функцию для получения метаданных ограничительных рамок на основе вашего ответа, но без использования 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)
person Leo    schedule 28.05.2020