0
3

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

Last updated at Posted at 2024-08-17

このコードは、シンプルな畳み込みニューラルネットワーク(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

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

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モデルの基本的な実装例です。画像超解像度の分野における入門的な例として、非常に有用です。

0
3
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
0
3