CVIM & PRMU 研究会 チュートリアル
微分可能レンダリング
2022-03-10
加藤 大晴 (Preferred Networks)
1
入力: 2D画像
出力: 3Dモデル
2D画像
ニューラル�ネットワーク
微分可能
レンダリング
誤差
最適化
Example from [Kato+ 2018]
自己紹介
加藤大晴(かとうひろはる)
#2
目次
#3
たくさんの画像から3Dモデルをつくりたい
#4
観測画像 (2D)
ほしいもの (3D)
たくさんの画像から3Dモデルをつくりたい
#5
観測画像 (2D)
ほしいもの (3D)
カメラ姿勢は既知であると仮定
典型的な方法
特徴点を検出し,画像間で対応点を探し,� 三角測量で3D空間での位置を求める
微分可能レンダリング
”観測画像のように見える” 3Dモデルを最適化で直接求める
たくさんの画像から3Dモデルをつくりたい
#6
観測画像 (2D)
ほしいもの (3D)
”観測画像のように見える” 3Dモデルを求める
3Dモデル π はどう “見える” か?
→ レンダリングして画像に変換してみればよい
3Dモデルをレンダリングして画像にする関数を R とすると,
見え方 I’ = R(π)
と書くことができる
2D画像
たくさんの画像から3Dモデルをつくりたい
#7
観測画像 (2D)
ほしいもの (3D)
”観測画像のように見える” 3Dモデルを求める
その見え方 I’ は “観測画像 I のように見える” か?
→ 画像同士の違いを測る適当な方法を使えばよい
画像同士の距離を測る関数 L を用いて
観測画像のように見えない度 = L(I, I’)
と書くことができる
たくさんの画像から3Dモデルをつくりたい
#8
観測画像 (2D)
ほしいもの (3D)
”観測画像のように見える” 3Dモデルを求める
結局,観測画像のように見える3Dモデル π* は
π* = argminπ L(I, I’) = argminπ L(I, R(π))
と書くことができる
3Dモデルを�レンダリングした画像
観測画像
画像の違い
たくさんの画像から3Dモデルをつくりたい
#9
観測画像 (2D)
ほしいもの (3D)
そのような π* をどうやって求めるか?
素朴に考えると,適当な初期値 π から勾配法で最適化したい
更新式: π ← π - μ ∂L/∂π = π - μ (∂L/∂R)(∂R/∂π)
距離関数 L が微分可能であると仮定すると,
∂R/∂π つまり “レンダリング関数 R を3Dモデル π で微分した値” さえわかればよい
→ 微分可能レンダリング
NeRF: Neural Radiance Fields
#10
ニューラルネットワークで表される3Dシーン π と
微分可能なボリュームレンダリング関数 R で驚異的な性能を達成
入力画像
得られたもの
詳細は後述
PFN 3D Scanner (公式ページ)
#11
PR
目次
#12
微分可能レンダリングとは
#13
∂ピクセル/∂3D形状
∂ピクセル/∂物性・色
∂ピクセル/∂照明
∂ピクセル/∂カメラ
微分可能レンダリング
(Differentiable rendering, DR)
→ これらが提供されるレンダリング関数
3D形状
物性・色
照明
カメラ
3Dシーン
レンダリング
2D画像(ピクセル)
微分可能レンダリングによる3Dシーンの最適化
#14
∂ピクセル/∂3D形状
∂ピクセル/∂物性・色
∂ピクセル/∂照明
∂ピクセル/∂カメラ
3Dシーン
2D画像
なんらかの
目的関数
評価値
これらがわかると,画像の “良さ” を高めるように,�3Dシーンのパラメータを勾配法で最適化できる
最適化
“良さ” を計算
レンダリング
物体の3D位置の最適化
#15
レンダリングされた画像
誤差
与えられたターゲット画像に似るように物体の3D位置を最適化
(∂誤差/∂物体の位置) を使って�3D位置を勾配降下法で最適化
ターゲット画像
物体の3D位置
その他シーン情報
最適化中の様子
照明とカメラの位置の最適化
#16
3D形状とテクスチャの最適化
#17
クルマの3D位置推定
#18
クルマの
カメラに映っているクルマは何メートル先にあるのか?
(Preferred Networks, TRI, Woven の共同研究)
誤差
レンダリング
最適化
PR
複雑な評価関数を使った最適化
#19
評価関数はターゲット画像との平均二乗誤差ではなく
微分可能な関数 (ニューラルネットワーク etc.) が出力するなにかでもよい
3Dシーン
2D画像
評価値
最適化
NN
微分可能
レンダリング
New!
画像のスタイルを3Dモデルへ転移
#20
3Dシーン
評価値
最適化
画像のスタイルの近さを測るNN
最適化結果
2D画像
ニューラルネットが苦手なケースを探す
#21
3Dモデル,�ライティング
レンダリング
最小化
画像
訓練済みの
ニューラルネット
標識だと
思う度
標識だと認識されるものについて,
光の当て方を変えて,そう認識されないようにする
初期状態:
標識と認識
最適化後:
給水塔と認識
3D ディープドリーム
#22
3Dシーン
なにかが�映っている度
最適化
画像識別器
最適化結果
2D画像
SKIP
微分可能レンダリングを用いた3D推定の弱点
#23
写真を見せるだけでなんでも3Dにできるようになる? → そうはならない
3Dシーンの最適化 まとめ
#24
3Dシーン
2D画像
なんらかの
目的関数
評価値
最適化
目次
#25
ディープラーニングは微分可能な層の組み合わせ
#26
最初の層 W
なんらかの層
なんらかの層
犬度
イヌ画像に対して高い「犬度」を出力するように�ニューラルネットワークを学習したい
最初の層がパラメータ W を持つとすると
W ← W + μ ∂犬度/∂W
という形でパラメータを更新する
∂犬度/∂W を計算するには、後続の層すべてが
微分可能である(勾配が計算できる)必要がある
逆に,微分可能な処理ならばだいたい何でも
ディープラーニングの層として使うことができる
Wを少し変えたとき
犬度はどう変わるか?
深層学習とつなげる
#27
微分可能レンダリングで,3Dシーンのパラメータではなく
3Dシーンを出力するニューラルネットワーク (NN) も最適化できる
3Dシーン
2D画像
ターゲット画像との差
最適化
なにか
NN
New!
New!
微分可能
レンダリング
一般化したパイプライン
#28
2D画像
評価値
微分可能
レンダリング
NNの画像認識�モジュールなど
最適化
3Dシーン
NNのシーン生成�モジュールなど
なんらかの入力
最適化
微分可能レンダリングは巨大なNNを構成するモジュールのひとつとみなせる
SKIP
教師付き学習による3D推定
#29
画像から3Dモデルを推定する NN を考える
素直な方法は {2D画像, 3Dモデル} の学習データを用いた教師付き学習
予測された
3Dモデル
2D画像
NNなど
予測誤差
正解の
3Dモデル
誤差が小さくなるように最適化
教師付き学習はデータセット作成が大変
#30
{2D画像, 3Dモデル} のデータの作成は
似た形のものをデータベースから選び画像にフィッティング [Xiang+ 2014]
3Dモデルを使わずに学習したい
そこで微分可能レンダリング
#31
レンダリングを介することで2D画像を教師データとして使うことができる
予測された
2D画像
予測された3Dモデル
予測誤差
正解の2D画像
2D画像
NN
レンダリング
学習データを作成するコストが下がる
正解の3Dモデル
予測誤差
3D再構成を2D画像から学習
#32
学習データ = {物体をいろいろな視点から見た画像, レンダリングのためのカメラ情報}
3Dシーン
差
最適化
3D推定NN
ターゲット画像
画像
2D画像
典型的なユースケース
#33
画像から3D構造を推定するニューラルネットワークを学習したいが
場合に,代わりにレンダリングされた画像を学習に使うことで
を目指す
SKIP
パラメトリック形状モデル
#34
3D構造を推定するNNが簡単に設計できるとカンタン
例: 身体や手については,いくつかのパラメータを受け取り形状・ポーズを出力するモデルが広く用いられている
NNはそのパラメータを予測すればよい
MANO hand model [Romero+ 2017]
SMPL body model [Loper+ 2015]
身体の3D再構成
#35
キーポイントと
シルエットを推定
人体モデルの変形
パラメータの推定
レンダリングして
合っているかを確認
手のポーズの推定
#36
手のスケルトンを学習データとして�使えるが,それは粗い情報しか含まない
2D画像の手のシルエットを追加の�教師情報として用いることで性能向上
入力
シルエットを使わない
学習の結果
シルエット使用
ニューラル形状生成モデル
#37
複雑な形状を球の頂点の位置を動かすことで生成可能 [Kato+ 2018] [Wang+ 2018]
Graph Convolution, AtlasNet [Groueix+ 2018], 頂点の逐次的な生成 [Nash+ 2020] など
物体の3D再構成の学習
#38
入力
出力
パラメトリック生成モデルがない物体カテゴリも扱える
3D形状,照明,テクスチャ画像を推定するNN
レンダリングした画像を入力画像と近付ける,という基準で学習
3D再構成の例
深度推定による顔画像の3D化
#39
顔画像の集合だけから3D形状 (= 深度),色,視点,照明推定を学習
画像さえあれば追加情報が不要なので�いろいろな物体カテゴリ(e.g. ネコ)に適用可
[Wu+ 2021] ほか [Zhou+ 2020] など
教師データをどこまで減らせるか?
#40
物体を複数の視点から見た画像,
視点情報,シルエット�[Kato+ 2018]
物体をひとつの視点から見た画像だけ
入力画像
[Kato+ 2018]
[Kato & Harada 2019a]
入力画像
出力
学習データ
入力画像
出力
PR
SKIP
3D再構成の学習 まとめ
目次
#42
NeRF によるビュー補間
#43
これまで紹介した手法のほとんどは,3D表現としてメッシュを用いていた
NeRF は neural radiance field という3D表現を用いる
σ = NNσ(p), c = NNc(p, d)
ニューラルネットで複雑なシーンを柔軟に表現できる
p にモノがありそう度
3D座標
p の色
見ている向き
NeRFの最適化
#44
後述
NeRFによるビュー補間
#45
観測画像
観測にない視点からレンダリング
NNを最適化
NeRFによるビュー補間
#46
視点によって
見え方が変わる
動画への拡張
#47
静止した NeRF
σ = NNσ(q)
c = NNc(q, d)
に加えて,その変形を最適化
q = NNq(p, t)
各フレームでの3D座標
時刻
静止した空間�での3D座標
動画への拡張
#48
SKIP
撮影条件が揃っていない写真からのNeRF
#49
街のNeRF
#50
カメラポーズの最適化
#51
SKIP
NeRFの問題点
#52
レンダリングに時間がかかる
最適化に時間がかかる
ジオメトリが不正確
たくさんの視点からの画像が必要
ある点にモノがあるかは NN に�問い合わせないとわからない
モノがありそう度の
閾値の決定が難しい
レンダリングの高速化
#53
シーンを大きな NN 1つで表すのではなく
グリッドごとに小さな NN を持つことで
レンダリングを2500倍高速化
まず普通の NeRF を得てから
その知識を転移する ← 最適化は速くならない
最適化の高速化
#54
NeRF の NN
σ = NNσ(p)
は p をいい感じの特徴量に変換するのに時間をかけている
ハッシュ化とグリッドを駆使して p を前処理しておくことで NN を小さくでき,最適化を4時間から5秒にまで高速化
3D座標
ジオメトリの精緻化
#55
σ = NNσ(p)
とすると,「モノがありそう度」から�表面の位置を求める閾値の設定が難しい
NN の出力が「モノがありそう度」と�「SDF」(出力がゼロのところが表面) の�両方の役割を果たすようなパラメタ化を行うことで,表面の位置を精緻に表現
p にモノがありそう度
SKIP
画像枚数が少ないときのNeRF
#56
入力枚数が少ないとき「そのシーンを表すNeRF」の�最適化は自由度が高すぎて困難
数枚の画像から NeRF を生成する NN を
いろいろなシーンを使って事前に学習しておく
Input (3 views)
PixelNeRF
NeRF
画像枚数が少ないときのNeRF
#57
3D再構成の学習でメッシュを NeRF に置き換えたものと解釈できる
NN
NeRF
レンダリングされた画像
誤差
最適化
NN
微分可能
レンダリング
誤差
最適化
微分可能
レンダリング
NeRFによるビュー補間 まとめ
#58
目次
#59
ラスタライズ vs 物理ベースレンダリング
ラスタライズに基づくレンダリングは高速で深層学習と組み合わせやすい
物理ベースレンダリングは複雑な素材や光の反射を扱えるが遅い
#60
Image: link
3D表現と微分可能レンダリング
ボクセルや点群は「レンダリングして見比べる」枠組みに不向き
メッシュとNN表現の微分可能レンダリングについて説明する
#61
| メッシュ ラスタライズ | メッシュ 物理ベース | NN ラスタライズ | NN 物理ベース |
レンダリング速度 | 速 | 遅 | 遅 | 激遅 |
複雑なマテリアル | 難 | 易 | 難 | 易 |
学習/最適化 | 難 | 難 | 易 | 易 |
微分可能レンダリング | やや難 | 難 | 易 | 難 |
ラスタライズとピクセル積分
#62
スクリーン座標上の
三角形の集合
各ピクセルへ�三角形を割り当てる
(ラスタライズ)
ピクセル領域の色の平均
(ピクセル積分)
✔ 写実的レンダリングに拡張しやすい
✗ 計算が重い(モンテカルロ積分)
✔ 計算が高速
✗ 非写実的
メッシュ
SKIP
色勾配があるときのラスタライズの微分
#63
v1
v2
v3
w1
w2
w3
たとえば左図では
p
✔ (∂ピクセル色/∂頂点座標) は解析的に計算できる
SKIP
素直な微分の問題点
#64
ピクセルの中心点の�三角形の色をサンプリング
三角形の色が一様な場合,�頂点座標を微小変化させてもピクセルの色は変わらない
→ “∂色/∂頂点座標” は常にゼロ
✗ 素直な微分では物体の形状の最適化が行えない
ラスタライズの微分のアプローチ
#65
レンダリング画像をぼやかすことで�最適化に有用な勾配を得る
Images: [Liu+ 2019]
3D
順伝播
(通常)
逆伝播
(工夫)
3D
順伝播
(工夫)
逆伝播
(通常)
✔ 画像の質が落ちない
✗ 勾配は疑似的
✔ 解析的に正しい勾配
✗ 画像の質が落ちる
どちらがいいのか?
#66
3D
順伝播
(通常)
逆伝播
(工夫)
3D
順伝播
(工夫)
逆伝播
(通常)
感覚としては,どの手法を使っても性能に大きな差はない
後者は「ぼやかし度」のパラメータのチューニングが必要
ラスタライズの微分による形状最適化
#67
レンダリング画像をぼやかすことで�最適化に有用な解析的な勾配を計算
Images: [Liu+ 2019]
3D
順伝播
(通常)
逆伝播
(工夫)
3D
順伝播
(工夫)
逆伝播
(通常)
✔ 画像の質が落ちない
✗ 勾配は疑似的
✔ 解析的に正しい勾配
✗ 画像の質が落ちる
SKIP
ラスタライズの逆伝播: 1枚のポリゴンを例に
#68
(a) 通常のラスタライズ
→ 誤差が逆伝播されない
SKIP
ラスタライズの逆伝播: 1枚のポリゴンを例に
#69
(a) 通常のラスタライズ
(b) 提案手法
しかし,これだけでは不十分
SKIP
ラスタライズの逆伝播: 1枚のポリゴンを例に
#70
(a) 通常のラスタライズ
(b) 提案手法
SKIP
メッシュの微分可能ラスタライズ まとめ
#71
頂点を少し動かすとピクセルの色が少し変わる,ということがない
目次
#72
ラスタライズとピクセル積分
#73
スクリーン座標上の
三角形の集合
各ピクセルへ�三角形を割り当てる
(ラスタライズ)
ピクセル領域の色の平均
(ピクセル積分)
✔ 写実的レンダリングに拡張しやすい
✗ 計算が重い(モンテカルロ積分)
✔ 計算が高速
✗ 非写実的
メッシュ
物理ベース微分可能レンダリング
光の振る舞いをモデリングすることで,反射を考慮した複雑な最適化が行える
#74
ピクセルの色は積分を用いて定義される
#75
ピクセルの色 = そのピクセル内の点の色の平均
*この話は [Zhao+ 2020] に基づいています
SKIP
ピクセルの色は積分を用いて定義される
#76
ピクセルの色
その点を
どれだけ重視するか
ピクセル内の�あらゆる点について
その点の色
シーンの
パラメータ
SKIP
この積分はモンテカルロ法で求められる
#77
ピクセル内の
たくさんの点について
その点の色×重み
SKIP
自動微分による勾配
#78
この式は微分可能そうだし,これを PyTorch で実装すれば
自動微分でオールオッケーなのでは? ← そうはならない
「積分をモンテカルロ近似してから微分したもの」では
「積分を微分したもの」を近似できない
SKIP
なぜモンテカルロ近似ではだめか?
#79
一般に,被積分関数に不連続点があるとき,積分の微分は
interior term と boundary term に分けられ,それぞれがモンテカルロ近似できる
三角形の色が変わると�ピクセルの色はどう変わるか?
これは自動微分で計算できる
三角形の辺の位置が変わると�ピクセルの色はどう変わるか?
自動微分では計算できない
ピクセル内に三角形の辺があるとき
SKIP
Boundary term の微分
#80
三角形の面ではなく辺の上にサンプリング点を置くことで計算できる
この計算はすべてのエッジを探す必要があり大変なので,�簡単に行う方法の探索が盛んに行われている
[Zhang+ 2020] [Loubet+ 2019] [Bangaru+ 2020] [Zhou+ 2021]
Boundary term 向けの
サンプリング
通常のサンプリング
SKIP
Interior term の微分
#81
レイトレーシングを自動微分フレームワークで実装すれば
自動微分で「理論上は」計算できるが,それは現実的ではない
SKIP
物理ベース微分可能レンダリング まとめ
#82
目次
#83
ニューラル場
#84
NeRF ではピクセルの色の決定にボリュームレンダリングを用いる
PyTorch などで素直に実装すれば,これは自然に微分可能である
NeRFの3D表現 neural radiance field(復習)
σ = NNσ(p), c = NNc(p, d)
p にモノがありそう度
3D座標
p の色
見ている向き
NeRFのボリュームレンダリングは素直に微分可能
カメラからピクセルに向かうレイ上の点 p1, p2, … で�密度 σi と色 ci を NN から得るとする*1
σi = NNσ(pi), ci = NNc(pi)
カメラから出発し pi に到達したときにそこでモノにぶつからない確率 αi を
αi = exp(-σi δ)*2
と定義すると,カメラから出発し pi でモノにぶつかる確率 wi は
wi = (Πj<i αj ) (1 - αi)
レイの色の期待値 c は
c = Σ wi ci
これらの演算はすべて,特に工夫をしなくても微分可能
#85
*1 piはカメラから近い順とし,レイの向き d は省略する�*2 δ は pi のサンプリングの間隔
pi まで到達
pi でぶつかる
ニューラル場の微分可能レンダリング まとめ
#86
目次
#87
微分可能レンダリングを使う
#88
nvdiffrast
2019年以降,いくつものライブラリがリリースされている
2022年3月現在のおすすめライブラリ
深層学習?
使いやすさ? 速さ?
PyTorch? TensorFlow?
No
Yes
TF
PT
使いやすさ
速さ
#89
SKIP
nvdiffrast
#90
SKIP
#91
SKIP
#92
PR
SKIP
目次
#93
微分可能レンダリング まとめ
#94
NN
微分可能
レンダリング
誤差
最適化
物理ベース微分可能レンダリング 論文早見表
#95
被積分関数に不連続面があるとき,�その微分は interior term と boundary term に分けられる
包括的なチュートリアル [Zhao+ 2020]
From [Zhao+ 2020]
References
#96
Rasterization-based differentiable rendering (mesh)
References
#97
Rasterization-based differentiable rendering (neural fields)
References
#98
Physics-based differentiable rendering (1)
References
#99
Physics-based differentiable rendering (2)
References
#100
3D hand/body/face reconstruction (1)
References
#101
3D hand/body/face reconstruction (2)
References
#102
3D object reconstruction
ラスタライズ v.s. レイトレーシング
深層学習と組み合わせるときは主にラスタライズベースの手法が用いられる
近年では物理ベースの手法の改善・高速化が著しいことからこの状況は数年以内には変わり得る(かもしれない)
#103
一般化したパイプライン
#104
2D画像
評価値
微分可能
レンダリング
ニューラルネットの
画像認識モジュールなど
3Dシーン
ニューラルネットの
シーン生成モジュールなど
なんらかの入力
コンピュータグラフィクス
コンピュータビジョン
微分可能レンダリングは
グラフィクスとビジョンを橋渡しするものとみなせる
ここまでのまとめ
#105
3Dシーンのパラメータ π を受け取り画像 I を出力するレンダリング関数
I = f(π) について,∂I/∂π が計算できるとき f を微分可能レンダリング関数とよぶ*
微分可能レンダリングは
*数学用語の「微分可能」とはほとんど関係がない
NeRFも微分可能レンダリング
#106
From [Mildenhall+ 2020]
例: 与えられたターゲット画像に似るように3D形状と色を最適化
ターゲット画像
最適化された3Dシーン
その他 ライブラリ
#107
ラスタライズ (PyTorch)
ラスタライズ (TensorFlow)
物理ベースレンダリング
なぜモンテカルロ近似ではだめか?
#108
f(p, π) = 1 if p in 赤い三角形 else 0
I(π) = meanp(f(p, π) * 赤 + (1 - f(p, π)) * 白)
このピクセル内の色を求める
ピクセル内のたくさんの点について
その平均を取ればピクセル色 I が求められる
π
ピクセル内の点
シーンのパラメータ,�ここでは三角形の頂点
なぜモンテカルロ近似ではだめか?
#109
f(p, π) = 1 if p in 赤い三角形 else 0
I(π) = mean(f(p, π) * 赤 + (1 - f(p, π)) * 白)
ほとんどすべての点 p で ∂f(p, π)/∂π = 0 なので
∂I(π)/∂π = mean(∂f/∂π * 赤 - ∂f/∂π * 白) = 0
π
ところで,頂点 x が右に動くと,このピクセルの色は少し濃くなるはず
つまり ∂I/∂x ≠ 0 となるはずでは…?