1. 程式人生 > >基於隨機森林的姿態識別演算法

基於隨機森林的姿態識別演算法

本部落格主要是對“Uncertainty-Driven 6D Pose Estimation of Objects and Scenes from a Single RGB Image”
論文的解讀。

1.訓練資料的採集

由於是基於畫素級的訓練,所以需要每個畫素都需要標籤,這個標籤包括每個畫素所屬的類別以及對應的三維空間座標。

a.標籤如何獲取呢?

可以首先利用傳統的裝置計算出某類物體和相機的真實姿態,計算出真實姿態就可以通過物體的二維影象計算出相對應的三維座標。然而在實際計算三維座標時需要把訓練的物體分割開來,這樣可以避免背景等一些不相關物體的干擾,通過對分割後的影象進行姿態運算,可以得出分割影象中每個畫素的三維座標。

由於是在畫素級進行訓練與預測,通常一幅影象中的某個物體由大量畫素組成,所以在實際訓練的時候不需要太大的樣本(樣本過多的話需要在訓練資料上花費很長時間),不過要儘量包含各個姿態下的資料,這樣模型才能儘可能的準確,一般100張影象(對每類物體來說)即可。

b.每個畫素的features?

在這裡插入圖片描述
在這裡δ代表一個二維的偏移(u,v),這裡的偏移沒有在參考文獻中找到具體介紹,在程式碼裡max offset=20,且δ≥0,所以0≤u≤20,0≤v≤20,δ_1和δ_2範圍大致相同(這裡u,v的量綱是px.m, px代表畫素)。D(p)代表畫素p的深度值,這裡D(p)是用來深度歸一化,單位是m。因此,如果在標準設定中的偏移量δ為20 px.m,畫素深度D(p)為1 m,則該公式計算的δ/D(p)為20 px;如果深度為2米,則公式評估為10 px。即畫素越遠,真正偏移就越小,這也即是深度歸一化。I(p,c)代表在影象中c通道中p畫素對應的畫素值,通常把這兩種特徵結合(拼接)起來一起用。

其實在這裡每個畫素的features是該畫素周圍一些畫素的畫素值的差或者深度值的差。Features的選擇很重要,建立好特徵才能進行訓練,才能更好區分不同標籤。

注意:在這裡對訓練影象中每類物體隨機取樣1000個畫素,每個畫素取樣1000個features。(當然這裡的畫素數量以及features數量是可以改變的,這取決於自己,1000是作者推薦的數值,有比較好的結果)。

2.訓練資料

Auto-context:

這篇paper中的分類器是Auto-context隨機森林,給定影象中的某個畫素,通過該隨機森林預測,可以得出其對應的三維座標以及所屬物體類別兩種資訊。

在得到每個畫素的特徵後,就可以通過這些特徵來訓練隨機森林。Auto-context隨機森林結構如下圖所示,Auto-context隨機森林由多個隨機森林組成(在這篇paper裡由三個隨機森林構成,每個隨機森林由三棵決策樹構成)。上一個隨機森林的輸出是下一個隨機森林的輸入,相鄰的隨機森林互相關聯。

具體訓練過程如下:
第一個隨機森林以每個畫素的features作為輸入,最終輸出每個畫素對應的三維座標以及類別[x,y,z,a](每個畫素的三維座標和類別在訓練集中均有給出,這裡只是用來訓練隨機森林)。

第二個隨機森林對每個畫素再次進行訓練,只是在這裡,每個畫素的特徵由上面的features和其周圍8個畫素標籤值構成(這個標籤值是由第一個隨機森林產生的[x,y,z,a]。其實這裡的neighbor可以不止8個,而且neighbor排列位置也可以有所不同,不一定就是畫素的八鄰域。Auto-context允許使用畫素的小範圍或者大範圍相鄰畫素[比如也可以是24個]標籤值作為畫素的features,取決於自己演算法的選擇)。這樣第二個隨機森林對每個畫素再一次進行預測,可以得出新的[x,y,z,a],每個畫素的標籤值進行更新。

注意:在這裡由於隨機森林是由多個決策樹組成的,這篇paper採用三棵決策樹,所以每棵樹都會預測出一個標籤值,對類別標籤a來說可以通過投票方式進行處理,但是對於[x,y,z]三維座標點,則需要進行幾何均值處理,這樣作為最終的標籤座標。

當第一個隨機森林構建完成後,會預測產生相應的標籤圖和三維座標圖,在訓練第二個隨機森林之前,需要對產生的標籤圖進行中值濾波處理,對產生的三維座標圖中的每個值以一定大小的模板(比如3x3)進行幾何平均數,把最終的幾何平均數結果作為新的座標標籤值。

第三個隨機森林和第二個隨機森林訓練方式相同,同樣每個畫素的特徵由features和其周圍16個畫素標籤值構成(這裡的畫素數量16要根據具體演算法確定,不是一成不變的,當然也可以是10或其它數字),只是這裡的標籤值是由第二個隨機森林預測出的而不是第一個。通過這種方式進行多次迭代,最終可以得到較為準確的結果。

