ManyDepth是什么?5分钟看懂自监督多帧单目深度估计的原理与三大创新

【免费下载链接】manydepth [CVPR 2021] Self-supervised depth estimation from short sequences 【免费下载链接】manydepth 项目地址: https://gitcode.com/gh_mirrors/ma/manydepth

ManyDepth 是一个基于 CVPR 2021 论文《The Temporal Opportunist》的开源项目,专注解决自监督多帧单目深度估计问题。它的核心卖点非常清晰:训练时只需要普通单目视频,不需要任何深度标注和位姿真值;而在推理时,只要手头有连续的几帧短序列,它就能主动利用序列信息,输出比"只看单帧"更精细、更准确的深度图。本文带你用 5 分钟读懂它的工作原理、三大创新点,以及如何快速上手体验。

什么是ManyDepth:从单目视频自学深度的自监督方案

传统的深度估计需要大量带标注的深度图(如 LiDAR 点云转换的真值),成本极高。而 ManyDepth 走的是自监督深度估计路线:它把"预测深度 → 用预测结果重建相邻帧画面 → 对比重建图与原图差异"当作训练信号,模型只要在大量普通行车视频上训练,就能学会预测每张图的深度。

它属于多帧单目深度估计方法:在推理时输入当前帧 + 相邻帧的短序列(通常 2~5 帧),利用帧与帧之间的几何关系,得到比单帧方法更稳、更准的结果。同时它完全兼容单帧输入——没有序列可用时退化为单帧模式,非常灵活。

下图展示了 ManyDepth 的整体网络结构:先对目标帧和源帧做特征提取,再结合 PoseCNN 估计的位姿做特征扭曲,构建代价体积,最后通过编码器-解码器输出目标帧深度图:

ManyDepth自监督多帧单目深度估计网络架构图

核心原理:代价体积(Cost Volume)如何聚合多帧信息

很多人第一次接触"多帧深度估计"会好奇:多帧到底怎么用?答案就是 代价体积(Cost Volume)

简单来说:模型会假设目标帧中每个像素可能处于若干个候选深度平面(代码里默认 96 个深度 bin),然后用相邻帧的像素去"验证"每个假设——把相邻帧的特征按某个深度投影回当前帧,对比两者特征的差异(L1 距离)。差异最小的那个深度,就最有可能是真实深度。把所有候选深度的差异堆叠起来,就形成了一叠"代价体积"。

ManyDepth代价体积聚合多帧序列的原理示意图

然而,代价体积虽然经典,却很难直接用于自监督训练。这也是 ManyDepth 论文最核心的贡献:它让代价体积第一次能稳定地工作在自监督场景下,并为此提出了三大创新。

三大创新:ManyDepth 解决的关键难题

创新一:自适应代价体积,解决"尺度未知"难题

自监督训练没有深度真值,导致模型预测的深度存在未知尺度(无法确定场景整体是 5 米还是 50 米)。如果代价体积按固定深度范围构建,尺度一偏就全部失效。

ManyDepth 的做法是:在训练过程中用一个单目网络(teacher 网络)实时估算当前场景的深度范围,动态更新代价体积的深度 bin。对应的实现位于 resnet_encoder.pyResnetEncoderMatching 类,adaptive_bins=True 即开启该机制;深度范围更新逻辑则在 trainer.pyupdate_adaptive_depth_bins 方法中。

创新二:运动物体与遮挡处理,拒绝"被误导"

多帧几何依赖"场景静止"假设,但真实行车视频里总有运动车辆、行人,它们会破坏帧间对应关系,把代价体积"带偏"。此外,遮挡区域的像素在多帧中根本不存在对应点。

ManyDepth 通过一个"一致性掩码"(consistency mask)区分可信与不可信的匹配区域:凡是代价体积与单目 teacher 预测差异过大的区域,就判定为不可信,交给单目分支兜底,避免多帧信息帮倒忙。相关实现见 trainer.pycompute_matching_maskcompute_confidence_mask(后者在 resnet_encoder.py 中)。

