提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
说在前面:本人是个菜鸡,纯菜鸡,以下我的理解绝对会有错误,欢迎指正共同进步!
文章题目:Learning Generalized Visual Odometry Using Position-Aware Optical Flow and Geometric Bundle Adjustment
文章链接:论文
代码链接:代码
本人认为这篇文章主要是玩光流,出位姿用的是传统的几何优化算法,为了辅助网络的训练,创新点还是有很多的,有很多可以借鉴的地方,是一篇非常之牛的论文,必读之。
一、方法
这个网络还是很好理解的:
1.深度网络由当前帧出逆深度
2.光流网络(PANet),由当前帧和上一帧出光流,反向堆叠出反向光流
3.光流和逆深度传入到BA中,先对光流去噪,找出准确的匹配点(后面的优化算法只需少量精准的匹配点即可,太多没用,如果不精准反而增大计算误差),然后对匹配点用LM算法优化,得出位姿和深度
4.基于BA模块得出的位姿和深度,可以进行扭曲,然后算光度误差损失、平滑损失、深度啥啥啥的损失,用于网络训练
1.深度网络
深度网络具有跳跃连接和5尺度侧输出的编码器-解码器设计。编码器是去掉全连接层的ResNet18;
在每个尺度上,解码器由 2 个内核大小为 3 的卷积层和 1 个内核大小为 1 的卷积层组成
2.PANet
PANet与PWC-Net类似,由金字塔特征提取器和几个不同尺度的光流估计器。
PWC-Net提取特征后,与上一级光流串联再进行反卷积即可预测光流。
PANet分为三个部分:
1.特征图提取部分,六个阶段卷积卷积架构
2.计算概光流率体
先构造一个沿x和y轴的两个2-D网格Gx和Gy,表示局部区域的某个像素从帧 It 到帧 It’ 分别沿x和y方向所有可能的光流值,即偏移值,然后网络预测局部区域中每个光流的再Gx和Gy的概率。
其中k等于4,所以预测KK个概率矩阵,维数应该是[K,K,HW],其中K=2k+1,然后输入到PAM中。
K=2k+1的解释,比如沿x轴方向上,设k=1,
坐标为8的像素,他的下一阶段光流可能落在7、8、9上,
坐标为9的像素,他的下一阶段光流可能落在8、9、10上,
坐标为10的像素,他的下一阶段光流可能落在9、10、11上,
坐标为11的像素,他的下一阶段光流可能落在10、11、12上,
坐标为12的像素,他的下一阶段光流可能落在11、12、13上,
所以,共有三个像素可能落在坐标为10的像素上,分别为9、10、11,所以坐标为10的像素上共有3个概率,K=2*1+1,其中k=1。
3.PAM
首先按照预先定义的Gx和Gy,计算每个像素沿 x 轴和 y 轴的光流残差分量:
公式解释:第(i,j)处的光流,为OPV中的概率与G中的预定义的位置加权平均值,讲人话就是说对每个可能落在(i,j)处的概率与先验值的乘积,然后求和再除以总数。
然后残差分量与上一阶段的光流相加最终得到当前阶段的光流结果。
3.几何BA模块
1.三个阶段光流去噪
连续两帧图像,前后堆叠两种堆叠方式,输入到PANet中可分别得到前向光流和后向光流
第一阶段:光流一致性掩码Ma,由前向-后向一致性掩码和遮挡掩码组成,选择前20%的2D对应关系
第二阶段:去除离群像素,算出第一阶段中 3,000 个最佳对应关系的基本矩阵后,计算内点分数:
第三阶段:过滤具有最小射线角度或无效重投影的匹配,通过对应像素计算 3D 空间中两条射线之间的角度的余弦值,然后过滤掉余弦值小的区域
2.几何BA模块
优化两帧视图中的位姿T和深度d,目标函数为:
其中,优化变量为T和d,N为优化的点的个数,w为Huber损失计算得到的权重,ξ为几何距离误差,定义如下:
pi表示一个坐标,因此该式子表示坐标差值。
其中两个基础公式,表示用深度和位姿或者用光流经过变换得到新的坐标。
通常使用LM算法计算该目标函数:
针对LM算法,细说两点问题:
第一个问题,初始化,LM算法需要为T和λ取一个初值,如果T的初值误差较大会导致算法难以收敛,λ较小会导致算法取得局部最优解,所以先用PnP(一个中传统的用几何的方式计算位姿的方法,用三组2D-3D的对应点即可)算一个T的初值,λ用下式赋值,
第二个问题,雅可比矩阵由位姿雅可比矩阵和深度雅可比矩阵构成,在训练时,给深度雅可比矩阵一个小的权重,则精度提高,但是在测试阶段却导致误差变大,论文推测这种现象是由于深度和位姿雅可比矩阵取值范围不一致造成的。因此提高测试时的深度雅可比权重,训练阶段为0.1,测试阶段权重为1。
算法流程:
可以看出BA模块最终求出位姿和逆深度,这两个数据会在后面分阶段损失函数中使用到。
4.损失函数
1.光度误差损失
根据位姿可以和前一帧图像,可以合成一张当前帧的图像,然后最小化当前帧和合成图像的光度误差(一种重投影误差),深度和光流自监督损失:
其中W为权重,r表示一种度量差值,SSIM为结构相似度函数,α表示一种权重?
2.一种平滑损失
可能存在某些独立像素差别很大,可以看作为一种噪声,会导致损失计算不准确,因此,增加一个平滑项,损失为:
式中,V表示输入的类型,可能为深度或者光流,β是平滑梯度的阶数。
在多阶段训练过程中的损失函数是基于以上两种损失建立的。
5.多阶段训练
文中说明在训练时网络很难收敛,作者推测两种原因:
1.不同模块(Depth-Net 和 PANet)的随机初始化可能会导致网络收敛到同一目标函数(文中没有说明具体哪一个损失函数)时遇到困难;
2.在存在多个任务目标的情况下,很难通过自监督成本函数有效地训练复杂网络。
所以他把训练分为三个阶段:
第一阶段:光流的自监督训练,损失函数为:
其中,Mc为光流一致性掩码
第二阶段:固定光流网络参数,深度自监督训练
Ldc为几何一致性损失:
其中,N是Md的和,Md是一种深度的掩码,由为auto-mask, depth projection mask和inlier score Sr的乘积组成(这里不太懂), dt→t′ 由dt 扭曲得到。
光度归一化损失:这里加入这个损失我不理解,为什么训练深度网络要用到这个?可能是扭曲用到位姿,计算位姿的BA模块用到深度,深度需要网络,这个原因?
逐点深度损失:
为网络预测的逆深度与 BA 模块输出的逆深度之间的差异
第三阶段:固定深度网络,对PANet 进行微调
损失函数为第一阶段的光流损失和跨任务损失 Lcross
深度扭曲得到的坐标和光流得到的应该一致,Lcross用于最小化Pdepth(pt)和Pflow(pt)之间的差异。
二.实验
三.结论
还没看