ManyDepth评估指标全解读:abs_rel、RMSE、δ阈值到底怎么算?

📅 2026/8/18 18:38:29
ManyDepth评估指标全解读:abs_rel、RMSE、δ阈值到底怎么算?
ManyDepth评估指标全解读abs_rel、RMSE、δ阈值到底怎么算【免费下载链接】manydepth[CVPR 2021] Self-supervised depth estimation from short sequences项目地址: https://gitcode.com/gh_mirrors/ma/manydepthManyDepth 是 CVPR 2021 发表的自监督多帧单目深度估计模型The Temporal Opportunist它无需任何真值深度标注仅凭视频短序列就能在 KITTI 上取得当时最先进的效果。但很多新手在复现时第一道坎不是训练而是读懂评估指标abs_rel、sq_rel、RMSE、RMSE log、δ1.25 这些术语到底代表什么数值越小越好还是越大越好本文将用大白话逐条拆解 ManyDepth评估指标的数学定义、计算流程和实战避坑指南让你 5 分钟彻底看懂结果表。认识 ManyDepth会翻旧账的深度估计模型传统单目深度估计如 Monodepth2只从一张图预测深度ManyDepth 的创新在于它会在测试时利用连续的短序列帧比如前几帧画面来辅助当前帧的深度预测通过自适应代价体cost volume融合多帧信息同时解决了移动物体、静态相机等难题最终效果优于单帧方法如上图所示上方为输入画面下方两列分别是预测深度与误差热力图红色越少代表误差越小。它的工作流程也很直观提取前后帧特征 → 估计相机位姿 → 构造代价体 → 解码出深度图。评估环节则全部集中在manydepth/evaluate_depth.py这一个文件里下面的所有指标都能在这里找到源码。七大评估指标逐个拆解先懂公式再懂好坏ManyDepth 沿用了深度估计领域公认的7 个指标它们全部在evaluate_depth.py的compute_errors函数中计算。先说结论前 4 个abs_rel、sq_rel、rmse、rmse_log越小越好后 3 个a1、a2、a3越大越好且都介于 0~1 之间。abs_rel绝对相对误差最常用的体检报告abs_rel mean( |gt - pred| / gt )它计算每个像素上预测深度与真值深度的绝对差占真值深度的比例再取平均。举例某像素真值深度 10 米你预测了 11 米误差就是 1/10 0.1。abs_rel 对所有深度一视同仁相对比例因此是论文中最常被单独拎出来比较的核心指标。ManyDepth中分辨率在 KITTI 上达到 0.098意味着平均相对误差不到 10%。sq_rel平方相对误差给大误差加刑sq_rel mean( (gt - pred)² / gt )公式只是把 abs_rel 的分子换成了平方。由于平方放大作用预测偏差大的像素会被显著惩罚因此 sq_rel 对离谱的预测更敏感。它的数值没有 abs_rel 直观通常只作为参考当两个模型 abs_rel 接近时sq_rel 更小的一方往往预测更稳定。RMSE均方根误差惩罚远距离大偏差rmse sqrt( mean( (gt - pred)² ) )把每个像素误差平方后取平均再开根号。注意它没有除以真值深度所以单位是米数值通常远大于前两个指标KITTI 上约 4~5。RMSE 的妙处在于它既惩罚大误差又因为开根号而把量纲拉回米方便人类感知——误差 4.5 米意味着整体预测与真值平均差 4.5 米。RMSE 对远处像素特别不友好因为远处深度数值大绝对误差天然偏大。RMSE log对数均方根误差远近一碗水端平rmse_log sqrt( mean( (log(gt) - log(pred))² ) )把真值和预测都取对数后再算 RMSE。对数变换能把100 米 vs 110 米和1 米 vs 1.1 米这两种情况归为同等级别的误差都是 10% 的相对偏差从而平衡了近处与远处的贡献。在 KITTI 上该值通常在 0.17~0.23 之间。δ阈值a1 / a2 / a3预测靠谱的像素占比这是新手最容易懵的一组指标其实本质很简单先算每个像素的比值thresh max(gt/pred, pred/gt)a1 (thresh 1.25) 的像素占比即预测深度与真值偏差在 25% 以内的像素占全图比例a2 (thresh 1.25²) 的像素占比即偏差在 56.25% 以内a3 (thresh 1.25³) 的像素占比即偏差在 95.3% 以内你可以把 δ 阈值理解为容错率递增的及格线a1 是最严苛的考核偏差不超 25%a3 最宽松。三者的值都在 0~1 之间越接近 1 越好。ManyDepth 在 KITTI 上的 a1 高达 0.900意味着 90% 的像素预测偏差在 25% 以内。一眼看懂指标好坏速查表指标含义一句话数值方向KITTI 参考值ManyDepthabs_rel平均相对误差比例越小越好0.098sq_rel平方相对误差放大偏差越小越好0.770rmse均方根误差米越小越好4.459rmse_log对数均方根误差越小越好0.176a1偏差25% 的像素占比越大越好0.900a2偏差56.25% 的像素占比越大越好0.965a3偏差95.3% 的像素占比越大越好0.983评估指标背后的完整计算流程看懂公式只是第一步ManyDepth 在算出这些指标前还藏着几个关键预处理步骤不了解它们你复现出来的数值可能对不上论文。第一步视差转深度网络输出的是**视差disparity**而非深度评估时先用pred_depth 1 / pred_disp转换。注意这一步用到了disp_to_depth定义在manydepth/layers.py它会把 sigmoid 输出按最小/最大深度范围默认 0.1~100 米缩放后再取倒数。第二步median scaling 尺度对齐自监督深度存在尺度不确定问题预测出的深度整体可能偏大或偏小。因此评估时默认会做中位数对齐ratio median(真值深度) / median(预测深度) 预测深度 预测深度 × ratio相当于把预测的整体尺度掰到与真值一致后再算误差这能公平地比较不同模型的相对精度。第三步Eigen 裁剪与深度范围过滤KITTI 评估遵循 Eigen 协议只取图像中央区域裁剪掉边缘天空等无意义区域并只统计深度在1e-3~80 米之间的像素MIN_DEPTH/MAX_DEPTH超出范围的全部忽略。Cityscapes 数据集则采用中心 50% 裁剪的规则。如何读懂 KITTI 结果表论文与 README 中的结果表assets/results_table.png把上述 7 个指标按列排开横向对比各方法读表小技巧先看 abs_rel 和 a1 两列这两列分别代表平均误差与最严苛的准确率是拉开差距的关键再看是否标注了 TTRtest-time refinement测试时优化——用了 TTR 的方法如 ManyDepth MRTTR通常数值更好比较时要分清对手有没有加外挂。例如 ManyDepthMRabs_rel 0.098 已优于 Monodepth2 的 0.115而加入 TTR 后更是降到 0.090、a1 达到 0.914。实战一条命令跑出评估指标要复现上述指标只需先运行export_gt_depth.py导出 KITTI 真值深度然后执行python -m manydepth.evaluate_depth \ --data_path 你的KITTI路径 \ --load_weights_folder 模型权重目录 \ --eval_mono运行结束后终端会打印一行格式化的 7 个指标abs_rel | sq_rel | rmse | rmse_log | a1 | a2 | a3即论文结果表中的数据。评估 Cityscapes 模型时加上--eval_split cityscapes即可。相关参数如--min_depth、--max_depth、--disable_median_scaling都定义在manydepth/options.py中。新手避坑指南不要直接比较不同协议的数值Eigen 与 Eigen-Benchmark、KITTI 与 Cityscapes 的裁剪规则不同跨协议对比没有意义。median scaling 不能随便关--disable_median_scaling只在立体stereo评估等特殊场景使用单目评估关掉它数值会明显变差。a1 差 0.01 就是巨大提升在 697 张测试图上a1 提升 0.01 意味着多上千个像素被预测得更准SOTA 之争往往就在这小数点后两位。别忘先导出真值直接跑评估会报找不到gt_depths.npz务必先执行export_gt_depth.py。读懂这些指标后你不仅能看懂论文里的每一张结果表还能在自己训练模型时快速判断改进方向abs_rel 高说明整体偏差大RMSE 高说明存在个别离谱预测a1 低说明精度的下限不够。这就是 ManyDepth评估指标的全部秘密现在你可以放心去复现了。【免费下载链接】manydepth[CVPR 2021] Self-supervised depth estimation from short sequences项目地址: https://gitcode.com/gh_mirrors/ma/manydepth创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考