基于机器学习随机森林方式的姿态识别算法
作者: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区域,后运算该算法,这样就可以减少不相关像素的预测,提高最终姿态的精度。
上述内容,如有侵犯版权,请联系作者,会自行删文。