0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

超解像SRCNNモデルのまとめ

Posted at

はじめに

超解像タスクにおける最初のCNNモデルであるSRCNNモデルの論文の重要なところだけまとめます。
モデル構造とかパラメータの数値がメインです。
初めて超解像やってみる方の参考になれば。

自分で実装して学習させた記事も書いてるのでコチラも是非。

簡単な用語まとめ

SISR

Single Image Super-Resolutionの頭文字を取ったもの。
日本語訳では「単一画像超解像」と訳される。

要は一枚の画像を入力として受け取り、それに対応した高画質の画像を出力とするもの。
超解像といったら、このことを指すことが多い。

LR, HR

それぞれLow Resolution, High Resolutionの略。
低解像度、高解像度と訳すのがいいかも。要は低解像度画像と、高解像度画像のこと。

超解像タスクにおける入力と出力ですね。

これらの単語は超解像分野のどの論文にも出てきます。

じゃ本題に入っていきます。

モデル構造

20190213151109.png

高解像度の画像と同じサイズの低解像度画像を入力として受け取り、高解像度画像を出力する。
シンプルで畳み込み層3層で構成されている。第一層と第二層の畳み込みの後の活性化関数はReluを使う。

またそれぞれの層の重みは平均0,標準偏差0.001のガウス分布で初期化する。

tensorflow(keras)で実装するなら以下。

initializer = tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.001)
    
    
model = Sequential()
model.add(Conv2D(64, kernel_size=9, padding='same', kernel_initializer=initializer, input_shape=(None, None, 3)))
model.add(Activation('relu'))
model.add(Conv2D(32, kernel_size=1, padding='same', kernel_initializer=initializer))
model.add(Activation('relu'))
model.add(Conv2D(1, kernel_size=5, padding='same', kernel_initializer=initializer))

最後の畳み込み層のフィルター数はグレー画像なら1,カラー画像なら3にする。

損失関数

損失関数はMSE(Mean Squared Error)を使う。MSEの値を小さくすることで評価指標であるPSNRの値を大きくすることにつながる。

最適化アルゴリズム

モーメンタム付き確率的勾配降下法(SGD)を使う。

学習率は最初の2層が0.0001, 最後の層が0.00001と学習率を層ごとに変更する。

tensorflow(keras)で実装するなら以下のようになると思う。(tensorflow_addonsをpipでインストールしておく必要あり)

import tensorflow_addons as tfa

optimizers = [
              tf.keras.optimizers.SGD(learning_rate=0.0001, momentum=0.9),
              tf.keras.optimizers.SGD(learning_rate=0.00001, momentum=0.9)
              ]

optimizers_and_layers = [(optimizers[0], model.layers[:-1]), (optimizers[1], model.layers[-1])]
optimizer = tfa.optimizers.MultiOptimizer(optimizers_and_layers)

評価指標

PSNRとSSIMを使う。それぞれの指標がどういう意味合いかはコチラの記事が詳しい。

端的にいうと、画質が良いか悪いかを表す。

tensorflow(keras)で実装するのは簡単。

def psnr(low, high):
    return tf.image.psnr(low, high, max_val=1.0)

def ssim(low, high):
    return tf.image.ssim(low, high, max_val=1.0)

max_valは輝度の最大値を示すので、255で割って正規化している場合は1、してないなら255を設定する。

データ前処理

論文中では高画質画像だけを用意し、それを縮小→元のサイズに拡大とすることで画質を落として低画質画像を生成している。この時の補完方法はbicubic法を用いている。

またRGB画像をYCbCr変換して、Y成分のみを学習させていたり、RGB画像のまま学習させていたりするが、RGB画像のまま学習させた方が精度は高めかも。(状況による)

入力画像サイズは任意のものでok。

まとめ

論文中のパラメータをメインでまとめてみました。一番最初の超解像CNNモデルで実装もしやすいので、自前のデータセットなどで実験してみると良いと思います。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?