はじめに
ICCV 2021より以下の論文
[1] S. Peng, et. al. "Animatable Neural Radiance Fields for Modeling Dynamic Human Bodies". ICCV2021
のまとめ
-
projectページ:
https://zju3dv.github.io/animatable_nerf/ -
公式コード:
https://github.com/zju3dv/animatable_nerf
商用利用不可
概要
- 他視点のRGBカメラから同時に動画を撮影し、それらから人の3Dモデルを再構築するしくみ
- 人の3D骨格モデルとNeRFを結びつける blend weight fields なるものを新たに導入した
以下の図([1] Figure1)では、
手法
全体像
${\rm x}$: observation-space における3次元座標
$T_i({\rm x})$: observation-space から canonical-speceへの座標変換。
$\gamma_{\rm x}$: 空間上の positional encoding
外観する。まず左端はあるフレームにおける人の状態をあるカメラから注目した状態で、図では右手指先付近の x に注目している。
これをその右 neural blend weight field に入力すると、x の重みが出力される。この重みは各関節にどの程度付随するかを示したような値。このとき neural blend weight field にフレーム固有の情報を与えるため、latent code も同時に入力している。
これと x 、さらに人の骨格モデルから、いわゆる T-pose である決められた姿勢の指先位置である x' が出力される。
この x' をNeRFに入力し、密度、カラーを出力する。
Representing videos with neural radiance fields
まずこの部分。
このfieldではNeRF論文[2]ごとく、位置を入力して密度などを出力する。NeRFとの違いは、入力するデータが x でなく、canonical spaceに変換した $T_i({\rm \bf x})$ である点。
(\sigma_i({\rm \bf x}), {\rm \bf z}_i({\rm \bf x})) = F_{\sigma}(\gamma_{\rm \bf x}(T_i({\rm \bf x}))), \tag{1}
${\rm \bf z}_i({\rm \bf x})$ は以下の図の赤い円内の部分だろう。(Fig9に加筆)
このshape feature z と向き $\gamma_{\rm \bf d}$ などを入力として、カラーを推定する。
ここでNeRF論文[2]とは異なり、frameごとの latent code ${\bf \ell}_i$ も入力する。
{\rm \bf c}_i({\rm \bf x}) = F_{\rm \bf c}({\rm \bf z}_i({\rm \bf x}), \gamma_{\rm \bf d}({\rm \bf d}, {\bf \ell}_i))
図にするとこんな感じか。(Fig9に加筆)
neural blend weight field
このあたりの部分。
今回のモデルでは SMPL などのshapeモデルをベースにobservation space の各点 x を canonical spaceへの変換を行う。その際に shapeモデルの各関節における transform に対して各点 x がどう追随するかが問題となる。
この observation space の各点 x が各関節に対してどれくらい影響を受けるかを重み ${\rm \bf w}_i ({\rm \bf x})$ とすると、これを以下の様に考える。
{\rm \bf w}_i ({\rm \bf x}) = {\rm norm} \left( F_{\Delta {\rm \bf w}} \left( {\rm \bf x}, {\bf \psi}_i \right) + {\rm \bf w}^{\rm s} \left( {\rm \bf x}, S_i \right) \right) \tag{5}
ここで
$F_{\Delta {\rm \bf w}}$: neural blend weight field による変換だが、具体的にはMLP。
${\bf \psi}_i$: フレームごとのlatent code
$S_i$: 統計的な体のモデル。例えばSMPL。
${ \rm \bf w}^s$: 統計的な体のモデルに基づいて計算されたblend weightの初期値
${\rm norm}({\rm \bf w}) = {\rm \bf w} / \sum w_i$
まず右辺第2項からみると、フレームごとの統計的な体のモデルを用意し、それらから重みの基準値を算出する。その際にまず x から最も近傍となるポリゴンの面を特定する。この面を囲む3点にはshapeモデルにより重みが割り振られている。よって3点から内挿することで重みが求まる。
次に1項目で差分を求めるが、ここで neural blend weight field $F_{\Delta{\rm \bf w}}$ を用いる。このネットワーク構造は以下。(Fig10より)
最後にそれらを正規化して重みとする。
骨格モデルを用いた変形
このあたりの部分。
まず諸々定義。
${\rm \bf J} \in \mathbb{R}^{K \times 3}$: 骨格モデルにおけるK個の関節位置。
${\rm \bf \theta} \in \mathbb{R}^{3(K+1) \times 1} = [{\bf \omega}_0^T, \cdots , {\bf \omega}_K^T]$: 各関節における親関節からの相対的な回転角で、Rodrigues表示。
${\rm \bf \theta}_c$: canonical poseにおけるθ
${\rm \bf \theta}_c$: observation poseにおけるθ
とすると、Rodriguesベクトルから作成した 3x3 の回転行列は
R({\rm \bf \omega}_i)
となる。ある関節 k は親関節の軸に対して R 回転させ、かつ親関節の位置の分変位させたものとなるので、その1回のaffine変換は同時座標系で
\begin{bmatrix}
R({\rm \bf \omega}_k) & {\rm \bf j}_k \\
0 & 1 \\
\end{bmatrix}
となる。これをkinematic treeに従って繰り返せば、k 番目の関節に対する変換行列が求まる。
A_k ({\rm \bf J}, {\rm \bf \theta}) = \prod_{i \in P(k)}
\begin{bmatrix}
R({\rm \bf \omega}_i) & {\rm \bf j}_i \\
0 & 1 \\
\end{bmatrix}
\tag{11}
$P(k)$ は関節 k に対する kinematic tree での親関節群。
まず canonical pose から曲げてないゼロの状態にした後に変換し、そこから observation poseまで変形するという過程を踏むと、canonical pose から observation poseまでの変換が求まる。
G_k = A_k ({\rm \bf J}, {\rm \bf \theta}_t) A_k ({\rm \bf J}, {\rm \bf \theta}_c) ^{-1} \tag{10}
k 番目の関節に対しては observation spaceの位置に対して $G_k^{-1}$ をかければ canonical spaceの位置が求まる。
一方でそれ以外の点に関しては、(5)式で求めた重みを用いれば
{\rm \bf x}' = \left( \sum^K_{k=1} w^o({\rm \bf x})_k G_k \right)^{-1}{\rm \bf x} \tag{4}
と求まる。
loss
まず学習対象のパラメータは
- NeRFのニューラルネット $F_{\sigma}, F_c$
- neural blend weight fields のニューラルネット $F_{\Delta {\rm \bf w}}$
- appearance code $\ell_i$
- latent code $\psi_i$
である。それに対して loss は以下の2種類。
レンダリングしたカラーによる loss
$\tilde{\rm \bf C}_i ({\rm \bf r})$: NeRFによってレンダリングした画像上の色
${\rm \bf C}_i ({\rm \bf r})$: 実際に観測した画像上の色
として、これらのL2を求める。
L_{rgb} = \sum_{r \in \mathcal{R}} \| \tilde{\rm \bf C}_i ({\rm \bf r}) - {\rm \bf C}_i ({\rm \bf r}) \|_2
\tag{6}
$\mathcal{R}$ は画像上の全ピクセルを通過する光。
neural blend weight に関する loss
observation space における x とそれを canonical space へ変換した x' とは体の同じ部分のはず。よって前者の neural blend weight と後者の neural blend weight ${\rm \bf w}^{\rm can}({\rm \bf x}')$ とは一致するはず。よってこの両者の差を loss とする。
L_{nsf} = \sum_{{\rm \bf x} \in \mathcal{X}_i} \| {\rm \bf w}_i ({\rm \bf x}) - {\rm \bf w}^{\rm can} \left( T_i \left( {\rm \bf x} \right) \right) \|_1
\tag{7}
$\mathcal{X}_i$ はフレーム i における人の体からサンプリングされた 3D座標。
新たなポーズにおける画像生成
新たなポーズにおける画像を生成する際には(5)式のSに新たなポーズを入れて重みを求め、それを(7)式で最適化させる。
実験と結果
学習方法
- 最適化:Adam
- 用いたvideoは3つのviewからの300frames
- 新視点におけるパラメータ調整部分を除くと4枚の2080Tiで12時間
- 新視点におけるパラメータ調整部分は上記スペックで30分
使用したデータセット
- H36M
- ZJU-MoCap
zju-MoCapはdeformableなNeRF系のデファクト・スタンダードになりつつある。
メトリクス
- PSNR
- SSIM
この2つのメトリクスはこの分野のデファクト・スタンダード。
定量的評価1 新視点からのレンダリング
新視点からのレンダリングタスクにおいて、同じくSMPLを用いた1)NT(Neural Textures), 2)NHR, 3)NB(Neural Body)との比較は以下。
NB(Neural Body)以外には勝っている。
定量的評価2 新ポーズのレンダリング
こちらはNT(Neural Textures)とNHRとの比較。
安定的に勝っている。
定性的評価
新ポーズのレンダリング・タスクでNT, NHR, NBと比較した結果は以下。
左側がH36M, 右側がzju-MoCap。やはり Neural Body の方が若干よい。
reference
[2] Ben Mildenhall, Pratul P Srinivasan, Matthew Tancik, Jonathan T Barron, Ravi Ramamoorthi, and Ren Ng. Nerf: Representing scenes as neural radiance fields for view syn- thesis. In ECCV, 2020.