こんにちは,DSOC R&Dグループ インターン生の内田です. 最近自宅にスタンディングデスクを導入したのを皮切りに,家具に無限にお金が溶けていっています. 季節と共に財布も寒くなってきています… 皆さんは暖かくしてください…
さて,今回は新しいスタンディングデスクで週末に遊んでいたDeep Network Interpolation[*1]について,超解像と絡めて紹介したいと思います.
Perception-Distortion Tradeoff
Perception-Distortion Tradeoff[*2]とは,超解像における知覚的品質とMSE(Mean Squared Error)やSSIM(Structural Similarity)のようなメトリックの間に存在するトレードオフのことを指します.
一般的なメトリックは,比較対象と完全に一致する場合に最大 or 最小となるように設計されているおり,これらを最適化してやれば知覚的品質は向上していくという直感を抱きます. しかし,この直感は当たらないことが経験的に知られており,具体的には 過去の連載 で述べたように,メトリックが優位であるにも関わらずGANを用いたモデルに比べてテクスチャの情報が失われるという現象が見られます.
このような現象に対し,Baluらは下図のようなPerception-Distortion Tradeoffが存在していることを理論的に示しました. また最適化の際,Adversarial lossの係数を調整することでトレードオフのLower boundを横断できることが示されました.
Blauの発表スライド*3のTake-home messagesには次のような言葉があります.
The "optimal algorithm" is application dependent.
つまり,「『自然さ』と『正確さ』のバランスはタスク毎に調整してね」ということです. 医療画像では正確さが重要なので係数を低く設定し,フォトアルバムの画像では自然であることが重要なので係数を高く設定するみたいな感じです.
Deep Network Interpolation
先で述べたように,最適なアルゴリズムは応用依存であり,最適なアルゴリズムを定めるにはAdversarial lossの係数をチューニングする必要があります. ただでさえ学習が不安定で時間もかかるGANの学習を,タスク毎に係数をなめていくのはなかなか気が重い話です*4.
CVPR2019で提案されたDeep Network Interpolation (DNI) は,そんな気の進まないチューニングを簡易的に行える手法です. 以下では,DNIについて解説・デモを行います.デモにはPyTorchを用い,コードは下記に置いてあります. github.com
手法
DNIは,複数の学習済みモデルをパラメータ空間上で線形補間することで,出力画像を連続的に変化させる手法です. 具体的には,最適化対象の異なる2つのネットワーク , (構造は共通)のパラメータ,を次のように補間します*5. $$ \theta_{interp} = \alpha \theta_A + (1-\alpha) \theta_B $$ ここで ] です. をパラメータに持つネットワークの出力画像は,の値によって から の出力へと連続的に変化します. 超解像においては, , にそれぞれ知覚的品質志向のモデルとメトリック志向のモデルを用意しておくことで,簡易的にPerception-Distortion Tradeoffを横断して動作点を定めることができます.
条件
DNIが利用できる条件は次のようになっています.
- ネットワーク構造が共通していること.
- ,が解くタスクに関連性があり,共通の重みからファインチューニングできること.
前者は対応するパラメータが両方のモデルに存在していなければならないためです. 後者については,以下で図を交えて見ていきます.
モデルをスクラッチで学習する場合,初期値はランダムなので各フィルタの担当する役割もランダムに振り分けられることになります. 対してファインチューニングを行う場合,大体役割が決まった状態からのスタートになるので,程度の違いはあれど似たようなフィルタが同じ位置で獲得できます. Denoisingを学習したモデルのフィルタを可視化した例を,次に示します.
図中のN20 run1
とN20 run2
はそれぞれ同じノイズレベルをスクラッチで学習したモデルです.
a-e
やc-f
のような似たフィルタが学習されていますが,位置が異なっており単純な補間を行うことはできません.
N60 fine-tuned
はN20 run1
を初期値として異なるノイズレベルを学習したモデルであり,同じ位置に似たフィルタが学習されることがわかります.
この性質を利用してN20 run1
とN60 fine-tuned
を補間すると,中間ノイズレベルを実際に学習したフィルタと近いフィルタが得られます.
図中のグラフは,各フィルタとN20のフィルタとの相関係数的なものを示しており,学習で得られるフィルタとDNIで得られるフィルタが近いことを示しています.
デモ
今回はopen-mmlab/MMSRが提供する学習済みモデルを利用して,DNIによるPerception-Distortion Tradeoffの横断をやってみます.
以下では,知覚的品質志向のモデルをRRDB_ESRGAN
,メトリック志向のモデルをRRDB_PSNR
と呼称します.
DNIをPyTorchで書くと次のようになります.
PyTorchの重みはOrderedDict
で格納されていているため,netA
とnetB
を補間して新しいOrderedDict
を返してやればDNIの処理は終了です.
def interpolate_network(netA, netB, alpha): net_interp = OrderedDict() for k in netA.keys(): v_A, v_B = netA[k], netB[k] net_interp[k.replace('module.', '')] = alpha * v_A + (1 - alpha) * v_B return net_interp
netA
をRRDB_ESRGAN
,netB
をRRDB_PSNR
として,alpha
を0.1刻みで0から1まで変化させた結果を次のGIF画像で示します.
alpha
が増えるにつれてテクスチャの情報が増えていきますが,それと同時にRMSEが上昇していくのが確認できます.
GIFの上部に表示されている指標をプロットした結果を次に示します. RMSEはDistortion,NIQEはPerceptionに相当*7し,両者ともに低いほうが良い指標になります. 結果を見るといい感じにPerception-Distortion Tradeoffを横断できる結果となりました.
まとめ
今回はPerception-Distortion Tradeoffを簡易的に横断する手法としてDeep Network Interpolationを紹介しました. 学習済みモデルを利用したデモで実際にトレードオフを横断できることを確認しました.
個人の所感として,弊社で取り扱う名刺データにおいてはテクスチャ情報はさほど重要とならないため,超解像タスクとしてDNIを使う必要はないと考えています. 一方でDNIは様々な画像生成タスクに応用可能なため,例えば名刺のホワイトニング処理では,名刺のベースカラーなどによって処理の強さを調整するケースなども考えられるため,うまく使える部分を模索中です.
*1:Wang, Xintao, et al. "Deep network interpolation for continuous imagery effect transition." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019.
*2:Blau, Yochai, and Tomer Michaeli. "The perception-distortion tradeoff." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.
*3:https://www.youtube.com/watch?v=3Oetx8DCUCA
*4:個人の意見です.
*5:係数の和を1とすれば3つ以上でも構いません
*6:Zeyde, Roman, Michael Elad, and Matan Protter. "On single image scale-up using sparse-representations." International conference on curves and surfaces. Springer, Berlin, Heidelberg, 2010.
*7:NIQEなどの知覚的指標は,画像単体での品質を図るもので画像復元問題には適さず,さらに微分可能でないため直接的に誤差関数として用いることはできません.