使用深度学习进行点云匹配(五)

本文承接前一篇:使用深度学习进行点云匹配四,今天要研究的是关于TDF的具体含义和如何训练3D match描述子的方法。之前提到了使用3D match进行迁移学习的代码,但是那个相当于利用已经训练好的权重只进行了一次前向传播,得出512维的描述子后进行匹配,那么这些权重是如何训练出的,这就是今天要探究的主题。

首先回顾一下TDF,之前提到的TDF我并没有很深的理解,今天再次细读论文,论文中的介绍是这样的:For each interest point, we first extract a 3D volumetric representation for the local region surrounding it. Each 3D region is converted from its original representation (surface mesh, point cloud, or depth map) into a volumetric 30 × 30 × 30 voxel grid of Truncated Distance Function (TDF) values. Analogous to 2D pixel image patches, we refer to these TDF voxel grids as local 3D patches.In our experiments, these local 3D patches spatially span 0.3m3, where voxel size is 0.01m3. 翻译一下就是:对于每个兴趣点,我们首先提取一个围绕它的局部区域的3D体积表示。每个3D区域从其原始表示(表面网格,点云或深度图)转换为截断距离函数(TDF)值的体积30×30×30体素网格。类似于2D图像块,我们将这些TDF体素网格称为局部3D块。在我们的实验中,这些局部3D块在空间上跨度为0.3m3,其中体素尺寸为0.01m3。这句话介绍十分详细了,也就是我们以关键点为中心选取了一个正方体,然后把这个正方体划分为许多小的正方体,这里我有一个疑问,作者说大的正方体空间跨度是0.3m3,但我觉得不应该是体积表示,同样小的正方体体积也不应该是0.01m3,因为这样的话得出的边长都是无限小数,结合之前的代码我认为作者是这样计算TDF值的,虽然只取了部分点作为关键点,但是TDF网格是针对整个点云图来构建的,在知道了整个点云图的x,y,z方向上的范围之后,作者据此构建了TDF网格,当我们选取关键点之后,我们便可以直接抽取关键点附近的30*30*30的正方体体素网格,也就是如论文中给出的图片:

从图中可以看出是关键点为中心的一个正方体,虽然图中是4*4*4的正方体,但是论文和代码中使用的的确是30*30*30的正方体。那么这里面每一个小正方体的含义是什么呢,其实我们仔细观察每一个小正方体,我们知道关键点一定是在点云表面的,但是小正方体则有三种可能,表面,远离表面和在表面内,这很容易想到TSDF算法,这里的TDF与此同理,只不过他把在表面内和远离表面统一为一种情形,这里我们可以看一下论文中是怎么介绍的:The TDF value of each voxel indicates the distance between the center of that voxel to the nearest 3D surface. These TDF values are truncated, normalized and then flipped to be between 1 (on surface) and 0 (far from surface). This form of 3D representation is cross-compatible with 3D meshes, point-clouds, and depth maps.Analogous to 2D RGB pixel matrices for color images, 3D TDF voxel grids also provide a natural volumetric encoding of 3D space that is suitable as input to a 3D ConvNet.翻译过来是每个体素的TDF值表示该体素的中心与最近的3D表面之间的距离。这些TDF值被截断,归一化,然后翻转到介于1(表面上)和0(远离表面)之间。这种形式的3D表示与3D网格,点云和深度图交叉兼容。类似于用于彩色图像的2D RGB像素矩阵,3D TDF体素网格还提供3D空间的自然体积编码,其适合作为3D ConvNet的输入。也就是说每一个小的正方体都有一个值,含义代表它距离表面的距离,1就是在表面上,0代表无限远离,0到1之间就是远离的程度,那么相当于每一个关键点附带的TDF网格共有30*30*30=900个TDF值。

以上就是我对TDF的再次研究,我并不能确定我的想法是对的,因为有一些代码我看不懂,但是我认为结合后面的做法,这种想法的确是一种可行的做法。那么接下来我们就要提到这个TDF值到底如何可以进行训练。

