作者:Tom Hardy
來源:公眾號@3D視覺工坊
傳統視覺基於特征點和參考坐標系的思想對物體進行姿態識別,這種方式對物體本身形狀和顏色特征要求較高,對一些較為復雜的物體則不能很好工作,本文使用機器學習(隨機森林)方式並通過顏色和深度特征對物體進行姿態識別。
1. 訓練數據的采集
由於是基於像素級的訓練,所以需要每個像素都需要標簽,這個標簽包括每個像素所屬的類別以及對應的三維空間坐標。
a.標簽如何獲取呢?
可以首先利用傳統的設備計算出某類物體和相機的真實姿態,計算出真實姿態就可以通過物體的二維圖像計算出相對應的三維坐標。然而在實際計算三維坐標時需要把訓練的物體分割開來,這樣可以避免背景等一些不相關物體的干擾,通過對分割后的圖像進行姿態運算,可以得出分割圖像中每個像素的三維坐標。
由於是在像素級進行訓練與預測,通常一幅圖像中的某個物體由大量像素組成,所以在實際訓練的時候不需要太大的樣本(樣本過多的話需要在訓練數據上花費很長時間),不過要盡量包含各個姿態下的數據,這樣模型才能盡可能的准確,一般100張圖像(對每類物體來說)即可。
b.每個像素的features?
其實在這里每個像素的features是該像素周圍一些像素的像素值的差或者深度值的差。Features的選擇很重要,建立好特征才能進行訓練,才能更好區分不同標簽。
注意:在這里對訓練圖像中每類物體隨機采樣1000個像素,每個像素采樣1000個features。
(當然這里的像素數量以及features數量是可以改變的,這取決於自己,1000是作者推薦的數值,有比較好的結果)。
c.對每個像素來說,features的提取還有其它更好的方式嗎?(思考)
如果對表面紋理相同的物體(比如兩個同種材料加工的零件),該種方法提取的features大致相同,這時候分類器可能很難辨別出來!在這種情況下,需要更換features提取方法。
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或其它數字),只是這里的標簽值是由第二個隨機森林預測出的而不是第一個。通過這種方式進行多次迭代,最終可以得到較為准確的結果。
Auto-context隨機森林
在構建隨機森林時,作者采用L1正則化的方式來防止隨機森林中的決策樹過擬合。根據決策樹的結構這里的L1正則化其實就是對決策樹的剪枝,剪枝操作可以剔除一些不重要的特征,在預測新數據的時候會比較准確。
關於分類器的思考:
相關領域的學者嘗試過不同分類器,比如KNN、SVM、神經網絡以及隨機森林,通過實驗發現,隨機森林能夠取得更好的結果,因為它把分類和回歸結合在一起!
Opencv庫中的隨機森林:
注意:這篇paper給出的源代碼里的隨機森林結構是作者自己設計的,既可以用於分類又可以用於回歸。然而,opencv里的Random Forest函數只能分別用於分類或回歸,二個功能不同時具備。具體原因:針對分類情況,隨機森林通過對里面多個決策樹預測出的結果進行投票從而得出最終的結果;針對回歸情況,隨機森林通過對里面多個決策樹預測出的結果進行求平均運算,從而得出最終的結果。
基於這個原因,一般資源包中的隨機森林函數不能同時滿足這兩個要求。然而可以通過兩套隨機森林分別執行分類和回歸,接着聯合兩種信息從而完成最終的預測。
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算法有所不同。許多方法都嘗試把多個對象合並到同一坐標空間中,但這有一定的缺點。這篇文章,由於通過隨機森林可以預測出每個像素的標簽,這樣就可以把不同對象分成獨立不同的坐標空間。對於每個對象來說,只在自己的空間進行姿態估計。
和單個物體姿態計算相比,多物體的姿態計算有所不同。單個物體通常會采樣n次(比如100次)得到100個初始姿態,但是對於多物體圖像而言,如果對每個物體都采樣n次會大大地拖慢計算速度。這篇paper提出了對多種物體仍然采樣n次的方法,不過在這n次中要采樣到每一種物體。而且在每次采樣中要記住采樣像素的類別(比如屬於cat的像素),這樣對每種物體都進行了多次采樣,比如圖像中有五種物體,每種物體分別采樣20次,這樣就可以對每種物體進行上述單物體的姿態計算。這種方法速度比較快,可以一次性計算出所有物體的姿態,供機器人抓取。
思考:
關於姿態計算,是否可以用ICP算法呢?
ICP算法在計算上是比較昂貴的
5.姿態優化
在得到全局最優姿態后,基於該姿態下的內點可以通過Kabsch algorithm(matlab有相對應的函數,GitHub上有相對應的C++源代碼)進一步對姿態進行優化,從而得到最終的姿態。
Kabsch algorithm只優化旋轉矩陣,不優化平移矩陣,因為在實際運行中,旋轉矩陣對精度影響更為大。
Kabsch algorithm具體算法見附錄
6.該算法的優缺點
算法的優點:
Auto-context隨機森林方法,通過多層森林預測(上一層森林的輸出值作為該層的輸入值),並通過引進L1正則化可來減少預測的不確定性,這對處理遮擋以及無紋理物體比較有優勢。除此之外,這篇paper采用multi-RANSAC算法,該算法可以同時處理多個不同物體的姿態識別,速度比較快;不過對多個同種物體則需要相應的改進(這篇paper提出的算法針對不同物體的檢測,包括后續的姿態計算也是分別在不同坐標系下計算得出,對多個同種物體的檢測則首先需要確定物體的個數)。
算法的缺點:
由於是像素級的密集預測,在實驗過程中會有相當一部分的背景像素被預測為某類物體像素,也就是當圖像中出現和檢測物體相近的顏色特征時,該算法會出錯,也是因為這個原因,對姿態估計會產生很大影響,往往誤差會很大。除此之外,在某些視角下(比如正視圖)往往會忽略物體在其它視角下(比如左視圖)的形狀,不能夠很好的估計出正確姿態,在旋轉向量上誤差較大。
圖1 Hinterstoisser數據集下的測試結果
7.實驗結果
在這里基於Hinterstoisser發布的數據集進行測試,該數據集每類物體一共1179幅圖像,該數據集既包含RGB圖像又包含RGB圖像的深度信息,所以可以提供兩種圖像的訓練和預測。其中每類物體選取393幅圖像用於訓練,786幅圖像進行測試,在實際訓練時,基於RGB和RGB-D圖像的模型有所區別,需要分開對待。
表1 論文中的實驗結果
由於實驗中RGB-D圖像的識別准確率更高,在此只關注深度圖像的測試結果。
8.算法改進
圖1 第一幅圖像預測出的掩碼圖像和真實分割出的掩碼圖像
預測出的掩碼圖像像素對應的三維坐標和
圖2 第二幅圖像預測出的掩碼圖像和真實分割出的掩碼圖像
圖3 第三幅圖像預測出的掩碼圖像和真實分割出的掩碼圖像
圖4 第四幅圖像預測出的掩碼圖像和真實分割出的掩碼圖像
圖5 第五幅圖像預測出的掩碼圖像和真實分割出的掩碼圖像
由上面5個對比圖可以看出,直接對整幅圖像進行預測處理,預測出的圖像掩碼錯誤率比較大,許多與物體不相關的背景被預測為相關物體。在姿態計算時,需要根據預測出的某類物體像素的坐標來計算姿態,如果對每類物體預測出的像素種類不准,這勢必影響后面的RANSAC操作!!!對姿態的精度影響很大。基於此缺點,可以通過先進行物體檢測,得出某類物體的ROI區域,后運算該算法,這樣就可以減少不相關像素的預測,提高最終姿態的精度。
上述內容,如有侵犯版權,請聯系作者,會自行刪文。