在這裡插入圖片描述

在構建隨機森林時,作者採用L1正則化的方式來防止隨機森林中的決策樹過擬合。根據決策樹的結構這裡的L1正則化其實就是對決策樹的剪枝,剪枝操作可以剔除一些不重要的特徵,在預測新資料的時候會比較準確。

3.利用決策樹進行畫素的三維座標預測

通過上述訓練好的Auto-context隨機森林,對輸入影象中每個畫素進行預測,可以得出對應畫素在三維空間下的座標以及所屬類別。

4.計算初始姿態取樣

上一步可以預測輸入影象中每個畫素的三維座標和其物體所屬類別,這樣就可以得到基於特定類別下的2D-3D對應點對。Pnp問題求解至少需要3個對應點對,這篇paper採集了四對對應點對。

取樣方法:
在這裡paper提出了一種取樣方法,首先隨機選取指定物體類別下的一個畫素,然後基於這個畫素為中心,畫一個正方形(比如說3x3),剩下的三個畫素則是在這個正方形內尋找。我的思考:是否可以隨機選取一個畫素,然後以這個畫素為左上角第一個畫素,畫2x2正方形,剩下的三個畫素則是從2x2正方形中採集(也就是正方形中剩下的三個位置所對應的畫素)。

注意:在這裡需要做個判斷,如果選的四個畫素不都是同一種類物體的畫素,那麼需要重新選擇。直到所選的四個畫素都屬於同一類物體。

Multi-RANSAC
一幅影象中通常不止包含一種物體,往往含有幾種物體,因此這篇paper提出了一種multi-RANSAC方法。

對一幅影象中只有一個物體來說,通過對該物體進行一定次數的取樣(採集二維點和對應的三維點),可以得到許多副2D-3D對應點對(每副對應點對有四個對應點對,負責求解一個姿態),基於這些點對進行姿態計算,可以得到一定數量的初始姿態[R,T]。3D點通過初始姿態運算,可以投影到二維影象座標上,這個投影點和3D點對應的2D點做距離運算,因為影象座標系中的單位為px(畫素),當投影點和2D點之間的距離不大於3px,則視為該點為內點,否則為外點。

重投影誤差:
注意:在取樣時,比如取樣四個畫素,當利用這四個畫素計算初始姿態後,如果經過這個姿態運算後的重投影誤差過大(大於一定的閾值),則拋棄該姿態,進行重新取樣,這樣就避免了RANSAC在不良資料上迭代,從而節省了時間。

這樣每個姿態都會計算出一定數量的內點,基於內點的數量對初始姿態進行優劣排序,並在這些姿態中保留內點數量多的一半,捨棄另一半。然後對保留下的一半姿態,根據其內點繼續對姿態進行優化,得出新的姿態(在這裡,對內點取樣一次,只得出一個新的姿態),和以上步驟相同,對這些新的姿態根據內點的數量進行排序,保留靠前的一半,捨棄後面的一半。這樣一直迴圈,直到內點數量基本保持不變,而且可以通過這種方式過濾出唯一的最佳姿態,這個姿態就是最終姿態。

注意:和單個物體RANSAC演算法相比,多個物體的RANSAC演算法有所不同。許多方法都嘗試把多個物件合併到同一座標空間中,但這有一定的缺點。這篇文章,由於通過隨機森林可以預測出每個畫素的標籤,這樣就可以把不同物件分成獨立不同的座標空間。對於每個物件來說,只在自己的空間進行姿態估計。

5.姿態優化

在得到全域性最優姿態後,基於該姿態下的內點可以通過Kabsch algorithm(matlab有相對應的函式,GitHub上有相對應的C++原始碼)進一步對姿態進行優化,從而得到最終的姿態。

Kabsch algorithm只優化旋轉矩陣,不優化平移矩陣,因為在實際執行中,旋轉矩陣對精度影響更為大。

Kabsch algorithm具體演算法見附錄

6.該演算法的優缺點

演算法的優點:

Auto-context隨機森林方法,通過多層森林預測(上一層森林的輸出值作為該層的輸入值),並通過引進L1正則化可來減少預測的不確定性,這對處理遮擋以及無紋理物體比較有優勢。除此之外,這篇paper採用multi-RANSAC演算法,該演算法可以同時處理多個不同物體的姿態識別,速度比較快;不過對多個同種物體則需要相應的改進(這篇paper提出的演算法針對不同物體的檢測,包括後續的姿態計算也是分別在不同座標系下計算得出,對多個同種物體的檢測則首先需要確定物體的個數)。

演算法的缺點:

由於是畫素級的密集預測,在實驗過程中會有相當一部分的背景畫素被預測為某類物體畫素,也就是當影象中出現和檢測物體相近的顏色特徵時,該演算法會出錯,也是因為這個原因,對姿態估計會產生很大影響,往往誤差會很大。除此之外,在某些視角下(比如正檢視)往往會忽略物體在其它視角下(比如左檢視)的形狀,不能夠很好的估計出正確姿態,在旋轉向量上誤差較大。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述