Main idea
用深度学习的方式学习一个keypoint的descriptor,用于3D点云匹配,为用DL做point cloud matching/registration领域中非常好的文章
dataset
本文是从现有reconstruction数据集中生成的positive和negative training data。
train
随机选keypoint,然后把keypoint点及其周围点一起做个voxel,然后转化为TDF,然后送入siamese网络训练,用GT-correspondences进行监督,loss用的是contrastive loss,即希望,对应的两个patch间descriptor的L2距离小,不对应的两个patch间descriptor的L2距离大。
test
在test时,随机选2N个keypoint,分别算完两个pointcloud的2N个patch的descriptor后,用KD树检索。
structure
数据集产生
数据集由reconstruction任务中提取,现成的reconstruction数据集中有RGBD图像还有camera的内参外参,还有相应的三维点的camera坐标
- 随机选一个scene,一个seqence,和一个frame,三者确定一个frame
- 在该frame中随机挑一个pixel(挑一对u,v,转化为一个idx,用于检索depth值)记为p1,得到其u,v,z。
- 把像素坐标u,v转化为相机坐标,然后结合depth图得到的z,得到p1的相机坐标
- 将p1投影到这个frame中,检查投影的u,v是否是在这个frame中,若在就记录
- 搜索同一个scene中的每一个sequence每一个frame,检查此时的camera的world坐标与p1的camera是否相隔1m,是的话继续,不是则跳过。相隔1m是保证视角差距足够大,场景变化足够大
- 遍历完之后在所有valid的p2中抽取一个检查它在对应的depth中是否valid,是的话就结束抽取,并把该点记为p2,不是则继续抽,最多抽100次。
- 然后随机抽scene,sequence,frame和pixel,记为p3
至此,p1-p2为一个positive样本,p1-p3为一个negative样本。记录p1,p2,p3来源的frame(即记录了对应的camera内外参),p1,p2,p3的pixel位置,p1,p2,p3的TDF数据,重复上述过程形成training set。
TDF
TDF值的计算就是:
- L获取一对pixel坐标,转化为camera坐标
- 根据设置的voxel大小,voxel size把这个点周围框住
- 3D框投影回2D框,获取其中所有valid的点转化为camera坐标系3D坐标,这些点就是所谓的”表面”,它所在的voxel就是occupy,该voxel的TDF值就是1
- 对其他未填充的voxel,计算其到表面点最近的距离,TDF值就是truncate margin normalize后的值(距离表面点越近越接近于1)。
// Apply truncation, normalize between 0 and 1, and flip so 1 is near surface and 0 is far away from surface
for (int i = 0; i < num_grid_pts; ++i)
voxel_grid_TDF[i] = 1.0f - (std::min(closest_pt_dists[i], trunc_margin) / trunc_margin);
discuss
- 选择TDF而不是直接编码深度图
因为TDF提供了对遮挡区域的合理推断。 - 不用learned metric
因为比较2N个patch至少要O(n**2)复杂度,learned度量函数(本文实现为一个分类问题,即不输出descriptor,也不用contrastive loss监督,直接输出"match" or “non-match”,用softmax loss)不能接KD树减少复杂度(都二元输出了还怎么用KD树。。。),所以还不如把descriptor显示输出出来,然后用L2距离为metric+KD树降低比较复杂度
文中拓展的应用:
- Descriptor+RANSAC进行点云keypoint匹配然后ICP算pose
- Descriptor+RANSAC点云算出R,t后把它们翻到同一个角度算重叠度,做回环。
- 3D重建(多片点云融合为一个大场景)(用这个descriptor代替SIFT/SURF,用BA一起优化)
- Amazon Picking Challenge(给定物体模型,在一片点云场景中检索这个物体)
- Surface Correspondence on 3D meshes.