Fusion4D: Real-time Performance Capture of Challenging Scenes 筆記

在這裏插入圖片描述簡介在這裏插入圖片描述
Fusion4D 算法的目的是 4D 重建,也就是說重建的場景是隨時間變化的,Fusion4D 可以把變化的 3D 場景記錄下來,算法記錄的是每時刻場景的 3D 模型。

由於 Fusion4D 採用多相機,簡單融合每一時刻多相機輸出的圖像也可以重建單一時刻下的 3D 場景,但是考慮到這樣重建的模型會有缺失,還需要將之前重建的(reference frame)和當前時刻重建的(data frame)做融合。

算法主要有兩個部分:一個是計算 warp reference frame 的 Embedded Deformation Graph 參數,ED 參數用來融合重建 reference frame,並且將 reference frame warp 到 data frame。一個是將 warp 到 data frame 的 reference frame 和當前時刻重建的 data frame 融合,輸出當前時刻的 3D 模型。

深度數據獲取和預處理
作者採用 24 個相機獲取 RGB-D 數據,每一時刻可以產生 8 個深度圖和 8 個 RGB 圖,深度圖採用 PatchMatch 算法通過立體匹配得到。

在得到深度圖後,根據 pixel-wise differences 分割得到前景,並且採用 CRF 算法增強像素之間的連續性。

非剛性運動場估計
作者採用 embedded deformation model (簡稱 ED) 將累積融合得到的 reference frame (key volume) 和新輸入的數據配準,同 DynamicFusion,ED 的節點也是從 TSDF 模型提取的 mesh 中採樣得到。mesh 中的每個點的位置和法向按照在 ED 中最近的 K 個節點的參數做變換 :

T(vm;G)=RkSmwkm[Ak(vgk)+gk+tk]+T\mathcal{T}\left(\mathbf{v}_{m} ; G\right)=R \sum_{k \in \mathcal{S}_{m}} w_{k}^{m}\left[A_{k}\left(\mathbf{v}-\mathbf{g}_{k}\right)+\mathbf{g}_{k}+\mathbf{t}_{k}\right]+T

T(nm;G)=RkSmwkmAkTnm\mathcal{T}^{\perp}\left(\mathbf{n}_{m} ; G\right)=R \sum_{k \in \mathcal{S}_{m}} w_{k}^{m} A_{k}^{-T} \mathbf{n}_{m}

作者在估計 motion field 參數時,優化的能量函數項較多:

E(G)=λ data E data (G)+λ hull E hull (G)+λ corr E corr (G)+λ rot E rot (G)+λ smooth E smooth (G)\begin{aligned} E(G)=& \lambda_{\text { data }} E_{\text { data }}(G)+\lambda_{\text { hull }} E_{\text { hull }}(G)+\lambda_{\text { corr }} E_{\text { corr }}(G)+\\ & \lambda_{\text { rot }} E_{\text { rot }}(G)+\lambda_{\text { smooth }} E_{\text { smooth }}(G) \end{aligned}

data 項(most crucial):

Edata(G)=n=1NmVn(G)(n~m(G)(v~m(G)Γn(v~m(G))))2E_{\mathrm{data}}(G)=\sum_{n=1}^{N} \sum_{m \in \mathcal{V}_{n}(G)}\left(\tilde{\mathbf{n}}_{m}(G)^{\top}\left(\tilde{\mathbf{v}}_{m}(G)-\Gamma_{n}\left(\tilde{\mathbf{v}}_{m}(G)\right)\right)\right)^{2}

其中,N 表示一幀當中的 N 幅圖像,m 表示當前 mesh 在第 n 圖像可見的點(可以投影到圖像中,並且 mesh 點和投影點的距離和法向相似)。

正則項
保持仿射變換矩陣單位正交,

Erot(G)=k=1KAkTAkIF+k=1K(det(Ak)1)2E_{\mathrm{rot}}(G)=\sum_{k=1}^{K}\left\|A_{k}^{T} A_{k}-\mathbf{I}\right\|_{F}+\sum_{k=1}^{K}\left(\operatorname{det}\left(A_{k}\right)-1\right)^{2}

並且光滑連續:

