一、背景介绍

  LineMod算法是由Hinterstoisser等人在2011年提出的旨在解决杂乱场景下少纹理三维物体的实时监测与6D位姿估计定位问题。

  针对传统方法搜索空间方式效率低、较难产生判别描述子并且鲁棒性较低的弊端,Stefan Hinterstoisser等人采用了模板匹配的方法,利用3D物体的RGB-D信息即三维物体的RGB二维彩色图像信息和Depth深度信息作为输入。

  通过PCL数据处理库分析目标点云数据,利用预先采集好的三维物体的无噪声或少噪声模板经过较短时间的训练得到物体各个方向每个像素点梯度方向和幅值变化。LineMod只需较短的时间即可完成模板的训练,在之后的识别中利用采集到的点云数据与模板对比即可得到物体信息、位姿及自信度。最后利用ICP算法对检测结果进行位姿修正完成3D刚性物体的位置检测判断。

  第一代LineMod算法不仅可以广泛应用于工业、生活以及会议等杂乱的场景中,而且还适用工业上常见的少纹理或无纹理的元器件等物体,但是对于同种物体相互重叠等复杂情况下的物体分割识别存在不足。工业上以及生活中常见的少纹理物体和零部件如下图1和2所示。

图1   工业上少纹理物体                                                                图2  生活中少纹理物体

  2012年以Hinterstoisser为核心的研究团队针对第一代LineMod算法在物体重叠遮挡情况下物体识别率打分迅速下降的缺点,提出了LineMod第二代升级算法。第二代LineMod算法为了解决遮挡的问题采用了较为稀疏的视角采样,利用分块匹配的方法提升被遮挡物体打分,一定程度上解决了在计算机视觉识别领域中较为复杂困难的遮挡问题。

  在工业生产、日常生活及会议等杂乱的场景中存在大量的无效特征点,变化的背景信息导致网格状描述子会受到干扰。处理这样的场景不仅需要对整幅图形进行全局搜索,还需要进行大量的后处理,而基于模板匹配的LineMod算法就是针对复杂场景下的三维物体识别。LineMod算法包括模板采集、模板训练和模板匹配三个阶段。

二、算法原理

1.参考

LineMod算法已经是比较成熟的算法,在Ubuntu里直接作为一个算法包嵌入进去,可以直接下载用。

运行环境:Ubuntu16.04+ROS Kinetic+PCL

http://campar.in.tum.de/pub/hinterstoisser2011linemod/hinterstoisser2011linemod.pdf

https://blog.csdn.net/zmdsjtu/article/details/79933822

https://blog.csdn.net/zmdsjtu/article/details/79933822

https://blog.csdn.net/haithink/article/details/88396670

这个是LineMod的算法总结,也可以辅助来看Patch_lineMod的源代码,其中有两篇是源码级带着看代码,对于理解代码还不错。

2.LineMod算法原理

2.1模板采集

  LineMod算法是基于模板匹配的方法,在进行三维物体识别前需要对应物体低噪声、高精度、完整的模型。

  一种方法是通过深度相机从多个视角、多种距离、多个方向分别对目标物体进行模板采集,但是这种方法容易产生较多的噪声,对之后的目标识别会产生潜在的干扰,而且该方法费时费力,手动采集不切实际。

 另一种方法是通过OpenGL手动渲染预识别三维物体的模型,利用UG、AutoCAD等三维仿真建模软件即可完成对应物体的三维模型创建与渲染[27]。这种方法的好处是噪声可控制,甚至可以得到零噪声的模型,对于之后算法对物体识别率的影响可以降到最低。

不过,因为计算机视觉方向的火热对生活中常见的物体的三维模型需求越来越强烈,因此存在很多三维物体模型的模板库供下载,如Thingiverse、YouMagine、Pinshape等网站已经提供了大部分常见的格式为stl、stp、obj的三维物体模型。

