ディープラーニング学習でのデータ読み込み高速化

Google Colabを使ってディープラーニングの学習を行おうとしたが、データの読み込みが非常に遅い。 もともと使っていたコードでは画像ファイルを1枚1枚直接読み込んでいた。ローカルでは数分かかる程度であったが、Google Colabだと1時間近くかかるようになったので、流石に待てないので高速化する。

方法としては、画像ファイルをすべてHDF5ファイル1つに集約する。HDF5ファイルについては以下のリンクが参考になる。

qiita.com

概要

HDF5ファイルではグループによって、データを階層構造で保持することができる。今回は

/train
グループを作成して、そこにDatasetとして画像ファイルを保存していく。Datasetの名前はそのファイル名とする。

画像ファイルは

/data
ディレクトリに保存してある。これをグレースケールで読み込み、保存していく。

/data
/data/img_001.png
/data/img_002.png
...

以降の作業はJupyer notebookなどPython環境で行っていく。

手順

'file.hdf5'というファイル名で作成する。このとき、ファイルがすでにあるとエラーになるので注意。

import numpy as np
import h5py
import glob, cv2
f = h5py.File('file.hdf5', mode='w')

グループを作成する。

group = f.create_group('/train')

画像ファイルをリストアップ。

file_list = glob.glob("/data/*.png")

グレースケールで読み込み、Datasetに保存する。

import os

for file in file_list:
    arr = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    dataset = group.create_dataset(
        name=os.path.basename(file), shape=arr.shape, dtype=np.uint8)
    dataset[...] = arr

ファイルを閉じる。

f.close()

以上でデータをHDF5ファイルに変換することができた。

データ読み込みとチェック

HDF5ファイルのデータにアクセスし、データのチェックを行う。HDF5ファイルのデータには、辞書データのようにアクセスすれば良い。

f = h5py.File('file.hdf5', mode='r')
dataset = f['/train']

c = 0
for file in file_list:
    arr_h5 = dataset[os.path.basename(file)][...]
    arr_org = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    if (arr_h5 != arr_org).all():
        c = c+1
print("Diff :", c)

"Diff: 0"と表示されればOK。0以外ならなにかおかしいので見直し。