Upgrade to Pro — share decks privately, control downloads, hide ads and more …

微分可能レンダラのつくりかた ~理論からVulkan実装まで~

u
September 24, 2023

微分可能レンダラのつくりかた ~理論からVulkan実装まで~

Visual Computing (VC) 2023で行ったチュートリアルの資料です.元はアニメーションと動画が入ったパワーポイントですがPDFにバラしてアップロードしています.

VCへのリンク:
https://visualcomputing.jp/vc2023/tutorial/#tutorial_sato

日時:
2023/09/17 芝浦工業大学・豊洲キャンパス 14:30-15:30

概要:
微分可能レンダリングは二次元画像を損失関数に使用し三次元シーンの最適化を行うための技術であり, グラフィックスのみならずビジョンや機械学習の分野でも注目を集めています. 本チュートリアルでは微分可能レンダリングの基礎知識と実装についてリアルタイムグラフィックスの観点から解説します. まずレンダリングパイプラインを微分可能に拡張する際の課題と,それらを克服するためのテクニックを解説します. さらにOpenGLやニューラルネットワーク用の自動微分ライブラリを用いた実装には改善の余地があることを示し, 現代的なグラフィックスAPIであるVulkanを用いた効率的な実装を紹介します.関連する最新の研究についても紹介します.

u

September 24, 2023
Tweet

Other Decks in Research