Esmooth(G)=k=1KjNkwjkρ(Aj(gkgj)+gj+tj(gk+tk)2)E_{\mathrm{smooth}}(G)=\sum_{k=1}^{K} \sum_{j \in \mathcal{N}_{k}} w_{j k} \rho\left(\left\|A_{j}\left(\mathbf{g}_{k}-\mathbf{g}_{j}\right)+\mathbf{g}_{j}+\mathbf{t}_{j}-\left(\mathbf{g}_{k}+\mathbf{t}_{k}\right)\right\|^{2}\right)

Visual Hull Term
在這裏插入圖片描述
visual hull 如上圖所示,第一幅圖中,因爲深度圖像有空洞,空洞位置處深度值爲 0,空洞使得 visual hull 一直延伸到相機光心(visual hull 位紅色輪廓加兩條紅色射線),這時 mesh 點 warp 到兩條射線相夾的空間是合法的,採用多幀深度圖像計算 visual hull 會更魯棒一些,例如,第二幅圖形成的 visual hull 會限制這一點。

爲了不使得 mesh 中的點 warp 到 free space(表面到相機一側的空間),作者添加 visual hull 約束,大概意思是在 warp mesh 中點時,懲罰 warp 到 free space 中的點,free space 通過深度圖像計算得到。

Ehull(G)=m=1MH(T(vm;G))2E_{\mathrm{hull}}(G)=\sum_{m=1}^{M} \mathcal{H}\left(\mathcal{T}\left(\mathbf{v}_{m} ; G\right)\right)^{2}

上式 的計算方式還要再細看參考文獻。

匹配項
作者採用 GPC(決策樹) 計算兩幀圖像中匹配的 patch(特徵):{unf prev ,unf}f=1Nf\left\{u_{n f}^{\text { prev }}, u_{n f}\right\}_{f=1}^{N_{f}}

然後根據匹配的特徵,對於之前幀中的點找到當前 mesh 中的匹配點:

qnf=argminvVΠn(T(v;Gprev))unfprev\mathbf{q}_{n f}=\underset{\mathbf{v} \in \mathbf{V}}{\operatorname{argmin}}\left\|\Pi_{n}\left(\mathcal{T}\left(\mathbf{v} ; G^{\mathrm{prev}}\right)\right)-u_{n f}^{\mathrm{prev}}\right\|

最終匹配項誤差函數爲:
Ecorr(G)=n=1Nf=1Fnρ(T(qnf;G)Pn(unf)2)E_{\mathrm{corr}}(G)=\sum_{n=1}^{N} \sum_{f=1}^{F_{n}} \rho\left(\left\|\mathcal{T}\left(\mathbf{q}_{n f} ; G\right)-P_{n}\left(u_{n f}\right)\right\|^{2}\right)

參數優化
在優化時,作者根據上一幀優化的 ED 參數初始化當前幀優化的 ED 參數,優化時,首先固定 ED 參數採用 ICP 算法計算全局的 R 和 t,然後,固定全局的 R 和 t 優化 ED 參數。

對於 data 項:
E~data(G)=n=1NmVn(G0)(n~m(G0)(v~m(G)Γn(v~m(G0))))2\tilde{E}_{\mathrm{data}}(G)=\sum_{n=1}^{N} \sum_{m \in \mathcal{V}_{n}\left(G_{0}\right)}\left(\tilde{\mathbf{n}}_{m}\left(G_{0}\right)^{\top}\left(\tilde{\mathbf{v}}_{m}(G)-\Gamma_{n}\left(\tilde{\mathbf{v}}_{m}\left(G_{0}\right)\right)\right)\right)^{2}

因爲上式牽扯到兩組 ED 參數相乘, 在每一步開始迭代優化時,作者保存初始的參數,將能量函數做近似:

E~data(G)=n=1NmVn(G0)(n~m(G0)(v~m(G)Γn(v~m(G0))))2\tilde{E}_{\mathrm{data}}(G)=\sum_{n=1}^{N} \sum_{m \in \mathcal{V}_{n}\left(G_{0}\right)}\left(\tilde{\mathbf{n}}_{m}\left(G_{0}\right)^{\top}\left(\tilde{\mathbf{v}}_{m}(G)-\Gamma_{n}\left(\tilde{\mathbf{v}}_{m}\left(G_{0}\right)\right)\right)\right)^{2}

