Kerasではデータ拡張(Data Augmentation)の処理を効果的に行うため、ImageDataGeneratorというジェネレーターが用意されています。
データ拡張とは、画像に対して移動、回転、拡大・縮小など加工することで、データ数を水増しするテクニックです。
ImageDataGeneratorを使用することで、このような画像を簡単に生成することが出来ます
機械学習、ディープラーニングの世界では大量のデータが必要となるので、オリジナルデータが少ない場合、ImageDataGeneratorを使用することで簡単に画像を増やす事ができます。
ImageDataGeneratorのimport
ImageDataGeneratorはkerasのライブラリです。次のようにインポートします。
1 |
from keras.preprocessing.image import ImageDataGenerator |
ImageDataGeneratorの引数
ImageDataGeneratorの引数です。パラメータを指定しなかった場合は"="の後がデフォルト値として設定されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
ImageDataGenerator( featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsilon=1e-06, rotation_range=0.0, width_shift_range=0.0, height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0, channel_shift_range=0.0, fill_mode='nearest', cval=0.0, horizontal_flip=False, vertical_flip=False, rescale=None, preprocessing_function=None, data_format=None, validation_split=0.0) |
ImageDataGeneratorの代表的な引数
ImageDataGeneratorの代表的な引数を具体的な画像と共に説明します。
使用したオリジナル画像(フリー画像)
rotation_range
指定角度の範囲でランダムに回転します。
rotation_range=90 の場合、0℃~90℃の範囲内で回転します。
width_shift_range
ランダムに水平シフトを行う範囲を指定します。
width_shift_range=0.3の場合。
height_shift_range
ランダムに垂直シフトを行う範囲を指定します。
height_shift_range=0.3の場合。
shear_range
シアー変換をかけます。
shear_range=0.85の場合。
zoom_range
ランダムにズームする範囲を指定します。
zoom_range=0.5の場合。
horizontal_flip
画像をランダムに水平シフトし反転します。
horizontal_flip=0.3の場合
vertical_flip
画像をランダムに垂直シフトし反転します。
vertical_flip=0.3の場合
channel_shift_range
画像のチャンネルをランダムに移動します。
channel_shift_range=100の場合
プログラムの概要
ImageDataGeneratorを使用して大量の画像を生成するプログラムです。
以下のディレクトリを作成し、image_inputディレクトリに変換したい画像を格納してください。プログラムを実行することで、変換された画像がimage_outディレクトリに格納されます。オリジナル画像は複数枚格納することが出来ます。
image_input ・・・変換したいオリジナル画像を格納(複数枚可能)
image_out ・・・変換後の画像が格納されるディレクトリ
1枚のオリジナル画像に対し、9枚の変換された画像が出力されます。
プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
from keras.preprocessing.image import load_img, img_to_array from keras.preprocessing.image import ImageDataGenerator import matplotlib.pyplot as plt import numpy as np import os import glob # 入力ディレクトリを作成 input_dir = "image_input" files = glob.glob(input_dir + '/*.jpg') # 出力ディレクトリを作成 output_dir = "image_out" if os.path.isdir(output_dir) == False: os.mkdir(output_dir) for i, file in enumerate(files): img = load_img(file) x = img_to_array(img) x = np.expand_dims(x, axis=0) # ImageDataGeneratorの生成 datagen = ImageDataGenerator( channel_shift_range=100 ) # 9個の画像を生成します g = datagen.flow(x, batch_size=1, save_to_dir=output_dir, save_prefix='img', save_format='jpg') for i in range(9): batch = g.next() |
実行結果
channel_shift_range=100と指定しているため、画像のチャンネルが変換された9枚の画像が出力されています。
このようにImageDataGeneratorを使用すると、画像を簡単に移動、回転、拡大・縮小など加工できるようになります。オリジナル画像を水増ししたいというときに効果を発揮するので是非使用してください。