画像データを対象とする機械学習をするとき、画像に変更を加えて教師データを増やすことはとても有効な手段です。
(それで最近、numpyをつかって行列をシフトさせたり反転させたりしています。)
そして、kerasには画像データの拡張専用のツールが用意されています。
それが、ImageDataGeneratorクラスです。
今回の記事ではこれの基本的な使い方を紹介します。
非常に多くのオプションがあり、どんな変換をするか細かく指定できるのですが、
一旦今回はランダムに、最大90度画像を回転させてみます。
使うメソッドは.flowです。
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()
# 例なので、データを10件に絞る
data = x_train[:10]
label = y_train[:10]
# 0~1に正規化
data = data/255.
target_name = {
0: "airplane",
1: "automobile",
2: "bird",
3: "cat",
4: "deer",
5: "dog",
6: "frog",
7: "horse",
8: "ship",
9: "truck",
}
# 例として、ランダムに90度以内画像を回転させるジェネレーターを生成する。
datagen = ImageDataGenerator(
rotation_range=90
)
# 画像の基本的な統計量を学習する
datagen.fit(data)
# 変換した画像を生成する(generatorなので、for文で順次生成する。)
for generated_data, generated_label in datagen.flow(data, label):
cnt += 1
fig = plt.figure(figsize=(11, 5))
# 可視化
for i in range(10):
ax = fig.add_subplot(2, 5, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.imshow(generated_data[i])
ax.set_title(target_name[generated_label[i, 0]])
plt.show()
# 無限に生成し続けるのでforを抜ける。
break
こうして生成された画像が次です。
回転する角度はランダムなので、中途半端な傾きになっていることがわかります。
また、結果は実行するたびに変わります。