作者採用 preconditioned conjugate gradient 計算 ED 參數。

Data Fusion
作者在系統中維護了兩個 volume:reference/model frame , data frame 。新獲取的數據融合到 reference frame,並且還從 reference frame 選擇數據融合到 data frame,

最終是在 data frame volume 中提取重建結果數據,在將 reference frame 的數據融合到 data frame 時,原則是從 reference frame 選擇的融合進 data frame 的數據,比 data frame 觀測的數據質量要高。

volume warping
這步操作是把 reference frame 融合的數據 warp 到一個新的 data frame,後續再將兩個 volume 的數據做 blending。

從 reference frame 選擇數據融合進 data frame 的流程是:根據估計的 ED 參數,計算 warp 後 reference 中的 voxel 在 data frame 中的位置,根據 warp 後 voxel 的位置,更新 data frame 中鄰域的 voxels 的值,更新的時候並不是簡單加權融合,操作如下:

dr=dr+(x~rxd)Δ~\overline{d^{r}}=d^{r}+\left(\tilde{\mathbf{x}}^{r}-\mathbf{x}^{d}\right)^{\top} \tilde{\Delta}

Voxel Misalignment
在將 reference frame 的數據融合到 data frame 時需要檢測 reference frame 中的數據是否是跟蹤的好,在將 reference frame 的數據 warp 到 data frame 後,首先檢測配準誤差:

exr={Dd(x~r) if Hd(x~r)=0min(Dd(x~r),Hd(x~r)) otherwise e_{\overline{\mathbf{x}}^{r}}=\left\{\begin{array}{ll}{\left|\mathcal{D}^{d}\left(\tilde{\mathbf{x}}^{r}\right)\right|} & {\text { if } \mathcal{H}^{d}\left(\tilde{\mathbf{x}}^{r}\right)=0} \\ {\min \left(\left|\mathcal{D}^{d}\left(\tilde{\mathbf{x}}^{r}\right)\right|, \mathcal{H}^{d}\left(\tilde{\mathbf{x}}^{r}\right)\right)} & {\text { otherwise }}\end{array}\right.

其中,Dd\mathcal{D}^{d} 是 data frame 中 SFD 值,Hd\mathcal{H}^{d} 是 visual hull transform,最後先統計每個 ED 節點相關 voxel 的平均值,然後在融合時丟掉和誤差較大的 ED 節點有關聯的 voxels。

Volume Blending
在將獲取的深度數據融合到 data frames,並且將 reference frame warp 到 data frame 後,將 data frame 和 reference frame V~r\tilde{\mathbb{V}}^{r} 融合得到最終重建輸出的 volume。

首先計算 Vd\mathbb{V}^{d}V~r\tilde{\mathbb{V}}^{r} 融合時 V~r\tilde{\mathbb{V}}^{r} 中 voxel 點的權重,做法是將 reference frame 中的點投影到各深度圖像,然後計算每個點的平均誤差:

e pixel ={min(1.0,dd proj /dmax) if d proj  is valid 1.0 otherwise e_{\text { pixel }}=\left\{\begin{array}{ll}{\min \left(1.0,\left|d-d_{\text { proj }}\right| / d_{\max }\right)} & {\text { if } d_{\text { proj }} \text { is valid }} \\ {1.0} & {\text { otherwise }}\end{array}\right.

融合如下:
dd=d~rw~r(1.0e voxel )+ddwdw~r(1.0e voxel )+wd\overline{d}^{d}=\frac{\tilde{d}^{r} \tilde{w}^{r}\left(1.0-e_{\text { voxel }}\right)+d^{d} w^{d}}{\tilde{w}^{r}\left(1.0-e_{\text { voxel }}\right)+w^{d}}

reference frame 數據融合
同 DynamicFusion,在更新 reference frame 中的 voxels 時,首先根據計算的 warp field 將 reference 中的 voxels warp 到 data frame,進而投影到圖像更新 TSDF value 和 weight。在融合時,reference 中的有些 voxels 和 depth map 中的數據並不能很好的融合,這時,根據計算的 ED 節點的誤差,從 data frame 中提取數據更新 reference frame,並且,還會週期性的根據 data frame 中的數據將 reference frame 中的數據復位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章