论文筆記:通過反向傳播PnP優化的端到端可學習幾何視覺

這篇文章結合了傳統的PnP方法與深度學習,整體思路相對簡單。主要關注點在於如何將傳統PnP方法的殘差反向傳播到神經網絡,實現無需給定數據關聯的End2End訓練和計算(Blind PnP)。

1 反向傳播PnP求解器 (BPnP)

首先,我們使用數學語言描述PnP問題。

定義g為一個PnP求解器,其輸出y是解出的6DoF位姿:

boldsymbol{y}=g(boldsymbol{x}, boldsymbol{z}, mathbf{K})tag{1}

其中x表示圖像上特徵點的2D坐標觀測值,z表示空間中的3D點坐標,代表一對一的映射對,K是相機內參數:

begin{array}{l}boldsymbol{x}=left[begin{array}{llll}boldsymbol{x}_{1}^{T} & boldsymbol{x}_{2}^{T} & ldots & boldsymbol{x}_{n}^{T}end{array}right]^{T} in mathbb{R}^{2 n times 1}boldsymbol{z}=left[begin{array}{llll}boldsymbol{z}_{1}^{T} & boldsymbol{z}_{2}^{T} & ldots & boldsymbol{z}_{n}^{T}end{array}right]^{T} in mathbb{R}^{3 n times 1}end{array}tag{2}
事實上,求解PnP是一個優化問題:

boldsymbol{y}=underset{boldsymbol{y} in S E(3)}{arg min } sum_{i=1}^{n}left|boldsymbol{r}_{i}right|_{2}^{2}tag{3}
其中boldsymbol{pi}_{i}=pileft(boldsymbol{z}_{i} mid boldsymbol{y}, mathbf{K}right)是投影函數,而boldsymbol{r}_{i}=boldsymbol{x}_{i}-boldsymbol{pi}_{i}是重投影誤差。

因此,我們可以將其簡化為:

boldsymbol{y}=underset{boldsymbol{y} in S E(3)}{arg min } quad|boldsymbol{x}-boldsymbol{pi}|_{2}^{2}tag{4}
其中:

boldsymbol{pi}:=left[boldsymbol{pi}_{1}^{T}, ldots, boldsymbol{pi}_{n}^{T}right]^{T}tag{5}

1.1 隱函數微分

1.2 構建約束函數f

將PnP的目標函數定義為:

o(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})=sum_{i=1}^{n}left|boldsymbol{r}_{i}right|_{2}^{2}tag{6}
當目標函數達到最小值時,我們有:

left.frac{partial o(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})}{partial boldsymbol{y}}right|_{boldsymbol{y}=g(boldsymbol{x}, boldsymbol{z}, mathbf{K})}=mathbf{0}tag{7}
我們將其定義為:

f(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})=left[f_{1}, ldots, f_{m}right]^{T}tag{8}
其中:

begin{aligned}f_{j} &=frac{partial o(boldsymbol{x}, boldsymbol{y}, boldsymbol{z}, mathbf{K})}{partial y_{j}}&=2 sum_{i=1}^{n}leftlangleboldsymbol{r}_{i}, frac{partial boldsymbol{r}_{i}}{partial y_{j}}rightrangle&=sum_{i=1}^{n}leftlangleboldsymbol{r}_{i}, boldsymbol{c}_{i j}rightrangleboldsymbol{c}_{i j} &=-2 frac{partial boldsymbol{pi}_{i}}{partial y_{j}}end{aligned}tag{9}

1.3 前向與反向傳播

我們首先重寫PnP函數,引入初始位姿y^{(0)}

boldsymbol{y}=gleft(boldsymbol{x}, boldsymbol{z}, mathbf{K}, boldsymbol{y}^{(0)}right)tag{10}
根據隱函數微分規則:

begin{aligned}frac{partial g}{partial boldsymbol{x}} &=-left[frac{partial f}{partial boldsymbol{y}}right]^{-1}left[frac{partial f}{partial boldsymbol{x}}right]frac{partial g}{partial boldsymbol{z}} &=-left[frac{partial f}{partial boldsymbol{y}}right]^{-1}left[frac{partial f}{partial boldsymbol{z}}right]frac{partial g}{partial mathbf{K}} &=-left[frac{partial f}{partial boldsymbol{y}}right]^{-1}left[frac{partial f}{partial mathbf{K}}right]end{aligned}tag{11}
對於神經網絡,我們可以獲得輸出nabla boldsymbol{y}的梯度,並且每個輸入的梯度為:

