#はじめに
MNISTで超解像の簡単なモデルを作成しましたが
KerasにはCIFAR10というカラー画像のデータセットが用意されていたので試してみました
#データセット
CIFAR10は、airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truckの10クラスのカラー画像からなるデータセットです
画像サイズは、32x32ピクセルでMNISTより若干大きめ(画像としては小さいですね)
画像の枚数は、50000枚(各クラス5000枚)の訓練データと10000枚(各クラス1000枚)のテストデータからなる総枚数60000枚のデータセットです
MNISTの時と同じように50%,25%の縮小画像を作成して入力画像とします
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
input=[]
input2=[]
for i in range(50000):
sample=x_train[i].copy()
sample=cv2.resize(sample, dsize=(16,16))
sample=cv2.resize(sample, dsize=(32,32), interpolation=cv2.INTER_NEAREST)
input.append(sample)
sample2=x_train[i].copy()
sample2=cv2.resize(sample2, dsize=(8,8))
sample2=cv2.resize(sample2, dsize=(32,32), interpolation=cv2.INTER_NEAREST)
input2.append(sample2)
#入力画像の確認
画像サイズが小さいので、オリジナル画像でも視認が困難
縮小画像では判別不能です、これはうまくいくのか?不安です、、
#モデル
モデルはMNISTとほぼ同じ、4層のCNNです
画像の入力サイズと最終層を3chに変えただけです
(これだけで済んでしまうのは本当にKeras様様です)
from keras import models
from keras import layers
modelx2 = models.Sequential()
modelx2.add(layers.Conv2D(16, (3, 3), activation='relu', padding='same', input_shape=(32,32,3)))
modelx2.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
modelx2.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
modelx2.add(layers.Conv2D(3, (3, 3), activation='relu', padding='same'))
modelx2.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_41 (Conv2D) (None, 32, 32, 16) 448
_________________________________________________________________
conv2d_42 (Conv2D) (None, 32, 32, 32) 4640
_________________________________________________________________
conv2d_43 (Conv2D) (None, 32, 32, 64) 18496
_________________________________________________________________
conv2d_44 (Conv2D) (None, 32, 32, 3) 1731
=================================================================
Total params: 25,315
Trainable params: 25,315
Non-trainable params: 0
_________________________________________________________________
#学習演算
MNISTと全く同じです
損失関数は、2乗和誤差
最適化関数は、rmsprop
modelx2.compile(optimizer='rmsprop', loss='mse', metrics=['accuracy'])
modelx2.fit(input, x_train, epochs=5, batch_size=64)
#50%結果
写真画像の拡大でよく用いられるbilinearとの比較もしてみます
入力画像はnearest neighborで拡大しているので、モザイクのようなジャギーが目立つ画像です
bilinearは、かなりソフトな画像になっています
変換画像はoriginalとまでは復元してないものの、拡大画像としてはかなりいい感じですね
#25%結果
この結果は結構驚きです
モザイク除去も夢ではない、、いやいや
刑事ドラマでよく監視画像が拡大されるシーンがありますが、現実味がありますね
#まとめ
小さなカラー画像ですが、個人的には思った以上の結果でした
(学習画像でしか拡大してなかった、、、test画像で試さないと、、)
次回は、もう少し大きな画像を探して現実的なテストをしてみたいと思います
超解像も現状ではGANなども使用してより自然な画像になるような試みがされているようなので、その辺も併せて調べていきたいです。