视频链接:链接
使用surfel based 的表示方法(vertex+normal)作为网络的输入,避免了量化损失,看起来是一种不错的表示方法,既没有误差,保留了点云数据的精确性,还以一种map 的形式提供邻域查询功能,不需要KDtree检索之类。
此外,使用几何一致性约束的损失函数进行无监督训练,通过扰动成像的方法证明了损失函数的可行性。并在部分场景上取得了优于有监督训练的精度。
( u v ) = ( ( f h / 2 − arctan ( p y , p x ) ) / δ h ( f v u − arctan ( p z , d ) ) / δ v ) \left(\begin{array}{l} u \\v \end{array}\right)=\left(\begin{array}{c} \left(f_{h} / 2-\arctan \left(p^{y}, p^{x}\right)\right) / \delta_{h} \\ \left(f_{v u}-\arctan \left(p^{z}, d\right)\right) / \delta_{v} \end{array}\right) (uv)=((fh/2−arctan(py,px))/δh(fvu−arctan(pz,d))/δv)
其中(u,v)为投影后的图像坐标, p = ( p x , p y , p z ) \mathbf{p}=\left(p^{x}, p^{y}, p^{z}\right) p=(px,py,pz)为3D点云坐标。深度 d = ( p x 2 + p y 2 ) 1 / 2 d=\left(p^{x 2}+p^{y 2}\right)^{1 / 2} d=(px2+py2)1/2,f_h和f_v分别为水平竖直的视野。如果有多个3D点投影到相同的像素坐标上,则选择最近的点作为像素值。每个像素点(vertex)包括三维的向量 v = [ v x , v y , v z ] \mathbf{v}=\left[v^{x}, v^{y}, v^{z}\right] v=[vx,vy,vz](论文没说是从哪里计算的值,应该是点云的三维坐标)
得到的2D投影图像被称为vertex map V。
同样作为输入的还有点云的normal map N。
即为每一个vertex分配一个法向量。分配方法使用的《NICP: Dense normal based pointcloud registration》的方法法向量计算方法根据V上的最近邻vertex计算。
range image的投影公式:
α = arctan ( y / x ) / Δ α β = arcsin ( z / x 2 + y 2 + z 2 ) / Δ β \begin{array}{l} \alpha=\arctan (y / x) / \Delta \alpha \\ \beta=\arcsin \left(z / \sqrt{x^{2}+y^{2}+z^{2}}\right) / \Delta \beta \end{array} α=arctan(y/x)/Δαβ=arcsin(z/x2+y2+z2)/Δβ
LO-Net、DMLO均使用了range image
vertex image的投影公式:
( u v ) = ( ( f h / 2 − arctan ( p y , p x ) ) / δ h ( f v u − arctan ( p z , d ) ) / δ v ) \left(\begin{array}{l} u \\v \end{array}\right)=\left(\begin{array}{c} \left(f_{h} / 2-\arctan \left(p^{y}, p^{x}\right)\right) / \delta_{h} \\ \left(f_{v u}-\arctan \left(p^{z}, d\right)\right) / \delta_{v} \end{array}\right) (uv)=((fh/2−arctan(py,px))/δh(fvu−arctan(pz,d))/δv)
除了本文,还有rangenet++也使用了vertex map
如图,左边是一个点云的两种表示,将其中一个部位(墙的俯视视角)放大至右图可见,range image由于角度离散化而产生了量化误差。而vertex map使用raw point作为表示,因此没有离散化带来的误差。
VertexNet 和 NormalNet分别提取输入前后帧两幅点云的平移特征和旋转特征,然后输入到posenet中进行回归,输出四元数
VertexNet 和 NormalNet均使用残差块和全连接网络
DeepLO还针对训练数据的真值提出了有监督和无监督两种训练模式:
v t ′ = T t , t + 1 v t + 1 v ‾ t = V ( π ( v t ′ ) ) n ‾ t = N ( π ( v t ′ ) ) \mathbf{v}_{t}^{\prime}=T_{t, t+1} \mathbf{v}_{t+1} \\ \begin{array}{l} \overline{\mathbf{v}}_{t}=V\left(\pi\left(\mathbf{v}_{t}^{\prime}\right)\right) \\ \overline{\mathbf{n}}_{t}=N\left(\pi\left(\mathbf{v}_{t}^{\prime}\right)\right) \end{array} vt′=Tt,t+1vt+1vt=V(π(vt′))nt=N(π(vt′))
有了对应点的关系,ICP损失:
L i c p = ∑ v ∈ V t + 1 n ‾ t ⋅ ( T t , t + 1 v t + 1 − v ‾ t ) \mathcal{L}_{i c p}=\sum_{\mathbf{v} \in V_{t+1}} \overline{\mathbf{n}}_{t} \cdot\left(T_{t, t+1} \mathbf{v}_{t+1}-\overline{\mathbf{v}}_{t}\right) Licp=v∈Vt+1∑nt⋅(Tt,t+1vt+1−vt)
代表了对应点之间的法向量距离之和(没有求平均)
但是,如果仅仅使用该损失网络会倾向于输出视场以外的刚性变换,导致没有对应点关系,以此达到最小损失。因此作者引入了filed of view损失函数作为约束:
L f o v = ∑ v ∈ V t + 1 I ( π ( T t , t + 1 v ) − ( w , h ) ) + I ( − π ( T t , t + 1 ) ) \mathcal{L}_{f o v}=\sum_{\mathbf{v} \in V_{t+1}} \mathbb{I}\left(\pi\left(T_{t, t+1} \mathbf{v}\right)-(w, h)\right)+\mathbb{I}\left(-\pi\left(T_{t, t+1}\right)\right) Lfov=v∈Vt+1∑I(π(Tt,t+1v)−(w,h))+I(−π(Tt,t+1))
该损失使得预测的旋转量始终将vertex投影在(w,h)的范围内。
总的损失:
L u n s = L i c p exp ( − s i c p ) + s i c p + L f o v exp ( − s f o v ) + s f o v \mathcal{L}_{u n s}=\mathcal{L}_{i c p} \exp \left(-s_{i c p}\right)+s_{i c p}+\mathcal{L}_{f o v} \exp \left(-s_{f o v}\right)+s_{f o v} Luns=Licpexp(−sicp)+sicp+Lfovexp(−sfov)+sfov
作者对该非监督的损失函数进行了评估,在加入平移量和旋转量的扰动后,观察损失函数值:
可以看出损失函数在最优值附近是凸的,这说明使用无监督损失函数进行训练是可行的。
作者使用于勒角 r = [ r x , r z , r y ] \mathbf{r}=\left[r^{x}, r^{z}, r^{y}\right] r=[rx,rz,ry],实验发现比四元数效果更好。
损失函数:
L sup = L t exp ( − s t ) + s t + L r exp ( − s r ) + s r \mathcal{L}_{\text {sup}}=\mathcal{L}_{t} \exp \left(-s_{t}\right)+s_{t}+\mathcal{L}_{r} \exp \left(-s_{r}\right)+s_{r} Lsup=Ltexp(−st)+st+Lrexp(−sr)+sr
其中: L t = ∥ t − t ^ ∥ l \mathcal{L}_{t}=\|\mathbf{t}-\hat{\mathbf{t}}\|_{l} Lt=∥t−t^∥l, L r = ∥ r − r ^ ∥ l \mathcal{L}_{r}=\|\mathbf{r}-\hat{\mathbf{r}}\|_{l} Lr=∥r−r^∥l,L = 1