打算以后每天看一篇论文并做记录,现在处于菜鸟水平,希望半个月后的自己可以根据自己看的论文写一个小的 无监督单目视觉测量深度/姿态 的一个综述
code地址
自己绘制的本文的模型框架
摘要
本文的创新点在于
- 在整个场景中使用 3D geometry,并且在视频连续帧之间 点云于ego-motion进行强制一致性约束;
- 使用validity masks 避免对无效区域的引入(文中指的是,重构图像与原图因为相机移动 漏掉或者多出的部分);
- 本文指出,因为此方法具有强大的鲁棒性,因此在手持未校准不稳定的普通相机拍摄的视频中也可使用,使得可使用数据及扩大。
本文使用KITTI数据集和手持相机相机数据集进行了评测,结果优于此前的所测量 深度和ego-motion的方法
1. 介绍
此部分写了
- 深度信息和ego-motion 对于robot和自动驾驶领域 等的重要性;
- 无监督方法的重要性:深度GT难以和camera信息对齐;
- 展开说了创新点,同上。
2.相关工作
此前 深度和ego-motion估计的技术包括:
- 立体和特征匹配技术(stereo and feature matching techniques );
- 从深度传感器获取监督信息学习深度,后续也是使用fully-convolutional architectures such as FCN [19] or U-Net 将depth estima- tion as a dense prediction problem;
- 校准的立体摄像机对:使用立体图像对的彼此重构,利用立体图像本身已知的摄像头间旋转矩阵;
- 在训练的时候使用立体图像对,利用视差匹配问题进行深度估计;
等其他相关方法不在此一一列出。
3. 方法
这里它主要说了自己的新提出的3D损失函数的优点:3D损失考虑整个场景及其几何图形
3.1 Problem Geometry
主要写了几何原理:输入 t,t-1 时刻的图片得到其深度图Dt-1 、Dt和ego-motion转换矩阵T,通过深度图到点云转换计算得到t-1时刻图像点云后利用ego-motion转换矩阵T得到t时刻的点云,通过点云转换到图像 ,最终得到t时刻的图像,将t时刻的预测图像与实际图像进行比较进行损失约束,使用同样的办法重构另外一张图片(以下损失计算同样需要重复,下面省略说明)。此部分的计算公式如下:
这里重构图像像素值得获得是通过:
现在还不明白什么意思,和双线性差的区别,以后再看看
3.2 Principled Masks
因为相机移动,相邻帧图像可能出现一些像素点移除图像边界,可以使用validity masks 来解决这一问题:对每个帧图像对Xt−1, Xt,得到一个mask对 Mt−1, Mt,它指示了Xt−1,和Xt都有效的区域。
自己还没搞清楚这个mask怎么来的,自己的猜测是网络mask分支生成的,稳重这样写的
3.3 Image Reconstruction Loss图像重构损失
使用重构图与原图践行光度一致性损失计算
因为重构图片是近似图片,它对照明、阴影、半透明或反射等情况的变化较为敏感,因此这部分损失是有噪声并且会产生伪像?(artifacts)为了减少artifacts,就要给他正则化,但这反过来又会导致leads to
smoothed out predictions ?这句没看懂(同学解释:相邻像素点之间的预测值过渡比较平滑)
3.4 A 3D Point Cloud Alignment Loss 3D点云对齐损失
此部分主要是说使用重构的点云和原点云图进行直接比较,此部分3D损失使用ICP来进行计算转换矩阵T´,同时可以得到残差表示使用转换矩阵T´修正后的图像间距离
使用计算出的T´作为 ego-motion Tt的损失的负梯度,
ICP是计算一个转换矩阵,这个转换矩阵可以使得两个点云图之间相应点对距离最小,他的主要方法是找到一个转换矩阵,使得两个图像间对应点距离最小,再根据计算的相应点之间的距离修正转换矩阵,再重新找到对应点对,再计算转换矩阵,以此进行迭代。最后输出转换矩阵T和平移t
在使用T´ 校正结束后使用moving the points in the direction rt would decrease the loss,使用 rt 作为深度Dt 的负梯度的 近似。
最后,完整的3D损失如下:
I是单位矩阵
3.5 基于图像的额外损失
使用结构一致性损失SSIM,方差 σ和均值µ 是使用simple (fixed) pooling计算得到,c1= 0.01^2
and c2= 0.03^2,考虑到ssim是越大越好,因此使用这个式子:
使用深度平滑损失考虑相应输入图片的梯度:
通过考虑图像的梯度,该损失函数允许在图像中有急剧变化的像素坐标处,有深度的急剧变化
没理解
3.6 学习设置Learning Setup
- 在4个不同的图像尺度s下,把图像输入网络计算损失函数,尺度由原图到1/8原图大小
- α, β, γ, ω 是超参数被设置为 α =0.85, β = 0.1, γ = 0.05, ω = 0.15
- 使用SFMLearner 架构(是基于DispNet)
- 神经网络由两部分组成,depth tower接收单图输入,分辨率为 128 × 416输出dense depth estimate mapping each pixel of the input to a depth value,ego-motion tower的输入为一堆视频帧,输出ego-motion estimate,
- 训练的时候,深度估计部分送入图片,ego-motion部分送入视频,并使用3-frame training sequences进行计算,输出6个数字,表示了两个相邻帧对应的相对 3D rotation and translation,
- 使用TensorFlow, Adam optimizer 的参数设置为β1= 0.9, β2= 0.999,
α = 0.0002 - 训练20 epochs
4 实验结果
4.1 数据集
- 在KITTI数据集上进行了训练以及测试,本文使用单目视频进行了训练,并使用数据及中的点云和车辆姿势进行了训练模型的评估
KITTI数据集上有完整的数据源,包括stereo video, 3D point clouds from LIDAR, 车辆轨迹等。
- Uncalibrated Bike Video Dataset是在骑自行车的时候使用手持的iphone相机进行拍摄的,帧率是30fps,分辨率是720×1280,训练集为了与KITTI匹配选择了5fps,使用 91,866 frames from the videos,没有排除任何特定部分,查询了相机的信息构建了相机的内参矩阵
4.2 深度估计的评估
下图是与其他无监督方法进行比较
下图是定量比较(包括一些有监督)Eigen [6] test set
模型在Cityscapes数据集进行预处理,在KITTI进行微调,absolute relative depth prediction error(Abs Rel 降低)
4.3 3D损失的评估Evaluation of the 3D Loss
有3D损失和没有3D损失训练出来的模型,出来的结果区别:有3D损失的模型reduce artifacts in low-texture regions of the image
由下明显可以看出,有ICP误差的结果好很多
4.4Ego-Motion的评价
depth and ego-motion are learned jointly and their accuracy is inter-dependent
4.5. Learning from Bike Videos
使用自行车手持相机视频进行训练,KITTI数据集进行测试,效果接近最好的无监督
4.6 Ablation Experiments消融实验
用来验证实验中每个组件的重要性
待补充:代码部分—tensorflow的,看不懂,先扔着吧