【HDF5】h5py的基本使用方法+GTSRB數據集加載

 

H5py包是HDF5二進制數據格式的python接口,可以用於存儲大量的數據並使用Numpy進行處理。成千上萬的數據集可以存儲在單一的文件中。

h5py的官方文檔:http://docs.h5py.org/en/latest/quick.html

現在我手頭有德國交通牌數據集的h5文件,裏面存有圖片和相應的label,需要讀取h5文件來讀取該數據集。圖像內容是X_test,圖像標籤是Y_test。以此舉例:

讀取文件:

import h5py
f = h5py.File('gtsrb_datasets.h5', 'r')  #文件擴展名是.hdf5也是一樣的

h5文件就像一個python字典,我們可以查看它的key

>>> list(f.keys())
[u'X_test',u'Y_test']

查看數據集的形狀和數據類型:

>>> xset=f['X_test']
>>> xset.shape
(12630,32,32,3)
>>> xset.dtype
dtype('uint8')

>>> yset=f['Y_test']
>>> yset.shape
(12630,43)
>>> yset.dtype
dtype('uint8')

我的數據集裏有12630張圖像,每張圖像是32*32*3的小圖,德國交通牌數據集有43個類別,每張圖片的標籤是一個one-hot向量。現在我要將數據讀取出來:

def load_hdf5(data_filename, keys=None):

    ''' assume all datasets are numpy arrays '''
    dataset = {}
    with h5py.File(data_filename) as hf:
        if keys is None:
            for name in hf:
                dataset[name] = np.array(hf.get(name))
        else:
            for name in keys:
                dataset[name] = np.array(hf.get(name))

    return dataset


dataset = load_hdf5('./gtsrb_dataset.h5', keys=['X_test', 'Y_test'])
X_test = np.array(dataset['X_test'], dtype='float32')
Y_test = np.array(dataset['Y_test'], dtype='float32')
print('X_test shape %s' % str(X_test.shape))
print('Y_test shape %s' % str(Y_test.shape))

現在所有的圖都讀到了X_test裏,所有的標籤都讀到了Y_test裏,讓我們隨便看一個吧:

可視化部分GTSRB數據集:

classes=[]
num_classes=10  #其實是有43個類別,但因爲圖太小了,全展示出來很擠所以我只展示10個
for i in range(0,num_classes):
    classes.append(i)  #這裏其實可以將類別的英文標籤等等粘上去
samples_per_class=10
Y_test=np.argmax(Y_test,axis=1) #將one-hot編碼轉換爲數字
for y,cls in enumerate(classes):
#     onehot_y=keras.utils.to_categorical(y,num_classes)
    idxs=np.flatnonzero((Y_test)==y)  #尋找Y_test中標籤爲y的元素所在的索引
    idxs=np.random.choice(idxs,samples_per_class,replace=False)  #隨機選擇samples個樣本
    for j,idx in enumerate(idxs):
        plt_idx=j*num_classes+y+1
        plt.subplot(samples_per_class,num_classes,plt_idx)
        plt.imshow(X_test[idx].astype('uint8'))
        plt.axis('off')
        if j==0:
            plt.title(cls)
plt.show()

=======================================================================

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章