Interactive Reconstruction of Monte Carlo Image Sequences using a Recurrent Denoising Autoencoderについて

DL分野は全くの素人なのですが、これをスルーすることは出来ないので、読んでみました。(ひどく)間違っていたら教えてください。
なので、以下は私的メモです。

参照

Interactive Reconstruction of Monte Carlo Image Sequences using a Recurrent Denoising Autoencoder
http://research.nvidia.com/sites/default/files/publications/dnn_denoise_author.pdf

Autoencoderについて

最近の画像処理系では、定番らしい。
3×3 spatial supportのCNNとMaxPoolingを使って、解像度を半分に下げながら、Featureを増加させていく。こうすることで、大きなsupportのCNNを用いなくても、画像のローカルな部分と、グローバルな部分の両方の特徴を学習できると思われる。
ちなみに、この論文では、すべてのConvolutionが3×3 spatial supportで行われている。前後で解像度が変わらないので、Feature Mapの境界では何らかのPaddingがされている模様。

Skip connectionについて

Autoencoderのみではどうしても消失しがちな画像のディテールを保つために、EncoderとDecoderのステージを飛び越えてネットワークを接続する。具体的には、Decode時に、Decodeする解像度と同一のEncode時のFeatureMapをにコピーしてFeatureとして付け加えて、Convolutionにかける。こうすることで、Encode時にMaxPoolingすることで失われたディティールをDecode時に取り込むことができる。
Skip connectionがあるためか、Decode時は、各解像度でConvolutionが2回行われる。

RNNについて

Encode時にRNNのフィードバックを備えている。これは、レンダリング画像を一連のシーケンスとして認識して、Temporally Stableなフィルタ結果が必要だからとともに、入力に、疎なレイトレーシング画像を想定しているので、RNNにより、過去のフレームよりライティングの情報を集めることができるため。
Recurrent Blockが全てのEncoderブロックに配置されているのは、Skip Connectionがあるため、低解像度のみにRecurrent Blockを付けても、Recurrent Bockを通らない多数のFeatureが出力に伝達するため、うまくいかない。
各Recurrent Blockは、3層のConvolutionで構成されており、1層目が終わったあと、前のフレームの隠れ層、すなわち、前のフレームのEncode時の同じ解像度のFeature Mapと接続(おそらく加算)される。(実は、なぜ1層目がReccurent Blockに所属するのかはよくわからない。3×3 spatial support のConvolutionならば、Encode層の最初のConvolution(Feed forward block)と区別がつかないはずだが。)

Network Sizeについて

Fig.2の見た目は比較的単純だが、合計36のConvolution Layerで構成されている。
Feed forward path (7 in Encoder, 10 in decoder, 1 output layer)とRecursive blockが各Encoderステージに3層ある。(18 layer in total)
Featureは、Encoderの最初のステージの出力を32 featureに設定して、ステージごとに4/3倍している。こうすると、ステージごとにFeature Mapの大きさは、1/3となる。学習可能なパラメーターは合計で3.2millionある。(これは自分の計算と合わない。根本的に理解できてないかも。)

LossFunctionについて

3つのLossFucntionを組み合わせて使っている。
一つは、Lsと呼ぶ、単純な色の差の平均。ただし計算前にGamma2.4をかけている。こうすることで、より低い輝度の、人の目につく部分にペナルティを課している。
二つ目(Lg)は、Gradient DomainのL1で、HFEN(High Frequency Error Norm)を算出して、L1を計算する。画像をそのまま使うとNoiseにセンシティブに反応してしまうので、事前にGaussian Filterで平滑化してから計算する。
3つ目(Lt)は時間方向のPixelの輝度変化をリファレンスと出力それぞれで計算し、その差分を計算してL1を計算する。こうすることで、時間方向での輝度変化のずれにペナルティを課す事ができる。
これら3つをそれぞれLs, Lg, Ltにウエイト0.8, 0.1, 0.1を乗算したものをLoss Functionとしている。
さらに、学習は7フレームを一つのシーケンスとして行っており、RNNブロックの学習にインセンティブを与えるため、Loss Functionは後半のフレームになるにしたがって、大きなLossとなるようにスケーリングしてある。

入力データについて

入力は、1sppのレイトレ画像のカラーとDepth,Normal,Roughnessが与えられる。Normalは2チャンネルで格納し、合計7チャンネルとなる。カラーは、事前に直接見えているMaterialのAlbedoを逆に適用して、テクスチャのディテールを取り除いて学習に使う。Inferenceの際も同様に行い、最後にAlbedoでModulationしたものを最終結果とする。レイトレ画像は、NEEを用い、Direct一回と、1 bounce一回のみ。リファレンスは、時間をかけてレンダリングした画像を用いる。ネットワークが特定の条件のみを学習しないように、ランダムな領域の128×128をcropして、7フレームを一つのシーケンスとして学習させる。さらに、逆再生や、回転させた画像などを入力して、様々な状況に対応できるようにする。

まとめ

ゲームのようなリアルタイム性ででInferenceするには大きいネットワークだと思いましたが、論文にも示されている通り、これ以上小さいネットワークでは、少なくともこのネットワークの形では、品質を保ったまま高速化するのは難しいので、あとはGPU頑張れと感じました。オフラインレンダリングのプレビューなどでは十分現実的な速さで適用可能なので、実用性は十分にあると感じます。法線の情報がViewSpaceのXY成分なので、少々気になりましたが、DLなので最終結果には影響がないかもしれません。

広告