6D pose estimation

6D pose estimation

來自專欄 6D pose estimation

最近在做機器人抓取的視覺部分,調研了很多資料,也手擼了很多代碼,這裡記錄一下。

機械臂要能抓到東西,首先得識別出目標的位置跟姿態。之前看到過好多bin picking的展示,就是一個箱子里雜亂放著某一類零件,能夠識別並把零件抓出來擺好。但是,這方面的開源代碼非常少,我就找到個linemod的,只能眼巴巴看著,完全不知道怎麼自己弄。

好在這方面的論文還是不少的,實在不行可以慢慢把論文復現出來。通過大量的論文調研,我發現這方面主要分為4種方法。

第一種是基於霍夫變換的。這個很好理解,隨便選點猜個姿態,最後投票多的就是。這個方向經典的有2010年的論文 ppf (point pair feature):

Model Globally, Match Locally: Efficient and Robust 3D Object Recognition

第二種是基於模板匹配的。基本思路很簡單,拿到物體的模型,從各個方向提取到RGBD圖像,經過九九81道工序腌製成模板,然後拿去在實際圖像每一個位置匹配,配上了就知道位置跟姿態了。這方面最經典的是2011-12年的linemod演算法(論文有2篇,一篇基礎的,一篇稍微改進的)。linemod的效果要好於之前的ppf,最可貴的是linemod在opencv里有實現的源碼,在基於ros的object recognition kitchen中有配套的模型生成圖像的程序、ICP後處理的教程跟代碼。

第三種是基於patch匹配+random forest的。linemod還是有些缺點的,比如有遮擋的時候識別率就會下降。那麼一個很自然的想法就是,我把原來的訓練圖像拆成好幾個patch,每個patch做成模板,然後拿去配測試圖像。Latent-Class Hough Forests(論文也有兩篇)就大概這麼個思路,用random forest做了點改進:如果單純按照原來的樣子匹配,模板量得好幾倍才行。通過比較模板之間的相似性訓練random forest,就像把一堆數據用二叉樹存起來,大大提高匹配效率。當然,在這中間還有一些小技巧,在匹配結束後也有一些後處理的方法,這裡就不談了。

基於這個思路的論文就很多了,舉幾個例子:

Learning 6D Object Pose Estimation using 3D Object Coordinates

不要linemod了,用pixel difference作為feature度量相似性,然後用random forest。

Recovering 6D Object Pose and Predicting Next-Best-View in the Crowd

為啥要手擼feature呢?用auto encoder搞出個embedding來度量相似性,然後forest。

當然,我覺得更好的方法是用人臉識別、行人重識別那一套,什麼Siamese Network啊,triplet loss啊,因為這個相似性度量就是要搞成類內距離小,類間距離大的一個效果,所以完全是這些領域的拿手好戲嘛。反正不管怎樣,把embedding搞出來,然後random forest快速匹配一下就行了(或者也有別的快速匹配embedding的方法?比如搞人臉識別的大公司這麼多數據是怎麼匹配的呢)

第四種就是現在的end-to-end大法了:反正我搞一個超大CNN,管他怎麼回事,一鍋全給燉了。基於這種思路有論文起了個很皮的標題:

SSD-6D: Making RGB-based 3D detection and 6D pose estimation great again

雖然論文有這麼多,但是開源的特別少,除了Linemod之外幾乎沒有。把所有論文比較下來,對於我想做的bin picking這個,Latent-Class Hough Forests的效果是比較好的,論文里配圖是這樣的:

其他論文要麼對比數據超過這篇不明顯,要麼沒有這種有說服力的配圖,所以我決定先復現這篇了。當然,由於這篇是基於Linemod的,還得先把Linemod研究一番;這篇的基本思路是embedding + random forest,應用很多,所以我會盡量把代碼搞成適用這一套思路的框架。

代碼見meiqua/6DPose


這個網站收集了效果最好的幾篇論文,記錄下:

Object Recognition, Detection and 6D Pose Estimation

推薦閱讀:

TAG:機器人操作平台ROS | 機器人編程 |