このコードは、シンプルな畳み込みニューラルネットワーク(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()
出力結果
以下に、コードの概要と各ステップの詳細な説明を示します。
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モデルの基本的な実装例です。画像超解像度の分野における入門的な例として、非常に有用です。