本篇文章要介紹的是 PointNetLK [1],目的是利用深度學習的方法找到兩個點雲之間的平移旋轉關係,在英文文獻中的術語是 Point set registration [2]。我們一般可以用 Iterative closest point (ICP) [3] 演算法來解決這個問題,但是 ICP 演算法有一些限制:
- 當點的數目多的時候要跑很久
- 對初始值很敏感
PointNetLK 的精神
先假設以下的變數:
- PS:輸入的點雲。
- PT:想要找出平移旋轉關係的參考點雲。
- G:平移旋轉的矩陣,一般我們用 3×3 的矩陣描述三維空間旋轉,以及三維向量描述平移,但為了計算方便我們通常用 4×4 的矩陣來表示 G。
- ϕ 函數:輸入為點雲,輸出為一個代表點雲特徵向量的函數。
這個問題的目標是找到一組平移旋轉關係 G 使得變換後的 PS 與 PT 之間的差異越小越好,而當這兩個點雲的差異小的話那他們對應的特徵向量差異也會小,也就是以下關係: ϕ(PT)=ϕ(G⋅PS)
PointNetLK 的一些式子推導
- ϕ(PS)=ϕ(G−1⋅PT),上式與此式等價。
- 利用泰勒展開式近似等號右邊: ϕ(PS)=ϕ(PT)+∂∂ξ[ϕ(G−1⋅PT)]ξ
- 前面提到 G 是描述平移旋轉的矩陣,也就是 SE3。我們用李代數與李群的指數映射關係來表示 G,ξ 為 G 對應的李代數,可以用個六維向量來表示: G−1=exp(−∑iξiTi)
- 我們用 J 表示上面的 ∂∂ξ[ϕ(G−1⋅PT)],也就是 Jacobian。
- 因此當解出 ξ 時就能算出對應的 SE3(G),也就是旋轉平移的關係。而 ξ 可用以下式子來求出: ξ=J+[ϕ(PS)−ϕ(PT)]
- J+ 為 J 的 Moore-Penrose inverse。
- 拿新的 ξ 算出對應的 G,更新 PS,再算下一輪,直到這一輪的 G 更新小於一個數字。
- 在訓練時的 loss function 為:
L=‖(G−1est⋅Ggt)−I4‖F
以下為 PointNetLK 的架構圖:
PointNetLK 的實作細節
- 函數 ϕ 是 Pointnet 的 feature,維度是 B×K,B 是 batch size,K 為特徵向量的維度。
- Jacobian J 的維度是 B×K×6,6 代表李代數 ξ 的六個維度,而圖中的 ti 代表李代數 ξi 的微小變化。
- J+ 的維度是 B×6×K。
- 圖中的 exp 為前文介紹的指數映射。
參考資料
[1] PointNetLK: Robust & Efficient Point Cloud Registration using PointNet
沒有留言:
張貼留言