前々回の記事: kerasによる画像データ拡張 で紹介した、
ImageDataGenerator を使って、色々画像を変換してみます。
引数の一覧はドキュメントにある通りで、
平行移動や回転、色の変更や拡大など色々行えます。
同時に複数を設定することももちろんできるのですが、今回は個々の動作をみたいので、1個ずつ適用しました。
また、どれもランダムに変換するものなので1枚の画像を5回ずつ変換して出力しています。
次が書いてみたコードです。結果がわかりやすいように変数はどれも大きめの値を渡しました。
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import cifar10
import matplotlib.pyplot as plt
# データ取得
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# 1データだけ抽出。
data = x_train[91: 92] / 255.
label = y_train[91: 92]
parameters = [
# 整数.画像をランダムに回転する回転範囲
{"rotation_range": 90},
# 浮動小数点数(横幅に対する割合).ランダムに水平シフトする範囲
{"width_shift_range": 0.5},
# 浮動小数点数(縦幅に対する割合).ランダムに垂直シフトする範囲
{"height_shift_range": 0.5},
# 浮動小数点数.シアー強度(反時計回りのシアー角度)
{"shear_range": 90},
# 浮動小数点数または[lower,upper].ランダムにズームする範囲.
# 浮動小数点数が与えられた場合,[lower, upper] = [1-zoom_range, 1+zoom_range]
{"zoom_range": 0.5},
# 浮動小数点数.ランダムにチャンネルをシフトする範囲
{"channel_shift_range": 0.5},
# 真理値.水平方向に入力をランダムに反転します
{"horizontal_flip": True},
# 真理値.垂直方向に入力をランダムに反転します
{"vertical_flip": True},
]
fig = plt.figure(figsize=(11, 20))
for j, kwargs in enumerate(parameters):
datagen = ImageDataGenerator(
**kwargs
)
# 画像の基本的な統計量を学習する
datagen.fit(data)
for i in range(5):
generated_data, generated_label = datagen.flow(data, label).next()
ax = fig.add_subplot(len(parameters), 5, i+j*5+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.imshow(generated_data[0])
if i == 0:
ax.set_title(kwargs)
plt.show()
結果がこちら。
猫の画像が変換されています。
平行移動や回転した時に、元々のと比べて隙間が発生してしまいますが、
それは、 fill_mode: {“constant”, “nearest”, “reflect”, “wrap”} で指定した方法で保管されます。
(デフォルトは ‘nearest’)
ドキュメントには下記のように記載があります。
“constant”: kkkkkkkk|abcd|kkkkkkkk (cval=k)
“nearest”: aaaaaaaa|abcd|dddddddd
“reflect”: abcddcba|abcd|dcbaabcd
“wrap”: abcdabcd|abcd|abcdabcd
constant は cval で指定した定数。
nearest は境界部分の色を引き延ばした形。
reflect は境界を境に線対称。
wrap は反対側からループするようなイメージです。