MNISTで超解像

# はじめに

きれいに画像を拡大できない？
何気ない質問から、ググってみるとwaif2xというアプリがなかなか良いとの評判
調べてみると、今はやりのDeeplearningを使った拡大アプリのようです
Kerasを使い始めていたので試してみよう！ってことで簡単なモデルを試してみました

# データセット

簡単な画像データセットとして頭に浮かんだのがMNIST
28x28ピクセルのグレーデータ(1ch)でkerasのデータセットとして用意されています
通常の数字認識と異なるので使用するのは手書き画像のみ
今回は、縦横2倍、4倍で学習してみます

元々の画像を拡大後と比較するため、縮小画像を入力画像として準備
waif2xも入力画像を拡大してからCNNにかけているようなので
縮小後にnearest neighborで拡大した画像を入力画像とします

```python

input=[]
input2=[]

for i in range(60000):
  
  sample=x_train[i].copy()
  sample=cv2.resize(sample, dsize=(14,14))
  sample=cv2.resize(sample, dsize=(28,28), interpolation=cv2.INTER_NEAREST)
  input.append(sample)
  
  sample2=x_train[i].copy()
  sample2=cv2.resize(sample2, dsize=(7,7))
  sample2=cv2.resize(sample2, dsize=(28,28), interpolation=cv2.INTER_NEAREST)
  input2.append(sample2)

input = np.array(input)
input2 = np.array(input2)

input = input.reshape(60000,28,28,1)
input2 = input2.reshape(60000,28,28,1)

```

入力画像を確認
50%画像は、なんとなく認識できるものの25%まで縮小するとかなり厳しい感じです
果たしてうまくいくか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/81b370a3-95f3-7dce-061c-e906d6cd6e22.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/2546d30f-0302-4c5c-d639-5ef5a1483111.png)


#モデル
waif2xが参考にしたというSRCNNにならって単純な4層のCNNでモデルを作成


```python

modelx2 = models.Sequential()
modelx2.add(layers.Conv2D(16, (3, 3), activation='relu', padding='same', input_shape=(28,28,1)))
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(1, (3, 3), activation='relu', padding='same'))

modelx2.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_33 (Conv2D)           (None, 28, 28, 16)        160       
_________________________________________________________________
conv2d_34 (Conv2D)           (None, 28, 28, 32)        4640      
_________________________________________________________________
conv2d_35 (Conv2D)           (None, 28, 28, 64)        18496     
_________________________________________________________________
conv2d_36 (Conv2D)           (None, 28, 28, 1)         577       
=================================================================
Total params: 23,873
Trainable params: 23,873
Non-trainable params: 0
_________________________________________________________________
```

#学習演算
損失関数は、2乗和誤差
最適化関数は、rmsprop
と基本的なものを使用

```python

modelx2.compile(optimizer='rmsprop', loss='mse', metrics=['accuracy'])

modelx2.fit(input, x_train, epochs=5, batch_size=64)
```


#結果

50%画像で学習したモデルで拡大した結果
そこそこoriginal画像に近づいています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/dd8c9197-e141-81a4-8ef4-4047327474c3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/d95fc0b7-492c-efed-579c-585501e1e7dd.png)

50%画像で学習したモデルで25%画像を拡大した結果
この結果はいまいちです、とくに9は数字として認識できません
学習時と条件がことなるとうまくいかないようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/16da158f-3394-6f85-3455-baa4b90f4872.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/09445c41-f2a3-d030-3bbb-8700723ce647.png)

#再学習した結果

25%画像で再学習を行ってみます
モデルとしては50%と同じで入力画像のみ変更した結果
9も何とか視認できそうなくらいの再現性です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/fe68d49f-0d07-0d2c-e918-130b1f5487f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258389/ad9d5044-71fd-59bd-fe25-44a95339ceb9.png)


#まとめ
CNNの4層だけでここまでの超解像ができてしまうことにびっくりしました
今回は手短に、手書き文字でのトライでしたが、写真画像を探してトライしてみたいと思います