澳大利亚国立大学,澳大利亚机器人视觉中心
本文解决的问题:BLind Perspective-n-Point(BPnP)
与Perspective-n-Point(PnP) 问题的区别在于PnP是已知2D与3D点之间的匹配关系的,而BPnP问题只有给定的2D点集和3D点集。因此BPnP需要额外求解一个匹配关系矩阵。
论文使用深度声明层将RANSAC结合到BPnP求解网络中,提出了第一个完全端到端可训练网路来解决BPnP问题
什么是深度声明层?
应该是在《deep declarative networks: A new hope》中首先提出的,与常见的具有显式前向函数、可以逐步进行梯度计算的命令层(如卷积层就是命令层)相对应。
声明层以优化目标函数的形式计算输出值,相比于命令层网络的逐层求梯度反向传播,其梯度计算是一步得到的,且允许递归或不可微算子存在,只要保证最后一个前向层是可微的。具体见其论文。
网络架构:
-
数据预处理:将3D点云p∈R3进行输入变换以规范其朝向。(借鉴了PoseNet);2D点是以三维方位向量f∈R3的形式表示:∥f∥=1 且 f∝K−1[u,v,1]⊤,在此基础上对f除以Z轴坐标转为2D点,以减少网络参数量。
-
特征提取:将P和f输入到各自的特征提取网络中,得到128维度的特征Zp和Zf.
特征提取器使用了论文《learning to findgood correspondence》
-
计算匹配概率:首先计算L2距离矩阵M:Mij=∥∥zfi−zpj∥∥2,Mij表示第i个2D点与第j个3D点之间的特征距离。然后使用 Sinkhorn 算法求解运输问题得到匹配概率矩阵P。
-
Sinkhorn 算法是在声明层中封装的:输入M,输出P
该层优化的目标函数:
f(M,P)=i=1∑mj=1∑n(MijPij+μPij(logPij−1))其中 U(r,c)={P∈R+m×n∣P1n=r,P⊤1m=c}
r,c是先验概率, 初始化时使用均匀分布作为先验
相比于匈牙利算法O(n3),Sinkhorn算法时间复杂度为O(n2)。
给定最优的概率匹配矩阵P,根据下列公式(引理2)计算P关于M的梯度:
若:欠约束线性方程组:Au=dy(x)∈arguminf(x,u) subject to Au=dH=DYY2f(x,y) and B=DXY2f(x,y)则:Dy(x)=(H−1A⊤(AH−1A⊤)−1AH−1−H−1)B
将这种算法封装在声明层中能够使算法运行到收敛,而不是固定其迭代次数,并且无需展开算法步骤并维护计算图,从而节省了大量的运算量。
-
BPnP优化: 已知匹配概率矩阵P,优化目标函数得到局部最优位姿(R,t)
目标函数:
f(P,r,t)=i=1∑mj=1∑nPij(1−fi⊤∥Rrpj+t∥Rrpj+t)
优化算法:pytorch自带的 L-BFGS 算法,关于这个算法,这个博客讲的很清楚。
由于目标函数是二阶可微的,所以可以用如下的方式求解r和t 关于P的导数,而不是通过L-BFGS迭代计算其反向传播:给定了(r*,t *),可以通过如下公式(论文中引理1)求r和t 关于P的导数Dr⋆(P) and Dt⋆(P):
若:H=DYY2f(x,y(x))∈Rm×m;B=DXY2f(x,y(x))∈Rm×m;y(x)∈arguminf(x,u)则:Dy(x)=−H−1B
单步求解只需要求解(局部)最优解用于计算梯度即可,尽管可以获得梯度的解析解,但它相当难计算。
作为替代,论文使用自动微分来计算必要的雅可比矩阵和黑森矩阵。
注意这里自动微分应用于规范目标函数,而不是用于优化目标函数的算法步骤,与深度学习中的标准用法不同。
对现有的可微PnP求解器(DSAC,DLT等),对应关系集合太大了,对于m = n = 1000,99.9%的对应关系是异常值。
-
声明层集成RANSAC
根据概率匹配矩阵P选择前K个匹配关系,这里k=1.5min{m,n},用RANSAC选择内点,然后使用EPnP优化位姿调整。EPnP: 《EPnP: An accurate O(n) solution to thePnP problem》
由于声明层中的最终处理节点优化了二次可微分的目标函数,因此任何中间不可微的计算与梯度计算无关。
RANSAC不可微,且没有显式解,不可能使用诸如显式或自动微分之类的标准技术来获得梯度。
-
损失函数:
衡量匹配矩阵的损失项:Lc=i∑mj∑nPij(1−2[∠(fi,Rgtpj+tgt)⩽θ])衡量位姿预测的损失项目:Lp=Lr+LtLr=∠(R,Rgt)=arccos21(traceRgt⊤R−1)Lt=∥t−tgt∥2
总的损失函数:L=Lc+γpLp
训练时先使用L_c进行训练120epoch,然后用总损失训练。先学习好对应关系预测,可以有效减少搜索空间。
-
实验结果:SOTA
仿真数据集:
真实数据集:
速度:0.12s