2.2模板训练

  相对于通过计算图像像素到最近的边缘的距离和梯度方向的基于图像边缘特征的方法,LineMod算法是通过模板匹配的方法,其通过采集物体在各角度、各距离的模板图像,将图像上各视点的梯度和法向量方向的特征进行提取保存并编码。

  每个视点位置的多个特征对应一串二进制字符串即为之后进行物体匹配的关键编码,因此对于三维物体的模板的训练至关重要。LineMod算法在训练阶段包括特征点特征向量计算、坐标计算及信息存储。

  1.计算特征点的特征向量

  模型信息包含RGB-D图像信息以及物体的ID信息,在导入算法后,LineMod算法会在空间中进行不同角度的选择与尺度缩放进而得到待训练模板。

  通过待训练模板、训练距离以及对应的掩模图像作为计算特征点的输入,通过7*7高斯模糊低通滤波完成所有候选点的去噪及预处理、通过Sobel算子计算候选点梯度幅度得到物体图像边缘、通过Phase函数计算候选点梯度方向。

  之后在360°空间范围内对候选点的梯度方向按照16个区间共十个方向进行投影,量化候选点的梯度方向;并通过设置阈值以及3*3梯度直方图统计3*3区域内候选点的梯度方向,得到梯度幅度高于阈值的区域候选点最多的梯度方向作为整个区域的梯度方向,这样就得到了特征点的梯度方向和梯度幅值。特征向量计算流程如下图3所示。

           图3 特征点特征向量处理流程图

  LineMod算法利用方向量化的方法处理梯度向量,即通过将输入图像的RGB三个通道分别进行梯度计算并把其中模长最大的梯度保留下来,将360°的梯度方向空间分别量化到个离散区间。之后为了降低噪声的干扰将梯度传播到大小为的邻域并只将模长大于预设阈值的梯度保留下来。梯度方向量化过程示意图如图4所示。

 

理效果。

 2.特征点坐标计算

  得到了特征点的特征向量后,需要确定特征点所在的坐标。在这一过程中,LineMod算法会遍历输入图像的每一层图像金字塔,通过下采样的方式提取金字塔每一层特征点所在的坐标位置,对应图像四层金字塔每一次循环会得到四个坐标位置。之后不断循环计算特征点坐标并且进行修正,最后得到了3*3区域内特征点对应的坐标位置。

 3.特征点信息存储

  在得到特征点的特征向量(梯度幅度和梯度方向)以及特征点的坐标位置以后,结果通过shapes.save_infos保存训练信息,通过detector.writeClasses写入预设待匹配模板特征点信息。值得说明的是,LineMod算法作为经典模板匹配算法,利用所有特征点将整个物体作为一个单个模板用于之后的模板匹配,这限定了其完全不具备多目标及遮挡场景的识别能力。

  采集物体模板多模态的特征示意图如下图所示。

2.3模板匹配阶段

  如图所示为模板匹配阶段流程图,输入的测试图像会简单判断图像的宽度和高度并调整为16的倍数便于之后的图像处理,各像素点特征向量以及坐标位置的计算和训练阶段一样。在得到像素点的特征向量和坐标位置以后进行下列相关步骤。

 1.梯度方向展开(方向扩散)

  梯度方向展开即把每一个像素点及其3*3领域按照离散化的方向进行或运算,并按照领域直径T循环T*T次完成领域内像素点的梯度方向值遍历,并在内存中存储为连续的特征信息数据。梯度方向展开过程如下图所示。

   其中,a为像素点的梯度方向,b为以该像素点为中心进行3*3领域梯度方向展开,c为每一个领域对应方向量化表而得到的方向量化值。之后每一个邻域的梯度方向量化值会通过T*T次循环进行遍历并存储,存储的邻域将会创建梯度响应表(如图c所示)用于存储梯度方向量化值。

2.线性化存储

  LineMod算法之后会预处理响应图,将像素点x位置处的多个特征进行编码。由之前的扩散而得到的多个特征将编码对应独一无二的二进制字符串供匹配过程使用。LineMod算法通过预先为每个离散方向创建n0个查找表以供之后的与二进制字符串匹配搜索过程,而查找表的索引号对应该字符串、索引值对应像素点位置与离散特征方向的余弦值,这样就完成了测试图像像素特征处理、方向扩散、构造响应表以及线性化存储梯度方向量化值的过程。

 特征离散化过程以及查找表创建过程如图4和图5所示。

图4 图像像素点特征离散化示意图

图5 查找表创建示意图

3.相似度计算

  在创建查找表并存储梯度方向量化值之后,LineMod算法会提取出训练阶段的训练模板特征点信息,通过将模板在测试图像上进行水平和垂直方向上的滑窗匹配,比较训练模板特征点与测试图像对应像素点在查找表上对应的梯度值差异性,产生一个二维相似度矩阵,完成测试图像的一次滑窗匹配。

  测试图像在不同的金字塔层级进对应预训练模板信息不断进行滑窗匹配,得到对应不同的相似度(梯度方向余弦值相似性),对于同一个模板进行相似度叠加从而得到整体相似度。这样就是一个测试图像对应不同位置方向角度模板而得到不同的整体相似度,通过相似度即可判断是否匹配成功。


写在后面:

LineMod算法内容比较多,我打算这一篇主要侧重原理,包括公式解析等,文字内容多一些。第二篇侧重原理及自己的理解,图示等。图片内容多一些。第三篇可以讲讲怎么复现这个算法,虽然已经在csdn上写过,不过可以重新梳理总结一下。