KerasのImageDataGeneratorで学習用画像を水増しする方法
KerasのImageDataGeneratorで学習用画像を水増しする方法をご紹介します。
目次
条件
- Python 3.7.0
- Keras 2.1.2
- openvc-python 4.1.0.25
画像のランダム生成
ImageDataGeneratorを用いて、元画像から10個の画像を生成します。
ソース
今回指定した、ImageDataGeneratorのパラメータは以下の通りです。
- rotation_range:画像をランダムに回転する回転範囲
- width_shift_range:ランダムに水平シフトする範囲
- height_shift_range:ランダムに垂直シフトする範囲
- shear_range:シアー強度(反時計回りのシアー角度)
- zoom_range:ランダムにズームする範囲
- horizontal_flip:水平方向に入力をランダムに反転
- fill_mode:{“constant”, “nearest”, “reflect”, “wrap”}のいずれか.デフォルトは ‘nearest’。指定されたモードに応じて,入力画像の境界周りを埋める
from keras.preprocessing.image import ImageDataGenerator import os import cv2 DATA_DIR = 'C:/data/train/dogs' # データディレクトリ IMAGE_NAME = 'dog1.jpg' # 対象画像ファイル SAVE_DIR = os.path.join(DATA_DIR, 'preview') # 生成画像の保存先ディレクトリ datagen = ImageDataGenerator( rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') img_array = cv2.imread(os.path.join(DATA_DIR, IMAGE_NAME),) # 画像読み込み img_array = img_array.reshape((1,) + img_array.shape) # 4次元データに変換(flow()に渡すため) # 保存先ディレクトリが存在しない場合、作成する。 if not os.path.exists(SAVE_DIR): os.makedirs(SAVE_DIR) # flow()により、ランダム変換したイメージのバッチを作成。 # 指定したディレクトリに生成画像を保存する。 i = 0 for batch in datagen.flow(img_array, batch_size=1, save_to_dir=SAVE_DIR, save_prefix='dog', save_format='jpeg'): i += 1 if i == 10: break # 停止しないと無限ループ
実行結果
元画像
生成画像
指定したディレクトリに、生成画像が保存されます。
学習用データを増やす意義
ネットワークの精度を高める方法の1つに、「学習用データを増やす」というものがあります。
学習を改善するもうひとつの手法は、より多くの学習データを用意することです。
Data Augumentation
画像の拡大、縮小、左右反転などにより、手元の画像を拡張する(バリエーションを増やす)ことが出来ます。
これは「Data Augumentation」と呼ばれており、画像の変更に強くする効果があり、ネットワークの精度を高めることが出来ます。
本記事で紹介した通り、KerasのImageDataGeneratorを用いれば、簡単に学習用データを増やすことが出来ます。
参考
Keras Documentation:ImageDataGenerator
https://keras.io/ja/preprocessing/image/
The Keras Blog:Building powerful image classification models using very little data
https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html