begin{aligned}nabla boldsymbol{x} &=left[frac{partial g}{partial boldsymbol{x}}right]^{T} nabla boldsymbol{y}nabla boldsymbol{z} &=left[frac{partial g}{partial boldsymbol{z}}right]^{T} nabla boldsymbol{y}nabla mathbf{K} & =left[frac{partial g}{partial mathbf{K}}right]^{T} nabla boldsymbol{y}end{aligned}tag{12}

1.4 實現注意事項

2 使用BPnP的端到端學習

2.1 位姿估計

本節描述了在給定已知地圖z和相機內參數K的情況下,根據觀測到的關鍵點坐標x估計位姿y的過程,如下圖所示:

損失由以下公式描述:

l(boldsymbol{x}, boldsymbol{y})=left|pi(boldsymbol{z} mid boldsymbol{y}, mathbf{K})-pileft(boldsymbol{z} mid boldsymbol{y}^{*}, mathbf{K}right)right|_{2}^{2}+lambda R(boldsymbol{x}, boldsymbol{y})tag{13}

上述過程中的一個重要梯度更新計算如下:

frac{partial ell}{partial boldsymbol{theta}}=frac{partial l}{partial boldsymbol{y}} frac{partial g}{partial boldsymbol{x}} frac{partial h}{partial boldsymbol{theta}}+frac{partial l}{partial boldsymbol{x}} frac{partial h}{partial boldsymbol{theta}}tag{14}

下圖展示了兩種情況下的收斂過程,第一行是lambda = 1,第二行是lambda = 0

圖1表示h(I; theta) = theta

圖2表示修改後的VGG11網絡

從這兩個實驗中,我們可以看到,無論是否使用正則項,兩者都能收斂,並且當lambda = 1時,兩者都達到了更好的收斂結果。

2.2 使用校準相機的SfM

本節是

href="https://www.liuxiao.org/wp-content/uploads/2021/08/1629866373-2-2.png">

損失定義如下:

lleft(left{boldsymbol{y}^{(j)}right}_{j=1}^{N}, boldsymbol{z}right)=sum_{j=1}^{N}left|boldsymbol{x}^{(j)}-pileft(boldsymbol{z}^{(j)} mid boldsymbol{y}^{(j)}, mathbf{K}right)right|_{2}^{2}tag{15}
過程中的梯度推導如下:

frac{partial ell}{partial boldsymbol{theta}}=sum_{j=1}^{N}left(frac{partial l}{partial boldsymbol{z}^{(j)}} frac{partial boldsymbol{z}^{(j)}}{partial boldsymbol{theta}}+frac{partial l}{partial boldsymbol{y}^{(j)}} frac{partial boldsymbol{y}^{(j)}}{partial boldsymbol{z}^{(j)}} frac{partial boldsymbol{z}^{(j)}}{partial boldsymbol{theta}}right)tag{16}
下圖展示了SfM的收斂過程:

2.3 相機校準

相機校準過程如下:

損失定義如下:

l(mathbf{K}, boldsymbol{y})=|boldsymbol{x}-pi(boldsymbol{z} mid boldsymbol{y}, mathbf{K})|_{2}^{2}tag{17}
梯度推導如下:

frac{partial ell}{partial boldsymbol{theta}}=frac{partial l}{partial mathbf{K}} frac{partial mathbf{K}}{partial boldsymbol{theta}}+frac{partial l}{partial boldsymbol{y}} frac{partial g}{partial mathbf{K}} frac{partial mathbf{K}}{partial boldsymbol{theta}}tag{18}

3 基於BPnP的物體姿態估計

最後,作者設計了一個基於BPnP的物體姿態估計過程:

論文 & 代碼

論文: https://arxiv.org/abs/1909.06043
代碼: https://github.com/BoChenYS/BPnP
視頻: https://www.youtube.com/watch?v=eYmoAAsiBEE

Add a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *