コンピュータビジョンの最新論文調査 Single Image Super-Resolution 前編
はじめに
こんにちは、AIシステム部でコンピュータビジョンの研究開発をしている中村です。 我々のチームでは、常に最新のコンピュータビジョンに関する論文調査を行い、部内で共有・議論しています。今回はSingle Image Super-Resolutionの前編として中村遵介が調査を行いました。
Single Image Super-Resolutionとは、一枚の画像を入力として受け取り、対応する高画質の画像を推定するもので、日本語では単一画像超解像として知られています。
過去の他タスク編については以下をご参照ください。
目次
論文調査のスコープ
コンピュータビジョンの最新論文調査 Single Image Super-Resolution 編は前編と後編からなり、全体としては、Convolutional Neural Network(CNN)が初めてSingle Image Super-Resolution(SISR)に用いられたSRCNNを皮切りに、CVPR2019で発表された論文までで重要と思われるものをピックアップして調査を行っております。
今回の前編では、「スケールやパラメータを含め縮小方法が既知の画像から、なるべく元の画像に近づくよう高画質な画像を推定する」というタスクに取り組んだ論文を紹介します。
後編では、「縮小方法が完全に未知、もしくは一部未知の画像から、なるべく元の画像に近づくよう高画質な画像を推定する」というものや「元画像にとても近いとは言えなくとも見た目が綺麗になるよう推定する」というタスクに取り組んだ論文を主に紹介する予定です。
前提知識
Single Image Super-Resolution
Single Image Super-Resolution(SISR)は、日本語では単一画像超解像として知られ、一枚の画像を入力として受け取り、対応する高画質の画像を推定するタスクです。
ある低画質画像と対応する高画質画像は複数存在するため、このタスクは解が定まらない不良設定問題として知られています。下の画像は後編で紹介するPhoto-Realistic Single Image Super-Resolution Using a Generative Adversarial Networkより引用したものですが、一つの低画質画像に対応する高画質画像が複数あることを示しています。
不良設定問題の例
そのような中、大量のデータから拡大方法を学習するCNNモデルは、この5年ほどで大きな注目を集めています。大量の低画質画像-高画質画像のペアデータから拡大方法を学習することで、未知の画像であってもかなり綺麗に拡大することが可能になってきました。以下の図は一般的にSISRをCNNで解く際の訓練と推論のイメージ図です。訓練時は高画質画像を縮小して入力し、元の画像を復元するように学習します。前編で紹介する論文は、アンチエイリアスをかけた高画質画像をBicubic法によって1/2, 1/3, 1/4 もしくは 1/8に縮小したものを用いています。
評価方法
今回紹介する手法においては、正解画像と推定画像の「近さ」はPeak Signal-to-Noise Ratio(PSNR)とStructure Similarity Index(SSIM)で評価しています。PSNRは画像の二乗誤差に対数を用いた評価指標で、高ければ高いほどモデルの精度が良いことを示しています。しかしPSNRはあくまで二乗誤差なので、ノイズのようなものをうまく指標に反映できないという欠点があります。そこで、PNSR以外の指標として、注目領域の画素の平均や標準偏差と言った統計情報を使用したSSIMも重要となっています。SSIMは0-1の範囲の指標で、これも高ければ高いほど精度が良いことを示しています。
ただし、どちらも「値は高いが見た目としてはあまりよくない」という結果を生む可能性もあり、絶対的に信頼できる指標ではありません。現状では既存手法との比較のしやすさや他により良い選択肢がないということもあり、これらの指標が採用されています。
関連データセット
学習用
- ImageNet: 1000万枚を超える超巨大データセットです。実際に学習する際は35万枚程度をサンプリングして使用します。画像サイズはまちまちですが、400x400程度のものが多いです。超解像の学習では192x192などにクロップされるため、おおよそ1枚の画像から4つほど完全に異なるデータを取得できます。
- DIV2K: CVPR、ECCVのコンペで使用されるデータセット。800枚と枚数は少ないですが、非常に品質が高いことで知られています。また画像サイズも大きく、2040x1300-1500程度の画像により構成されています。おおよそ1枚の画像から60-70枚ほど完全に異なるデータを取得できます。
評価用
- Set5: 5枚のデータセット。CNNモデル登場以前から頻繁に用いられていました。人の顔や蝶、鳥のような自然画像が入っています。
- Set14: 14枚のデータセット。一部、Set5と被る画像もあります。白黒画像やイラスト調の画像が増えました。
- BSD: 100枚、200枚など使用する枚数は異なりますが近年は100枚を使用するケースがほとんどです。動物や人物、飛行機のようなものから景色の画像まで、幅広い自然画像が入っています。
- Urban100: 建物の画像を主に集めたデータセットです。画像内の自己相関性が高い事で知られています。
- Manga109: 漫画のデータセットですが、主に表紙のカラー画像を評価対象に用いられます。
あるSISRモデルを複数の画像に対してそれぞれ適用した際のPSNRは一般的にばらつきがちです。そのため、数枚の画像で評価をすることが難しく、ほとんどの論文では複数の評価データセットについてそれぞれの平均PSNRを記載して既存手法との相対評価を行います。
論文紹介
SISRは辞書ベースのアプローチが行われていましたが、最近ではCNNを利用したアプローチが盛んになっています。まずはCNNモデルのベースとなった辞書ベースの手法についてその手法を大まかに説明します。
辞書ベース超解像
辞書ベースの手法の大まかな流れは以下のようになっています。
- 事前に高画質画像の一部領域を切り出したパッチと、それを縮小した低画質パッチを大量に用意します。
- 大量の低画質パッチ群をある基底行列(辞書)とそれぞれのスパースベクトルの積で近似表現します。これは、低画質パッチを、代表的な特徴群の中のいくつかの和で表現することで、より少ない情報で画像を表現しようとしています。
- 低画質パッチを変換したベクトルと、高画質パッチの対応表を作成します。
- 超解像の対象となる入力された低画質画像から小領域を切り出します
- 切り出した小領域を 2. の方法でベクトル表現します。
- 6. の対応表の中から最も近いベクトルを探し出し、対応する高画質パッチを、小領域に対応する高画質画像として使用します。
- 4-6.を繰り返して高画質画像を生成します
2.において特徴表現を工夫したり6.の最近傍探索においてアルゴリズムを工夫することで、高速な超解像や正確な超解像を行なっていくもの(A+: Adjusted Anchored Neighborhood Regression for Fast Super-Resolution)や、事前に用意する画像群を外部データを利用せず、入力された画像だけから作成する手法などが存在します。最近だとCVPR2015で画像の自己相関を利用したSelfExSR: "Single Image Super-Resolution from Transformed Self-Exemplars"が発表されていたのが記憶に新しいです。
目的
従来の超解像のうち、辞書ベースに基づいた手法をCNNに置き換えることで高精度化を図りました。
要約
辞書ベースの手法が行なっていた操作を、CNNに置き換えた論文です。初めてSISRにCNNを用いましたが、既に従来手法を大きく上回る精度を達成しました。
提案内容
全体は3層のCNN構造になっています。
- 1層目が 9x9 の畳み込みで、「小領域を切り出す」という操作に該当
- 2層目が 1x1 の畳み込みで、「小領域を特徴ベクトルに埋め込む」という操作に該当
- 3層目が 5x5 の畳み込みで、「特徴ベクトルから対応する高画質画像を検索する」という操作に該当
損失は、生成結果と正解画像の平均二乗誤差です。CNN内部では拡大を行わず、Bicubic 法で事前に拡大処理したものをCNNで refine するという手法をとっています
結果
4x4倍に拡大した画像と実際の高画質画像から計算されたPSNRの各データセットにおける平均値です。
4x4 PSNR | Bicubic | A+ | SRCNN |
Set5 | 28.42 | 30.28 | 30.49 |
Set14 | 26.00 | 27.32 | 27.50 |
BSD300 | 25.96 | - | 26.90 |
A+はCNN手法ではなく、辞書ベースのものですが当時の最高手法の1つです。SRCNNがPSNRにおいて高い精度を達成したことを示しています。
以下は論文から引用した3x3倍超解像の結果です。既存手法に比べて鮮明な結果となっています。
問題点
SRCNNはCNNのSISRへの適用ということで注目を浴びた論文でしたが、以下の2つの問題を抱えていました。
- Bicubic法で事前に拡大された画像を処理するため計算コストが大きい
- 3層で構成されており、表現能力が乏しい
そこで、この2つに取り組んだ論文をそれぞれ紹介します。まずは1つ目の計算コストが大きい問題に取り組んだ論文を2つ紹介します。
目的
SRCNNではBicubic法で拡大した画像をCNNで処理していたため計算コストが大きい問題がありました。この論文はその計算コストの縮小を図ったものです。
要約
実際の拡大をCNN入力前のBicubic法で行うのではなく、CNNの最終部分でsub-pixel convolutionを導入することで実現しています。これにより、CNN内部のほぼ全てのレイヤで小さなサイズの画像のまま計算を行うことを可能にしました。SRCNNのおよそ4-5倍の速度を出しています。
提案内容
SRCNNで前処理として行なっていたBicubic法を除外し、最終層の9x9の畳み込みをsub-pixel convolutionに置き換えることで最終層で拡大を行います。
sub-pixel convolutionは、width, height方向への拡大を行うのではなく、channel方向にr^2倍の拡大を行います。その後、reshapeとtransposeによってテンソルを変形させ、width, height方向にそれぞれr倍した結果を出力します。
結果
4x4倍に拡大した画像と実際の高画質画像から計算されたPSNRの各データセットにおける平均値です。
x4 PSNR | Bicubic | SRCNN | ESPCN |
Set5 | 28.42 | 30.49 | 30.90 |
Set14 | 26.00 | 27.50 | 27.73 |
BSD300 | 25.96 | 26.90 | 27.06 |
以下は論文から引用した3x3倍超解像の結果です。
目的
SRCNNではBicubic法で拡大した画像をCNNで処理していたため計算コストが大きい問題がありました。この論文はその計算コストの縮小を図ったものです。
要約
SRCNNを提案したチームが、さらに高速化を行ったFast-SRCNN(FSRCNN)です。ESPCNはsub-pixel convolutionを採用していましたが、FSRCNNはtransposed convolutionを採用しています。どちらも表現能力は変わりません。元のSRCNNのおよそ10倍の速度を出しています。
結果
4x4倍に拡大した画像と実際の高画質画像から計算されたPSNRの各データセットにおける平均値です。
x4 PSNR | Bicubic | SRCNN | FSRCNN |
Set5 | 28.42 | 30.49 | 30.71 |
Set14 | 26.00 | 27.50 | 27.59 |
BSD200 | 25.97 | 26.73 | 26.98 |
以下は論文から引用した3x3倍超解像の結果です。
以上のように、この後はCNNの最終層近くでtransposed convolutionか、sub-pixel convolutionで拡大を行うようになっていきます。
これにより、SRCNNの2つの問題点である、
- Bicubic法で事前に拡大された画像を処理するため計算コストが大きい
- 3層で構成されており、表現能力が乏しい
の一つ目が解決されていきます。
二つ目の
に取り組んだ初期の重要な論文が以下の2つです。単純に層を増加させても学習が不安定になってしまうところを、Residual Learningという手法で防いでいます。
目的
SRCNNは3層で構成されており、表現能力が乏しい問題がありました。この論文は多層化させることで不安定になる学習を安定化させることを目指したものです。
要約
Bicubic法で拡大した画像からの差分だけをCNNに学習させるResidual Learningを提案し、深い層のモデルを用いても学習を安定化させた論文です。差分のみを学習できるようにglobal skip connectionを用いています。
提案内容
CNN自体は3x3の畳み込み層を20枚積んだモデルを提案しています。入力はBicubic法で拡大された画像ですが、モデルの出力にこの拡大された画像を足し合わせて最終出力とすることで、結果的にモデルが「正解画像とBicubic法による拡大画像との差分」のみを学習するように制限をかけています。
Bicubic法は単純なフィルタ処理ですが、それでもある程度補間は行えるため、残った僅かな差分だけを学習させることで、学習を容易にしています。この頃は20層のモデルでもvery deepという名前がついたことに少し感慨を覚えます。
結果
x4 PSNR / SSIM | Bicubic | SRCNN | VDSR |
Set5 | 28.42 / 0.810 | 30.49 / 0.863 | 31.35 / 0.884 |
Set14 | 26.00 / 0.702 | 27.50 / 0.751 | 28.01 / 0.767 |
BSD100 | 24.65 / 0.673 | 25.60 / 0.718 | 27.29 / 0.725 |
Urban100 | 23.14 / 0.658 | 24.52 / 0.722 | 25.18 / 0.752 |
以下は論文から引用した3x3倍超解像の結果です。
目的
SRCNNは3層で構成されており、表現能力が乏しい問題がありました。この論文は多層化させることで不安定になる学習を安定化させることと同時に、多層化によるパラメータ増加を抑えることを図ったものです。
要約
VDSRと同じ著者が同じ会議に提出した論文で、こちらは口頭発表になっています。
基本的にはVDSRと同じくResidual Learningを導入していますが、さらに中間層を再帰構造にさせることでパラメータ数の増加を防いでいます。
提案内容
Residual Learningを導入して Bicubic法と正解画像との差分のみを学習しますが、さらに中間層を再帰構造にしています。最大16回再帰させることで、16枚の超解像画像を生成し、最後にそれらをアンサンブルすることで最終出力を得ています。単純な加算平均ですが、PSNRのように二乗誤差を元にするような指標では、こういった加算平均は大きなズレを抑制し、精度が上昇することが知られています。
結果
x4 PSNR / SSIM | Bicubic | SRCNN | DRCN |
Set5 | 28.42 / 0.810 | 30.49 / 0.863 | 31.53 / 0.885 |
Set14 | 26.00 / 0.702 | 27.50 / 0.751 | 28.02 / 0.767 |
BSD100 | 24.65 / 0.673 | 25.60 / 0.718 | 27.23 / 0.723 |
Urban100 | 23.14 / 0.658 | 24.52 / 0.722 | 25.14 / 0.751 |
以下は論文から引用した4x4倍超解像の結果です。
以上が SRCNNの3層問題を解決した2つの論文でした。
ここまでで、
- 計算効率をあげるために最終層付近で畳み込みベースの拡大を行う
- 層を増やしたほうが精度が上がる。安定化のためにはskip connectionを用いたResidual Learningが良さそう
という 2点が明らかになりました。その結果、これ以降のデファクト・スタンダードとなるSRResNetが誕生することになりました。
Using GAN
と入っていることから明らかなようにこの論文ではGANを使用したモデル、SRGANを主軸に提案しています。それに加えて、Generatorとして一緒に提案されているSRResNetが当時のPSNR / SSIMを大きく向上させた手法だったので、今回はSRResNetに注目した解説を行います。
目的
ESPCNやFSRCNNを経てCNNの後段で拡大することや、VDSRやDRCNによって多層化の知見が得られたため、それらを組み合わせることで高精度な超解像を行います。
要約
Global skip connectionではなく、ResNetのように、モジュール内にskip connectionを組み込んだlocal skip connectionを使用したモデルを提案。最終層付近でsub-pixel convolutionを用いた拡大を行い、その後にもう一度畳み込みを行うことでさらなる補正を行っています。
提案手法
Residual blockと呼ばれる、local skip connectionを導入したモジュールを積み重ねることで、40層近い大規模なネットワークを構築しつつ安定した学習を可能にしたモデルです。
最終層の手前でsub-pixel convolutionによって拡大を行い、最後に9x9の畳み込みで補正をかけたものを最終出力としています。
Residual Learningは導入していませんが、最初の層の直後とsub-pixel convolutionの手前までのskip connectionを導入し、global skip connectionに近い効果を狙っています。
結果
x4 PSNR / SSIM | Bicubic | SRCNN | DRCN | SRResNet |
Set5 | 28.42 / 0.810 | 30.49 / 0.863 | 31.53 / 0.885 | 32.05 / 0.902 |
Set14 | 26.00 / 0.702 | 27.50 / 0.751 | 28.02 / 0.767 | 28.49 / 0.818 |
BSD100 | 24.65 / 0.673 | 25.60 / 0.718 | 27.23 / 0.723 | 27.58 / 0.762 |
以下は論文から引用した4x4倍超解像の結果です。SRGAN という記載のものについては後編で解説いたします。
ここで再びブレイクスルーが発生しているのがわかるかと思います。
このあたりまで来ると、PSNRの上下変動に対して、生成結果の見た目の変動がパッと見では分からず、画像の一部を切り出したものを注視して比較する必要が出てきます。
一方で、層を増やした影響としてリアルタイム処理には不向きになっています。
目的
SRResNetが大きく精度向上をさせられることがわかったため、更に発展させることを目指したものです。
要約
SRResNetから一部の無駄なモジュールを削除しつつ、モデル自体を深さ・広さ共に巨大化させることに成功しました。
提案手法
基本はSRResNetを踏襲しますが、SRResNetではモデル内の1つのモジュールが Conv + BN + ReLU + Conv + BN (+ skip connection)
で構成されていたのに対し、Conv + ReLU + Conv (+ skip connection)
のようにバッチ正規化を除外したモジュールを提案しています。論文内では、除外の理由はバッチ正規化は値の範囲を制限してしまう点で超解像に不向きであると主張されています。また、バッチ正規化を除外したことでGPUのメモリ消費量を40%近く抑えることができたとも主張しています。
また、SRResNetはモジュール数が16、それぞれの畳み込み層のチャンネル数が64だったのに対し、EDSRはモジュール数を32、チャンネル数を256に変更しています。モデルサイズはSRResNetのおよそ30倍にも及びます。モデルサイズを巨大化させて行く風潮を強く感じる論文です。
一方で、バッチ正規化を除外しモデルを巨大化させたため、中間特徴の値が次第に爆発してしまうことがわかりました。そこで、モジュールの最終部に0.1倍の定数スケーリング層を追加しています。これにより学習を安定化させることに成功しました。
結果
x4 PSNR / SSIM | Bicubic | SRResNet | EDSR |
Set5 | 28.42 / 0.810 | 32.05 / 0.891 | 32.46 / 0.897 |
Set14 | 26.00 / 0.702 | 28.53 / 0.780 | 28.80 / 0.788 |
BSD100 | 24.65 / 0.673 | 27.57 / 0.735 | 27.71 / 0.742 |
以下は論文から引用した4x4倍超解像の結果です。+
とついているのは後述するgeometric self-ensembleをおこなったもので見た目の変化はほとんどありませんがPSNRが上がるtest time augmentationです。
目的
ResNetベースのモデルが成功を収めたので、さらに広げてSENetをベースにすることでさらなる大規模化を図ったものです。
要約
さらにモデルを巨大化させます。といってもSRResNetを直接巨大化させるのはEDSRで達成されているので、この論文はresidual in residualモジュールとself-attentionを使用するアプローチを取っています。
結果として400層のネットワークを構成するのに成功しました。一方でforwardにかかる時間も増加しています。
提案手法
Local skip connectionを組み込んだブロックを複数繋げ、それらを一つのグループとみなし、それらを連結させることでモデルを構成しています。各グループにもlocal skip connectionが導入されているので、residual in residual構造と呼ばれています。
さらに各モジュールにはチャンネルベースのself-attention構造を取り入れています。論文内では畳み込みの受容野の小ささによるコンテキスト情報の欠損を防ぐために導入していると主張されています。
また、ablation studyも行われ、residual in residualが性能向上に大きく貢献していることがわかります。一方でattentionによる性能向上は僅かな値程度に留まり、パラメータ数の増加による性能向上との比較が難しいというのが個人的な見解です。
結果
x4 PSNR / SSIM | Bicubic | EDSR | RCAN |
Set5 | 28.42 / 0.810 | 32.46 / 0.897 | 32.63 / 0.900 |
Set14 | 26.00 / 0.702 | 28.80 / 0.788 | 28.87 / 0.789 |
BSD100 | 24.65 / 0.673 | 27.71 / 0.742 | 27.77 / 0.744 |
ここまで結果の表の数字を真剣にご覧になっている方はお気づきかもしれませんが、精度の上がり幅がかなり小さくなってきています。
現時点で4x4倍の単一画像超解像はPSNRの精度において大幅な精度上昇は起きていません。
また、PSNRは1.0変化してようやく人の目にもそれがわかる程度なので、RCANの見栄えが劇的にEDSRに比べてよくなっているわけでもありません。
やはり毎年残っているごく僅かな精度向上を目指して数多くの論文が公開されているのですが、こういった現状を受けて最近は異なる問題設定のタイプの単一画像超解像が登場するようになりました。
次回のTech Blogでそういった論文を紹介していきます。
それでは今回の締めくくりとして、PSNRを高めることを目的とした超解像の訓練Tipsを載せておしまいにしたいと思います。
Tips: PSNRの向上を目的とした超解像モデルの訓練方法
訓練データセット
ImageNet, DIV2Kが使用されていますが、最近はDIV2Kのみが使用されることが多いです。もともと超解像のコンペ用に作成されただけあって、非常に質のいい画像が揃っています。
また、ImageNetで訓練する場合は、数十万枚を使用するケースが多いですが、DIV2Kは800枚の訓練画像でも十分な精度に至ります。そもそもImageNetでもそこまで枚数を必要としないのかもしれませんが、この枚数差は大きいです。
Augmentation
Augmentationにはcropとflipと90, 180, 270度のrotate が使用されます。
Cropのサイズはモデルによってまちまちですが、だいたいのケースでは入力 48x48 -> 出力 96x96, 144x144, 192x192のサイズ感が好まれています。もともとPSNRを高めるためならそこまで画像のコンテキストを厳密に考慮する必要がないので、このサイズ感で問題ないと考えられています。
そこからさらにflip、rotateによって最大8種類の画像を作成して訓練に使用します。
また、test time augmentationとして、flip, rotateで作成した8枚の入力画像をそれぞれ超解像し、その後で再びflipとrotateを適用して元の方向に戻してそれぞれの結果を加算平均する、という手法が存在します。8枚のどれかで一部間違った推論が行われたとしても、残りの7枚との平均計算によって誤差が小さくなり、PSNRが上昇することが期待されます。このtest time augmentationは、geometric enesembleとも呼ばれ、最近の手法でこれを導入していないものはほとんど見ません。
それくらい劇的にPSNRが上昇します(本ブログでの結果の表は全てtest time augmentationを行なっていない時の値です)。
大抵の超解像論文では「Ours, Ours+」のように +
でgeometric ensembleの数値結果を表記するため、モデルの性能評価を行いたいときは geometric ensembleしているもの同士、していないもの同士で比較しなければならないことに十分注意してください。ほぼ間違いなく既存手法の精度を表記する際はgeometric ensembleしていない場合の値が表記されます。
損失関数
PSNRの向上を目的とする場合は現状、二乗誤差もしくは絶対誤差が使用されます。二乗誤差よりは絶対誤差の方が収束の速さから好まれる傾向にあります。ただし、現状のPSNR向上モデルの一つであるRCANは二乗誤差を採用しており、一概にどちらの方が精度が良い、という断言はできません(RCANの著者はGitHubのissueの中で、二乗誤差と絶対誤差の選択は大して精度に影響を与えないがより良い損失関数があるかもしれない、と記載しています)。
初期値
バッチ正規化を除外したままモデルを巨大化していくと特徴のスケールが発散する傾向にあるので、モデルの初期値はガウス分布ではなく、一様分布でスケールを調整したものを使用するのが良いです。
入力正規化
RGBの[0, 255]を単純な割り算で[0, 1], [-1, 1]に正規化する人もいれば、そのまま使用する人、データセットの平均RGBを引いて使用する人もいます。最近は訓練データの平均RGB値だけ引いて、特にスケールは変更しないまま使用するケースが多いです。
評価
PSNRの計算は式が単純なだけにさっと実装しておしまいにしてしまいがちですが、実はフレームワークによって算出される値が異なります。というのも、PSNRは輝度から計算されますが、RGBからYCrCbへの変換式が統一されていないからです。SelfExSRという画像の自己相関を利用した手法に関してGitHubで[著者による実装](https://github.com/jbhuang0604/SelfExSR)が公開されていますが、その中でMATLABによる評価コードが書かれており、これを使用するか、独自で実装した場合は他のモデルの出力結果も自身のプログラムによって再計算するのが良いです。
参考レポジトリ
巨大化してきたモデルの構造を把握するのは実際にコードを見るのが早いという点でこれらの著者実装を眺めてみるのもいいと思います。ただし、どちらも訓練にはある程度のGPUを必要とします。
コンピュータビジョンの最新論文調査 Single Image Super-Resolution 前編
はじめに
こんにちは、AIシステム部でコンピュータビジョンの研究開発をしている中村です。 我々のチームでは、常に最新のコンピュータビジョンに関する論文調査を行い、部内で共有・議論しています。今回はSingle Image Super-Resolutionの前編として中村遵介が調査を行いました。
Single Image Super-Resolutionとは、一枚の画像を入力として受け取り、対応する高画質の画像を推定するもので、日本語では単一画像超解像として知られています。
過去の他タスク編については以下をご参照ください。
目次
論文調査のスコープ
コンピュータビジョンの最新論文調査 Single Image Super-Resolution 編は前編と後編からなり、全体としては、Convolutional Neural Network(CNN)が初めてSingle Image Super-Resolution(SISR)に用いられたSRCNNを皮切りに、CVPR2019で発表された論文までで重要と思われるものをピックアップして調査を行っております。
今回の前編では、「スケールやパラメータを含め縮小方法が既知の画像から、なるべく元の画像に近づくよう高画質な画像を推定する」というタスクに取り組んだ論文を紹介します。
後編では、「縮小方法が完全に未知、もしくは一部未知の画像から、なるべく元の画像に近づくよう高画質な画像を推定する」というものや「元画像にとても近いとは言えなくとも見た目が綺麗になるよう推定する」というタスクに取り組んだ論文を主に紹介する予定です。
前提知識
Single Image Super-Resolution
Single Image Super-Resolution(SISR)は、日本語では単一画像超解像として知られ、一枚の画像を入力として受け取り、対応する高画質の画像を推定するタスクです。
ある低画質画像と対応する高画質画像は複数存在するため、このタスクは解が定まらない不良設定問題として知られています。下の画像は後編で紹介するPhoto-Realistic Single Image Super-Resolution Using a Generative Adversarial Networkより引用したものですが、一つの低画質画像に対応する高画質画像が複数あることを示しています。
不良設定問題の例
そのような中、大量のデータから拡大方法を学習するCNNモデルは、この5年ほどで大きな注目を集めています。大量の低画質画像-高画質画像のペアデータから拡大方法を学習することで、未知の画像であってもかなり綺麗に拡大することが可能になってきました。以下の図は一般的にSISRをCNNで解く際の訓練と推論のイメージ図です。訓練時は高画質画像を縮小して入力し、元の画像を復元するように学習します。前編で紹介する論文は、アンチエイリアスをかけた高画質画像をBicubic法によって1/2, 1/3, 1/4 もしくは 1/8に縮小したものを用いています。
評価方法
今回紹介する手法においては、正解画像と推定画像の「近さ」はPeak Signal-to-Noise Ratio(PSNR)とStructure Similarity Index(SSIM)で評価しています。PSNRは画像の二乗誤差に対数を用いた評価指標で、高ければ高いほどモデルの精度が良いことを示しています。しかしPSNRはあくまで二乗誤差なので、ノイズのようなものをうまく指標に反映できないという欠点があります。そこで、PNSR以外の指標として、注目領域の画素の平均や標準偏差と言った統計情報を使用したSSIMも重要となっています。SSIMは0-1の範囲の指標で、これも高ければ高いほど精度が良いことを示しています。
ただし、どちらも「値は高いが見た目としてはあまりよくない」という結果を生む可能性もあり、絶対的に信頼できる指標ではありません。現状では既存手法との比較のしやすさや他により良い選択肢がないということもあり、これらの指標が採用されています。
関連データセット
学習用
評価用
あるSISRモデルを複数の画像に対してそれぞれ適用した際のPSNRは一般的にばらつきがちです。そのため、数枚の画像で評価をすることが難しく、ほとんどの論文では複数の評価データセットについてそれぞれの平均PSNRを記載して既存手法との相対評価を行います。
論文紹介
SISRは辞書ベースのアプローチが行われていましたが、最近ではCNNを利用したアプローチが盛んになっています。まずはCNNモデルのベースとなった辞書ベースの手法についてその手法を大まかに説明します。
辞書ベース超解像
辞書ベースの手法の大まかな流れは以下のようになっています。
2.において特徴表現を工夫したり6.の最近傍探索においてアルゴリズムを工夫することで、高速な超解像や正確な超解像を行なっていくもの(A+: Adjusted Anchored Neighborhood Regression for Fast Super-Resolution)や、事前に用意する画像群を外部データを利用せず、入力された画像だけから作成する手法などが存在します。最近だとCVPR2015で画像の自己相関を利用したSelfExSR: "Single Image Super-Resolution from Transformed Self-Exemplars"が発表されていたのが記憶に新しいです。
SRCNN: "Image Super-Resolution Using Deep Convolutional Networks"(TPAMI2015)
目的
従来の超解像のうち、辞書ベースに基づいた手法をCNNに置き換えることで高精度化を図りました。
要約
辞書ベースの手法が行なっていた操作を、CNNに置き換えた論文です。初めてSISRにCNNを用いましたが、既に従来手法を大きく上回る精度を達成しました。
提案内容
全体は3層のCNN構造になっています。
損失は、生成結果と正解画像の平均二乗誤差です。CNN内部では拡大を行わず、Bicubic 法で事前に拡大処理したものをCNNで refine するという手法をとっています
結果
4x4倍に拡大した画像と実際の高画質画像から計算されたPSNRの各データセットにおける平均値です。
A+はCNN手法ではなく、辞書ベースのものですが当時の最高手法の1つです。SRCNNがPSNRにおいて高い精度を達成したことを示しています。
以下は論文から引用した3x3倍超解像の結果です。既存手法に比べて鮮明な結果となっています。
問題点
SRCNNはCNNのSISRへの適用ということで注目を浴びた論文でしたが、以下の2つの問題を抱えていました。
そこで、この2つに取り組んだ論文をそれぞれ紹介します。まずは1つ目の計算コストが大きい問題に取り組んだ論文を2つ紹介します。
ESPCN: "Real-Time Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolution Neural"(CVPR2016)
目的
SRCNNではBicubic法で拡大した画像をCNNで処理していたため計算コストが大きい問題がありました。この論文はその計算コストの縮小を図ったものです。
要約
実際の拡大をCNN入力前のBicubic法で行うのではなく、CNNの最終部分でsub-pixel convolutionを導入することで実現しています。これにより、CNN内部のほぼ全てのレイヤで小さなサイズの画像のまま計算を行うことを可能にしました。SRCNNのおよそ4-5倍の速度を出しています。
提案内容
SRCNNで前処理として行なっていたBicubic法を除外し、最終層の9x9の畳み込みをsub-pixel convolutionに置き換えることで最終層で拡大を行います。
sub-pixel convolutionは、width, height方向への拡大を行うのではなく、channel方向にr^2倍の拡大を行います。その後、reshapeとtransposeによってテンソルを変形させ、width, height方向にそれぞれr倍した結果を出力します。
結果
4x4倍に拡大した画像と実際の高画質画像から計算されたPSNRの各データセットにおける平均値です。
以下は論文から引用した3x3倍超解像の結果です。
FSRCNN: "Accelerating the Super-Resolution Convolutional Neural Network"(ECCV2016)
目的
SRCNNではBicubic法で拡大した画像をCNNで処理していたため計算コストが大きい問題がありました。この論文はその計算コストの縮小を図ったものです。
要約
SRCNNを提案したチームが、さらに高速化を行ったFast-SRCNN(FSRCNN)です。ESPCNはsub-pixel convolutionを採用していましたが、FSRCNNはtransposed convolutionを採用しています。どちらも表現能力は変わりません。元のSRCNNのおよそ10倍の速度を出しています。
結果
4x4倍に拡大した画像と実際の高画質画像から計算されたPSNRの各データセットにおける平均値です。
以下は論文から引用した3x3倍超解像の結果です。
以上のように、この後はCNNの最終層近くでtransposed convolutionか、sub-pixel convolutionで拡大を行うようになっていきます。
これにより、SRCNNの2つの問題点である、
の一つ目が解決されていきます。
二つ目の
に取り組んだ初期の重要な論文が以下の2つです。単純に層を増加させても学習が不安定になってしまうところを、Residual Learningという手法で防いでいます。
VDSR: "Accurate Image Super-Resolution Using Very Deep Convolutional Networks"(CVPR2016)
目的
SRCNNは3層で構成されており、表現能力が乏しい問題がありました。この論文は多層化させることで不安定になる学習を安定化させることを目指したものです。
要約
Bicubic法で拡大した画像からの差分だけをCNNに学習させるResidual Learningを提案し、深い層のモデルを用いても学習を安定化させた論文です。差分のみを学習できるようにglobal skip connectionを用いています。
提案内容
CNN自体は3x3の畳み込み層を20枚積んだモデルを提案しています。入力はBicubic法で拡大された画像ですが、モデルの出力にこの拡大された画像を足し合わせて最終出力とすることで、結果的にモデルが「正解画像とBicubic法による拡大画像との差分」のみを学習するように制限をかけています。
Bicubic法は単純なフィルタ処理ですが、それでもある程度補間は行えるため、残った僅かな差分だけを学習させることで、学習を容易にしています。この頃は20層のモデルでもvery deepという名前がついたことに少し感慨を覚えます。
結果
以下は論文から引用した3x3倍超解像の結果です。
DRCN: "Deeply-Recursive Convolutional Network for Image Super-Resolution"(CVPR2016, Oral)
目的
SRCNNは3層で構成されており、表現能力が乏しい問題がありました。この論文は多層化させることで不安定になる学習を安定化させることと同時に、多層化によるパラメータ増加を抑えることを図ったものです。
要約
VDSRと同じ著者が同じ会議に提出した論文で、こちらは口頭発表になっています。
基本的にはVDSRと同じくResidual Learningを導入していますが、さらに中間層を再帰構造にさせることでパラメータ数の増加を防いでいます。
提案内容
Residual Learningを導入して Bicubic法と正解画像との差分のみを学習しますが、さらに中間層を再帰構造にしています。最大16回再帰させることで、16枚の超解像画像を生成し、最後にそれらをアンサンブルすることで最終出力を得ています。単純な加算平均ですが、PSNRのように二乗誤差を元にするような指標では、こういった加算平均は大きなズレを抑制し、精度が上昇することが知られています。
結果
以下は論文から引用した4x4倍超解像の結果です。
以上が SRCNNの3層問題を解決した2つの論文でした。
ここまでで、
という 2点が明らかになりました。その結果、これ以降のデファクト・スタンダードとなるSRResNetが誕生することになりました。
SRResNet: "Photo-Realistic Single Image Super-Resolution using Generative Adversarial Network"(CVPR2017, Oral)
Using GAN
と入っていることから明らかなようにこの論文ではGANを使用したモデル、SRGANを主軸に提案しています。それに加えて、Generatorとして一緒に提案されているSRResNetが当時のPSNR / SSIMを大きく向上させた手法だったので、今回はSRResNetに注目した解説を行います。目的
ESPCNやFSRCNNを経てCNNの後段で拡大することや、VDSRやDRCNによって多層化の知見が得られたため、それらを組み合わせることで高精度な超解像を行います。
要約
Global skip connectionではなく、ResNetのように、モジュール内にskip connectionを組み込んだlocal skip connectionを使用したモデルを提案。最終層付近でsub-pixel convolutionを用いた拡大を行い、その後にもう一度畳み込みを行うことでさらなる補正を行っています。
提案手法
Residual blockと呼ばれる、local skip connectionを導入したモジュールを積み重ねることで、40層近い大規模なネットワークを構築しつつ安定した学習を可能にしたモデルです。
最終層の手前でsub-pixel convolutionによって拡大を行い、最後に9x9の畳み込みで補正をかけたものを最終出力としています。
Residual Learningは導入していませんが、最初の層の直後とsub-pixel convolutionの手前までのskip connectionを導入し、global skip connectionに近い効果を狙っています。
結果
以下は論文から引用した4x4倍超解像の結果です。SRGAN という記載のものについては後編で解説いたします。
ここで再びブレイクスルーが発生しているのがわかるかと思います。
このあたりまで来ると、PSNRの上下変動に対して、生成結果の見た目の変動がパッと見では分からず、画像の一部を切り出したものを注視して比較する必要が出てきます。
一方で、層を増やした影響としてリアルタイム処理には不向きになっています。
EDSR: "Enhanced Deep Residual Networks for Single Image Super-Resolution"(CVPRW2017)
目的
SRResNetが大きく精度向上をさせられることがわかったため、更に発展させることを目指したものです。
要約
SRResNetから一部の無駄なモジュールを削除しつつ、モデル自体を深さ・広さ共に巨大化させることに成功しました。
提案手法
基本はSRResNetを踏襲しますが、SRResNetではモデル内の1つのモジュールが
Conv + BN + ReLU + Conv + BN (+ skip connection)
で構成されていたのに対し、Conv + ReLU + Conv (+ skip connection)
のようにバッチ正規化を除外したモジュールを提案しています。論文内では、除外の理由はバッチ正規化は値の範囲を制限してしまう点で超解像に不向きであると主張されています。また、バッチ正規化を除外したことでGPUのメモリ消費量を40%近く抑えることができたとも主張しています。また、SRResNetはモジュール数が16、それぞれの畳み込み層のチャンネル数が64だったのに対し、EDSRはモジュール数を32、チャンネル数を256に変更しています。モデルサイズはSRResNetのおよそ30倍にも及びます。モデルサイズを巨大化させて行く風潮を強く感じる論文です。
一方で、バッチ正規化を除外しモデルを巨大化させたため、中間特徴の値が次第に爆発してしまうことがわかりました。そこで、モジュールの最終部に0.1倍の定数スケーリング層を追加しています。これにより学習を安定化させることに成功しました。
結果
以下は論文から引用した4x4倍超解像の結果です。
+
とついているのは後述するgeometric self-ensembleをおこなったもので見た目の変化はほとんどありませんがPSNRが上がるtest time augmentationです。RCAN: "Image Super-Resolution Using Very Deep Residual Channel Attention Networks"(ECCV2018)
目的
ResNetベースのモデルが成功を収めたので、さらに広げてSENetをベースにすることでさらなる大規模化を図ったものです。
要約
さらにモデルを巨大化させます。といってもSRResNetを直接巨大化させるのはEDSRで達成されているので、この論文はresidual in residualモジュールとself-attentionを使用するアプローチを取っています。
結果として400層のネットワークを構成するのに成功しました。一方でforwardにかかる時間も増加しています。
提案手法
Local skip connectionを組み込んだブロックを複数繋げ、それらを一つのグループとみなし、それらを連結させることでモデルを構成しています。各グループにもlocal skip connectionが導入されているので、residual in residual構造と呼ばれています。
さらに各モジュールにはチャンネルベースのself-attention構造を取り入れています。論文内では畳み込みの受容野の小ささによるコンテキスト情報の欠損を防ぐために導入していると主張されています。
また、ablation studyも行われ、residual in residualが性能向上に大きく貢献していることがわかります。一方でattentionによる性能向上は僅かな値程度に留まり、パラメータ数の増加による性能向上との比較が難しいというのが個人的な見解です。
結果
ここまで結果の表の数字を真剣にご覧になっている方はお気づきかもしれませんが、精度の上がり幅がかなり小さくなってきています。
現時点で4x4倍の単一画像超解像はPSNRの精度において大幅な精度上昇は起きていません。
また、PSNRは1.0変化してようやく人の目にもそれがわかる程度なので、RCANの見栄えが劇的にEDSRに比べてよくなっているわけでもありません。
やはり毎年残っているごく僅かな精度向上を目指して数多くの論文が公開されているのですが、こういった現状を受けて最近は異なる問題設定のタイプの単一画像超解像が登場するようになりました。
次回のTech Blogでそういった論文を紹介していきます。
それでは今回の締めくくりとして、PSNRを高めることを目的とした超解像の訓練Tipsを載せておしまいにしたいと思います。
Tips: PSNRの向上を目的とした超解像モデルの訓練方法
訓練データセット
ImageNet, DIV2Kが使用されていますが、最近はDIV2Kのみが使用されることが多いです。もともと超解像のコンペ用に作成されただけあって、非常に質のいい画像が揃っています。
また、ImageNetで訓練する場合は、数十万枚を使用するケースが多いですが、DIV2Kは800枚の訓練画像でも十分な精度に至ります。そもそもImageNetでもそこまで枚数を必要としないのかもしれませんが、この枚数差は大きいです。
Augmentation
Augmentationにはcropとflipと90, 180, 270度のrotate が使用されます。
Cropのサイズはモデルによってまちまちですが、だいたいのケースでは入力 48x48 -> 出力 96x96, 144x144, 192x192のサイズ感が好まれています。もともとPSNRを高めるためならそこまで画像のコンテキストを厳密に考慮する必要がないので、このサイズ感で問題ないと考えられています。
そこからさらにflip、rotateによって最大8種類の画像を作成して訓練に使用します。
また、test time augmentationとして、flip, rotateで作成した8枚の入力画像をそれぞれ超解像し、その後で再びflipとrotateを適用して元の方向に戻してそれぞれの結果を加算平均する、という手法が存在します。8枚のどれかで一部間違った推論が行われたとしても、残りの7枚との平均計算によって誤差が小さくなり、PSNRが上昇することが期待されます。このtest time augmentationは、geometric enesembleとも呼ばれ、最近の手法でこれを導入していないものはほとんど見ません。
それくらい劇的にPSNRが上昇します(本ブログでの結果の表は全てtest time augmentationを行なっていない時の値です)。
大抵の超解像論文では「Ours, Ours+」のように
+
でgeometric ensembleの数値結果を表記するため、モデルの性能評価を行いたいときは geometric ensembleしているもの同士、していないもの同士で比較しなければならないことに十分注意してください。ほぼ間違いなく既存手法の精度を表記する際はgeometric ensembleしていない場合の値が表記されます。損失関数
PSNRの向上を目的とする場合は現状、二乗誤差もしくは絶対誤差が使用されます。二乗誤差よりは絶対誤差の方が収束の速さから好まれる傾向にあります。ただし、現状のPSNR向上モデルの一つであるRCANは二乗誤差を採用しており、一概にどちらの方が精度が良い、という断言はできません(RCANの著者はGitHubのissueの中で、二乗誤差と絶対誤差の選択は大して精度に影響を与えないがより良い損失関数があるかもしれない、と記載しています)。
初期値
バッチ正規化を除外したままモデルを巨大化していくと特徴のスケールが発散する傾向にあるので、モデルの初期値はガウス分布ではなく、一様分布でスケールを調整したものを使用するのが良いです。
入力正規化
RGBの[0, 255]を単純な割り算で[0, 1], [-1, 1]に正規化する人もいれば、そのまま使用する人、データセットの平均RGBを引いて使用する人もいます。最近は訓練データの平均RGB値だけ引いて、特にスケールは変更しないまま使用するケースが多いです。
評価
PSNRの計算は式が単純なだけにさっと実装しておしまいにしてしまいがちですが、実はフレームワークによって算出される値が異なります。というのも、PSNRは輝度から計算されますが、RGBからYCrCbへの変換式が統一されていないからです。SelfExSRという画像の自己相関を利用した手法に関してGitHubで[著者による実装](https://github.com/jbhuang0604/SelfExSR)が公開されていますが、その中でMATLABによる評価コードが書かれており、これを使用するか、独自で実装した場合は他のモデルの出力結果も自身のプログラムによって再計算するのが良いです。
参考レポジトリ
巨大化してきたモデルの構造を把握するのは実際にコードを見るのが早いという点でこれらの著者実装を眺めてみるのもいいと思います。ただし、どちらも訓練にはある程度のGPUを必要とします。