学習用データの水増し【ImageDateGenerator】


学習用データの水増し【ImageDateGenerator】

from keras.preprocessing.image import load_img,img_to_array,ImageDataGenerator, array_to_img
# import matplotlib.pyplot as plt
from keras_preprocessing.image import list_pictures
import os
from PIL import Image

# ---- 分類するクラス --- #
classes = ["犬","猫","鳥"]

# ---- 画像の大きさを設定 ---- #
img_width, img_height = 1600, 1200

# ---- ディレクトリ定義 ---- #
DATA_DIR = [""] * len(classes)
SAVE_DIR = [""] * len(classes)
for i in range(len(classes)):
    DATA_DIR[i] = 'input/' + classes[i]
    SAVE_DIR[i] = os.path.join('output/', classes[i])  # 生成画像の保存先ディレクトリ
    if not os.path.exists(SAVE_DIR[i]):
        os.makedirs(SAVE_DIR[i])

# 画像をロード(PIL形式画像)
# img = load_img(IMAGE_FILE)

# 貼り付け
# plt.imshow(img)

# 表示
# plt.show()

# 回転:-15~15
# 上下平行移動:-0.8~1.2割の移動
# 左右平行移動:-0.8~1.2割の移動
# せん断:-5度~5度でせん断
# 拡大縮小:0.8~1.2割で拡大縮小
# 明度変更:-5.0~5.0の範囲で画素値に値を足す
# 各画素値に値を足す:0.3~1.0の範囲で値を変更する

datagen = ImageDataGenerator(
    rotation_range=15,
    height_shift_range=0.2,
    width_shift_range=0.2,
    shear_range=5,
    zoom_range=0.2,
   channel_shift_range=5,
   brightness_range=[0.3, 1.0]
)

for i in range(len(classes)):
    for picture in list_pictures(DATA_DIR[i]):
        img = img_to_array(load_img(picture, target_size=(img_height, img_width)))

        # numpyの配列に変換
        x = img_to_array(img)

        # 4次元配列に変換
        # x = np.expand_dims(x, axis=0)
        x = x.reshape((1,) + x.shape)

        # print(x.shape)

        g = datagen.flow(x, batch_size=1, save_to_dir=SAVE_DIR[i], save_prefix='out', save_format='jpg')
        for j in range(3):
            batches = g.next()

            # (1,縦サイズ, 横サイズ, チャンネル数)
            # print(batches.shape)
            # 画像として表示するため、4次元から3次元データにし、配列から画像にする。
            gen_img = array_to_img(batches[0])

            # plt.subplot(8, 8, i + 1)
            # plt.imshow(gen_img)
            # plt.axis('off')