Learning Less is More – 6D Camera Localization via 3D Surface Regression && 2018 论文笔记


作者: Eric Brachmann and Carsten Rother

机构:海德堡大学 视觉学习实验室

本文基于DSAC模型,提出了DSAC++ , 证明了相比于 学习 相机定位 pipeline 的所有组件,只学习其中的一种会更加高效。

DSAC++就是这样一个 将可学习的组件结合到定位 pipeline 中,组成的端到端学习系统。

DSAC有三个问题:

  1. 对位姿假说进行评分的CNN模块很容易过拟合。因为它可以记住全局的共识模式,以区分优劣假说。 例如,CNN可能会专注于图像中出现误差的位置,而不是去学习评估误差的质量。然而出现误差的位置不能在不同场景之间是不同的,因而不能够被泛化。
  2. 初始化pipeline需要RGBD训练数据,或者是3D模型。这些数据较难获取。
  3. DSAC中姿态细化通过有限查分得到,不稳定的数值会导致非常大的梯度方差。

针对以上问题,DSAC++ 使用了soft inliner count 取代原来的评分CNN, 对位姿假设进行评分。防止了过拟合问题。为了解决评分数值不稳定导致的大梯度方差,DSAC++ 使用香农熵对概率分布进行监督使得模型参数能够适应概率分布。

此外,本文还探索了模型在不适用3D模型下的性能,实验证明,DSAC++在不依赖3D模型的情况下依然可以精确估计相机位姿。

论文方法介绍

本文基于DSAC,因此首先介绍下DSAC.

DSAC 的pipeline步骤:

  • 场景坐标回归:

    首先有一个CNN来预测每个像素i对应的3维场景坐标 y i ( w ) y_i(w) ,其中w为模型的参数

  • 位姿假设采样:

    任选4个 y i ( w ) y_i(w) 就可以生成一个位姿假设。多次采样,生成位姿假设集合 h ( w ) h(w)

  • 选择最优位姿假设:

    评分函数 s ( h ) s(h) 根据每个位姿假设 h j ( w ) h_j(w) 对应的概率分布 P ( j ; w ; α ) P(j;w;\alpha) 对每个位姿假设进行评分,选择最可能的位姿假设。其中参数 α \alpha 控制概率分布的宽度。
    r i ( h , w ) = C h 1 y i ( w ) p i ,   p i i C s o f t m a x P ( j ; w , α ) = e x p ( α s ( h j ( w ) ) ) k e x p ( α s ( h k ( w ) ) ) P ( j ; w , α ) 姿 姿 α 首先计算重投影误差:\quad r_i(h,w) =||Ch^{−1}y_i(w)−p_i||, \ p_i是像素i的坐标,C为相机内参矩阵。\\ 计算重投影误差的softmax:\quad P(j;w,\alpha) =\frac{exp(\alpha s(h_j(w)))}{\sum_kexp(\alpha s(h_k(w)))}\\ 选择P(j;w,\alpha)(即概率分布)最大的位姿假设为最佳位姿假设\\ 参数\alpha是固定的缩放因子,控制概率分布的宽度。
    参数 α \alpha 的作用就是减小假设评分之间的差别,使得梯度值相差不会太远。个人理解,比如两个假设的得分是10和100,相差90,那么乘以该参数(论文中使用0.1)后变成了1和10,相差9。

    这个基于概率分布选择最优位姿假设的机制使得DSAC可以进行端到端的训练。

  • 细化最优位姿假设

    细化操作R是一个迭代步骤,选择inliner的像素,然后根据inliner像素进行优化,输出最终的位姿 R ( h j ( w ) ) R(h_j(w))

DSAC 的损失函数只使用角度误差和平移误差中的一项,通过优化所有inliners的损失来对网络进行监督。
l ( h , h ) = m a x ( ( θ , θ ) , t t ) l(h,h^∗) = max(∠(θ,θ^∗),||t−t^∗||)
DSAC详细的介绍见DSAC论文笔记,下面逐个介绍DSAC++的各个模块。

场景坐标回归:

论文使用VGG-like的全卷积网络进行三维坐标回归。

在这里插入图片描述

DSAC中使用图像裁切后的patches作为输入,对每个patch的中心点输出对应的坐标预测。尽管对图像patches进行了40*40 的采样,重复计算仍然很多,计算量大。

因此本文以整张图像640*480作为输入,然后生成80 * 60的场景坐标预测,一次性计算完成。

