论文筆記:通過反向傳播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}
其中:
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}
其中:
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}的梯度,並且每個輸入的梯度為:
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}
梯度推導如下:
3 基於BPnP的物體姿態估計
最後,作者設計了一個基於BPnP的物體姿態估計過程:
論文 & 代碼
論文: https://arxiv.org/abs/1909.06043
代碼: https://github.com/BoChenYS/BPnP
視頻: https://www.youtube.com/watch?v=eYmoAAsiBEE