1.模板数据
视点采样:模板数据为每类物体不同视角的图像,每类物体模板的提取数量为2000幅。在采样时,应该尽量覆盖各个视点下的图像(除此之外,还可以记录每个视图下的大致姿态)。
对每个物体采集不同尺度、不同视角的模板图像,文章中推荐绕每个轴旋转±80°,尺度上大小的变化范围为[1.0,2.0]。
2.训练过程
Line2D采用的是图像颜色梯度特征,这一点不同于LineMod(除了颜色梯度特征,还有深度特征)。在匹配时,仍采用传统的滑窗方式,即用每幅模板图像在输入图像上依次滑窗匹配,求出最佳的匹配位置。
2.1 图像梯度
为什么选择图像梯度?因为他们被证明比其他形式的特征更具有判别力,并且对光照变化和噪声具有鲁棒性。此外,图像渐变通常是无纹理对象时唯一可靠的图像提示。图像梯度的定义:
其中ori()为位置x处的以弧度为单位的梯度方向。C ^(x)定义如下:
为了增加鲁棒性,在每个像素位置x的三个颜色通道上分别计算其梯度,并选择梯度值最大的通道,最终该通道下的梯度方向为x位置下的最终梯度方向,也即是ori()。
2.2 模板的定义
模板图像是在特定视角下某类物体的图像,如下图所示:给定模板图像后,需要对该模板图像进行梯度求解,求出其梯度图像(由于Line2D不涉及深度信息,这里可以忽略下面的surface normals),同样的,输入图像也需要求出其梯度图像,才能进行匹配。(具体的介绍见后面章节)
2.3 相似度测量(模板和输入图像对应的区域)
其中:ori(O,r)为模板图像上位置r上的梯度,ori(I,c+r)为输入图像上在c+r上的梯度,其中c为输入图像上对应于模板图像的中心点,其实这里也就是输入图像上和模板图像像素对应的像素的梯度。
2.4 梯度的量化
为了量化梯度,在这里把梯度方向划分为n个空间,由相应的二进制数据来表示,如图2所示(n=5)。粉红色箭头表示计算出的梯度方向,由于在量化后的空间中,该梯度方向更接近于第二个00010方向,因此被强制归于(等同于)00010。量化后的梯度,方向按照一定的角度距离隔开排列。在这里不考虑梯度的方向,比如在同一个直线上的两个梯度方向可以归为相同的一个梯度方向比如在0-180°之间,具体如下图所示,不考虑下半部分方向梯度。
2.5 梯度方向的扩展
为了使量化对噪声强健,每个量化位置的梯度方向还需要考虑邻域上的梯度方向。在这里采用3×3邻域下的梯度方向,如图4(b)所示,在梯度图(a)的基础上,每个位置结合周边3×3邻域位置下的梯度,并汇总到一起,这样每个位置就包含多个梯度方向如图b所示,把这些方向转换为量化后的二进制数据就得到(c) Binarized Image,这里如果3×3邻域内有相关量化梯度方向,那么该位置的二进制数据在相应位置上为1,否则为0。注意:这只是针对输入图像,对模板图像不需要梯度扩展,只需要对模板图像求解出梯度图像即可。
2.6 查找表(Lookup Table)
查找表
T
i
T_i
T
i
的定义为:
其中:i是量化方向的序号(比如第几个量化方向,这里一共五个,上面已经叙述过了),L是一系列的组合梯度方向列表,针对量化方向i。如图5所示,计算出每个量化方向i(比如←或者↑)和所有量化方向的组合(比如11010、11011、00001,具体数量涉及到5种量化方向的排列组合)的最大相似值,得出结果如1和0.7。在实际运算中,通过提前计算出量化方向和各个组合之间的相似值,并通过查找表的形式保存下来,这样在实时匹配时,只需要通过查找Lookup Table就可得出对应位置梯度的相似值。实际上,我们使用对应于L的二进制表示的整数值作为查找表中元素的索引。
注意:这里是这样,对模板图像进行量化后,模板图像上的每个像素对应一个量化方向,查找表一共有n个(分别对应n个量化方向),所以在实际使用时,通过模板上每个像素位置的量化方向,查找对应的Lookup Table,并根据输入图像扩展梯度后指定像素的二进制梯度值(比如11010对应于整数值26)。这样,在对应量化梯度查找表上,根据对应的二进制梯度值(比如11010对应于整数值26)就可以查找到最大的cos()余弦值。通过在线下训练好查找表,这样在模板进行遍历匹配的时候,把在线余弦计算转换为查找。
每个量化后的梯度方向(←或者↑),都对应一个Lookup Table,这样可以有目标的进行对应查找,如图5最右侧图所示。
2.7 预先计算的响应地图
响应地图是指在模板和输入图像进行匹配运算时,把得出的一系列相似值,这些相似值保存到response map中,这个map就叫做响应地图。
注意:由于在建立Lookup Table查找表时已经计算出每种量化梯度和所有量化梯度组合的相似值,所以在实际匹配时只需要在Lookup Table中查找即可,不需要在线计算,这样就大大节省了计算时间。
为什么叫预先计算的响应图呢?
这是因为,在模板匹配之前就已经建立好了Lookup Table,所以在实际匹配时,相似度值不需要在线计算,直接查找结果即可,比如11010(组合梯度,对应于输入图像)和10000(只量化,但不进行梯度扩展,对应于模板图像)之间的相似度为1。
一个模板在输入图像上进行滑动匹配时,每滑动一次,就会得到一个响应图,如图6最右边图像所示。把响应图中的每个相似度进行相加求和,即可得出该模板在对应位置上的相似度。
图6 响应图 Si和Sj
如图7所示,模板上的梯度和输入图像上的Binarized Image进行相似度计算,相似度值可以通过图6上的Lookup Table进行查找。
2.8 姿态纠正
姿态纠正的算法:进行模板匹配时,模板匹配的位置和图像中物体的位置不一定完全重合,这时需要对模板进行一个姿态的微调,使其匹配到更准确的位置。具体操作就是对模板进行平移和旋转,通过最小二乘法来求出平移和旋转量x,y,θ。
具体算法流程:
- 对模板上的特征点,一一找到其在匹配图像上的对应点,具体方法为,寻找特征点在匹配图像上某邻域内的最近点(也就是对应点,在这里默认最近点梯度方向和特征点的方向相同,不会发生太大变化)。
- 对模板上每个特征点都找到对应点后(其实是找到对应坐标),计算对应点的切线,同时计算特征点到对应点切线的距离,对所有特征点进行相同操作,使距离最小化。对特征点进行旋转和平移,通过特征点坐标和对应点切线进行最小平方差运算,使特征点尽量靠近对应点,分别求出最小平方差和对x,y, θ的一阶导数,并令其为0,求出x,y, θ。
- 进行迭代,第二步已经纠正模板的姿态,但是效果还不够好,需要多次进行调节,具体方法为,基于第2步姿态已经调整过的模板,再次进行特征点的对应点选取(这个对应点和第一次找到的会有所不同),然后采用和第二步相同的操作,通过和对应点坐标进行最小平方差运算,分别求出最小平方差和对x1,y1, θ1的一阶导数,并令其为0,求出x1,y1, θ1。
- 通常,迭代2~3次即可达到要求。
实验结果: