RAFT-3D
Teed 2021 · 论文
一句话总结 — 将RAFT从2D光流扩展到3D场景流,通过迭代细化一个逐像素刚体运动的稠密场来实现,并配备学习到的刚体运动嵌入以及一个强制几何一致性的可微Dense-SE3优化层。
问题
场景流——给定一对立体或RGB-D视频帧,估计逐像素的3D运动——是机器人将相机自运动与独立运动物体分离所需要的信息。真实场景在很大程度上是若干刚性运动物体的集合,因此其3D运动场在意义下是分段常数的,但早期方法要么预测无约束的逐点平移(例如FlowNet3D),要么通过物体检测/实例分割网络来利用刚性——这需要实例级监督,无法处理未知物体,并在流水线中引入不可微组件。RAFT-3D探究的问题是:如何在不使用任何物体实例标签的情况下,将刚性先验融入到RAFT式的稠密架构中。
方法与架构
输入:两对RGB-D帧、(深度来自现成的立体网络GA-Net,针对立体输入);输出:一个稠密变换场。使用一个增广的针孔投影,将3D点映射为像素坐标加逆深度,该场可诱导出对应关系
其中的前两个分量为光流,第三个分量为逆深度变化量。
- RAFT机制:一个共享特征编码器(1/8分辨率下的128维特征)输入到一个4D全对相关性体中,该相关性体被池化为一个4级金字塔,并通过双线性采样在当前对应关系周围进行索引。上下文编码器升级为一个预训练的ResNet50——将像素分组为刚体所需要的语义信息和感受野,比2D光流所需要的更多。
- 更新算子:一个ConvGRU输入诱导出的光流场、扭量场、一个深度残差(将逆深度反投影后与第2帧在对应点处的深度图相比较)以及相关性特征。从其隐状态中,它预测刚体运动嵌入、修正图(对诱导光流和第2帧逆深度的修正)以及置信度图。
- Dense-SE3层:嵌入通过如下亲和度将像素软性地分组为刚体,
每个像素的变换通过在加权重投影目标函数上执行一步高斯-牛顿更新来更新,
也就是说,每个像素都在寻找一个能够解释其邻居的运动——但只有嵌入相似的邻居对才会产生贡献。因为每一项只涉及一个,这个庞大的系统(在FlyingThings3D分辨率下有2亿个方程)分解为个独立的、原地在CUDA中构造的6变量问题;12次GRU迭代对应12次高斯-牛顿更新。
- 辅助层:一个可微的双拉普拉斯优化层(稀疏Cholesky分解)利用GRU预测的边权重,在运动边界内部对嵌入进行平滑;SE3上采样将映射到李代数,在其中进行凸上采样,再通过指数映射映射回来。
- 监督:仅对诱导出的光流/逆深度变化进行监督,,——刚体运动嵌入是通过对Dense-SE3求导隐式学到的(反向传播在切空间中通过LieTorch库实现)。全程没有任何框或掩码监督。
实验结果
- FlyingThings3D(在FlowNet3D划分上的双视图评估):将已发布的最佳3D精度()从34.3%提升到83.7%。同时也大幅优于扩展到3D的RAFT基线(反投影2D光流、光流+深度变化、直接3D光流预测),并且——由于它将场景分解为刚性组件——甚至能够估计被遮挡区域的运动。刚性分割在没有对嵌入进行监督的情况下自发涌现。
- KITTI场景流排行榜:误差为5.77,优于已发布最佳方法DRISP(6.31),后者结合了PSMNet、PWC-Net以及在Cityscapes上预训练的带实例监督的Mask-RCNN——而RAFT-3D仅在FlyingThings3D+KITTI上训练,不使用任何实例标签。
- 消融实验:精度在约16次更新迭代之前持续提升;Dense-SE3邻域半径为256时优于更小半径和全图范围两种设置;逆深度修正提升了3D指标;双拉普拉斯层将1像素精度从85.8提升到86.3,3D精度从87.1提升到87.8。
- 可训练参数4500万个(其中ResNet50上下文骨干网络占4000万);在540x960图像上推理占用1.6GB GPU内存(GTX 1080Ti,16次更新)。
对SLAM的意义
动态环境是SLAM的核心失效模式之一:运动物体违反了自运动估计所依赖的静态世界假设。RAFT-3D的逐像素刚体运动场恰好提供了分割动态物体并将其运动与相机运动分开估计所需的表示——这正是动态SLAM系统(VDO-SLAM、DynaSLAM II)用基于检测器的流水线所攻克的同一个问题,而这里无需实例监督即可解决。它将学习式迭代细化与嵌入式可微几何优化层相结合,处于从RAFT到同一批作者提出的DROID-SLAM的直接谱系之上。
相关条目
- RAFT — 2D光流基础方法
- FlowNet3D — 更早的、不含刚性先验的点云场景流方法
- DROID-SLAM — 同一批作者;在完整SLAM系统中使用稠密BA层
- VDO-SLAM — 跟踪物体运动的动态SLAM系统