位姿假设评分:

首先分析了DSAC的假设评分机制的两个问题:

  1. 因为使用patches进行局部预测,场景位姿回归网络可以很好地泛化到其他场景。而评分网络使用的是学习的是全局误差,使得评分网络不能够被很好的泛化。
  2. 评分CNN有输出极大值的趋势,当有些位姿假设的得分为1时,loss取得极小值,而参数 α \alpha 是固定的,这导致过拟合以及训练的不稳定。

正则化可能可以解决这些问题 ,但是论文采取了一种更加简单的可导的方法:

  1. 首先统计inlier点的数目,这里与DSAC不同,使用了sigmoid函数计算评分值:
    s ( h ) = i s i g ( τ β ( r i ( h , w ) ) ) τ β P ( j ; w , α ) = e x p ( α s ( h j ( w ) ) ) k e x p ( α s ( h k ( w ) ) ) D S A C s(h)= \sum_isig(\tau-\beta(r_i(h,w)))\\ \tau 为重投影误差的阈值,\beta为超参\\ P(j;w,\alpha) =\frac{exp(\alpha s(h_j(w)))}{\sum_kexp(\alpha s(h_k(w)))}\\ 这一步与DSAC相同

  2. 计算概率分布的香农熵

    香农熵:
    S ( α ) = j P ( j ; w , α ) l o g P ( j ; w , α ) S(\alpha) =−\sum_jP(j;w,α) logP(j;w,\alpha)
    用于衡量概率分布的分散程度(宽度),从而找到合适的超参数 α \alpha

    在前几次的迭代中建立目标熵 S S^* ,然后通过梯度下降优化 α \alpha 使得香农熵接近目标熵。

三步训练:

作者发现使用RGB和对应位姿真值进行训练很容易陷入局部极小值,因此提出了训练的三个步骤:

  1. 初始化模型参数w:

    有3D模型时,使用渲染的场景真值进行初始化,否则近似的真值进行启发式的初始化
    w ^ = a r g m i n w i y i ( w ) y i \hat w= argmin_w\sum_i||y_i(w)−y^∗_i||
    在这里插入图片描述

  2. 优化重投影误差

    这一步相当于加入了几何约束
    w ^ = a r g m i n w i r i ( h , w ) \hat w= argmin_w\sum_ir_i(h^∗,w)

  3. 进行端到端训练
    w ^ = a r g m i n w D E j P ( j ; w , α ) [ l ( R ( h j ( w ) ) , h ) ] l ( ) D S A C l ( h , h ) = m a x ( ( θ , θ ) , t t ) \hat w= argmin_w\sum_DE_{j∼P(j;w,α)}[l(R(h_j(w)),h^∗)] \\这里损失函数l()与DSAC一样:l(h,h^∗) = max(∠(θ,θ^∗),||t−t^∗||)
    端到端训练要求模型的所有组件都是可导的,包括位姿细化。

    DSAC的位姿细化使用有限差分实现,速度慢计算量大,由于数值不稳定性,,梯度值往往很大。

    论文将位姿细化分为两个步骤:根据重投影误差定义inlier像素集合,然后在inlier集上根据重投影误差进行细化。
    i n l i e r I = { i r i < τ }    τ inlier集合:I=\{i|r_i< \tau\}\ \ \tau 为阈值
    细化函数R(h)应当使得重投影误差最小:
    R ( h ) = a r g m i n h r ( h , w ) 2 R(h) = argmin_{h′}||r(h′,w)||^2
    使用高斯牛顿迭代优化:
    R t + 1 = R t ( J r T J r ) 1 J r T r ( R t , w ) ( J r ) i j = ( r ( R t , w ) ) i ( R t ) j R^{t+1}=R^t−(J^T_rJ_r)^{−1}J^T_rr(R^t,w)\\ 雅各比矩阵:(J_r)_{ij}=\frac{\partial(r(R^t,w))_i}{\partial(Rt)_j}
    DSAC中,为了控制计算量设置了迭代次数上线和inliers数量的最大值。

    相比于DSAC,论文中的迭代数值和inliers数目是不受限的,直到优化收敛为止。

实验内容以及分析

实验总的来看角度误差非常优秀,平移误差已经DSAC已经很小了
在这里插入图片描述

统计了在给定阈值后定位成功的整数比例:
在这里插入图片描述

速度:0.2fps,

训练时间:每个训练阶段是1-2天,总共就是3-6天(Tesla K80)