
我第一次对“单目深度估计”这个方向产生系统性补课的冲动是在一次拿单张街景图做3D重建的尝试里。模型输出了很漂亮的深度图缩略图里结构清楚、边缘规整可一旦把重建出的网格放大到侧面视角墙面就像被风吹过的幕布一样扭曲。那个时候我才意识到单目深度估计不是“把深度图输出出来”那么简单。它在数学上本就有无数个解网络只是从这无数个解里挑了一个看起来合理的。也就是从那个项目开始我把《Deep Learning-Based Monocular Depth Estimation Methods—A State-of-the-Art Review》这篇综述认真读了一遍而且读的节奏非常慢——不是因为难而是因为每读一段都能对应上我自己踩过的坑。这篇综述的价值不在于帮你把单目深度估计的论文都读完而在于给你画一张坐标轴这个问题为什么难、方法按什么逻辑分家族、每个家族各自解决了什么又留下了什么、评测表格里的数字到底该信几分。对于刚开始接触3D视觉、自动驾驶感知或三维重建的读者来说这类综述是比散装论文高效得多的入口。下面这篇分享不是逐字复述综述的读书笔记我更想把它写成一份“我读完它之后留下的认知骨架”先讲清楚问题为什么难再梳理主流方法是怎么一路演化过来的最后聊聊数据集、评价指标以及那些综述里没细说但实际很重要的细节。1. 为什么我会停下来系统读一篇综述从一只“看起来合理”的深度图说起1.1 单目深度估计最迷惑人的地方在于“看得懂却做不对”我一开始和很多入门者一样觉得单目深度估计不就是给一张RGB图让网络回归一张深度图吗输入输出都很清晰网络结构也无非是编码器加解码器。可一旦实际做出结果问题就来了深度的大致层次是对的近处更亮、远处更暗但局部的几何关系却是错的。比如一个书桌角深度预测把桌面和前面的一把椅子连成了一片又比如一面白墙明明是平面预测出的深度却在墙上拱出了波浪。这并不是工程实现得不好而是任务本身的性质决定的。单目深度估计是一个典型的病态逆问题一张2D图像本身不携带足够的3D信息同一个像素位置可以对应三维空间里一条直线上的无数个点。人类能看出一张照片里的远近关系靠的是大量视觉先验——大小、遮挡、阴影、消失点、纹理梯度。神经网络做单目深度估计本质上就是在数据中学这些先验而不是在“测量”深度。所以模型输出的深度图看起来“合理”是因为它拟合了训练集里常见的场景分布一旦遇到分布之外的物体组合或视角它就会毫不犹豫地编造一个三维结构。1.2 我给自己定的三个阅读目标读这篇综述之前我先把目的写在了笔记本上防止自己又在摘要和结论之间滑水第一把“问题为什么难”拆成可以讨论的子问题而不是停留在一个模糊的“病态”概念上。第二搞清楚主流方法到底分成哪几个技术家族每个家族之间是什么继承和竞争关系。第三建立一套自己的“评测方法学”拿到一篇新论文时如何快速判断它的涨点到底可不可信。这三个目标决定了我不需要把综述的每个章节都精读一遍而是可以跳着读先啃问题定义再啃方法分类然后直接翻到数据集和实验对比部分最后仔细研究它的开放问题章节。事实证明这个策略效率很高后续我所有关于深度估计的新论文阅读几乎都是在这套框架里往里填空。2. 综述反复强调的三个难点绝对尺度、多解性与真值获取2.1 从二维观测到三维结构单目模型缺了哪一根轴综述开头几乎都会回到成像过程。针孔相机模型里三维空间中的点通过光心投影到像平面上形成二维像素坐标。这个过程把三维坐标压缩成了二维深度信息丢失了。双目或多目相机可以通过视差三角测量恢复深度因为有几何上的基线约束而单目输入只有一张图没有第二个视角也就没有直接的几何约束可以依赖。这也是单目深度估计和双目深度估计最本质的区别双目问题里有“测量误差”和“匹配误差”但单目问题里连“尺度的唯一解”都不存在。同一张图可以是一个近距离的小玩具也可以是一个远距离的大楼只要放在同一投影方向上图像就是一样的。网络必须通过上下文推断出“绝对尺度”但这只能依赖统计先验比如某个常见物体在图像里占了多少像素、透视纹理的收缩速度等。理解了这一点就很容易理解为什么很多单目方法会用对数值而不是线性值来监督深度深度在近处变化剧烈、在远处变化平缓用对数域可以让网络把预测力量分摊到不同距离上。同时也能理解为什么尺度不变损失在早期会被反复使用——因为不同场景的绝对尺度不一致干脆先容忍整体缩放误差把精力放在相对深度的准确性上。2.2 深度真值从来都不“干净”这是全局评测最大的暗礁综述不会绕开训练数据的问题因为它直接决定了监督学习的天花板。深度真值的来源主要有四条路线每一条都带病激光雷达扫描投影到图像稀疏、边缘有遮挡空洞、远处的点极其稀疏而且多帧拼接还可能存在运动畸变。消费级深度相机或者结构光设备室内效果好但受光照影响大、对透明和反光物体基本失效测量距离也有限。多视几何通过SfM/MVS重建没有绝对尺度重建出的点是稀疏的而且无纹理区域会大面积缺失。合成场景渲染深度足够干净但渲染域和真实域之间存在明显的分布差距需要域适应或混合训练。这意味着即使是一个标注严谨的深度数据集也不过是“某个传感器在某个时刻捕捉到的、经过投影和插值处理后的近似深度”。模型在拟合真值的同时其实也在拟合传感器的噪声模式。读这篇综述让我真正意识到一个问题评测报告中那一串漂亮的RMSE可能有一部分是“模型学会了传感器扫描的深度”而不是“模型学会了物理上的真实深度”。3. 综述的技术路线骨架从监督回归到自监督阵营再到生成式时代3.1 监督学习方法族从多尺度回归到有序分类综述把监督学习方法放在最前面我觉得这个安排很合理因为自监督方法里很多模块都是从监督方法继承下来的。早期工作可以概括为“设计一个编码器-解码器网络把RGB映射到深度”但很快研究者发现建好这张地图没那么简单。最典型的问题是网络既要把握全局场景结构又要保留局部细节。针对这个问题早年有几类代表性尝试。第一种是多尺度网络用不同分支或不同分辨率分别预测粗糙的全局结构和精细的局部结构再把它们融合。第二种是离散化分类思路把连续的深度值切分成一个个有间隔的区间把回归问题变成有序分类问题。这里有个非常关键的设计区间不是等宽的而是随着深度变大逐渐变宽。原因在于深度误差在近处更敏感近处需要更细的划分远处则可以粗糙一点。这个“递增间隔的离散化”思路是监督学习阶段一个很实用的方法论。再到后来有两条路线让我觉得比较有代表性。一条是局部平面引导网络不再直接输出每个像素的深度而是输出每个像素邻域的一个平面拟合参数用“小块平面拼成大场景”的方式获得更规整的几何输出。另一条是更灵活的跨尺度特征融合把不同分辨率的解码特征用注意力或密集连接组合起来避免低分辨率特征丢失细节、高分辨率特征缺乏上下文的问题。为什么监督学习到今天仍是精度的基准因为深度的绝对尺度信号明确地从真值传到了网络里。只要数据质量够高、场景分布匹配监督学习的指标通常还是最稳的。它的瓶颈也肉眼可见真值获取太贵、领域迁移差、在无标注的大规模数据上使不上劲。3.2 自监督的核心逻辑不需要真值但需要“视角合成”当老师综述里最让我有“原来如此”感的部分是对自监督深度估计的分析。自监督方法不直接使用深度真值而是利用同一个场景在不同视角下的图像一致性来训练。它的基本逻辑是这样的如果网络预测了一个深度图又知道了相机从一个视角运动到另一个视角的姿态那么我们可以把相邻视角的图像反投影出来重建出当前视角的图像。如果预测的深度和姿态是对的重建出来的图像应该和真实拍摄的图像高度一致如果不一致就对深度网络和姿态网络同时产生梯度。这个逻辑下有两个典型的子分支。一个分支是双目自监督同时输入左右视图利用已知基线的双目几何约束解决绝对尺度的问题。另一个分支是单目视频自监督不需要双目相机只依赖单目视频序列和一个姿态估计网络。后者更自由但问题也更明显视频中动态物体和遮挡区域的像素不满足几何一致性假设网络很容易把移动的汽车或行人当成立体畸变去拟合。成熟的自监督方案会针对这些问题做三件事一是用最小重投影损失在多个相邻帧之间选择光度误差最小的那个作为监督而不是死磕某一帧二是构造自动掩膜把那些在相邻帧之间变换不明显、可能是静态的或者被遮挡的像素剔除出损失计算三是在边缘感知的平滑约束上做文章让深度图在图像边缘处允许跳变而在平坦区域保持平滑。这套组合拳基本已经成了自监督深度估计的标配。自监督路线的意义往大里说是把训练数据从昂贵的深度标注解放到了海量的无标注视频上这让模型可以获得更广的场景覆盖。代价是绝对规模、动态物体、光照变化等问题仍然没有完全解决通透的玻璃、细长的栏杆、纯色的高反射表面依然是它的死穴。3.3 多任务协作与生成式模型最近几年新增的两条分支综述的后半段在讨论方法演进时我不太想用“结构创新”这类笼统的词更愿意把它拆成两条清晰的分支。第一条分支是任务间的协作。很多方法不再孤零零估计深度而是同时估计语义、法线、光流、边缘等。这些任务之间存在天然的几何与语义一致性一个像素如果属于“天空”或“玻璃”它的深度特征就应该和属于“地面”或“墙”的像素不同。共享编码器特征、在不同解码头之间传递信息让深度估计得以借用其它任务的归纳偏置。这几年一些代表性的工作把深度估计当作一个辅助任务挂在视觉大模型上本质上也是多任务协作思路的延伸。第二条分支是生成式方法的渗透。Vision Transformer等带全局感受野的骨干网络逐渐取代纯CNN解决了局部感受野不足的问题。更进一步的是一类“把深度估计当成条件生成”的做法用扩散模型对自然图像做大规模预训练然后从它的中间特征里训练出深度解码头。这类方法的泛化能力让人印象深刻一张没见过的自然图像也能直接得到可用的相对深度。它的代价是推理成本偏高而且输出的深度往往是相对深度做定量评测时还需要用真值做一次尺度对齐。读到这里我把综述里的方法家族总结成一个逻辑每个新方法都在试图突破“没有绝对尺度的病态问题、缺乏真值的数据瓶颈、泛化性不足的域差距”这三座大山的某一个侧面。没有哪个方法能同时解决三个问题。4. 读实验章节之前先配好数据集和评价指标这对“眼镜”4.1 常用数据集各有“性格”不能只看名字综述里几乎所有的定量对比都会落到几个公开数据集上。读实验对比的那几页之前我做了不少背景功课因为只看表格不看数据集性格很容易被数字误导。自动驾驶室外数据集是单目深度估计最常用的评测场优点是场景贴近行车应用深度范围大有激光雷达真值缺点是深度稀疏、远处像素几乎没有有效值、动态车辆和行人的深度边缘不干净。评测时通常还要遵循一个固定的裁剪约定剪掉图像边缘那些激光雷达扫描不到的无效区域这个裁剪比例直接影响了最终指标所以我后来看论文时会把“是否说明了裁剪方式”列为可信度的第一道门槛。室内数据集则来自深度相机采集深度图密度比激光雷达投影高很多但覆盖的场景类型比较集中基本就是卧室、客厅、厨房这些限定类目训练集和测试集之间的种类重叠也相对明显。相比之下无标注的大规模视频集是自监督方法更喜欢的原料但它只能提供图像对之间的几何一致性监督没有绝对尺度信号不能用于标准的监督评测。合成数据集虽然干净、可控但评测时需要一个重要的常识如果在合成数据上训练又直接在真实数据上测指标会明显缩水所以很多方法会用混合训练或微调来缓解域差距。为了让自己以后看表格时不迷糊我综合综述和实验部分把常用数据集的特性整理成了一个小的参考表数据集类型代表场景真值来源主要用途主要限制自动驾驶室外道路、车辆、行人激光雷达投影监督训练、自监督视频训练真值稀疏、远处缺失、边缘脏室内RGB-D卧室、客厅、厨房消费级深度相机监督训练、室内评测场景类目有限、光照敏感大规模无标注视频城市、街景、驾驶无自监督预训练无绝对尺度、动态物体多合成场景任意可控室内外渲染深度预训练、域适应研究域差距明显、泛化受限4.2 评价指标别只盯着一两个数字综述里评价指标部分的篇幅不长但我觉得它值得反复读因为这些指标决定了所有方法的对错。常用的误差类指标有几个绝对相对误差Abs Rel平方相对误差Sq Rel均方根误差RMSE以及在log域计算的RMSE log。其中Abs Rel计算的是每个像素的误差除以真实深度后取平均这个指标对远处的误差相对宽容对近处的误差更敏感RMSE则受大误差像素的影响很大一个离群点就能把它拉高。准确率类指标里最常见的是δ1.25它的意思是“预测深度与真实深度的比值落在1/1.25到1.25之间的像素比例”。这个指标直观好理解只要预测深度在真值的25%以内就算对比例越高说明整体贴近程度越好。通常还会扩展到1.25²和1.25³三个阈值一起看用来判断误差分布的形状。读论文表格时我现在的习惯是同时看误差类和准确率类指标而不是只盯某一项。有些方法专门压低Abs Rel但RMSE却很高说明它把误差均匀分摊了个别大误差依然存在。反过来有的方法RMSE很低Abs Rel却不突出说明它可能把近处的细节牺牲了整体平均值好看但近景不够可靠。指标之间本来就有互补性单独看任何一个都容易得出偏颇的结论。另外还有两个容易被忽略的细节。一是深度真值通常在评测前会做一次对应操作激光雷达投影得到的稀疏深度点需要插值或邻域聚合才能和预测的稠密深度图对齐。二是评测时要不要在log域计算、要不要对深度做尺度对齐这些条件不同结果可能差百分之几十。所以我后来再看到一篇论文说自己“领先了x%”第一反应不是信而是先回头翻它的评测条件。5. 综述的展望与我的批判性笔记5.1 综述点名的几个未来方向综述在结尾部分照例会列出开放问题。单目深度估计这边的名单比较固定但也有一些新加入的面孔。泛化性肯定排在第一位。大多数模型在训练数据集上表现尚可但换一个城市、换一种道路结构、换一类相机内参性能就会明显下滑。自监督的出现部分缓解了这个问题因为它可以用海量无标注数据梯次训练但域差距的根源依然存在尤其是真值监督训练出来的模型对传感器特征极其敏感。动态世界与遮挡问题排在第二。现实场景里没有哪个瞬间是完全静态的移动的人、车、树枝、窗帘都在破坏几何一致性假设。自监督方法用掩膜暂时绕过了它们但绕过的代价是把这部分像素的监督信号直接丢弃模型在运动物体上的深度质量始终不令人满意。与基础模型和生成模型结合的路线也在展望名单里。深度估计正在从单独训练的小模型变成通用视觉模型中可以被插拔的一个能力模块。这个方向听起来漂亮但如何把相对深度转成可靠绝对尺度如何在保持泛化的同时不丢几何精度都还远没有定论。5.2 综述留白但我觉得很要命的三件事读完展望之后我又把综述翻了几遍总觉得有三个问题被它一笔带过了但它们在实际使用中往往比方法论更影响表现。第一件事是深度真值的“系统性偏差”被低估了。前面说过激光雷达投影得到的“真实深度”本质上是传感器扫描到的一次观测不是场景真正的几何。不同数据集的真值之间可能存在系统性偏差比如车辆运动导致的点云畸变、激光束与物体边缘的混合反射。模型在训练时把这些偏差也学进去了所以评测高分不等于几何正确可能只是和传感器打了招呼。第二件事是评测指标对困难区域的敏感性不足。常见的Abs Rel和RMSE在整个图像上做平均那些小而关键的物体远处的行人、路缘石、交通锥贡献的误差占比极低可它们恰恰是自动驾驶里最容易出事的目标。综述里几乎没有讨论边界区域、透明物体、镜面表面的专项评测这也是我后来做实验时会额外补测的部分。第三件事是“深度估计精度”和“3D重建可用性”之间不是直接画等号。深度图很精准不代表把它转成点云或网格后就能直接用于SLAM、机器人抓取或渲染。下游任务需要的是边缘保真、尺度连续、时间稳定这些要求并不完全体现在单帧深度图的指标里。综述里极少提到深度估计与下游任务的闭环反馈这几乎是全领域都欠缺的环节。6. 回到综述阅读方法本身三步读综述的实际流程6.1 先读框架和图表再决定精读哪些小节我读这类综述的效率比读普通论文高是因为我给自己定了一套流程。第一步不是从摘要往下读而是翻目录、翻图表、看参考文献的分类目的只有一个把综述作者画的方法分类树复刻到自己的笔记里。我会先画一个粗糙的树结构主干是“网络结构”、“训练范式”、“损失函数”、“数据策略”然后在每个分支下面填上综述里提到的具体工作。有了这个框架再决定哪些小节要精读、哪些小节可以扫读。比如我自己当前正在做自监督相关的实验那么“光度一致性”和“遮挡掩膜”部分就值得精读而纯监督的某些网络变体只需要知道它解决什么问题、有什么启发即可。综述的好处是每一段都自带上下文能让我快速判断它和我的目标之间有没有关系。6.2 顺着“方法家族”找到每一篇引文的入口综述本质上是一张地图参考文献列表就是地图上的城市列表。如果所有文献都从第一篇开始读大概率会迷失。我的筛选原则很简单优先读那些被综述在多个章节反复提到的文献它们通常是这个领域公认的节点其次读与自己任务域相近的文献比如我正在做自动驾驶场景就会优先看室外数据集上的工作最后我会把图表中出现的对比方法全部拉一个名单因为这说明它们在评测上被当作标准参考。用这张被筛选过的清单去替代“看到标题就下载”的随机浏览能帮我节省大概一半的时间。而且我每读完一篇被综述引用过的论文都会回到综述的分类树里把它放到对应位置看看综述那一段对它的评价是否和我自己的判断一致。这种“原论文-综述评述-我的判断”的三方对照经常比直接读论文更有收获。6.3 用综述的“问题清单”反查自己的实验设计综述最后部分的开放问题不只是用来展望的拿来反向检查自己的实验设计非常有效。我读完综述后回看自己那个街景重建项目按照综述提的“评测条件、指标选择、真值依赖”三条线自查了一遍立刻就发现我当时至少犯了两个错误一是把不同裁剪方式下报告的指标直接拿来横向比较二是只看RMSE单一指标忽略了边界区域的灾难性误差。如果你也打算把综述的框架用在研究里我建议做三件事第一在做任何对比实验之前先固定数据集的裁剪方式和插值策略并在论文里写清楚这是别人复现你实验时最容易踩的坑第二设置指标时同时报告误差类和准确率类至少各选一个有必要的话单独在边界区域和高深度区域各测一次第三明确标出你的方法是监督、自监督还是混合训练因为不同的监督信号意味着绝对尺度的可信度不同这些信息在对比时比模型结构更重要。这套从综述里学来的“问题清单”后来几乎成了我看每一篇深度估计论文的固定起点。我会先看它的问题定义属于三座大山中的哪一座再看它选择了哪个方法家族再看它在哪个数据集上、用什么指标、做没做尺度对齐最后才谈得上评价它的优势。论文读到这里我那本笔记的首页多了一行字“单目深度估计不是估一个数而是要在无穷多个可能的3D解释里选择一个符合观测和先验的解释。”看起来像一句哲学总结但其实落到实验里非常具体它意味着评估一个模型不能只看它输出了什么还要看它怎么越过尺度模糊、怎么处理遮挡、在什么数据条件下可靠、又会在哪里毫不犹豫地编造几何。这篇综述正是把这些“落在实验里的具体”摆在了我面前。我后来再看到新的单目深度估计论文都会先问自己四句话它属于哪个方法家族它依赖哪种监督信号它在哪个数据集和评测条件下报告成绩它有没有真正解决一个我项目里也在头疼的问题把这个问题清单变成习惯之后读论文的效率和质量都和以前不一样了。