Slide 1

Slide 1 text

GroomCap: High-Fidelity Prior-Free Hair Capture SIGGRAPH Asia 2024 (Journal Track) 高山 健志 October 9, 2024 https://calciferzh.github.io/ https://arxiv.org/abs/2409.00831 プロジェクトページ等は無い模様 Spatial AI Network 勉強会

Slide 2

Slide 2 text

やりたいこと: 高品質な3D髪型復元 • 入力は多視点撮影画像 çè CT2Hair (SIGGRAPH23) • “大規模”データの事前学習はやらない çè NeuralHaircut (ICCV23) • Dr.Hair (CVPR24) と似た動機 (引用なし) • カーブが必ず頭皮に接続 • シミュレーションに適用可能

Slide 3

Slide 3 text

全体像と新規性 ・NeRFを拡張した方法で、髪の3D方向を推定 ・角度の値そのものではなく、角度の確率分布を一致させる ・3DGSを使って描画 ・自由度を制限 ・適応的な増減

Slide 4

Slide 4 text

入力データの前処理 • 背景/hair領域/non-hair前景のマスク • 不正確でも良い • 外部サーフェスをラフに復元 (outer mesh) • Google内製 The Relightable • 顔パラメトリックモデルをフィッティング (inner mesh) • 髪領域を包含するバウンディングボックス • マスク画像から生成 • (オプション) 分け目のアノテーション • ここだけ手動 分け目

Slide 5

Slide 5 text

ステップ1: 髪ボリューム陰関数の学習

Slide 6

Slide 6 text

まず、普通にNeRFを学習する NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis [Mildenhall+,ECCV20]

Slide 7

Slide 7 text

まず、普通にNeRFを学習する ∈ ℝ! ∈ ℝ! ∈ ℝ! ∈ 0,1 🔥 🔥

Slide 8

Slide 8 text

次に、髪のoccupancyと3D方向を学習する • レイ上の各点における3D方向をブレンドする方法を提案 ∈ ℝ! ∈ ℝ! ∈ ℝ! ∈ 0,1 ∈ 0,1 " ∈ 0, 𝜋 " ❄ ❄ 🔥 {髪, ボディ}領域のoccupancy 髪の3D方向の極座標表現 🎥 𝐫(𝑡) = 𝐨 + 𝑡𝐪

Slide 9

Slide 9 text

