ココアのお勉強ブログ

技術職の一般人です。趣味でコード書いたりソフト触ったり。

Unsupervised Learning of Probably Symmetric Deformable 3D Objects from Images in the Wild 自分用メモ

論文リンク

https://arxiv.org/abs/1911.11130

注意

3Dの知識全くなく、もちろん3D画像生成の論文自体初めて読んだので信憑性がかなり低いかもしれないので過信しないで下さい。

どんな論文?

CVPR2020 Best Paper Award
(3D情報が一切ない)単一の画像の学習データから3次元変形可能なオブジェクトの生成を学習する手法の提案をしている。
入力画像をDepth、Albedo、Viewpoint、 Illumination(light)に分解するAutoEncoderを用いている。
これらの要素を教師なしで分解するために、入力画像が対称構造を持っているという前提事実を利用している。
本手法を用いることで、人の顔、猫の顔、車の3次元形状を、教師なしで正確に生成できることを示した。
教師ありで用いる他の手法と比較して、優れた精度を確認している。

3Dの知識が一切ないので調べて理解した程度だが

「深度」は奥行の情報 (図はhttps://solidthinking.com/help/Evolve/2017.3/macosx/ja/depth_of_field.html より)

「Albedo」は光の反射率 (図はhttps://tech.cygames.co.jp/archives/2129/ より)

「view point」はよく分からないけど普通にどの視点から見たオブジェクトかという情報のこと? https://www.eplan.help/help/platform/2.7/ja-JP/help/EPLAN_Help.htm#htm/Glossary_o_3d_blickpunkte.html

「illumination(light)」は多分光源情報のこと。

技術のキモ

以下の図は提案しているPhoto-geometric autoencodingの全体図。

入力画像IをDepth、Albedo、Viewpoint、 Illumination(light)に分解していることが分かる。
confというものが出てくるがこれは画像内で各ピクセルに対して対称的な対応を持つピクセルの確率(信頼度スコア)を表しているという。
同じ入力画像Iから,ネットワークを使用して,2つの信頼度マップσ,、σ'を推定します。
この信頼度マップにより、モデルは入力画像のどの部分が対称ではないかを学習できるらしいです。
例えば図に示すように、人の髪の毛は対称性があまりなく、σ'は、対称性の仮定が満たされていない髪の毛の領域に、高い不確かさを表します。

ネットワーク

ネットワークを見るため著者実装の中を覗いてみる。

# Depth用のAutoEncoder
self.netD = networks.EDDeconv(cin=3, cout=1, nf=64, zdim=256, activation=None)
# Albedo用のAutoEncoder
self.netA = networks.EDDeconv(cin=3, cout=3, nf=64, zdim=256)
# Light用のEncoder
self.netL = networks.Encoder(cin=3, cout=4, nf=32)
# View用のEncoder
self.netV = networks.Encoder(cin=3, cout=6, nf=32)
# conf用のAutoEncoder
self.netC = networks.ConfNet(cin=3, cout=2, nf=64, zdim=128)

行数が半端なくなるので、各ネットワークの構造はhttps://github.com/elliottwu/unsup3d/blob/master/unsup3d/networks.py#L9-L137 を見てください。

流れ

まず入力画像からDepth、Albedo、Viewpoint、 Illumination(light)に分解します。
詳しいことはよく分かりませんが、depthとlightの情報からshadingという立体的な構造(多分3D?)を作成し、albedoの情報を加えることでshadingに顔のテクスチャを情報を貼ったような感じにしたcanonical viewというものを出力します(light(照明)に比べてalbedoは対象であることが多いためテクスチャのように扱うのが良いということが論文のDisscusionに書いてあったような気がする)。
その後viewpoint、depth、canonical view をRendererに通しレンダリングします。
レンダリングって何か知らないけど3Dモデルをイメージとして出力することっぽいです。

この論文のキモである対称性を利用します。
以下の図のようにdepthとalbedoを反転して同じことをします。

最終的な出力は入力した画像の再構成画像になっているべきです。
なので入力画像と出力画像を再構成損失で評価できることになります
また先程説明したconfも再構成損失に適用します。

損失関数

再構成損失は以下で定義される。

そして全体の損失関数は以下で定義される。

ここでI'は反転を入れた時の再構成画像。
論文ではλ=0.5としてある。
L1損失(|\hat{I}-I|)は、ぼやけた画像を再構成にする傾向があるためPerceptual lossという損失関数も追加したという。
論文を読んでもあまり詳しくは分からなかったが、VGG16(pretrain-model)を新しいEncoderとして追加し、encodeしたものを差分の絶対値を求める。
それを以下のperceptual lossに適用する。
kと書いてあるのはk層目の出力を意味している。この論文ではVGG16のrelu3_3の特徴だけで十分な結果が出たという。

これを先の再構成損失に加える。

論文ではλ_p=1としてある。

結果

感想

3Dもうちょっと基礎的なこと勉強してから読めばよかったです。

参考

GitHub - elliottwu/unsup3d: (CVPR'20 Oral) Unsupervised Learning of Probably Symmetric Deformable 3D Objects from Images in the Wild
https://www.youtube.com/watch?v=5rPJyrU-WE4

その他

論文ではレンダラーとして微分可能レンダリング × 深層学習であるNeural 3D mesh rendererを用いていた。
以下の研究動向を見るのが良さそう。
docs.google.com