Transcript

  1. Huawei Japan紹介 • R&D拠点 • 横浜 • 船橋 • 大阪

    • 東京(品川):メディア • 音系:ノイズキャンセリングイヤホン等 • PV:https://www.youtube.com/watch?v=wcj4G2wUiDM • Huawei公式ASMR (!?):https://www.youtube.com/watch?v=0_Lg5rP_rRU • カメラ系:スマホ向け等 • CG系:デジタルヒューマン HUAWEI FreeBuds Pro 2 (2022) 4
  2. 日本のDigital Human Lab アニメーション ユーザーによる編集 リコンストラクション =インバースレンダリング レンダリング+AI CG Rendering

    CG + AI 入力:画像 デジタルヒューマン プラットフォーム 6 Vulkan実装の 内製微分可能レンダラ EG2022 VC2022招待講演
  3. 微分可能レンダリングだけでできること: 3Dシーンの最適化 テクスチャ 頂点位置 カメラポーズ 3DMM (パラメトリックモデル) ライト https://github.com/ascust/3DMM-Fitting-Pytorch SoftRas

    [Liu+ 2019] PyTorch3D [Ravi+ 2020] Nvdiffrec [Munkberg+ 2022] Dressi [Takimoto+ 2022] などなど、レンダリングに登場する概念は(ほぼ)全て最適化できる 11
  4. 自己紹介 佐藤浩之 • Digital Human Lab, Tokyo Research Center, Huawei

    • 3Dコンピュータビジョンとグラフィックスの研究開発 • 学歴 • 2007-2011 東北大学工学部 • 本当は哲学を学びたかった • 文学部哲学科卒の教授の元で関数型言語を研究 • 2011-2013 東京大学大学院修士 • AI(Deep以前)が面白そうと思い進化計算を研究 • 職歴 • 2013-2017 キヤノン株式会社 • 成り行きで3Dコンピュータビジョンをやりはじめる • 2017-現職 • グラフィックスもやらざるを得なくなる • 好きなCG系研究者 • Alec Jacobson, Olga Sorkine-Hornung , Kun Zhou 15 残念ながら今回の話にはほとんど出てこない……
  5. 用語と前置き • 微分可能レンダリング:Differentiable Rendering、DR • 微分可能レンダラ:Differentiable Renderer、DR • 2種類ある •

    画像生成ネットワーク • 古典的レンダリングパイプラインを拡張 RenderNet [Nguyen-Phuoc+ 2018] [Kips+ 2022] 18 DRがどちらを指す かは文脈による
  6. メッシュは使いやすいが微分可能レンダリングが難しい 19 本講演ではメッシュのラスタライゼーションベース 微分可能レンダリングを解説 クオリティ CGツールのサポート × 標準フォーマットなし ◎ 標準フォーマット多数

    微分可能レンダリング 容易 レイに添ったサンプリング→足し算と掛け算 →明らかに微分可能&密な勾配 難しい Explicitな面の存在により 不連続性=微分不能性が発生 NeRF [Mildenhall+ 2020] (≒ボリューム) メッシュ ◎ △~◎ https://github.com/facebookresearch/pytorch3d
  7. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 22 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算
  8. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 23 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ 微分可能にするには? ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算
  9. 計算機による微分計算 • 記号微分(symbolic differentiation) • 人間と同じようなやり方で記号的に微分する • 例:Wolfram alpha •

    https://ja.wolframalpha.com/ • 数値微分(numerical differentiation) • 微分の定義そのもの • 近似値しか求まらない • 差分hがハイパーパラメータ、不安定になることも • 自動微分(automatic differentiation, AD) • Forward mode • Ceres solver • Reverse mode • PyTorch, TensorFlow, JAX のデフォルト 24
  10. 計算機による微分計算 • 記号微分(symbolic differentiation) • 人間と同じようなやり方で記号的に微分する • 例:Wolfram alpha •

    https://ja.wolframalpha.com/ • 数値微分(numerical differentiation) • 微分の定義そのもの • 近似値しか求まらない • 差分hがハイパーパラメータ、不安定になることも • 自動微分(automatic differentiation, AD) • Forward mode • Ceres solver • Reverse mode • PyTorch, TensorFlow, JAX のデフォルト 高速で高精度 25
  11. 自動微分(AD)で用いられる計算グラフ • 計算の過程をグラフで表現 𝐿 𝑥 =(log 𝑥 − 1)2 x

    log 1 Subtract y z Multiply l L 28 (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥
  12. 自動微分(AD)で用いられる計算グラフ • 計算の過程をグラフで表現 𝐿 𝑥 =(log 𝑥 − 1)2 Forward:

    入力から計算グラフを順に辿ってロスを計算 x log 1 Subtract y z Multiply l L 29 (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥
  13. Reverse mode AD(Reverse modeの自動微分) x log 1 Subtract y z

    Multiply l L (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥 Forward: 入力から計算グラフを順に辿ってロスを計算 30
  14. Reverse mode AD(Reverse modeの自動微分) x log 1 Subtract y z

    Multiply l L (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥 Forward: 入力から計算グラフを順に辿ってロスを計算 PyTorch: loss.backward() 31
  15. Reverse mode AD(Reverse modeの自動微分) x log 1 Subtract y z

    Multiply l L (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥 Forward: 入力から計算グラフを順に辿ってロスを計算 𝜕𝑙 𝜕𝑧 = 2𝑧 𝜕𝑧 𝜕𝑦 = 1 𝜕𝑦 𝜕𝑥 = 1 𝑥 𝜕𝐿 𝜕𝑙 = 1 𝜕𝐿 𝜕𝑧 𝜕𝐿 𝜕𝑦 𝜕𝐿 𝜕𝑥 PyTorch: loss.backward() 32
  16. Reverse mode AD(Reverse modeの自動微分) x log 1 Subtract y z

    Multiply l L (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥 Forward: 入力から計算グラフを順に辿ってロスを計算 𝜕𝑙 𝜕𝑧 = 2𝑧 𝜕𝑧 𝜕𝑦 = 1 𝜕𝑦 𝜕𝑥 = 1 𝑥 𝜕𝐿 𝜕𝑙 = 1 𝜕𝐿 𝜕𝑧 𝜕𝐿 𝜕𝑦 𝜕𝐿 𝜕𝑥 Backward: ロスから計算グラフを逆に辿って入力の勾配値を計算 𝜕𝐿 𝜕𝑥 ቚ 𝑥=𝑥′ = 𝜕𝐿 𝜕𝑙 𝜕𝑙 𝜕𝑧 𝜕𝑧 𝜕𝑦 𝜕𝑦 𝜕𝑥 ቚ {𝑙=𝑙′, 𝑧=𝑧′ 𝑦=𝑦′, 𝑥=𝑥′} = 2𝑧 ቚ 𝑧=𝑧′ 1 𝑥 ቚ 𝑥=𝑥′ = 2(log 𝑥 − 1) 𝑥 ቚ 𝑥=𝑥′ チェインルール 解析解 計算した値 PyTorch: loss.backward() 33
  17. Reverse mode AD(Reverse modeの自動微分) x log 1 Subtract y z

    Multiply l L (log 𝑥 − 1)2 = 𝑦 − 1 2 = 𝑧2 = 𝑙 = 𝐿 𝑥 Forward: 入力から計算グラフを順に辿ってロスを計算 𝜕𝑙 𝜕𝑧 = 2𝑧 𝜕𝑧 𝜕𝑦 = 1 𝜕𝑦 𝜕𝑥 = 1 𝑥 𝜕𝐿 𝜕𝑙 = 1 𝜕𝐿 𝜕𝑧 𝜕𝐿 𝜕𝑦 𝜕𝐿 𝜕𝑥 PyTorch: optimizer.step() 更新: 勾配値で入力を更新 Backward: ロスから計算グラフを逆に辿って入力の勾配値を計算 𝜕𝐿 𝜕𝑥 ቚ 𝑥=𝑥′ = 𝜕𝐿 𝜕𝑙 𝜕𝑙 𝜕𝑧 𝜕𝑧 𝜕𝑦 𝜕𝑦 𝜕𝑥 ቚ {𝑙=𝑙′, 𝑧=𝑧′ 𝑦=𝑦′, 𝑥=𝑥′} = 2𝑧 ቚ 𝑧=𝑧′ 1 𝑥 ቚ 𝑥=𝑥′ = 2(log 𝑥 − 1) 𝑥 ቚ 𝑥=𝑥′ チェインルール 解析解 計算した値 PyTorch: loss.backward() 34
  18. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 35 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算
  19. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 36 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算 行列演算 =足し算&掛け算 =微分可能
  20. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 37 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算 行列演算 =足し算&掛け算 =微分可能 行列演算 (+Z割り算) =微分可能
  21. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 38 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算 頂点毎から ピクセル毎への変換 微分可能? 行列演算 =足し算&掛け算 =微分可能 行列演算 (+Z割り算) =微分可能
  22. ラスタライズ(広義)は2ステップからなる 1. ラスタライズ(狭義): ピクセルが対応する三角形IDを求める 2. Barycentric補間: 1. ピクセルが対応するBarycentric coordinateの計算(三角形内の相対的な位置、面積比) •

    u, v, wの3パラメータ(和が1なので実質2パラメータ) 2. 頂点属性を線形補間 out vec4 FragColor; uniform sampler2D color_tex; in vec2 TexCoords; void main() { vec3 color = texture(color_tex, TexCoords).rgb; FragColor = vec4(color, 1.0); } 補完まで終わっている! https://www.scratchapixel.com/lessons/3d- basic-rendering/rasterization-practical- implementation/perspective-correct- interpolation-vertex-attributes.html GLSLの例 • GPUで効率的に行われる • フラグメントシェーダの入力の時点で自動で補完まで済んでいる • “通常の”シェーダ開発者は意識する必要はない 𝑝𝑖 = u𝑣0 + v𝑣1 + w𝑣2 ピクセルiの値 三角形の各頂点属性 39
  23. ラスタライズ(広義)を自動微分で書いたら? • ラスタライズ(狭義) • ハードウェアラスタライザによるラスタライズは高速だが微分不能 • ソフトウェア(自動微分)によるラスタライズは遅い(しかも結局微分不能) • ニューラルネットワーク用のテンソルベースの自動微分ライブラリによる実装は特に遅い •

    shape:(ピクセル数, Face数, Gbuffer数) • テンソル演算のブロードキャストの枠組みではIf分岐を全て評価する必要がありさらにはbreakによる処理 の打ち切りができない ↔ Culling • 弊チームで実装経験あり、1Kで一枚描くのに1時間くらい? • 結局ハードウェアラスタライザと同様に三角形IDを計算→整数値でありBackwardで役に立たない • Barycentric補間 • Barycentric coordinateの計算も線形補間も自動微分で問題なく書ける • 結論の先取り:ラスタライズ(狭義)は微分不能でよい ハードウェアラスタライザを使ってよい 40
  24. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 41 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ (広義) シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算 行列演算 =足し算&掛け算 =微分可能 行列演算 (+Z割り算) =微分可能
  25. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 42 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ (広義) シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算 ラスタライズ(狭義)は微分不能 Barycentric補間は微分可能 行列演算 =足し算&掛け算 =微分可能 行列演算 (+Z割り算) =微分可能
  26. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 43 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ (広義) シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算 ラスタライズ(狭義)は微分不能 Barycentric補間は微分可能 行列演算 =足し算&掛け算 =微分可能 行列演算 (+Z割り算) =微分可能 ピクセル毎の計算 微分可能
  27. リアルタイムレンダリングの グラフィックスパイプライン 頂点属性 レンダー画像 頂点毎の計算 離散化 カメラ 位置 Tex coord.

    … モデルビュー 変換 44 X Y Z 離散的なピクセルを生成 三角形を塗る 投影変換 ラスタライズ (広義) シェーディング ポストプロセス ライト テクスチャ 3Dから3Dの変換 最終的にカメラ座 標に変換 3Dから2Dに変換 三角形内部は スカスカ 離散的な ピクセルを生成 三角形を塗る テクスチャ サンプルと 陰影計算 見た目を向上 輪郭をボカす(アン チエイリアス)等 https://nvlabs.github.io/nvdiffrast/ ※アニメーション、テッセレーショ ン、ジオメトリシェーダetcは省略 ピクセル毎の計算 ラスタライズ(狭義)は微分不能 Barycentric補間は微分可能 行列演算 =足し算&掛け算 =微分可能 行列演算 (+Z割り算) =微分可能 ピクセル毎の計算 微分可能 これも ピクセル毎の計算 微分可能
  28. グラフィックスパイプラインを計算グラフの観点から 頂点属性 投影変換 Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, …

    カメラ ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 46 ラスタライズ(広義)
  29. グラフィックスパイプラインを計算グラフの観点から 頂点属性 投影変換 三角形ID 三角形ID : 5 頂点ID : (0,

    10, 11) Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … カメラ ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 47 https://nvlabs.github.io/nvdiffrast/ ラスタライズ(広義)
  30. グラフィックスパイプラインを計算グラフの観点から 頂点属性 投影変換 三角形ID 三角形ID : 5 頂点ID : (0,

    10, 11) Barycentric補間 Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … カメラ ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 48 https://nvlabs.github.io/nvdiffrast/ ラスタライズ(広義)
  31. グラフィックスパイプラインを計算グラフの観点から 頂点属性 投影変換 三角形ID 三角形ID : 5 頂点ID : (0,

    10, 11) Barycentric補間 Texture coord. Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … カメラ ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 49 https://nvlabs.github.io/nvdiffrast/ = u + v + w ラスタライズ(広義)
  32. グラフィックスパイプラインを計算グラフの観点から 頂点属性 投影変換 三角形ID 三角形ID : 5 頂点ID : (0,

    10, 11) Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … カメラ ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 50 テクスチャ https://nvlabs.github.io/nvdiffrast/ = u + v + w ラスタライズ(広義)
  33. グラフィックスパイプラインを計算グラフの観点から 頂点属性 投影変換 三角形ID 三角形ID : 5 頂点ID : (0,

    10, 11) シェーディング Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … カメラ ライト ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 51 テクスチャ https://nvlabs.github.io/nvdiffrast/ = u + v + w ラスタライズ(広義)
  34. グラフィックスパイプラインを計算グラフの観点から 頂点属性 投影変換 三角形ID 三角形ID : 5 頂点ID : (0,

    10, 11) シェーディング Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … カメラ ライト ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 52 テクスチャ https://nvlabs.github.io/nvdiffrast/ ポストプロセス ブラーやアンチエイリアス = u + v + w ラスタライズ(広義)
  35. グラフィックスパイプラインを計算グラフの観点から 頂点属性 レンダー画像 投影変換 三角形ID 三角形ID : 5 頂点ID :

    (0, 10, 11) シェーディング Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … カメラ ライト ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 53 テクスチャ https://nvlabs.github.io/nvdiffrast/ ポストプロセス ブラーやアンチエイリアス = u + v + w ラスタライズ(広義)
  36. グラフィックスパイプラインを計算グラフの観点から 頂点属性 レンダー画像 投影変換 三角形ID 三角形ID : 5 頂点ID :

    (0, 10, 11) シェーディング Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … ロス計算 カメラ ライト ターゲット画像 Backward不能 位置 Texture coord. … モデルビュー変換 54 テクスチャ https://nvlabs.github.io/nvdiffrast/ ポストプロセス ブラーやアンチエイリアス = u + v + w ラスタライズ(広義)
  37. グラフィックスパイプラインを計算グラフの観点から 頂点属性 レンダー画像 投影変換 三角形ID 三角形ID : 5 頂点ID :

    (0, 10, 11) シェーディング Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … ロス計算 カメラ ライト ターゲット画像 Backward不能 位置 Texture coord. … ピクセルのロスは 1. Barycentric補間 2. ポストプロセス(ブラーやアンチエイリアス) によって頂点属性までBackwardされる モデルビュー変換 55 テクスチャ https://nvlabs.github.io/nvdiffrast/ ポストプロセス ブラーやアンチエイリアス = u + v + w ラスタライズ(広義)
  38. グラフィックスパイプラインを計算グラフの観点から 頂点属性 レンダー画像 投影変換 三角形ID 三角形ID : 5 頂点ID :

    (0, 10, 11) シェーディング Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … ロス計算 カメラ ライト ターゲット画像 Backward不能 位置 Texture coord. … ピクセルのロスは 1. Barycentric補間 2. ポストプロセス(ブラーやアンチエイリアス) によって頂点属性までBackwardされる モデルビュー変換 56 テクスチャ https://nvlabs.github.io/nvdiffrast/ ポストプロセス ブラーやアンチエイリアス = u + v + w ラスタライズ(広義) シェーディング勾配
  39. グラフィックスパイプラインを計算グラフの観点から 頂点属性 レンダー画像 投影変換 三角形ID 三角形ID : 5 頂点ID :

    (0, 10, 11) シェーディング Barycentric補間 Texture coord. テクスチャ サンプル Backward可能 離散化 ラスタライズ(狭義) CUDA, OpenGL, Vulkan, … ロス計算 カメラ ライト ターゲット画像 Backward不能 位置 Texture coord. … ピクセルのロスは 1. Barycentric補間 2. ポストプロセス(ブラーやアンチエイリアス) によって頂点属性までBackwardされる モデルビュー変換 57 テクスチャ https://nvlabs.github.io/nvdiffrast/ ポストプロセス ブラーやアンチエイリアス = u + v + w ラスタライズ(広義) シェーディング勾配 シルエット勾配
  40. 微分可能レンダリングの2種類の勾配 59 1. シェーディング勾配: 画像中の色が変化するパラメータを最適化可能 • テクスチャ、ライト、法線… • 色の変化に基づいて形状も最適化可能な場合あり、シェー ディング手法に依存

    • 可能な場合でも勾配は弱い、形状の変化に対して色の変化が小さいため • シルエット、unlit&フラットなテクスチャ等色がフラットなシェーディ ングでは形状は最適化不能 2. シルエット勾配: 画像中の形状が変化するパラメータを最適化可能 • 頂点位置、パラメトリックモデル、カメラパラ メータ… • カメラのビュー方向(Z方向)の形状は最適化できない(シルエットに 関係ないため)ので,シェーディング勾配に頼る必要がある [Nicolet + 2021] による分類 𝜕 𝜕𝜃 勾配の種類によって 何ができるか大きく変わる! Barycentric補間のBackwardに対応 ポストプロセスのBackwardに対応
  41. シルエット勾配がある =ラスタライズ前のジオメトリ情報を使うポストプロセスがある場合 ロスを減らす=色を白くするには 三角形エッジまでの距離 が近くなればよい 距離が近くなる方向に頂点 を移動すればよい 左上にずれている ターゲット画像 投影変換後

    シェーディング後 … ラスタライズ &Barytentric補間 &シェーディング ジオメトリ情報を使うポストプロセス ブラーやアンチエイリアス ボケた レンダー画像 ラスタライズ前のジオメトリ情報を使うポストプロセスにより ジオメトリが移動すべき方向が色にエンコードされる! ラスタライズ前のジオメトリを 参照してピクセルと距離計算 61
  42. 単純にブラーすればシルエット勾配が出る? 62 ほぼ同じ絵だが 計算過程が異なる ピクセルとピクセルの距離 で重みが決まる →色を見てもジオメトリの情報は何もわからない “普通の”ブラー(ガウシアンブラー、ボックスブラー、etc) ピクセルとジオメトリ間の距離 で重みが決まる

    →ジオメトリの移動すべき方向が色に反映! シェーディング後 ラスタライズ前の ジオメトリ情報 Backward可能 ブラー ブラー DRのブラー … カーネルの畳み込み 距離計算 シルエット勾配 でBackward シェーディング勾配 でBackward
  43. シルエット勾配の生成方法 65 tf_mesh_renderer [Genova+ 2018] シェーディング勾配のみ Backward可能 Forwardそのまま Backwardを疑似的に生成 OpenDR

    [Loper & Black 2014] NMR [Kato+ 2018] ネットワークの学習用に スクリーンスペースで勾配が届く範囲を拡張
  44. シルエット勾配の生成方法 66 tf_mesh_renderer [Genova+ 2018] シェーディング勾配のみ Backward可能 Forwardそのまま Backwardを疑似的に生成 OpenDR

    [Loper & Black 2014] NMR [Kato+ 2018] ネットワークの学習用に スクリーンスペースで勾配が届く範囲を拡張 ピクセルと三角形を計算グラフ上で繋ぐ ForwardとBackward一致
  45. シルエット勾配の生成方法 67 tf_mesh_renderer [Genova+ 2018] シェーディング勾配のみ Backward可能 Forwardそのまま Backwardを疑似的に生成 OpenDR

    [Loper & Black 2014] NMR [Kato+ 2018] ネットワークの学習用に スクリーンスペースで勾配が届く範囲を拡張 ピクセルと三角形を計算グラフ上で繋ぐ ForwardとBackward一致 ピクセルとジオメトリを直接距離計算で繋ぐ
  46. SoftRas [Liu+ 2019] ReDA [Zhu+ 2020] HardSoftRas/Dressi [Takimoto+ 2022] PyTorch3D

    [Ravi+ 2020] DIB-R [Chen+ 2019] ハードウェアラスタライザで高速化 シルエット内部の アーティファクトを抑制 範囲閾値により 計算量削減 Soft Rasterization GenDR [Zhu+ 2022] 距離計算方法等を分析 線形が一番良い 顔用に拡張 セグメンテーションマスク等 スクリーンスペース&デプス方向、広範囲にブラー シルエット勾配の生成方法 68 tf_mesh_renderer [Genova+ 2018] シェーディング勾配のみ Backward可能 Forwardそのまま Backwardを疑似的に生成 OpenDR [Loper & Black 2014] NMR [Kato+ 2018] ネットワークの学習用に スクリーンスペースで勾配が届く範囲を拡張 ピクセルと三角形を計算グラフ上で繋ぐ ForwardとBackward一致 ピクセルとジオメトリを直接距離計算で繋ぐ
  47. SoftRas [Liu+ 2019] ReDA [Zhu+ 2020] HardSoftRas/Dressi [Takimoto+ 2022] PyTorch3D

    [Ravi+ 2020] DIB-R [Chen+ 2019] ハードウェアラスタライザで高速化 シルエット内部の アーティファクトを抑制 範囲閾値により 計算量削減 Soft Rasterization GenDR [Zhu+ 2022] 距離計算方法等を分析 線形が一番良い 顔用に拡張 セグメンテーションマスク等 スクリーンスペース&デプス方向、広範囲にブラー シルエット勾配の生成方法 69 tf_mesh_renderer [Genova+ 2018] シェーディング勾配のみ Backward可能 Forwardそのまま Backwardを疑似的に生成 OpenDR [Loper & Black 2014] NMR [Kato+ 2018] ネットワークの学習用に スクリーンスペースで勾配が届く範囲を拡張 Anti-aliasing nvdiffrast [Laine+ 2020] グラフィックスパイプラインと整合性あり 数学的に微分可能 エッジの一部、1ピクセル未満のブラー ピクセルと三角形を計算グラフ上で繋ぐ ForwardとBackward一致 ピクセルとジオメトリを直接距離計算で繋ぐ
  48. SoftRas [Liu+ 2019] ReDA [Zhu+ 2020] HardSoftRas/Dressi [Takimoto+ 2022] PyTorch3D

    [Ravi+ 2020] DIB-R [Chen+ 2019] ハードウェアラスタライザで高速化 シルエット内部の アーティファクトを抑制 範囲閾値により 計算量削減 Soft Rasterization GenDR [Zhu+ 2022] 距離計算方法等を分析 線形が一番良い 顔用に拡張 セグメンテーションマスク等 スクリーンスペース&デプス方向、広範囲にブラー シルエット勾配の生成方法 70 tf_mesh_renderer [Genova+ 2018] シェーディング勾配のみ Backward可能 Forwardそのまま Backwardを疑似的に生成 OpenDR [Loper & Black 2014] NMR [Kato+ 2018] ネットワークの学習用に スクリーンスペースで勾配が届く範囲を拡張 Anti-aliasing nvdiffrast [Laine+ 2020] グラフィックスパイプラインと整合性あり 数学的に微分可能 エッジの一部、1ピクセル未満のブラー ピクセル位置を補間で求めて繋ぐ 補間で求めたピクセル位置にカーネルを畳み込む 三角形以外にも適用可能 rasterize-then-splat [Cole+ 2021] ピクセルと三角形を計算グラフ上で繋ぐ ForwardとBackward一致 ピクセルとジオメトリを直接距離計算で繋ぐ
  49. SoftRas [Liu+ 2019] ReDA [Zhu+ 2020] HardSoftRas/Dressi [Takimoto+ 2022] PyTorch3D

    [Ravi+ 2020] DIB-R [Chen+ 2019] ハードウェアラスタライザで高速化 シルエット内部の アーティファクトを抑制 範囲閾値により 計算量削減 Soft Rasterization GenDR [Zhu+ 2022] 距離計算方法等を分析 線形が一番良い 顔用に拡張 セグメンテーションマスク等 スクリーンスペース&デプス方向、広範囲にブラー シルエット勾配の生成方法 71 tf_mesh_renderer [Genova+ 2018] シェーディング勾配のみ Backward可能 Forwardそのまま Backwardを疑似的に生成 OpenDR [Loper & Black 2014] NMR [Kato+ 2018] ネットワークの学習用に スクリーンスペースで勾配が届く範囲を拡張 Anti-aliasing nvdiffrast [Laine+ 2020] グラフィックスパイプラインと整合性あり 数学的に微分可能 エッジの一部、1ピクセル未満のブラー ピクセル位置を補間で求めて繋ぐ 補間で求めたピクセル位置にカーネルを畳み込む 三角形以外にも適用可能 rasterize-then-splat [Cole+ 2021] ピクセルと三角形を計算グラフ上で繋ぐ ForwardとBackward一致 ピクセルとジオメトリを直接距離計算で繋ぐ 1 2 3 4
  50. Backwardを疑似的に生成: OpenDR & Neural 3D Mesh Renderer (NMR) • Forward:普通に絵を描く

    • Backward:疑似的にシルエット勾配を生成する • Backwardだけポストプロセスをするイメージ • 欠点 • 数学的に微分可能でない=BackwardがForwardの導関数ではない • 調節が難しい • 自動微分で書けない 72 OpenDR [Looper & Black 2014] NMR [Kato+ 2018] Forward Backward Backward XY方向に広げる 少しだけ広げる SoftRas [Liu+ 2019]の比較図 SoftRas [Liu+ 2019]の比較図 これまで説明してきた手法とはアプ ローチが異なるが、DRの歴史的に重要 1
  51. SoftRas:スクリーンスペース&デプス 方向で広範囲にブラー • スクリーンスペース距離とデプス値に基づい て、近いほど濃くなるように三角形の色を混 ぜるポストプロセス • 全ピクセルで全三角形の色を混ぜる • (height,

    width, 全三角形数 (デプスバッファ))のテンソルを確 保する必要あり 73 三角形エッジとピクセルの 2Dスクリーンスペース距離でブラー オクルージョンされている三角形も考慮し、 デプス方向に色をブレンド 距離にシグモイド をかけて色を減衰 デプスの逆数に基づいた重み 2
  52. SoftRas:スクリーンスペース&デプス 方向で広範囲にブラー • 利点 • 最適化もネットワーク学習も上手くいく • 色のボケ具合と勾配がリンクしているのでハイパーパ ラメータをチューニングしやすい •

    欠点 • ハードウェアラスタライザが使えず遅い • レンダリングされた絵がボケていてクオリティが低い • 古典的レンダリングと矛盾 • 遠くの色が混ざる • 透明でない物体も透ける 74 2
  53. SoftRasの発展形 • PyTorch3D • スクリーンスペースとデプスバッファの閾 値を導入して計算量を削減 • DIB-R • シルエット内部のアーティファクトを抑制

    • HardSoftRas/Dressi • ハードウェアラスタライザで高速化 • [PR] 実装はクローズドだが世界最速 75 DIB-R SoftRas 2
  54. 2018~2020年(NMRやSoftRasが広く使われだした頃)の 微分可能レンダリングの雰囲気(主観) 80 CV ML CG CVPRとNeurIPSの論文 が楽しみだな!!! [Kanazawa+ 2018]

    ついにレンダリングも 微分可能になった! ビジョン系の学習 が上手くいってる! 3Dでもどんどんネットワー ク学習していこうぜ! 3
  55. 2018~2020年(NMRやSoftRasが広く使われだした頃)の 微分可能レンダリングの雰囲気(主観) 81 CV ML CG CVPRとNeurIPSの論文 が楽しみだな!!! [Kanazawa+ 2018]

    ついにレンダリングも 微分可能になった! ビジョン系の学習 が上手くいってる! 3Dでもどんどんネットワー ク学習していこうぜ! 3
  56. 2018~2020年(NMRやSoftRasが広く使われだした頃)の 微分可能レンダリングの雰囲気(主観) 82 CV ML CG CVPRとNeurIPSの論文 が楽しみだな!!! [Kanazawa+ 2018]

    ついにレンダリングも 微分可能になった! ビジョン系の学習 が上手くいってる! 3Dでもどんどんネットワー ク学習していこうぜ! 3
  57. 2018~2020年(NMRやSoftRasが広く使われだした頃)の 微分可能レンダリングの雰囲気(主観) 83 CV ML CG CVPRとNeurIPSの論文 が楽しみだな!!! [Kanazawa+ 2018]

    ついにレンダリングも 微分可能になった! ビジョン系の学習 が上手くいってる! 3Dでもどんどんネットワー ク学習していこうぜ! 意訳: NMRやSoftRasは遅くて、絵が綺麗ではない グラフィックス分野の知見を活用しきれていない 3
  58. nvdiffrast :アンチエイリアスでブラー • Contribution 1: アンチエイリアス • 前面、一部のエッジ、1ピクセル未満のスクリーンスペー ス距離に基づくブラー •

    処理自体はSoftRasに近いが、範囲を絞っている • シルエット勾配のBackward用にジオメトリ情報を計算に組み入れる 必要があるため、Geometric anti-aliasingを選択 • 数学的に微分可能 (Analytic Anti-Aliasing) • 古典的グラフィックスパイプラインに使われているポス トプロセスであり絵のクオリティが上がる ↔SoftRasの絵はクオリティが低い • ラスタライズはOpenGLで行うため高速 • 最近CUDAラスタライザも実装された模様 • 複数GPUでOpenGLが動かない場合に対応 • (なぜVulkanにしなかったのか……) 89 3
  59. nvdiffrast :アンチエイリアスでブラー • Contribution2: DRライブラリに必須のAPIを特定 • ドキュメントが非常に良く書かれている、一見の価値あり • https://nvlabs.github.io/nvdiffrast/ •

    CGの達人によるエレガントな微分可能レンダラ • 古典的グラフィックスパイプラインを理論的に綺麗に維持しつ つ形状も最適化できる • 欠点 • アンチエイリアスの性質的に一部のピクセルしかブラーされない →シルエット勾配がスパースになり形状最適化が不安定 • しかしこの欠点もlarge steps [Nicolet + 2021]で解消され最強に(後半で解説) • 数学的に微分可能だが自動微分で書かれておらず 手動で導関数を記述している • 例:BarycentricはForwardはラスタライザ、BackwardはCUDAで計算.速度は出 るが…… 90 nvdiffrast特有のスパースな勾配 Dressi [Takimoto + 2022]の比較より 3
  60. rasterize-then-splat : ピクセル位置を補完で求めて繋ぐ GBufferを微分不能にラスタライズしてから 1. ピクセル位置をジオメトリ情報から補間に基づいて求める • この処理によりピクセルとジオメトリが繋がる 2. “普通のブラー”をかけ色をボカす

    (Splat) • 点群レンダリング手法 Surface splatting [Zwicker+ 2001]にインスパイア • 利点:GBufferさえあれば適用できるので • ハードウェアラスタライザが使える • 三角形に限らず適用できる(パラメトリックカーブやSDF等) • 欠点 • 実際使ってみると不安定、ロバスト性に欠ける • TensorFlowGraphics, PyTorch3Dに実装されている 91 補間によって求めたピクセル位置間の距離 でウェイトを定義し 畳み込む ジオメトリ情報から 補間によってピクセル位置を計算 2 2 1 4
  61. 前半のまとめ • シェーディング勾配:Barycentric補間 • テクスチャやライトが最適化できる • シルエット勾配:ジオメトリ情報を用いた ポストプロセス • ジオメトリやカメラパラメータが最適化できる

    • オープンな微分可能レンダラで最もエレガントなのはnvdiffrast(主観) • [PR] 我々が内製した はエレガントで最速だがクローズド • おすすめオープン実装 • ネットワーク学習用:PyTorch3D、DIB-R (Kaolin) • 最適化用:nvdiffrast + large steps [Nicolet+ 2021](後半で説明) 93 令和5年9月現在 微分可能レンダリングの2種類の勾配
  62. 自己紹介 滝本佑介 • Digital Human Lab,Tokyo Research Center, Huawei •

    3Dグラフィックスの研究開発 • 学歴 • 2013-2017 慶應義塾大学 理工学部 • Human Interaction用のロボットの制御を研究 • 2017-2019 慶應義塾大学大学院修士 • 自然言語処理の研究 • 2019- 慶應義塾大学大学院博士課程 • 現在も在学中 • 職歴 • 2014-2019 Light Transport Enterainment Inc. • アルバイトを通じてCGに携わる • 2017- 現職 • そのままグラフィックが専門になる 96
  63. 深層学習フレームワークを用いたDR実装 • 既存のDR • / など • PyTorchやTensorflow等の深層学習フレームワーク上に実装 • メリット

    • 自動微分など既存の仕組みを 活用できる • →DRに固有な部分のみを考え れば良い • デメリット • 効率が悪く、遅い • あくまで深層学習用だから • ベンダー依存 • CUDA → NVIDIA GPU必須 • Backwardがバグを含みやすい • forward/backwardを手書き 97
  64. 深層学習フレームワークを用いたDR実装 • しかしDRは非常に遅かった • PyTorch3D • 単純なシーンでも約10fps • Nvdiffrastの登場で改善されたが、 それでも通常の3DCGには及ばない

    • 3DCGではリアルタイム(1~4K 60fps以上)が当たり前 • ゲームエンジン/ CGツール • GPU上のGraphics専用API 単純なシーン なら数百fps • 効率が悪く、遅い • あくまで深層学習用だから • ベンダー依存 • CUDA → NVIDIA GPU必須 • Backwardがバグを含みやすい • forward/backwardを手書き 98
  65. 深層学習フレームワークを用いたDR実装 • 深層学習フレームワーク上のDRが遅い理由 • 効率が悪く、遅い • あくまで深層学習用だから • ベンダー依存 •

    CUDA → NVIDIA GPU必須 • Backwardがバグを含みやすい • forward/backwardを手書き • 1 . Software Rasterization • Nvdiffrast以外はCUDA上のfor loop • Hardware Rasterizerは非常に強力 • 2. 複雑な計算グラフを扱いきれない • 深層学習のレイヤー構造はほぼ直列 • DRは細かな演算が大量の複雑なグラフ U-Net DR 99 1000以上の 関数
  66. 深層学習フレームワークを用いたDR実装 • DRはCUDA依存だった • 依存する深層学習フレームワーク のせい • 回避のしようがない • 非アカデミックでは特定の企業の製品に

    依存するのは危険 • 3DCGソフトは任意のGPUで当たり前のように動く • - • ベンダを跨いだオープンなAPIの上に実装されているから • 無論例外もあるが、何かしらの回避策があるもの • 効率が悪く、遅い • あくまで深層学習用だから • ベンダー依存 • CUDA → NVIDIA GPU必須 • Backwardがバグを含みやすい • forward/backwardを手書き 100
  67. 深層学習フレームワークを用いたDR実装 • 自動微分が便利だからフレームワークを使っているはずなのに DR部分は微分を手動で記述 • 手書きbackwardはバグの温床 • 間違っていても気が付きにくい • なんとなくで動いてしまう

    • 効率が悪く、遅い • あくまで深層学習用だから • ベンダー依存 • CUDA → NVIDIA GPU必須 • Backwardがバグを含みやすい • forward/backwardを手書き 101 • 本質的に自動微分では書けないところ • (狭義の)Rasterization ↪ Backwardは定義されない • 自動微分でかけるのに手書きをしているところ • Blurring / Antialiasing • Texture Sampling • Barycentric Interpolation ↪ 本来は必要ないはずなのに、速度を出すために悪あがき
  68. 3DCG SoftwareとしてのDR • Graphics APIでDR特化の自動微分ライブラリを実装する • その上にDRのforwardのみを記述する • 既存DRの問題点 •

    効率が悪く、遅い • あくまで深層学習用だから • ベンダー依存 • CUDA → NVIDIA GPU必須 • Backwardがバグを含みやすい • forward/backwardを手書き • DRも3DCGソフトとして記述 すれば良い • GPUが提供するGraphics Pipelineで高速に動作 • ベンダに依らないAPI 102 • 全てを自動微分で書けば良い • 間違いの無い微分
  69. Vulkanを用いたDR • 現代においてクロスプラットホームなGraphics APIはVulkan以外に無い OpenGL DirectX 12 Metal Vulkan 自由度

    低 高 高 高 プラット フォーム 多 Windows Mac 多 • Graphics APIとしてVulkanを採用 • Vulkanとは • 最新のGraphic API • OpenGLの後継 • 多種多様なOS / GPUでサポート • Low Level • GLSL(コード)をコンパイルして SPIR-V(バイナリ)をGPU上で実 行する 103
  70. Vulkan入門 • VulkanはC言語のAPI • https://github.com/KhronosGroup/Vulkan-Headers <vulkan/vulkan.h> • 非常に低レイヤー VkInstanceCreateInfo createInfo{};

    createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; VkApplicationInfo appInfo{}; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName = "AppName"; appInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 0); appInfo.pEngineName = "EngineName"; appInfo.engineVersion = VK_MAKE_VERSION(0, 0, 0); appInfo.apiVersion = VK_API_VERSION_1_0; createInfo.pApplicationInfo = &appInfo; VkInstance instance; VkResult result = vkCreateInstance(&createInfo, nullptr, &instance); if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) { throw std::runtime_error("failed to create instance!"); } 例: VkInstanceの作成 • 空のInstanceCreateInfoを作り • CreateInfoを表すEnumをセット • CreateInfoのメンバに必要な空の structureを作り • StructureのEnumをセット • メンバを記述して • CreateInfoにアドレスをセット • 空のInstanceを作り • CreateInfoを渡すことでInstanceが確保 される 記述量が多すぎて現実的ではない 106 GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  71. C++ Vulkan入門 現実的な記述量 • C言語版は記述量が異常に多くなってしまうので Khronos公式のC++ Wrapperを使用する • VulkanHppとVulkanRAIIの2種類 •

    https://github.com/KhronosGroup/Vulkan-Headers • <vulkan/vulkan.hpp> or <vulkan/vulkan_raii.hpp> • VulkanHpp • std::uniqueをベースにしたC++らしい記述スタイル (vk namespace) • VulkanRAII • VulkanHppを更にwrap (vk::raii namespace) • コンストラクタ/デストラクタでリソース管理 • 弊社ではVulkanHppを使用 vk::ApplicationInfo app_info = {"AppName", app_version, "EngineName", engine_version}; vk::UniqueInstance instance = vk::createInstanceUnique({{}, &app_info}); 例: VkInstanceの作成 107 GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  72. Vulkanで複雑なグラフを計算する • Vulkanで複雑な計算グラフを扱うには? • 多入力多出力が可能なShader • Fragment Shader • Graphics

    Pipelineの一部 • ピクセル毎に独立の2D処理 • Compute Shader • Compute Pipeline • ピクセルに縛られない自由なテンソル処理が可能 • Graphics Pipelineの方が最適化の仕組みが揃っている • RenderPass と Subpass など • Compute Shaderの高い自由度はDRには不必要 • DRには高々2D Image + 複数channelで十分 • Vetrex Attribute等 1Dバッファは2D Imageに保存可能 • Vulkanで性能を求めるならGraphics Pipeline → Fragment Shader 108 GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  73. RenderPassとSubpass • 1つのFragment Shaderに全ての計算を入れるのが最速 • しかし同一ピクセルの値にしかアクセスできない • 異なるピクセルの値を使用するにはShaderを分割する • 多段のShaderを効率的に実行する仕組み

    → RenderPass & Subpass RenderPass [512x512] SubPass Vertex Shader Tessellation Shader Geometry Shader Rasterizer Fragment Shader ... 109 ... SubPass Vertex Shader Tessellation Shader Geometry Shader Rasterizer Fragment Shader RenderPass [128x128] GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  74. RenderPassとSubpass • Input Attachment • Subpassの為にFragment Shaderに導入された新しい入力タイプ • OpenGLには無い •

    前段のFragment Shaderの同一pixelの出力を効率的に受け取る • OpenGLではTexture Fetchを使用するしかなかった • モバイル系のGPUで有効 • RenderPass内のSubpassは非同期に実行される • Dependencyを明示する必要がある • Vulkanのドライバが自動で行ってくれる 110 GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  75. SubpassによるDeferred Shading • Subpassの非同期機能は効率的なDeferred Shadingのため • ある程度のImageのIOを想定している 112 →小規模な計算グラフとみなせる •

    RenderPass / Subpassの枠組み上にDRの巨大な計算グラフを実装する • = DRを記述した計算グラフは究極のDeferred Shading GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  76. DR用のSubpass • DRの為に使用するSubpassの使い方は2通り • 1. 汎用的な計算 • Fragment Shaderのみを利用する •

    他のシェーダは多入力多出力が不可能 • 2. Rasterize • Hardware Rasterizerを利用する • Vertex ShaderとFragment Shader • 普通のレンダリングと同様 SubPass Vertex Shader Rasterizer Fragment Shader SubPass Vertex Shader Rasterizer Fragment Shader 113 GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  77. RenderPass / Subpassの設定要素 114 • Attachment 入出力Image情報 • Image type

    • Load / Store • Image layout 遷移 (メモリアクセスの最適化) • Dependency Subpassの依存関係 • Source • Destination できるだけ〇〇Optimal 型を利用する vk::Format::eR32Sfloat // 1ch float vk::Format::eR32G32B32A32Sfloat // 4ch float {vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eDontCare} // 入力 {vk::AttachmentLoadOp::eDontCare, vk::AttachmentStoreOp::eDontCare} // 出力 {vk::AttachmentLoadOp::eClear, vk::AttachmentStoreOp::eDontCare} // 出力 (0-filled) vk::ImageLayout::eShaderReadOnlyOptimal // 入力 vk::ImageLayout::eColorAttachmentOptimal // 出力 vk::ImageLayout::eTransferDstOptimal // (CPUからの)転送 vk::ImageLayout::eGeneral // 汎用 = 最適化されていない {vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::AccessFlagBits::eColorAttachmentWrite} // Fragment Shaderからの出力 {vk::PipelineStageFlagBits::eFragmentShader, vk::AccessFlagBits::eInputAttachmentRead} // Fragment Shaderへの入力 GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  78. 計算グラフ の表現 • 計算グラフを作るためのインターフェースを作る • PyTorchの系譜を参考にした書き方 • 例) y =

    sin(x) 115 class Variable { VType type = VType::FLOAT; Size2D size = {512, 512}; } Variable x auto y = F::Sin(x) FunctionをGLSLがサポートする Native関数について必要なだけ 記述する 約100個 namespace F { Variable Sin(Variable x) { return SinFunction().forward(x) } } class SinFunction { Variable forward(Variable x) { return Variable{x.type, x.size} } string glsl_code = "{out}=sin({inp0})" } 出力のVariable 情報を定義 対応するGLSLスニペット (パワー) GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  79. • 数々の細かな設定を Vulkanに施す 計算グラフのVulkan実行 116 RenderPass Subpass … … …

    Variable a auto b = F::Sin(a) ... auto z = x * y ... 計算グラフ パッキング • RenderPass/Subpass の条件を守りながら、 可能な限り大きな集合 を作る • 同一のImageサイズ • RenderPass/Subpass共に • 入出力Imageの数 • デバイスに依存 • メモリ同期の制約 • Texture Samplingの参照 元と先は異なるpass RenderPass Subpassに変換 • GLSLコードを文字列 処理で生成する GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ Function & Variable
  80. 計算グラフ上で自動微分 (AD) • Vulkan ADが完成117 • 計算グラフをVulkan上で実行できるようになったので、 自動微分ライブラリ (VulkanAD) を作成する

    • PyTorch等と同様に、Function毎に微分を事前定義する • Forwardの計算グラフが入力されると、Forwardと Backwardが繋がった計算グラフが出力される y = F::Sin(x) BuildBackward gx = gy * F::Cos(x) こちらの関係も 約100個記述する Forward Forward Backward BuildBackward GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  81. 微分可能シェーディング • しかしDRのシェーディングは、閲覧用のレンダラと一致する必要がある • 異なればターゲット画像の見た目が再現されない • 「Physically-based Shading (PBS)」が一般的だが、解釈が様々で皆違う 120

    • 既存のレンダラのシェーダコードをDR上に写経する Vulkan AD 微分可能 Shader • シェーディングもAD上に実装すればよいだけ GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  82. 微分可能シェーディング • しかしDRのシェーディングは、閲覧用のレンダラと一致する必要がある • 異なればターゲット画像の見た目が再現されない • 「Physically-based Shading (PBS)」が一般的だが、解釈が様々で皆違う 121

    • 既存のレンダラのシェーダコードをDR上に写経する Vulkan AD 微分可能 Shader • シェーディングもAD上に実装すればよいだけ GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ • コストが高いのでトランスパイラを実装する
  83. GLSL → Vulkan AD のトランスパイラ • 弊チームには独自開発されたリアルタイムレンダラがあった • OpenGL/GLSL実装 •

    BlenderのCyclesをベースにしたマテリアル定義 • Disney BSDFの亜種 122 • GLSL実装のPBSをVulkan ADの記法に変換する トランスパイラを実装 • Python • 関数の対応テーブルがあれば可能 Blender's Principled BSDF GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  84. GLSL → Vulkan AD のトランスパイラ • 元となったOpenGLレンダラとVulkanDRで同一の レンダリングが可能になった 123 OpenGL/GLSL

    VulkanDR からのトランスパイルも 書けばできるはず (ライセンスに注意) GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  85. DRを用いた最適化問題 • 実装したDR上に最適化問題を定義する • レンダリングパイプライン + 目的関数 (Loss) 頂点情報 材質

    カメラ 出力画像 目標画像 DR Loss ライト • 定義したDR関数を使用して最適化問題を記述する • レンダリングパイプラインの部品を意識する程度の粒度 124 GPU Vulkan 計算グラフ 自動微分 DR 最適化問題 今ここ
  86. DRでジオメトリを最適化するには • DRによって2Dの色情報が3Dの頂点位置にまで伝搬する • しかしNaiveに実装するとメッシュが崩壊する • 正則化が必要 • Laplacian正則化 •

    ある頂点と隣接頂点の平均位置の差分を最小化する • Large Steps [Nicolet+2021] • 初期状態のラプラシアンを保持するように形状変化を行う • 元論文での実装はCUDAによる疎なLinear Solverを用いているが、 VulkanADには荷が重い • VulkanADでは共役勾配法を実装することで実現 127 https://docs.blender.org/manual/en/latest/model ing/modifiers/deform/laplacian_deform.html
  87. トポロジーの異なる物体を扱う • Tetrahedraを用いた、初期形状を与えない 形状最適化 [Munkberg+ 2022] • 元実装はもちろんCUDA • 制約のあるVulkan

    ADでも頑張れば実装可能 133 NeRFのような事がメッシュでもできる • Large Stepによる最適化より、安定的な最適化が可能になったが、 初期形状を与えなければならない • 球から始めたらトーラスにはならない
  88. トポロジーの異なる物体を扱う • Tetrahedraを用いた、初期形状を与えない 形状最適化 [Munkberg+ 2022] • 元実装はもちろんCUDA • 制約のあるVulkan

    ADでも頑張れば実装可能 134 NeRFのような事がメッシュでもできる • Large Stepによる最適化より、安定的な最適化が可能になったが、 初期形状を与えなければならない • 球から始めたらトーラスにはならない
  89. トポロジーの異なる物体を扱う • Tetrahedraを用いた、初期形状を与えない 形状最適化 [Munkberg+ 2022] • 元実装はもちろんCUDA • 制約のあるVulkan

    ADでも頑張れば実装可能 135 NeRFのような事がメッシュでもできる • Large Stepによる最適化より、安定的な最適化が可能になったが、 初期形状を与えなければならない • 球から始めたらトーラスにはならない
  90. トポロジーの異なる物体を扱う • Tetrahedraを用いた、初期形状を与えない 形状最適化 [Munkberg+ 2022] • 元実装はもちろんCUDA • 制約のあるVulkan

    ADでも頑張れば実装可能 136 NeRFのような事がメッシュでもできる • Large Stepによる最適化より、安定的な最適化が可能になったが、 初期形状を与えなければならない • 球から始めたらトーラスにはならない
  91. トポロジーの異なる物体を扱う • Tetrahedraを用いた、初期形状を与えない 形状最適化 [Munkberg+ 2022] • 元実装はもちろんCUDA • 制約のあるVulkan

    ADでも頑張れば実装可能 137 NeRFのような事がメッシュでもできる • Large Stepによる最適化より、安定的な最適化が可能になったが、 初期形状を与えなければならない • 球から始めたらトーラスにはならない
  92. トポロジーの異なる物体を扱う • Tetrahedraを用いた、初期形状を与えない 形状最適化 [Munkberg+ 2022] • 元実装はもちろんCUDA • 制約のあるVulkan

    ADでも頑張れば実装可能 138 NeRFのような事がメッシュでもできる • Large Stepによる最適化より、安定的な最適化が可能になったが、 初期形状を与えなければならない • 球から始めたらトーラスにはならない
  93. 後半のまとめ • Vulkan上にフラグメントシェーダでDR用の自動微分 ライブラリを実現した • 高速 • ベンダー非依存 • 正確なbackward

    • VulkanDRにより、マテリアル・ジオメトリの最適化 が高速に行えるようになった • Nvdiffrastの2倍から数倍 139 Desktop Laptop Mobile
  94. ラスタライゼーションベースの微分可能レンダラの比較 tf_mesh_ren derer Neural 3D Mesh Renderer SoftRas/DIB- R/PyTorch3D Nvdiffast

    Nvdiffrast + Large steps rasterize- then-splat Dressi 年 2018 2018 2019/2019/2020 2020 2021 2021 2022 頂点属性 任意 任意 任意 任意 位置のみ 任意 任意 スクリーンス ペース距離 × △ 〇 〇 〇 〇 ピクセル位置を補間で計算 〇 古典的レンダリ ングパイプライ ンとの整合性 〇 × × 〇 〇 × × Forward/Backw ard一致 〇 × 〇 〇 〇 〇 〇 シェーディング 必要 不要 不要 不要 不要 必要 不要 ロバスト性 × △ 〇 △ ◎ × 〇 シェーディング勾配 Dense Dense Dense Dense Dense Dense Dense シルエット勾配 None Sparse Dense Sparse Dense Dense Dense 遮蔽面の勾配 × × 〇 × (nvdiffmodeling用に半透明物体対応してい るが透明でない物体の裏面向けではない) × × 〇 複数枚デプスバッファ × × 〇 〇 〇 〇 〇 実装 OpenGL/CUDA CUDA CUDA OpenGL/CUDA OpenGL/CUDA OpenGL/CUDA Vulkan 速度 ◎ △ × ◎ ◎ ◎ ◎ 最適化向け ネットワーク学習向け 141
  95. レイトレーシングDR 1. シェーディング勾配及び計算グラフの接続性 • BVHによるレイと三角形の衝突判定(ラスタライズ(狭 義)相当)は微分不能、Barycentric補間経由でBackward できる 2. シルエット勾配 •

    エッジ近辺を重点的にサンプリング • エッジサンプリング [Li+ 2018] • Path-Space Differentiable Rendering [Zhao+ 2020] • サンプリング対象を滑らかな関数に変更 • Reparametrization [Loubet+ 2019] • Warping function [Bangaru+ 2020] [Bangaru+ 2020]の分類図 142 ラスタライゼーションDRと比較して • より正確にレンダリング方程式を解ける • 反射や屈折を含んだ最適化ができる • 同じ絵のクオリティを出すのに 10倍~100倍以上遅い
  96. 三角形以外のプリミティブ • 点群 • 体積がない点を円盤、球、SH等として距離計算 しつつ拡がりを持たせて描く • 点IDでBackwardするというメッシュ同様のテク ニックが使えるのでハードウェアラスタライザを 使った高速な微分可能レンダリングが可能

    • SDF • 陰関数であり、メッシュや点群とは異なるアプ ローチが必要 • NaïveなSphere Tracingでは探索点=Backward される点がスパースになることが問題 • レイトレDRと同様にreparameterizationのテク ニックが有効 [Vicini+ 2022] [Bangaru+ 2022] DSS [Yifan+ 2019 ] [Zhang+ 2022] Pulsar [Lassner+ 2020 ] 143
  97. DR界隈勢力図 Academia Industry レイトレーシング ※DR基盤技術に着目 ※NeRF系、CV&ML系応用は除く ⚫ Mitsuba 3 /

    2 ⚫ Dr. Jit / Enoki ⚫ Large Steps ⚫ And more… ⚫ Path-Space DR Prof. Wenzel Jakob Prof. Tzu-Mao Li Prof. Shuang Zhao ⚫ Redner ⚫ Reparameterization ⚫ Taich (not DR) ⚫ Neural 3D Mesh Renderer ⚫ SoftRas ⚫ nvdiffrast ⚫ DIB-R ⚫ Kaolin ⚫ OpenDR ⚫ Dressi ⚫ PyTorch3D ⚫ RGBXY Derivatives N. A. ⚫ Rasterize-then-splat ⚫ TensorFlow Graphics ラスタライゼーション 144 144
  98. 最近の面白かったDR論文: 初期値が遠くても最適化できるDROT[Xing+ 2022] • 課題:ターゲット画像で初期値がジオメトリ的に遠 いとスクリーンスペース勾配が発生せず最適化でき ない • Optimal Transport(Sinkhorn)で

    陽にピクセルマッチングを行う →ピクセルレベルで位置を合わせてから最適化する • これ自体の実装も既存のDRに組み込むのも容易 145 Hybrid: 後半は普通の DRでRefine Basic: 提案手法のみ
  99. 微分可能レンダリングの元祖は? • OpenDR [Loper & Black 2014]だと思われていたが …… • 実は“Model-based

    3D Hand Pose Estimation from Monocular Video” [de la Gorce+ 2011] がDRの元祖らしい • 著者の公式リポジトリ&主張 • https://github.com/martinResearch/DEODR • 2008年に実装したと書いてあるので、本当は同じ著者の” Model- based hand tracking with texture, shading and self- occlusions”[de la Gorce+ 2008]が最初?しかし大人の事情?で PAMI2011には引用されていない 146
  100. 微分可能レンダリング以前: 手の3Dトラッキングを例にして • 形状がほぼ変わらない前提でカルマンフィ ルタでトラッキング • 微分可能なガウシアンの3Dモデルをデプ スに対してフィッティング • カラーとデプスをレンダリングして画像の

    ロスを進化計算で最適化 [Oikonomidis+ 2011] [Sridhar+ 2013] [Stenger+ 2006] 3D形状の変形をカラー画像のロスだけで扱うのが難しかった が、近年では微分可能レンダリングのおかげで簡単になった 147
  101. ラスタライゼーションベースの 微分可能レンダリングの現状 • 解決 • 最適化やネットワークの学習に使える広範囲の勾配 ←NMRやSoftRasで解決 • 古典的レンダリングパイプラインとの整合性 ←nvdiffrastで解決

    • Graphics Pipelineを活用したDR ← で解決 • 未解決 • 勾配ベース最適化に起因する局所解 • 例:マテリアルとライトの分離 • カラー画像“だけ”からのカメラパラメータとジオメトリの復元 • COLMAPによるカメラパラメータの初期化、パラメトリックモデル、良い初期形状、追加の シルエット画像等が必要な手法が多い • Structure-from-Motion (SfM) + Multi-View Stereo (MVS)のビジョン系の古典的パイプライン に勝てない 148
  102. ラスタライゼーションベースの 微分可能レンダリングの今後の展望 • レイトレーシングDRやNeRFと共存できるのか? • スピード面での優位性はしばらく続く!まだいける! • (古典的レンダリングとは絵が違う) 最適化に適している微分可能レンダリング はまだまだ研究の余地がある

    • 微分可能シェーディング:レンダリングエンジンの移行が容易に • 例:Unreal Engine(UE)のシェーダのPyTorch化 • 課題:UnityやBlenderで作ったモデルをUEに持ち込むとシェーダが違うため見た目(色)が変わる • 現在:アーティストのよる手作業のマテリアル等の調整が必要 • 微分可能UEシェーダで最適化&近似すれば自動化できる • インタラクティブ性を活用したDRアプリケーションは未知数 • 例:ユーザ入力に合わせてリアルタイムで最適化&プレビュー、エクスポート 149 SoftRas 絵はボケているが、勾配が広い DROT 絵はぐちゃぐちゃだが、初期 値に対してロバスト
  103. 微分可能レンダリングに関する日本語の資料 • “微分可能レンダリング(CVIM研究会 チュートリアル)” In CVIM/PRMU 2022年3月研究会. • https://docs.google.com/presentation/d/1nbyUBucCTFP2- sVLFeo2gP76L3EJTImMFXLmV7OifxI/edit?pli=1#slide=id.p

    • あのクルマのマテリアルを再現!?微分可能レンダラを用いた 計測BRDFフィッティング (CEDEC2023) • https://cedec.cesa.or.jp/2023/session/detail/s6426cba8d4036 153
  104. [PR] に関する資料 • EG library:本文、supplemental material、デモ動画 • https://diglib.eg.org/handle/10.1111/cgf14455 • Willey(EG

    libraryと同じ内容の出版社版) • https://onlinelibrary.wiley.com/doi/10.1111/cgf.14455 • arxiv • https://arxiv.org/abs/2204.01386 • 発表の録画 • https://www.youtube.com/watch?v=8T_BIMrzfwk 154 後半のVulkan実装に関する内容をより詳細に記載
  105. 自動微分について • PyTorchの自動微分の公式解説 by Preferred Networks • Overview of PyTorch

    Autograd Engine • https://pytorch.org/blog/overview-of-pytorch-autograd-engine/ • How Computational Graphs are Constructed in PyTorch • https://pytorch.org/blog/computational-graphs-constructed-in-pytorch/ • How Computational Graphs are Executed in PyTorch • https://pytorch.org/blog/how-computational-graphs-are-executed-in- pytorch/ • PyTorch/LibTorchのソースコードを読むことが理解への近道 155
  106. 自動微分を使えばなんでも“微分可能”? • PyTorchを使えば明らかに微分不能な関数でも最適化できる • torch.abs(): 0で微分不能 • torch.amax(): 最大値を選ぶ、離散なので微分不能 •

    微分可能になってない、Backwardしてるだけ • 勾配が届く範囲は狭く、滑らかでもない • 滑らかで広範囲に勾配をBackwardするには“微分可能”な代替を考え る必要がある • maxに対するsoftmax • 正規化処理により、全ての入力と計算グラフが繋がる • absに対するLog-cosh Loss • 0でも勾配が滑らか 0 -1 abs(): 符号を反転して Backward max(): 最も大きい値のイ ンデックスにだけ Backward 4
  107. Barycentric補間のBackward 1. Barycentric coordinateの計算 • 頂点位置にBackwardされる • Barycentricを微分不能=ハードウェアラスタライザで描いても動作は するが、シェーディング勾配で頂点位置が動きづらくなる •

    線形補間によるBackwardだけだと頂点を動かすには勾配が弱い • 例:ボウルのような凹んだ形状をシェーディングで最適化する場合 • 凹みはシルエットから判断できないためシェーディングに頼るしかない 2. 線形補間 • 任意の頂点属性にBackwardされる 158
  108. 参考文献 • ラスタライゼーション • Munkberg, J., Hasselgren, J., Shen, T.,

    Gao, J., Chen, W., Evans, A., ... & Fidler, S. (2022). Extracting triangular 3d models, materials, and lighting from images. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 8280-8290). • Petersen, F., Goldluecke, B., Borgelt, C., & Deussen, O. (2022). Gendr: A generalized differentiable renderer. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 4002-4011). • Takimoto, Y., Sato, H., Takehara, H., Uragaki, K., Tawara, T., Liang, X., ... & Zheng, B. (2022, May). Dressi: A Hardware‐Agnostic Differentiable Renderer with Reactive Shader Packing and Soft Rasterization. In Computer Graphics Forum (Vol. 41, No. 2, pp. 13-27). • Cole, F., Genova, K., Sud, A., Vlasic, D., & Zhang, Z. (2021). Differentiable surface rendering via non-differentiable sampling. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 6088-6097). • Laine, S., Hellsten, J., Karras, T., Seol, Y., Lehtinen, J., & Aila, T. (2020). Modular primitives for high-performance differentiable rendering. ACM Transactions on Graphics (TOG), 39(6), 1-14. • Ravi, N., Reizenstein, J., Novotny, D., Gordon, T., Lo, W. Y., Johnson, J., & Gkioxari, G. (2020). Accelerating 3d deep learning with pytorch3d. arXiv preprint arXiv:2007.08501. • Zhu, W., Wu, H., Chen, Z., Vesdapunt, N., & Wang, B. (2020). Reda: reinforced differentiable attribute for 3d face reconstruction. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 4958-4967). • Liu, S., Li, T., Chen, W., & Li, H. (2019). Soft rasterizer: A differentiable renderer for image-based 3d reasoning. In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 7708-7717). • Kato, H., Ushiku, Y., & Harada, T. (2018). Neural 3d mesh renderer. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 3907-3916). • Genova, K., Cole, F., Maschinot, A., Sarna, A., Vlasic, D., & Freeman, W. T. (2018). Unsupervised training for 3d morphable model regression. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 8377-8386). • Loper, M. M., & Black, M. J. (2014). OpenDR: An approximate differentiable renderer. In Computer Vision–ECCV 2014: 13th European Conference, Zurich, Switzerland, September 6-12, 2014, Proceedings, Part VII 13 (pp. 154-169). Springer International Publishing. • de La Gorce, M., Fleet, D. J., & Paragios, N. (2011). Model-based 3d hand pose estimation from monocular video. IEEE transactions on pattern analysis and machine intelligence, 33(9), 1793-1805. • de La Gorce, M., Paragios, N., & Fleet, D. J. (2008, June). Model-based hand tracking with texture, shading and self-occlusions. In 2008 IEEE Conference on Computer Vision and Pattern Recognition (pp. 1-8). IEEE. • レイトレ:Edge sampling • Li, T. M., Aittala, M., Durand, F., & Lehtinen, J. (2018). Differentiable monte carlo ray tracing through edge sampling. ACM Transactions on Graphics (TOG), 37(6), 1-11. • レイトレ:Path-space • Zhang, C., Miller, B., Yan, K., Gkioulekas, I., & Zhao, S. (2020). Path-space differentiable rendering. ACM transactions on graphics, 39(4). • レイトレ:Area sampling • Bangaru, S. P., Li, T. M., & Durand, F. (2020). Unbiased warped-area sampling for differentiable rendering. ACM Transactions on Graphics (TOG), 39(6), 1-18. • Loubet, G., Holzschuch, N., & Jakob, W. (2019). Reparameterizing discontinuous integrands for differentiable rendering. ACM Transactions on Graphics (TOG), 38(6), 1-14. 159
  109. 参考文献 • SDF • Bangaru, S. P., Gharbi, M., Luan,

    F., Li, T. M., Sunkavalli, K., Hasan, M., ... & Durand, F. (2022, November). Differentiable rendering of neural sdfs through reparameterization. In SIGGRAPH Asia 2022 Conference Papers (pp. 1-9). • Vicini, D., Speierer, S., & Jakob, W. (2022). Differentiable signed distance function rendering. ACM Transactions on Graphics (TOG), 41(4), 1-18. • 点群 • Zhang, Q., Baek, S. H., Rusinkiewicz, S., & Heide, F. (2022, November). Differentiable point-based radiance fields for efficient view synthesis. In SIGGRAPH Asia 2022 Conference Papers (pp. 1-12).Lassner, C., & Zollhofer, M. (2021). Pulsar: Efficient sphere-based neural rendering. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 1440-1449). • Lassner, C., & Zollhofer, M. (2021). Pulsar: Efficient sphere-based neural rendering. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 1440-1449). • Yifan, W., Serena, F., Wu, S., Öztireli, C., & Sorkine-Hornung, O. (2019). Differentiable surface splatting for point-based geometry processing. ACM Transactions on Graphics (TOG), 38(6), 1-14. • Pfister, H., Zwicker, M., Van Baar, J., & Gross, M. (2000, July). Surfels: Surface elements as rendering primitives. In Proceedings of the 27th annual conference on Computer graphics and interactive techniques (pp. 335-342). • NeRF & ボリューム • Mildenhall, B., Srinivasan, P.P., Tancik, M., Barron, J.T., Ramamoorthi, R., Ng, R. (2020). NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. In: Vedaldi, A., Bischof, H., Brox, T., Frahm, JM. (eds) Computer Vision – ECCV 2020. ECCV 2020. Lecture Notes in Computer Science(), vol 12346. Springer, Cham. https://doi.org/10.1007/978-3-030-58452-8_24 • 汎用的テクニック • Xing, J., Luan, F., Yan, L. Q., Hu, X., Qian, H., & Xu, K. (2022). Differentiable Rendering using RGBXY Derivatives and Optimal Transport. ACM Transactions on Graphics (TOG), 41(6), 1-13. • Nicolet, B., Jacobson, A., & Jakob, W. (2021). Large steps in inverse rendering of geometry. ACM Transactions on Graphics (TOG), 40(6), 1-13. • 画像生成ネットワーク • Nguyen-Phuoc, T. H., Li, C., Balaban, S., & Yang, Y. (2018). Rendernet: A deep convolutional network for differentiable rendering from 3d shapes. Advances in neural information processing systems, 31. • Kips, R., Jiang, R., Ba, S., Duke, B., Perrot, M., Gori, P., & Bloch, I. (2022, May). Real‐time Virtual‐Try‐On from a Single Example Image through Deep Inverse Graphics and Learned Differentiable Renderers. In Computer Graphics Forum (Vol. 41, No. 2, pp. 29-40). • DR以前 • Sridhar, S., Oulasvirta, A., & Theobalt, C. (2013). Interactive markerless articulated hand motion tracking using RGB and depth data. In Proceedings of the IEEE international conference on computer vision (pp. 2456-2463). • Oikonomidis, I., Kyriazis, N., & Argyros, A. A. (2011, August). Efficient model-based 3D tracking of hand articulations using Kinect. In BmVC (Vol. 1, No. 2, p. 3). • Stenger, B., Thayananthan, A., Torr, P. H., & Cipolla, R. (2006). Model-based hand tracking using a hierarchical bayesian filter. IEEE transactions on pattern analysis and machine intelligence, 28(9), 1372-1384. • アプリケーション • Lin, C. H., Gao, J., Tang, L., Takikawa, T., Zeng, X., Huang, X., ... & Lin, T. Y. (2023). Magic3d: High-resolution text-to-3d content creation. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 300-309). • https://github.com/ascust/3DMM-Fitting-Pytorch.git • Kanazawa, A., Tulsiani, S., Efros, A. A., & Malik, J. (2018). Learning category-specific mesh reconstruction from image collections. In Proceedings of the European Conference on Computer Vision (ECCV) (pp. 371-386).. 160