髪の3D角度を確率分布として表現 • ある地点 𝐱 ∈ ℝ' における髪の3D角度が (𝜃𝐱 , 𝜙𝐱 ) であるとき、 これを確率分布に変換する: • 古典的なボリュームレンダリングで、レイ上の3D角度分布を積分 ℎ𝐱 " 𝜃, 𝜙 = - #$%& & - '$%& & 1 𝛽 𝜃 − 𝜃𝐱 + 𝑖𝜋 ( + 𝜙 − 𝜙𝐱 + 𝑗𝜋 ( + 𝛿 ℎ𝐱 𝜃, 𝜙 = 1 𝐶𝐱 ℎ𝐱 " 𝜃, 𝜙 𝜃𝐱, 𝜙𝐱 = 36°, 18° が表す確率分布 𝜃𝐱, 𝜙𝐱 = 162°, 126° が表す確率分布 6:4の比率でブレンド 𝜃 𝜙 周期性を考慮 正規化 ・𝛽と𝛿はハイパラ ・Gaussianカーネルも試したが、良くなかった

Slide 10

Slide 10 text

3D角度分布を2D角度分布に変換し、ロスを計算 𝑓(𝜂) = 1 𝐶6 max (7,8)∈: 𝑔 𝜃, 𝜙 2D平面に投影すると角度が 𝜂 となる ような3D角度の集合 (事前計算可能) 入力画像に対する Gaborフィルタのレスポンス 𝜂

Slide 11

Slide 11 text

髪/ボディ領域のoccupancy 𝜌! , 𝜌" の学習 • NeRFでRGBの代わりに 𝜌) , 𝜌* を描画 è ラベルマップ 𝜓) , 𝜓* を得る • 複数種類 (𝑚=3) の教師データを組み合わせる è NeRFにより自然と3D空間的整合性が 保たれて、ベストな結果が得られる • 最終的なロス: • レイの範囲を限定するためにouter meshを利用 100 ℒ+,- + 0.02 ℒ+.. GT GT

Slide 12

Slide 12 text

ステップ1の結果 髪のoccupancyが高い場所における3D方向 やたら縦線が多くないか?

Slide 13

Slide 13 text

赤いピクセルに対応するレイ上の密度と髪の方向 積分した3D角度分布を投影して得られた2D角度分布

Slide 14

Slide 14 text

オレンジのピクセル■ 髪の流れが明確 è 強いピーク ブルーのピクセル■ 髪の流れが不明確 è ぼやけたピーク 推定された3D方向を2Dに投影して得られた確率分布

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

ステップ2: 髪ボリュームのトレーシング

Slide 17

Slide 17 text

前進オイラー法によるトレーシング • 髪ボリューム領域に一様にシード点を生成 • 髪の密度 𝜎 " 𝜌! を優先度として priority queue に入れる • 最も優先度の高いシード点を起点として、 NeRFで推定した3D方向 𝐠 に沿って伸ばしていく • 以下の条件を一定回数満たしたら停止 • 先端における 𝜎 または 𝜌" が閾値未満 • 先端がバウンディングボックスまたは outer mesh の外に出ている • トレースしたカーブの付近に存在するシード点の優先度を下げる 成長方向 慣性 前後の向きを選択 inner meshへのめり込みを防ぐ 先端の頂点座標 3mm (基本的に先行研究を踏襲) (説明が雑)

Slide 18

Slide 18 text

前進オイラー法によるトレーシング • 先述の方法で生成したカーブを volume hair と呼ぶ • volume hair が頭皮と接続することは稀 è 頭皮からもトレースし (scalp hair) 、うまくvolume hairと繋げる • 頭皮上で一様にシード点を生成 • 初期の成長方向は頭皮法線 • 各volume hairが頭皮に接続していない場合、付近のscalp hairをランダムに選 び、それに沿ってvolume hairを頭皮に向かって伸ばす • この方法で99%のvolume hairは頭皮に接続できる • 接続できないものは捨てる • 分け目のアノテーションがある場合、 それを横切るカーブを捨てる • 最終的に約3万本のカーブを得る (説明が雑)

Slide 19

Slide 19 text

ステップ2の結果 • この時点で既に良い感じに見えるが、ディテールが失われている

Slide 20

Slide 20 text

ステップ2の結果 • この時点で既に良い感じに見えるが、ディテールが失われている

Slide 21

Slide 21 text

ステップ2の結果 • この時点で既に良い感じに見えるが、ディテールが失われている

Slide 22

Slide 22 text

ステップ3: 3DGSを用いたカーブの最適化

Slide 23

Slide 23 text

カーブ形状の表現方法 • カーブ頂点座標を変数として最適化すると、 ギザギザが発生する è ステップ2で得たカーブ形状を学習データ として、VAEの潜在変数に落とし込む • 全てのカーブを100個の頂点でリサンプリング • 毛根を原点とし、99個の頂点の相対座標をデー タとし、128次元の潜在変数に圧縮 • 潜在変数を最適化する

Slide 24

Slide 24 text

Recap: 3D Gaussian Splatting (3DGS) [Kerbl+,SIGGRAPH23]

Slide 25

Slide 25 text

3DGSのパラメタ • 中心位置 ∈ ℝ' • 共分散行列 ∈ ℝ'×' • 色 ∈ ℝ' • Hallucinationを防ぐため、 SH係数は使わない • 透明度 ∈ (0,1] 𝐯; + 𝐯;<= 2 𝐶 = 𝐸𝐷>𝐸? 𝐸 = 𝐞# , 𝐞# ", 𝐞# "" ) 𝐷 = diag 𝜏* , 𝜏+ , 𝜏+ 𝐞# = norm 𝐯#,& − 𝐯# 𝜏* = ⁄ 𝐯#,& − 𝐯# 2 𝜏+ = ⁄ 𝑑 2 カーブ1本あたりのパラメタ: • 形状を表す潜在変数 𝐥 ∈ ℝ=>P • 色 𝐜 ∈ ℝP×R • 太さ 𝐝 ∈ ℝP • 透明度 𝑜= , 𝑜> ∈ 0,1 > è 合計162次元 𝐯# 𝐯#,& 向き 大きさ Hallucinationを防ぐため自由度を減らす 𝐞! に直交するベクトル

Slide 26

Slide 26 text

適応的なカーブの分割・削除 • 5000ステップ毎にsplitting/pruningを実行 • 初期状態で3万本だったカーブを、最終的に5万本に増やす 太くて不透明なカーブèsplit 髪の平均色より背景色に近いカーブèprune split有り split無し prune有り prune無し

Slide 27

Slide 27 text

ロス • Photometric loss ℒ- • Volume guidance • 陰関数の3D方向に沿わせる • 貫通を防ぐ • 潜在変数が初期値からあまり 離れないようにする • 半径を小さくする • Body radius (?) 重み1 重み1 重み0.05 重み1 重み1 splitする度に2倍 重み1000

Slide 28

Slide 28 text

最適化途中の様子 • 背景は緑色で、ボディも緑色のGaussianで描画する (正確には理解できず)

Slide 29

Slide 29 text

結果 27人ぶんのIn-houseデータセット

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

比較

Slide 33

Slide 33 text

比較

Slide 34

Slide 34 text

比較

Slide 35

Slide 35 text

実装と計算コスト • ステップ1 (陰関数の学習) • feat. & app. net. の学習を100万ステップ • struct. net. の学習を100万ステップ • 16枚のGoogle TPU v5で28時間 • ステップ2 (トレーシング) • 1枚のA100 GPUで1.5時間 • 陰関数のクエリがボトルネック è キャッシュしておくことで高速化できそう • ステップ3 (最適化) • カーブVAE: 6層のエンコーダ + 4層のデコーダ • 1枚のA100 GPUで100万ステップ è 2.5時間 • 3DGSによる最適化 • 3万本〜5万本を同時に描画できないので、1/3をランダムに選んで描画 • 8枚のH100 GPUで1.5万ステップ è 1.5時間 • 最後に後処理として splitting を行い、5万本è15万本に増やす 6 FC 2 FC 8 FC 隠れユニット数は全て1024

Slide 36

Slide 36 text

Limitations • 細かいカールは表現できない

Slide 37

Slide 37 text

Limitations • 細かいカールは表現できない

Slide 38

Slide 38 text

Limitations • 細かいカールは表現できない

Slide 39

Slide 39 text

Limitations • 薄毛がうまく再現できていない • マスクが二値であるため è 正確なマッティング手法との組み合わせ

Slide 40

Slide 40 text

Ablation Studies

Slide 41

Slide 41 text

3DGS最適化とDoF制限の有効性 スムージング 最適化 最適化 最適化 (DoF制限無し) ほぼ同じ高品質 ディテールが足りない

Slide 42

Slide 42 text

カーブVAEの学習 提案法: 被写体ごとに学習 Ablation: USC-HairSalonから学習

Slide 43

Slide 43 text

3D方向陰関数によるガイド 提案法: ガイド有り Ablation: ガイド無し

Slide 44

Slide 44 text

分け目アノテーションの有無 有り 無し

Slide 45

Slide 45 text

入力画像の解像度を下げた場合の挙動 そこまで品質に影響しない

Slide 46

Slide 46 text

Applications

Slide 47

Slide 47 text

リライティング

Slide 48

Slide 48 text

リライティングとマテリアル変更

Slide 49

Slide 49 text

シミュレーション

Slide 50

Slide 50 text

シミュレーション

Slide 51

Slide 51 text

仮想ヘアカット

Slide 52

Slide 52 text

仮想ヘアカット

Slide 53

Slide 53 text

感想 • 髪の方向を入力画像と比較するのに、確率分布を使うのは慧眼! • 髪は細くて一部透明なので、3DGSによる描画は合理的 • 陰関数として3D座標を3D方向に対応づける限り、乱雑な髪の配置は表 現できないのでは? è ベクトル場を使わないアプローチ • 激しくカールしていない髪型の場合は、 ほぼ解かれてしまった (Dr.Hairでも) è 今後は、激しくカールした髪型に注力? ほとんど同一の点を複数のカーブが通る状態