畳み込みニューラルネットワークを用いた画像の高解像度の例

このコードは、シンプルな畳み込みニューラルネットワーク（SRCNN）モデルを使って、低解像度の画像を高解像度に変換する手法を示しています。SRCNNは画像超解像度技術の一つであり、低解像度画像を入力として受け取り、それを高解像度画像に変換することを目指しています。


### 概要
- 宇宙飛行士の画像をグレースケールに変換して読み込みます。
- 読み込んだ画像を低解像度化し、それを元の解像度にリサイズして劣化画像を作成します。
- SRCNNモデルを定義し、低解像度画像を高解像度画像に変換するために学習させます。
- 学習済みモデルを使って低解像度画像から高解像度画像を予測し、結果を表示します。

## Pythonのコード全文

```
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, color, transform, img_as_float
import tensorflow as tf
from tensorflow.keras import layers, models

# 宇宙飛行士の画像を読み込む
image = color.rgb2gray(data.astronaut())  # グレースケールに変換
image = img_as_float(image)

# 低解像度画像を生成
low_res_image = transform.resize(image, (image.shape[0]//5, image.shape[1]//5), anti_aliasing=True)
low_res_image = transform.resize(low_res_image, image.shape, anti_aliasing=True)

# SRCNNモデルの定義
def create_srcnn_model():
    model = models.Sequential()
    model.add(layers.Conv2D(64, (9, 9), activation='relu', padding='same', input_shape=(None, None, 1)))
    model.add(layers.Conv2D(32, (1, 1), activation='relu', padding='same'))
    model.add(layers.Conv2D(1, (5, 5), activation='linear', padding='same'))
    model.compile(optimizer='adam', loss='mean_squared_error')
    return model

# データの準備
low_res_image = low_res_image.reshape(1, low_res_image.shape[0], low_res_image.shape[1], 1)
image = image.reshape(1, image.shape[0], image.shape[1], 1)

# モデルの生成と学習
srcnn = create_srcnn_model()
srcnn.fit(low_res_image, image, epochs=1000, verbose=0)

# 高解像度画像の予測
predicted = srcnn.predict(low_res_image)

# 画像の表示
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.title('Low Resolution')
plt.imshow(low_res_image[0, :, :, 0], cmap='gray')
plt.subplot(1, 3, 2)
plt.title('Original')
plt.imshow(image[0, :, :, 0], cmap='gray')
plt.subplot(1, 3, 3)
plt.title('Super Resolution')
plt.imshow(predicted[0, :, :, 0], cmap='gray')
plt.show()
```

## 出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36629/f10cca48-e020-7292-f5f9-d7c6a8bb8056.png)


## 以下に、コードの概要と各ステップの詳細な説明を示します。



### 1. **ライブラリのインポート**
    
    import numpy as np
    import matplotlib.pyplot as plt
    from skimage import data, color, transform, img_as_float
    import tensorflow as tf
    from tensorflow.keras import layers, models
    
   - 必要なライブラリをインポートします。`skimage`は画像処理、`tensorflow`は深層学習モデルの構築に使用します。

### 2. **宇宙飛行士の画像を読み込む**
    
    image = color.rgb2gray(data.astronaut())  # グレースケールに変換
    image = img_as_float(image)
    
   - `skimage`ライブラリからサンプル画像として宇宙飛行士の画像を読み込み、グレースケールに変換します。
   - 画像データを浮動小数点形式に変換します。

### 3. **低解像度画像を生成**
    
    low_res_image = transform.resize(image, (image.shape[0]//5, image.shape[1]//5), anti_aliasing=True)
    low_res_image = transform.resize(low_res_image, image.shape, anti_aliasing=True)
    
   - 画像をリサイズし、解像度を下げます（5分の1に縮小）。
   - 低解像度にした画像を再び元のサイズにリサイズし、劣化した画像を作成します。

### 4. **SRCNNモデルの定義**
    
    def create_srcnn_model():
        model = models.Sequential()
        model.add(layers.Conv2D(64, (9, 9), activation='relu', padding='same', input_shape=(None, None, 1)))
        model.add(layers.Conv2D(32, (1, 1), activation='relu', padding='same'))
        model.add(layers.Conv2D(1, (5, 5), activation='linear', padding='same'))
        model.compile(optimizer='adam', loss='mean_squared_error')
        return model
    
   - 畳み込み層を使用してSRCNNモデルを定義します。
   - 3つの畳み込み層を使用し、それぞれ異なるサイズのフィルターで特徴を抽出し、高解像度画像を再構築します。
   - 最後に、Adamオプティマイザーを用いてモデルをコンパイルします。

### 5. **データの準備**
    
    low_res_image = low_res_image.reshape(1, low_res_image.shape[0], low_res_image.shape[1], 1)
    image = image.reshape(1, image.shape[0], image.shape[1], 1)
    
   - モデルが期待する形状（バッチサイズ、高さ、幅、チャネル数）に画像データをリシェイプします。

### 6. **モデルの生成と学習**
    
    srcnn = create_srcnn_model()
    srcnn.fit(low_res_image, image, epochs=1000, verbose=0)
    
   - 定義したSRCNNモデルを生成します。
   - 低解像度画像を入力、元の高解像度画像をターゲットとしてモデルを学習させます。このコードではエポック数を1000回としています。

### 7. **高解像度画像の予測**
    
    predicted = srcnn.predict(low_res_image)
    
   - 学習済みモデルを用いて、低解像度画像から高解像度画像を予測します。

### 8. **画像の表示**
    
    plt.figure(figsize=(15, 5))
    plt.subplot(1, 3, 1)
    plt.title('Low Resolution')
    plt.imshow(low_res_image[0, :, :, 0], cmap='gray')
    plt.subplot(1, 3, 2)
    plt.title('Original')
    plt.imshow(image[0, :, :, 0], cmap='gray')
    plt.subplot(1, 3, 3)
    plt.title('Super Resolution')
    plt.imshow(predicted[0, :, :, 0], cmap='gray')
    plt.show()
    
   - 3つの画像を表示します：低解像度画像、オリジナルの高解像度画像、予測された高解像度画像。
   - これにより、低解像度画像がSRCNNモデルによってどの程度改善されたかを視覚的に確認できます。

### 最終的な結果
このコードは、低解像度画像から高解像度画像を生成するSRCNNモデルの基本的な実装例です。画像超解像度の分野における入門的な例として、非常に有用です。