创新三:静态相机与序列起始帧的数据增强

训练数据里还存在两类"坑":一是相机静止(如等红灯),此时多帧几乎无差异,代价体积学不到东西;二是序列起始帧没有前一帧可用,网络必须学会"没有多帧也能工作"。

ManyDepth 通过专门的数据增强应对:随机把参考帧替换成当前帧(模拟静止相机)、随机把位姿置零(模拟缺失参考帧)。这些增强逻辑位于 trainer.pyprocess_batch 方法中,配合"一致性损失"(consistency loss)让多帧分支与单帧 teacher 互相约束、各司其职。

效果如何:多帧深度估计的优势一目了然

通过这三大创新,ManyDepth 在 KITTI、Cityscapes 等数据集上达到了当时自监督单目深度估计的最先进水平,且推理时只需一次前向传播,无需任何测试时优化。

ManyDepth与Monodepth2单目深度估计效果对比图

上图对比了 ManyDepth 与单帧方法 Monodepth2 的输出与误差图:可以看到,输入同样的短序列时,ManyDepth 的深度图更干净,误差图上的高误差区域明显更少。官方在 KITTI 上的量化结果如下表所示,多帧方法在主要误差指标(Abs Rel、RMSE 等)上全面领先:

ManyDepth自监督单目深度估计KITTI实验结果对比表

快速上手:5分钟跑通多帧深度估计

想立刻体验 ManyDepth?按照下面的步骤,几分钟就能在自己的图片上跑出深度图。

第一步:克隆仓库并准备环境

先获取项目源码:

git clone https://gitcode.com/gh_mirrors/ma/manydepth

项目基于 PyTorch,环境依赖已整理在 environment.yml 中,可用 Conda 一键创建:

conda env create -f environment.yml
conda activate manydepth

第二步:下载预训练权重

从 README 中给出的链接下载 KITTI 或 Cityscapes 预训练权重,解压后得到包含 encoder.pthdepth.pthpose_encoder.pthpose.pth 的权重文件夹。

第三步:运行多帧推理示例

项目自带了测试图片(assets/test_sequence_target.jpgassets/test_sequence_source.jpg),以及相机内参文件 assets/test_sequence_intrinsics.json。运行:

python -m manydepth.test_simple \
    --target_image_path assets/test_sequence_target.jpg \
    --source_image_path assets/test_sequence_source.jpg \
    --intrinsics_json_path assets/test_sequence_intrinsics.json \
    --model_path path/to/weights

预测的深度图会自动保存为 jpeg 和 npy 文件。这套多帧推理流程的完整代码在 test_simple.py 中,非常适合作为二次开发的起点。

项目结构速览:代码如何组织

想深入源码学习的同学,可以按下面的路径快速定位关键模块:

模块 文件 作用
多帧编码器 networks/resnet_encoder.py 特征提取 + 代价体积构建(ResnetEncoderMatching
深度解码器 networks/depth_decoder.py 由多尺度特征解码出深度图
位姿估计 networks/pose_cnn.py 估计帧间相对位姿
训练主逻辑 trainer.py 损失计算、自适应深度 bin、数据增强
参数配置 options.py 训练与推理的全部命令行参数
数据集 datasets/kitti_dataset.py KITTI 数据加载与预处理

总结

ManyDepth 的价值在于:它证明了多帧信息在自监督单目深度估计中同样能发挥威力——通过自适应代价体积、运动物体处理和针对性数据增强三大创新,让"短序列"成为提升深度精度的免费午餐。无论是想了解自监督深度估计的原理,还是想在自动驾驶、视觉 SLAM 等场景落地多帧深度方案,它都是不可多得的参考实现。😊

【免费下载链接】manydepth [CVPR 2021] Self-supervised depth estimation from short sequences 【免费下载链接】manydepth 项目地址: https://gitcode.com/gh_mirrors/ma/manydepth

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