はじめに
CVPR2018より以下の論文
[1] S. Zuffi, et. al. "Lions and Tigers and Bears: Capturing Non-Rigid, 3D, Articulated Shape from Images".CVPR2018
のまとめ
CVF open access:
https://openaccess.thecvf.com/content_cvpr_2018/html/Zuffi_Lions_and_Tigers_CVPR_2018_paper.html
著者のコード:
https://github.com/silviazuffi/smalr_online
概要
- 動物の3D-shapeを推定するモデル
- SMALモデルに対し、動物の画像を用いてrefineすることで、より詳細なモデルを作成した
- 具体的には、画像中の動物におけるlandmarkとシルエットが推定した3D-shapeを画像にprojectしたものに適合するように、3D-shapeをrefineする
- texture mapも生成できる
以下の図で下行が対象の画像、中央行がそれに対する推定したshape、上行がそれにtextureを貼ったもの。
背景
気になったところだけざっくりまとめ。
- 人の場合と異なり、動物のリアルなshape推定、motion captureなどは現状ではない
- 人の場合は3D-scannerを用いて形状のデータを得るが、野生動物だとそれが難しいからだ
- これがあると、アニメでリアルな動きを再現したり、実験室の場で実験動物の動きを理解したり、動物の動きを真似たロボットを作成するのに役立つだろう
提案手法
SMALモデル
開始点のSMALモデル[2]について。このモデルは5種類の動物(猫・犬・馬・牛・カバ)の計41toysをスキャンして、それに適合するようにパラメータを調整することで作られている。
出来上がった全ての動物に対するテンプレートの頂点群を ${\bf v}_{template}$ として、ある特定の種類の動物(例えば猫)の典型的な頂点は
{\bf v}_{shape}(\beta) = {\bf v}_{template, 0} + B_s \beta \tag{1}
で得られる。ここで
$\beta$ :PCAで次元圧縮したshapeを表すベクトル
$B_s \in \mathbb{R}^{20}$ :βからshapeの変形ベクトルを復元するdeformation matrix
これで得られるのはrootの位置がworld座標上で (0,0,0) かつ典型的な姿勢(いわゆるT-bone)をしたもの。これに対して任意の位置、姿勢における頂点群を表現するには
${\bf r}$ :33個ある関節の親関節に対するロドリゲス角度。rootの関節はglobalなrotationを表す
${\bf t} = (t_x, t_y, t_z)$ :root関節のtranslation
として、
{\bf v}(\beta, {\bf r}, {\bf t}) \tag{2}
となる。
SMALモデルを画像に割り当てる
ここは3step。
1)$f_x = 1000$ と想定してtranslationのz軸の値を求める
2)translationのz軸の値からtranslationとrotationを求める
3)求めたtranslationとrotationを初期値として、エネルギー方程式を解き、βを求める
1) translationのz軸の値を求める
まず各変数の定義
$I^{(i)}$ :N枚ある動物が映った画像の i 番目
$S^{(i)}$ :i 番目画像内の動物のシルエット
${\bf v}(\beta^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)})$ :i 番目の画像内の動物の(2)式で表された頂点群のworld座標
${\bf K}^{(i)}$ :n_k個ある画像上のlandmarkの座標の集合
${\bf k}^{(i)}_j, (1 \leq j \leq n_k)$ :j 番目の landmarkの座標
${\bf v}_{K, j}, (1 \leq j \leq n_k)$ :landmark の j に関連した頂点群の K 番目
$n_{H(j)}$ :j 番目のlandmarkに関連した頂点の個数
${\bf f} = (f_x, f_y)$ :focal length。1stepでは 1,000とする。
${\bf c}({\bf f}^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)})$ :カメラ関連のパラメータ。r_cはカメラのrotation, t_cはカメラのtranslation。
z 軸のtranslationを求める。これは以下のようなものとする。
\hat{t_z^{(i)}} = f_x^{(i)} median \left( [\frac{\| {\bf v}_{K, h} - {\bf v}_{K, j} \|_2}{\| {\bf k}_{h}^{(i)} - {\bf k}_{l}^{(i)} \|_2}] \right) \tag{3}
ここで
${\bf v}_{K, h}$ :landmark の h に関連した頂点群の平均値
${\bf v}_{K, l}$ :landmark の l に関連した頂点群の平均値
としている。
括弧内の値を全てのlandmarkの組み合わせに関して計算し、そのmedianを求める。
まず(3)式右側カッコ内分子から考えると、landmarkのh に関連した頂点の3D座標の平均値と、別のlandmarkのkに関連した頂点の3D座標の平均値との間の距離を求めている。図にするとこんな感じか。
一方でカッコ内分母はlandmarkのkおよびhの座標を画像にprojectし、その画像内の距離を求めている。図にするとこんな感じか。
この(分子):(分母)の比が (z軸のtranslation):(焦点距離)と大体一致すると考えると、(3)式が導かれるだろう。
2) translationと rotationを求める
次に translationとglobal rotationを以下の最適化問題を解くことでで求める。
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
\hat{{\bf t}^{(i)}}, \hat{{\bf r}^{(i)}_{0}} = \argmin_{{\bf t}^{(i)}, {\bf r}^{(i)}_{0}} \alpha_z (t^{(i)}_z - \hat{t^{(i)}_{z}}) + \sum^{\tilde{n^{(i)}_{K}}}_{j=1} \| {\bf k}^{(i)}_{j} - \frac{1}{n_{H(j)}} \sum^{n_{H(i)}}_{h=1} \Pi ({\bf v}({\bf r}^{(i)}, {\bf t}^{(i)})_{K,j,h}, {\bf c}^{(i)}) \|_2 \tag{4}
ここで $\Pi$ はprojectするオペレーター。
1つ1つ見ていく。
まず右辺第1項は求めるtranslationのz成分と先で求めた(3)式のtranslationのz成分との差。$\alpha_z$ に関しては論文中に言及が無いが、第2項との比重を考えた掛け率か。
右辺第2項はlandmark(的な値)を画像座標にprojectしたものと、実際にアノテーションされた画像上のlandmarkとの差。
より細かく見ると、
{\bf v}({\bf r}^{(i)}, {\bf t}^{(i)})_{K,j,h}
はlandmark 「j」に関する頂点 h をrotateとtranslateしてworld座標にしたもの。($K$ は何を意味してる??)
これとカメラパラメータ ${\bf c}^{(i)}$ とで画像上にprojectする。それの全てのlandmark 「j」に関する平均値を求める。
これがアノテーションした画像上の landmark 「j」の位置と一致しているだろうから、その差を求める。これを全ての landmarkに関して足す。
3) βを求める
以下のエネルギー方程式を解くことでβを求める。
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
\hat{\Theta^{(i)}} = \argmin_{\beta, {\bf r, t, f}} \sum^N_{i=1} (E_{kp} (\Theta^{(i)}) + E^{(i)}_{\beta}(\beta) + E_{cam}({\bf f}) + E_{sil} (\Theta^{(i)}) + E_{lim}({\bf r}^{(i)}) + E_{pose}({\bf r}^{(i)}) + E_{shape}(\beta^{(i)}) \tag{5}
ここで
\hat{\Theta^{(i)}} = (\beta^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)}, {\bf f}^{(i)})
以下1つ1つみていく。
$E_{kp}$ は推論した3D上のkeypointを画像上にprojectし、それと正解との差とする。
E_{kp}(\Theta^{(i)}) = \alpha_{kp} \sum^{\tilde{n_K^{(i)}}}_{j=1} \rho (\| {\bf k}^{(i)}_j - \frac{1}{n_{H(j)}} \sum^{n_{H(j)}}_{h=1} \Pi ({\bf v}(\beta^{(i)}, {\bf r}^{(i)}, {\bf t}^{(i)})_{K, j, h}, {\bf c}({\bf f}^{(i)}) \|_2) \tag{6}
先程の(4)式と同様だが、ここではβに加えて ${\bf r}^{(i)}, {\bf t}^{(i)}, {\bf f}^{(i)}$ が最適化対象の変数となっている。
次に $E_{\beta}^{(i)}$ だが、これは同じビデオに出てくる同じ馬はshapeが同じだろうという事前知識でβ同士で差をとる。
E_{\beta}^{(i)} = \alpha_{\beta} | \beta^{(i-1)} - \beta^{(i)} | \ for \ i>1 \tag{7}
$E_{cam}$ はf_xとf_yとの差をとるもの。
$E_{sil}$ はシルエットに関するloss。
E_{sil}(\Theta^{(i)}) = \alpha_{sil} \left( \sum_{{\bf x} \in \hat{S(i)}} \mathcal{D_S}({\bf x}) + \sum_{{\bf x} \in S(i)} \rho (\min_{\hat{\bf x} \in \hat{S^{(i)}}} \| {\bf x} - \hat{\bf x} \|_2 ) \right) \tag{8}
右辺カッコ内第1項の $\mathcal{D_S}$ はL2距離で、点 x がシルエット内であれば 0 とする。
右辺カッコ内第2項の $\hat{S^{(i)}}$ はprojectしたシルエット。正解のシルエット内の全ての点とprojectしたシルエット内の全ての点とのL2を考え、そのうちの最小のものを求めているので、重なっている部分は 0、一方に対してはみ出している部分は、他方との近傍点との差となる。
$E_{lim}$ は関節の角度に関する事前知識を利用したもの。つまり、こちらには曲がらない、という可動域を利用している。
E_{lim} ({\bf r}^{(i)}) = \alpha_{lim} (\max({\bf r}^{(i)} - {\bf r}_{max}, 0) + \max ({\bf r}_{min} - {\bf r}^{(i)} , 0)) \tag{9}
関節角度が r_max を超えるとlossとなるし、r_min を下回っても lossとなる。
$E_{pose}, E_{shape}$ はtargetと推定値とで、meanとcovarianceをL1の2乗で計算する。
SMALR
SMALRは ${\bf dv}$ 値を使ってSMALをrefineする。
{\bf v}_{shape}({\bf dv}) = {\bf v}_{template, 0} + B_s \hat{\beta} + {\bf dv} \tag{10}
この ${\bf dv}$ 値もエネルギー関数を最小化させることで求めるが、その際に上記で求めたパラメータは固定させる。
E_{opt} ({\bf dv} = \sum^N_{i=1} \left( E_{kp}^{(i)} ({\bf dv}) + E_{sil}^{(i)} \right) + E_{arap}({\bf dv}) + E_{sym} ({\bf dv}) + E_{lap}({\bf dv}) \tag{11}
新たに出てきた項に関してみると、$E_{arap}$ は[3]に出てくるもので、変形するにも局所的には出来るだけ固定するようにするloss。
$E_{sym}$ は左右をできるだけ対象にするloss。
$E_{lap}$ は dv 値のlaplacianを取り、スムーズにするloss。
textureの復元
以下の手順で動物の画像が与えられた時にtexture mapを復元する
- SMAL modelに対して textureの座標系における UV mapを定義する
- 画像とそれに対応するmeshからtextureと各textureの位置におけるvisibility weight(ちゃんと見えてると1.0みたいな値?)を定義する
- (複数の画像における?)加重平均でtexture mapを計算する。この段階ではどの画像にも映っていないtextureの部分がある
- 左右の対称性を利用し、texture mapを更新する。具体的には1)左右の対応するtexture上の点においては平均の画素とする、2)一方がどの画像にもない(つまりtexture mapで定義されてない)場合、対応する側の点の画素とする
- この1)はシマウマ模様や斑点模様の部分には適応しない(おそらく左右で異なるだろうから)
- これでもtexture map上で定義されない点に関しては、texture map全体の平均画素を割り当てる
以下はtigerの例。
どの画像からも見えない(例えば体の下部分)などは平均的な色で埋められている。
実験と結果
合成データに対する結果
馬とサイで検証した。以下の図の左側では、左列がシルエット、中央列がSMALをfittingさせたもの、右列がSMALRでrefineしたもの。
右側のグラフは横軸が画像数、縦軸はloss。画像が増えるとSMALRのlossがSMALのlossを安定して下回っている。
実データに対する結果
以下はリアルなサイに対する推論結果。
左列はSMAL、中央列はSMALR、右列の最上部はその左のSMALRにtextureをハメたもの、下3つはrealな画像。
SMALRではツノの再現等、よりリアルになっている。
reference
[2] S. Zuffi, A. Kanazawa, D. Jacobs, and M. J. Black. 3D menagerie: Modeling the 3D shape and pose of animals. In IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), July 2017.
[3] O. Sorkine and M. Alexa. As-rigid-as-possible surface mod- eling. In Proceedings of the Fifth Eurographics Symposium on Geometry Processing, Barcelona, Spain, July 4-6, 2007, pages 109–116, 2007.