【问题标题】:h5py, access data in Datasets in SVHNh5py,在 SVHN 中访问 Datasets 中的数据
【发布时间】:2017-05-01 18:28:44
【问题描述】:

我想使用 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是宽、高、顶对应的组名, left 和 label 数据。

如何访问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。

【问题讨论】:

    标签: python h5py


    【解决方案1】:

    我根据您的回答做了一个类似的函数来获取边界框的元数据,但没有使用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)
    

    【讨论】:

      【解决方案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_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数据!

      【讨论】:

      • 在调用函数时我们应该输入0作为索引吗?你能解释一下这个函数是如何工作的吗?
      • 谢谢。使用你的代码后,我自己也想通了。你能解释一下 print_attrs 函数吗?
      • @DhruvMarwha, print_attrs 是获取每个 bbox 中数据的函数。您可以阅读visititems of h5py 的文档,也可以查看box = hdf5_data['/digitStruct/bbox'][index]hdf5_data[box[0]] 的详细信息以了解代码的详细信息。注意h5py不是高性能库,可以先picklize数据使用。
      • 我假设你已经使用了这个数据集@Alexander Yau。正如你所知,边界框有很长的线条。我想在字符周围画这些框。我试过了,但因为我没有起点,我无法在数字周围绘制边界框。有什么想法吗?
      • @DhruvMarwha,SVHNdata包含bbox数据,可以试试上面的函数获取box数据。
      猜你喜欢
      • 2020-09-21
      • 2017-10-27
      • 1970-01-01
      • 2019-08-29
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多