Main Idea
把点云和
通过pointnet网络映射到和
,目标是找出一个rigid transformation
使得
。借鉴LK的思想,LK目标是跟踪detector的平移,这里是跟踪整个点云的旋转。LK是有两个2D图片
,
,有提取出来的
的detector,在
中根据灰度找到
的detector,算出两者位移。LK是基于光度不变假设,即
,解出
。这里是相似的,已知
解出
。这里是迭代求解之后,解出的
与GT之差产生一个loss,反向传播去训练PointNet,即优化
。
本质上是修改了ICP的操作域,ICP是直接用点云去算,而PointNetLK则是把ICP用在feature域中
缺点
因为这个iteration,虽然作者设为max-iter=10,但是整个过程非常非常耗显存,可以看到,一次前向后向就需要12个叠起来的图,其中求导过程还有6倍batch_size的数据过pointnet,也就是17 times pointnet参数。训练的时候。。需要10个G的显存而且5分钟一个epoch。。
Structure
这里借鉴LK的the Inverse Compositional (IC) formulation(用算梯度)(正常LK是用
算梯度)
首先已知求
这个方程不一定有精确解,我们可以求最近似的解。
定义
目标是minmize这个error,即
这个问题不是线性的,只能迭代求解,使用高斯牛顿法
求一个
用一节泰勒展开近似后,解得
其中。其中
,没有加法,导数无法按照正常定义进行计算。所以可以转而对其对应的
进行求导:
。接下来,如果按照正向的光流法思路就是
,但是这样的话,每迭代一步就需要重新算
。所以借鉴反向LK的思路,把error改成
,则第0时刻有
,然后每迭代一步,就把
乘到
上,然后
不动
,这样相对而言就是
退了一步,所以每迭代一步,jacoobin矩阵都不变,n次迭代后得出总的G:
计算用于训练的loss:
利用神经网络框架的动态图,每一次前向传播就建一次图,叠加n个图,然后反向传播一次,实现训练。
Result
训练的时候是用pointnet在model40上训练好了之后,在联合PointNetLK进行fine-tune。本文的比较对象是ICP。
在ModelNet40上sample出一个Template,然后把template进行旋转平移生成Source,用这样的数据进行train和test,做了1,2,两个实验:
- Train and test on same object categories
- Train and test on different object categories
结果如下:
3. 在数据中加高斯噪声,证明pointnet最后的symmetrical function用average pooling比max pooling更加Robust
4. Partially visible data
3D与2.5D的匹配。使用的方法是:
A second approach is to use an initial estimate of camera pose with respect to the 3D model to sample visible points on the model, which can be compared with the 2.5D scan.The camera pose can be iteratively updated until the visible points on the 3D model match the 2.5D scan.
首先在CAD上sample出template=source,然后给source一个随机的translate得到,把这两个点云平移
,然后截取满足
的点云
(基本上是一半)(这其实就是一个模拟深度相机扫描的过程),然后把这两个点云送入PNLK得出一个
,把原始的
旋转之后,重新截取
,重复上述过程直至收敛。