はじめに
CVPR2022に採択されたらしきこちらの論文
[1] C. Y. Weng, et. al. HumanNeRF: Free-viewpoint Rendering of Moving People from Monocular Video.
のまとめ
-
project page
https://grail.cs.washington.edu/projects/humannerf/
概要
- 単眼カメラから撮影されたビデオから、その映像内の人に対して新しい視点でレンダリングするしくみ
- T-pose上でNeRFを行い、それを各フレームごとの姿勢に変換する
- 事前に必要なものは3D骨格を推定するモデル
上図のように単眼ビデオを入力して、自由視点からのレンダリングを行う。
手法
全体像
まず ${\rm \bf x}_0 \in \mathbb{R}^3 ?$: 各フレームにおける3次元(?)の座標とする。
また ${\rm \bf p} = (J, \Omega)$: そのフレームにおける人のposeで、
\Omega = \{ \omega_i \}
は関節の相対回転ベクトルとし、
J \in \mathbb{R}^{K \times 3}
は各関節の3D座標とする。撮影したフレームにおける3次元(?)の座標から canonical space(T-poseの空間)の座標へと変換(motion field)を T として
T: ({\rm \bf x}_0, {\rm \bf p}) \rightarrow {\rm \bf x}_c
とする。このcanonical spaceにおける点から色と密度を推定する関数を $F_c : {\rm \bf x}_c \rightarrow ({\rm \bf c}, \sigma)$ とする。
撮影したフレームにおける3次元位置と姿勢情報から以下の $F_0 : $ でその色と密度を求める。
F_0 ({\rm \bf x}, {\rm \bf p}) = F_c (T({\rm \bf x}, {\rm \bf p}) \tag{1}
さらにmotion field T は線形の逆運動学で決まる $T_{skel}$ とそれを補完するoffset TNRに分ける。
T({\rm \bf x}, {\rm \bf p}) = T_{skel}({\rm \bf x}, {\rm \bf p}) + T_{NR}(T_{skel}({\rm \bf x}, {\rm \bf p}), {\rm \bf p}) \tag{2}
ここまでまとめると、こんな感じか。
canonical volume
canonical volume $F_c$ は NeRF 的な部分だが、ここはMLPとする。
F_c ({\rm \bf x}) = {\rm MLP}_{\theta_c} (\gamma ({\rm \bf x})) \tag{3}
$\gamma$ はNeRF同様以下でエンコードする。
\gamma ({\rm \bf x}) = ({\rm \bf x}, \sin (2^0 \pi {\rm \bf x}), {\rm \bf x}, \cos (2^0 \pi {\rm \bf x}), \cdots, {\rm \bf x}, \sin (2^{L-1} \pi {\rm \bf x}), {\rm \bf x}, \cos (2^{L-1} \pi {\rm \bf x}))
図にするとこんな感じ。
skeletal motion
observation space における x は近傍の骨格に沿って変形させる。
body poseから計算した i 番目の関節の親関節に対する回転角と変位をR, tとして、
T_{skel} ({\rm \bf x}, {\rm \bf p}) = \sum^{K}_{i=1} w^i_o ({\rm \bf x})(R_i {\rm \bf x} + {\rm \bf t}_i) \tag{4}
$w^i_o ({\rm \bf x})$ は observation space における各点 x がどの関節と関連しているかを表す重みだが、これは以下の様に canonical space上の重みを使った表現に置き換える。
w_o^i ({\rm \bf x}) = \frac{w_c^i (R_i {\rm \bf x} + {\rm \bf t}_i)}{\sum^K_{k=1} w^k_c (R_k {\rm \bf x} + {\rm \bf t}_k)} \tag{5}
ここで
\{ w^i_c({\rm \bf x}) \} = W_c({\rm \bf x})
とする。$W_c({\rm \bf x})$ はニューラルネットの出力を想定して、Kチャンネルとする。
この $W_c({\rm \bf x})$ は 乱数の定数である
latent code z を使ってCNNから出力する。このあたりは意味不明
W_c({\rm \bf x}) = {\rm CNN}_{\theta_{\rm skel}}({\rm \bf x}; {\rm \bf z}) \tag{6}
このへんを図にするとこんな感じか。$w_c$ 周りがよくわからん。
Non-rigid motion
offset $\Delta{\rm \bf x}$ はposeとskeltal motionから
T_{\rm NR} ({\rm \bf x}, {\rm \bf p}) = {\rm MLP}_{\theta_{\rm NR}} (\gamma ({\rm \bf x}; \Omega) \tag{7}
x は standard positional encoding $\gamma$ する。
あえて図にするとこんな感じ。
Pose correction
3d 骨格モデルから推定される各関節の角度を学習によりrefineする。具体的には3d 骨格モデルから推定される各関節の角度に対して、正しい角度との差分を $\Delta_{\Omega} = (\Delta_{\omega_{0}}, \cdots \Delta_{\omega_{K}})$ をMLPから求める。
\Delta_{\Omega} = {\rm MLP}_{\theta_{pose}}(\Omega) \tag{9}
これに3D骨格モデルからの推定値を加えたposeを使用する。
P_{\rm pose} ({\rm \bf p}) = (J, \Delta_{\Omega}({\rm \bf p}) \otimes \Omega) \tag{8}
ここの部分。
loss
volume renderingによるloss
volume rendiringにより$\theta_c, \theta_{\rm skel}, \theta_{\rm NR}, \theta_{\rm pose}$ を求める。
${\rm \bf e}_i$: i番目の画像に対応するカメラパラメータ
$\Gamma $: volume renderer
として、lossは以下のように1)observation space上の点をcanonical spaceに変換して、それを色を取得し、それを画像上にレンダリングしたものと、2)実際の画像、との間で計算する。
\newcommand{\minimize}{\mathop{\rm minimize}\limits}
\minimize_{\Theta} \sum^N_{i=1} \mathcal{L} \{ \Gamma [F_c (T({\rm \bf x}, {\rm \bf p}_i)), {\rm \bf e}_i] I_i \} \tag{11}
lossの関数 $\mathcal{L}$ はMSEと perceptual loss の1種でVGGを使う LPIPS[2] との和とする。
\mathcal{L} = \mathcal{L}_{\rm LPIPS} + 0.2 \times \mathcal{L}_{\rm MSE}
関節に対するweight
canonical spaceにおける体内の各点が各関節に対してどれくらいの重みかを表す $\Delta W_c$ は以下のように
W_c = softmax(\Delta W_c + \log(W_g)) \tag{21}
各関節からのgaussianを仮定したデフォルト値 $W_g$ との差分を加えることで表現する。この差分をニューラルネットで学習する。
volume rendering
レンダリングに関してはNeRFごとく以下。
\begin{eqnarray}
C({\rm \bf r}) &=& \sum^D_{i=1} (\prod^{i-1}_{j=1}(1 - \alpha_j)) \alpha_i {\rm \bf c}({\rm \bf r}_i) \tag{12} \\
\alpha_i &=& 1-\exp(-\sigma({\rm \bf x}_i) \Delta t_i)
\end{eqnarray}
サンプリングは3D pose estimationの過程で生じた(?)人の3D bounding box内のみで行う。
delayed optimization of non-rigid motion field
ここはよくわかってないので雰囲気だけ。
skeletal motion モデルと non-rigid motion モデルを同時に学習させると、後者が過学習するらしい。前者の主体は行列演算だが、パラメータで重み $w_o$ を使っていて、これの元を正せばニューラルネット。よって前者が適切に学び、後者がその差分を学ぶ形が理想的だが、先に後者がフィッティングしてしまうらしい。
この対応策として、周波数領域にHann windowをかけて適切な周波数のみ選択する。学習と共にwindowの幅を広げていく。
loss and ray sampling
perceptual loss である LPIPS を用いているので、NeRFのようなrandom samplingはできない。サンプリングはパッチとする。
実験と評価
用いたデータセット
- ZJU-MoCap dataset
- Youtubeのビデオ
学習の設定
- 最適化:Adam(β1=0.9, β2=0.99, lr=5x10-4 for $\theta_c$, 5x10-5 for all)
- 1 rayあたり128点をサンプリング
- iteration:400K(4xRTX2080Tiで72時間)
- Youtubeのビデオを使用した場合の Ts, Teに対してdelayed optimization
比較対象
- Neural Body
拙著 https://qiita.com/masataka46/items/dadfe474693961b19467 等参照 - HyperNeRF[4](結局、性能が悪すぎるので使われず)
メトリクス
- PSNR
- SSIM
- LPIPS*(上記LPIPSの値を100倍する)
他のモデルとの比較結果
ZJU-MoCap datasetを用いた場合の比較結果は以下
いずれのメトリクスにおいてもneural bodyより精度が良い。
定性的評価
以下の図は上2行が著者らが撮影したビデオ映像、下3行がYoutubeの映像。
neural bodyより本手法の方が細部まではっきりしている。
reference
[2] Katja Schwarz, Yiyi Liao, Michael Niemeyer, and Andreas Geiger. GRAF: Generative radiance fields for 3d-aware im- age synthesis. NeurIPS, 2020.
[3] Nikos Kolotouros, Georgios Pavlakos, Michael J. Black, and Kostas Daniilidis. Learning to reconstruct 3D human pose and shape via model-fitting in the loop. ICCV, 2019.
[4] Keunhong Park, Utkarsh Sinha, Peter Hedman, Jonathan T. Barron, Sofien Bouaziz, Dan B Goldman, Ricardo Martin- Brualla, and Steven M. Seitz. HyperNeRF: A higher- dimensional representation for topologically varying neural radiance fields. SIGGRAPH Asia, 2021.