LoginSignup
8
10

More than 3 years have passed since last update.

CIFAR10で超解像

Last updated at Posted at 2019-07-15

はじめに

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)

入力画像の確認

画像サイズが小さいので、オリジナル画像でも視認が困難
縮小画像では判別不能です、これはうまくいくのか?不安です、、

frog
image.png

car truck (訂正です)
image.png

deer
image.png

モデル

モデルは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とまでは復元してないものの、拡大画像としてはかなりいい感じですね

frog
image.png

car truck (訂正です)
image.png

deer
image.png

25%結果

この結果は結構驚きです
モザイク除去も夢ではない、、いやいや
刑事ドラマでよく監視画像が拡大されるシーンがありますが、現実味がありますね

frog
image.png

car truck (訂正です)
image.png

deer
image.png

まとめ

小さなカラー画像ですが、個人的には思った以上の結果でした
(学習画像でしか拡大してなかった、、、test画像で試さないと、、)
次回は、もう少し大きな画像を探して現実的なテストをしてみたいと思います
超解像も現状ではGANなども使用してより自然な画像になるような試みがされているようなので、その辺も併せて調べていきたいです。

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10