PCRNet算是在ModelNet40这种object-centric数据集上用deep-learning做配准最好入手的一篇文章了,整体架构涉及简洁明了,一句话描述就是简单粗暴,话不多说,直接上网络架构图:
Work Flow:
- 首先对输入source ( N × 3 N \times 3 N×3)与template ( M × 3 M \times 3 M×3)进行PointNet操作,即MLP + max-pooling后,分别得到描述各自点云的维度为1024的global feature vector: Φ ( P S ) , Φ ( P T ) \Phi ({P_S}),\Phi ({P_T}) Φ(PS),Φ(PT).
- 此时可以粗略的认为 Φ ( P S ) , Φ ( P T ) \Phi ({P_S}),\Phi ({P_T}) Φ(PS),Φ(PT)分别encode了 P S {P_S} PS 与 P T {P_T} PT 各自的位置信息,接着进行concatenate拼接操作将两个1024维向量拼成2048维。
- 接着直接将配准问题建模为一个简单的回归问题,将concatenate输出了2048维向量应用FC层投影成最终的7维向量输出:前三维代表translation vector,后四维代表rotation matrix转化成的四元素表示。
简单的模型可想而知带来的就是效果不可能会很好,因此一次不行就来多次,反正模型简单做一次inference时间会很快,因此最后使用时是以迭代形式 (Iterative PCRNet)呈现:
Loss:
这里使用的loss是点云配准中不经常出现的Earth Mover Distance (EMDLoss):
我觉得这种做一般了解就好,毕竟不是Registration中的主流loss.
Code:
代码使用的是发哥的代码,整体代码是比较易于阅读的,这里直接贴出我复现的结果:
Method | isotropic R | isotropic t | anisotropic(mse, mae) | anisotropic(mse, mae) | training_mode | epochs | trainset/testset | testing with noise/partial |
---|---|---|---|---|---|---|---|---|
Iter-PCRNet | 6.77 | 0.09 | 10.30(3.23) | 0.13(0.04) | clean | 600 | 9840/2468 | N/N |
Iter-PCRNet | 7.01 | 0.09 | 9.94(3.41) | 0.13(0.04) | clean | 600 | 9840/1266 | N/N |
Iter-PCRNet | 27.55 | 0.39 | 28.17(15.47) | 0.30(0.19) | clean | 600 | 9840/2468 | N/Y |
分别测试了default、unseen、以及partial三种setting下的表现。
Summary
感觉PCRNet里面真正值得研究的东西没多少,但是作为一种在ModelNet40上深度学习配准的入门文章与代码,还是挺不错的。
Pretrained Model can be found at here:link