3d segmentation Bin Picking

最近看到一个什么博览会上bin picking的演示,突然间发现bin picking的零件好像都是简单几何体或者简单几何体的组合,比如圆柱、弯管之类的。之前我一直以为现在bin picking已经能做到抓任意零件了,但是如果真的能做到,那这些公司肯定会重点展示。所以他们的算法肯定利用了简单几何体的性质,跟linemod之流还不太一样。

那简单几何体的什么性质可以拿来用呢?经过我一周的调研跟思考,我发现最有可能的是凸。比如说现在一个正方体放在桌面上。首先,RGB的信息一般用不上,因为工业上的零件都是无纹理的。那为了识别出这个正方体,我们需要把正方体的点云分割出来,之后用super4pcs或者icp都好处理了。由于正方体是凸的,正方体自己的边可以认为是凸的边,而正方体跟桌面的边就不是凸的了。凸边还是凹边判断起来也简单,用一张图说明:

如果零件本身不是完全凸的,有一大块是凸的也行,匹配的时候相当于匹配零件的一部分。所以,零件的点云凸的区域越大,分割出来的点云越容易识别。

那么,怎么把一块凸的点云分割出来呢?

DASP

点云分割的论文也挺多,我主要看的是PCL库segmentation源码里贴的论文,其中比较有代表性的是:

Object Partitioning using Local Convexity

这篇论文分割的主要思路是先把点云聚类,处理成superpixel,一个superpixel可以看做一个小平面;然后计算平面之间是凸还是凹,把小平面聚起来:

这篇效果看上去不错,不过第一步聚类成supervoxels是基于voxel的,我感觉比较慢。我找到另一篇直接基于pixel的算法,算法参考了SLIC图像分割算法,速度比较快,效果也不错:

(更新:Superpixels: An Evaluation of the State-of-the-Art专门对这两种(VCCS DASP)做了评测,结果DASP consistently outperforms)

Depth-Adaptive Superpixels,代码:Danvil/asp

原论文中也有聚类的部分,采用的是sPb,一篇11年经典的图像分割论文的思路:

detection and hierarchical image segmentation

看上去效果还行,不过这一部分的代码没有开源,所以我简单地用图分割的方法写了一个。也就是说,如果两个superpixel是凹的关系就不合并,离得太远也不合并,这样一个连续的凸点云就分割出来了。测试结果如下:

可以看到效果还是不错的,第一张图中两个长方体合在一起,这是因为它们接触的部分凹的不明显,这个之后可以用一些方法进一步处理分开;第二张图的结果就比较好了,可以清楚地看到每个杯子的轮廓。在图像的边边角角的地方superpixel没有合并起来,这是因为那一块比较远,而且拍摄角度几乎垂直,superpixel之间的实际距离远。算法的速度非常快,开O3优化一张640x480的图才0.2s。

代码见 meiqua/6DPose


进一步测试发现,直接用这种greedy的方式不太好,因为两个物体只要有一小部分凸连接连起来,那物体很容易全部聚成一块,如图:

为了解决这个问题,我采用了一个分阶段的聚类方法:

第一阶段聚类接近平面的超像素,也就是normal夹角接近0度:

第二阶段聚类剩下的凸连接,聚类过程中不断检查凸点云的性质,也就是任一平面都是凸点云的切平面,每次合并两个平面集都检查是不是满足这个条件。这样操作跟原来相比考虑了全局凸点云的性质,理论上分割地更好。最后聚类的结果:

可以看见原来一坨大点云被分成了三坨小点云,效果比较好。而且这个也能把原来挨着的长方体分割开:


又经过一段时间的测试改进,我发现第二阶段按照边的权重顺序来融合不合理。更好的方式是按照第一阶段得到近似平面的点云大小来聚类,我们称之为big brother first

我们的核心假设是,零件有一大块凸点云,而由于干扰的存在,按照边权重聚合+convex check的方式可能会把不同物体的一部分聚在一起。如果按照大点云优先的方式,就算这个零件的分割侵占了别的物体也无所谓,只要一坨大点云有一个完整物体就好,反正bin picking抓走就没了,再抓再识别就好。所以按照这个思路,这次的第二阶段按照第一阶段分割的大小来greedy聚类。

最后我们的big brother first版本结果如下:


测试了下复杂形状的情况,果然把物体凸分割割开了:


这个平平无奇的思路果然有人做过了,VCCS+graph merge,可以参考着优化下参数:

Convexity based object partitioning for robot applications

 

 

 

BOP: Benchmark for 6D Object Pose Estimation

https://arxiv.org/pdf/1808.08319.pdf

一众大佬刚搞出来的个板凳。看效果PPF这一系列确实不错,Linemod在无遮挡时也还行,考虑遮挡就拖后腿了(第4那个)。

LCHF(13)那个简直惨不忍睹。。不知道是参数没调好还是咋滴,反正我自己实现的时候确实发现很难调好,后来发现很难训练就没管了。


最近在做机器人抓取的视觉部分,调研了很多资料,也手撸了很多代码,这里记录一下。

机械臂要能抓到东西,首先得识别出目标的位置跟姿态。之前看到过好多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啊,因为这个相似性度量就是要搞成类内距离小,类间距离大的一个效果,所以完全是这些领域的拿手好戏嘛。

更新:果然有人沿这个思路做了,把pose尽量映射到相似结构的embedding空间,这样之后的匹配也好办,跟LCHF相比较(匹配只能比较两个点的相似度,这个空间没有欧式的美好性质,只能random forest加速匹配(这是因为forest直接进行了比较操作)),这样的空间可以用更简单高效点的快速匹配方法比如KNN。

论文:Pose Guided RGBD Feature Learning for 3D Object Pose Estimation

反正不管怎样,把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​rkouskou.gitlab.io

 

LCHF linemod评测:

Multi-modal Analyses on Challenges​arxiv.org

 


发现了个秘密,这个方向好多论文都是Imperial College London一个组做的,TK Kim, Doumanoglou这些大佬。我说怎么比较不同算法的时候LCHF这些没开源的他们也能复现,原来是一个系列的工作。。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值