ImageDataGenerator (画像データジェネレータ)

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,
    samplewise_center=False,
    featurewise_std_normalization=False,
    samplewise_std_normalization=False,
    zca_whitening=False,
    rotation_range=0.,
    width_shift_range=0.,
    height_shift_range=0.,
    shear_range=0.,
    zoom_range=0.,
    channel_shift_range=0.,
    fill_mode='nearest',
    cval=0.,
    horizontal_flip=False,
    vertical_flip=False,
    rescale=None,
    dim_ordering=K.image_dim_ordering())

リアルタイムにデータ拡張しながら,テンソル画像データのバッチを生成します.また,このジェネレータは,データを無限にループするので,無限にバッチを生成します.

  • 引数:

    • featurewise_center: 真理値.データセット全体で,入力の平均を0にします.
    • samplewise_center: 真理値. 各サンプルの平均を0にします.
    • featurewise_std_normalization: 真理値. 入力をデータセットの標準偏差で正規化します.
    • samplewise_std_normalization: 真理値.各入力をその標準偏差で正規化します.
    • zca_whitening: 真理値.ZCA白色化を適用します.
    • rotation_range: 整数.画像をランダムに回転する回転範囲.
    • width_shift_range: 浮動小数点数(横幅に対する割合).ランダムに水平シフトする範囲.
    • height_shift_range: 浮動小数点数(縦幅に対する割合).ランダムに垂直シフトする範囲.
    • shear_range: 浮動小数点数.シアー強度(反時計回りのシアー角度(ラジアン)).
    • zoom_range: 浮動小数点数または[lower,upper].ランダムにズームする範囲.浮動小数点数が与えられた場合,[lower, upper] = [1-zoom_range, 1+zoom_range]となります.
    • channel_shift_range: 浮動小数点数.ランダムにチャンネルをシフトする範囲.
    • fill_mode: {"constant", "nearest", "reflect", "wrap"}のいずれか.指定されたモードに応じて,入力画像の境界周りを埋めます.
    • cval: 浮動小数点数または整数.fill_mode = "constant"のときに利用される値.
    • horizontal_flip: 真理値.水平方向に入力をランダムに反転します.
    • vertical_flip: 真理値.垂直方向に入力をランダムに反転します.
    • rescale: rescale factor. デフォルトはNone.Noneか0ならば,適用しない.それ以外であれば,(他の変換を行う前に) 与えられた値をデータに積算する.
    • dim_ordering: {"th", "tf"}のいずれか. "tf"モードは入力の形状が(samples, width, height, channels)であることを想定します. "th"モードは入力の形状が(samples, channels, width, height)であることを想定します. デフォルトはKerasの設定ファイル~/.keras/keras.jsonimage_dim_orderingの値です.値を設定していなければ,"th"になります.
  • メソッド:

    • fit(X): featurewise_center,featurewise_std_normalization,または,zca_whiteningが指定されたときに必要になります.いくつかのサンプルに対して必要な値を計算します.
      • 引数:
        • X: サンプルデータ.
        • augment: 真理値(デフォルト: False).ランダムにサンプルを拡張するかどうか.
        • rounds: 整数(デフォルト: 1).augumentが与えられたときに,利用するデータに対して何回データ拡張を行うか.
    • flow(X, y): numpyデータとラベルのarrayを受け取り,拡張/正規化したデータのバッチを生成する.データを無限ループ内で,無限にバッチを生成します.
      • 引数:
        • X: データ.
        • y: ラベル.
        • batch_size: 整数(デフォルト: 32).
        • shuffle: 真理値(デフォルト: False).
        • save_to_dir: Noneまたは文字列(デフォルト: None).生成された拡張画像を保存するディレクトリを指定できます(行ったことの可視化に有用です).
        • save_prefix: 文字列(デフォルト'').画像を保存する際にファイル名に付けるプレフィックス(set_to_dirに引数が与えられた時のみ有効).
        • save_format: "png"または"jpeg"(set_to_dirに引数が与えられた時のみ有効).デフォルトは"jpeg".
      • yields: (x, y)からなるタプルでxは画像データのnumpy配列でyはラベルのnumpy配列.ジェネレーターは無限ループする.
    • flow_from_directory(directory): ディレクトリへのパスを受け取り,拡張/正規化したデータのバッチを生成する.データを無限にループするので,無限にバッチを生成します.
      • 引数:
        • directory: ディレクトリへのパス.クラスごとに1つのサブディレクトリを含み,サブディレクトリはPNGかJPG形式の画像を含まなければならない.詳細はこのスクリプトを.
        • target_size: 整数のタプル.デフォルトは(256, 256).この値に全画像はリサイズされる.
        • color_mode: "grayscale"か"rbg"の一方.デフォルトは"rgb".画像を1か3チャンネルの画像に変換するかどうか.
        • classes: クラスサブディレクトリのリスト.(例えば,['dogs', 'cats']).デフォルトはNone.与えられなければ,クラスのリスト自動的に推論される(そして,ラベルのインデックスと対応づいたクラスの順序はalphanumericになる).
        • class_mode: "categorical"か"binary"か"sparse"か"None"のいずれか1つ.デフォルトは"categorical".返すラベルの配列の型を決定する: "categorical"は2次元のone-hotにエンコード化されたラベル,"binary"は1次元の2値ラベル,"sparse"は1次元の整数ラベル.Noneであれば,ラベルを返さない (ジェネレーターは画像のバッチのみ生成するため,model.predict_generator()model.evaluate_generator()などを使う際に有用).
        • batch_size: 整数(デフォルト: 32).
        • shuffle: 真理値(デフォルト: True).
        • seed: shuffleのための乱数seed
        • save_to_dir: Noneまたは文字列(デフォルト: None).生成された拡張画像を保存するディレクトリを指定できます(行ったことの可視化に有用です).
        • save_prefix: 文字列.画像を保存する際にファイル名に付けるプレフィックス(set_to_dirに引数が与えられた時のみ有効).
        • save_format: "png"または"jpeg"(set_to_dirに引数が与えられた時のみ有効).デフォルトは"jpeg".
  • :

.flow(X, y)の使用例:

(X_train, y_train), (X_test, y_test) = cifar10.load_data()
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

# compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied)
datagen.fit(X_train)

# fits the model on batches with real-time data augmentation:
model.fit_generator(datagen.flow(X_train, Y_train, batch_size=32),
                    samples_per_epoch=len(X_train), nb_epoch=nb_epoch)

# here's a more "manual" example
for e in range(nb_epoch):
    print 'Epoch', e
    batches = 0
    for X_batch, Y_batch in datagen.flow(X_train, Y_train, batch_size=32):
        loss = model.train(X_batch, Y_batch)
        batches += 1
        if batches >= len(X_train) / 32:
            # we need to break the loop by hand because
            # the generator loops indefinitely
            break

.flow_from_directory(directory)の使用例:

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

model.fit_generator(
        train_generator,
        samples_per_epoch=2000,
        nb_epoch=50,
        validation_data=validation_generator,
        nb_val_samples=800)