Keras: 超解像

Takami Torao Python 3.5 Keras 2.2 TensorFlow 1.8 #Keras #TensorFlow #RSCNN
  • このエントリーをはてなブックマークに追加

概要

超解像 (super resolution) は解像度の低い画像や動画、音声などの信号からより高解像度なバージョンを生成する技術。

畳み込みニューラルネットワークによる超解像

超解像畳み込みニューラルネットワーク (SRCNN; super-resolution convolutional neural network) は畳み込み層✕3 の非常にシンプルなネットワークで精度の良い超解像を実装することができる。

Fig.1 から Fig.3 は Open Images Datasets V4 のサブセット 10 万画像を使って学習した SRCNN を使用して、1/3 に縮小した画像から元の画像を復元したものである。色合いがくすんでいるが羽毛の質感や目の光が復元されていることが分かる。PSNR は 26.0dB であった。

Fig.1 オリジナル画像。
Fig.2 1/3 縮小画像と bicubic アルゴリズムで再度拡大した画像。
Fig.3 SRCNN によって復元した画像。

SRCNN は 3 つの畳み込み層で構成される単純な構造を持っている。画像データを縮小/拡大したもので訓練することで学習をおこなう。

> model = Sequential()
> model.add(Conv2D(filters=64, kernel_size=9, padding="same", activation="relu", input_shape=(None, None, 3)))
> model.add(Conv2D(filters=32, kernel_size=1, padding="same", activation="relu"))
> model.add(Conv2D(filters=3, kernel_size=5, padding="same"))
> model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d_10 (Conv2D)           (None, None, None, 64)    15616
_________________________________________________________________
conv2d_11 (Conv2D)           (None, None, None, 32)    2080
_________________________________________________________________
conv2d_12 (Conv2D)           (None, None, None, 3)     2403
=================================================================
Total params: 20,099
Trainable params: 20,099
Non-trainable params: 0

FSRCNN (Fast SRCNN; Accelerating the Super-Resolution Convolutional Neural Network) は SRCNN を高速化したネットワーク。SRCNN で 1 層だった中間畳み込み層を増やしているが、全体としてパラメータ数は減っており PSNR 値も高い。24fps 程度のリアルタイム処理を行うことができる。

畳み込みオートーエンコーダーによる超解像

オートエンコーダは入力に近い出力を生成するように学習したネットワーク。

Fig.4 オートエンコーダーによる超解像。PSNR はそれぞれカワセミ 26.6dB, ミノカサゴ 21.3dB。

PSNR による評価

ピーク信号対雑音比 (PSNR; peak signal to noise ratio) はノイズや非可逆圧縮を施した信号が圧縮前と比べてどれほど劣化したかを評価する指標として使用される。このため SRCNN においても復元した画像がどの程度劣化しているかを示す指標となる。\[ \begin{equation} {\rm PSNR} = 10 \log_{10} \frac{{\rm MAX}^2}{\rm MSE} \label{psnr} \end{equation} \]

ここで \({\rm MSE}\) はカラー画素ごとの差の二乗を平均した平均二乗誤差である。Numpy を使用するのであれば以下のように算出することができる。

import numpy as np
-10 * np.log(np.mean((x1 - x2).flatten() ** 2)) / np.log(10)

また \({\rm MAX}\) は信号の取りうる最大値を表している。カラー画素値が 0.0-1.0 の値を取る場合は \({\rm MAX}=1\) となることから式 (\(\ref{psnr}\)) は以下のように表すことができる。\[ {\rm PSNR} = - 10 \frac{\log {\rm MSE}}{\log 10} \]

PSNR は dB (デシベル) を単位とし、値が大きいほど劣化が少ないことを示している。全く同一の画像の場合は \(+\infty\) に発散する。画像に対しては概ね 30dB 以上であれば元の画質を高品質に保っていると言える。

参考に Photoshop を用いて JPEG 形式で保存したときの画質レベルで PSNR がどの程度になるかを調べたもの。

元画像
80: -8.9dB
50: -15.8dB
0: -21.1dB

参照

  1. Chao Dong, Chen Change Loy, Kaiming He, Xiaoou Tang (2015) "Image Super-Resolution Using Deep Convolutional Networks"
  2. 太田満久, 須藤広大, 黒澤匠雅, 小田大輔 "現場で使える! TensorFlow 開発入門", 翔泳社 (2018)