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’。指定されたモードに応じて,入力画像の境界周りを埋める
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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 # 停止しないと無限ループ
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 # 停止しないと無限ループ
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つに、「学習用データを増やす」というものがあります。

学習を改善するもうひとつの手法は、より多くの学習データを用意することです。

出典:直感 Deep Learning

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です