首先每一个关键点的TDF值(应该是900个)是作为输入的,那么我们的标签是什么呢?我们知道做训练的模型应该有一个真实的标签y,以及有一个计算得出的标签y‘, 对二者基于某种目标函数进行优化,才可以达到训练的目的。那么作者关于数据集的标签制作很简单,通俗解释就是他首先人为标定了两个点云中的一些对应关键点,同时为这些关键点又分别找了一个不对应的点,也就是对于一点,我们在另一个点云中找了两个点,一个是它的对应点,一个是非对应点,把这三个点同时输入到网络中进行训练,有的人可能有疑问了,神经网络的模型还可以有三个输入吗,当然可以,因为这里用到了一种网络模型:Siamese network ,中文翻译过来就是孪生神经网络,什么是孪生神经网络?大家可以自行百度,这个并不复杂,简单的解释就是我们构建了两个神经网络,但是他们的权重可以是共享的(也可以不共享),也就是说我们其实只需要训练其中一个网络得到参数共享给另一个就行了,孪生网络的作用是为了衡量两个输入的相似度。但是要注意的是,作者这里的孪生网络还是有些不同的,它构建的两个网络我们拆开看的话是这样的,一个网络输入两个点云中的两个对应点,我们训练的目的是让他们的输出越来越像就可以了,而另一个网络我们则输入的是两个不对应的点,我们的目的是让他们输出的差距越来越大就可以了,比如我们的代码中使用的是L2损失函数,我们可以看一下论文中的介绍:During training, our objective is to optimize the local descriptors generated by the ConvNet such that they are similar for 3D patches corresponding to the same point, and dissimilar otherwise.To this end, we train our ConvNet with two streams in a Siamese fashion where each stream independently computes a descriptor for a different local
3D patch.The first stream takes in the local 3D patch around a surface point p1, while the second stream takes in a second local 3D patch around a surface point p2. Both streams share the same architecture and underlying weights. We use the L2 norm as a similarity metric between descriptors, modeled during training with the contrastive loss function .This loss minimizes the L2 distance between descriptors of corresponding 3D point pairs (matches), while pulling apart the `2 distance between descriptors of noncorresponding 3D point pairs.During training, we feed the network with a balanced 1:1 ratio of matches to nonmatches. This strategy of balancing positives and negatives has shown to be effective for efficiently learning discriminative. 这段话很长,翻译过来就是:在训练期间,我们的目标是优化由ConvNet生成的局部描述子,使得它们对应于相同点的3D块是相似的,否则是不相似的。为此,我们以连体方式训练我们的ConvNet有两个流,每个流独立计算不同局部3D块的描述子。第一个流接收局部3D块围绕表面点p1,而第二流在表面点p2周围接收第二个局部3D块。两个流有相同的网络结构和基础权重。我们使用L2范数作为描述子之间的相似性度量,在训练期间用对比损失函数建模。该损失使相应3D点对(匹配)的描述子之间的L2距离最小化,同时拉开非对应3D点对的描述子之间的距离。在训练期间,我们为网络提供平衡的1:1匹配与不匹配的比率。这种平衡积极和消极的策略已经证明对于有效学习判别性的描述子是有效的。看到这里不得不说作者的这种想法的确是很有创造性,将对应点的描述子的L2距离最小化,将非对应点的描述子的L2距离最大化,这一点在代码中也有体现,比如我们查看training下的net.json文件,也就是训练中的模型配置文件,可以看到每一层的输入输出都有match和nomatch,截图举例如下:

其实如果仔细思考这种思路,我们还有一点需要注意,那就是关于非对应点的问题,我们知道在两个点云中,一个点云中的某个点在另一个点云中只有一个点与它对应这是很好理解的,此外都是与它不对应的点,我们应该如何进行选取呢?我们不可能随机选取,因为万一运气不好选到了对应点就很糟糕了,关于这一点作者在论文3.1部分中也提到了:To obtain nonmatching pairs, we extract local 3D patches from randomly picked depth frames of two interest points (at least 0.1m apart) randomly sampled from the surface of the reconstruction.为了获得不匹配的对, 我们从随机选取的两个兴趣点 (至少间隔0.1 米) 的深度帧中从重建表面随机采样的局部3d 块中提取。也就是作者选取的非对应点与对应点至少距离0.1m。

最后我们再看一下坐着给出的siamese network架构图,可以看出输入是三个体素网格,对于中间的来说,上面的是他的对应点,下面的是选取的非对应点,把他们输入到siamese network中,可以看到右边的网络框架,两部分架构是相同的。对于最后输出的描述子,使对应点的描述子的L2损失变小,使非对应点的L2损失变大,从而得出网络的权重。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值