当前位置: 首页 > ds >正文

average per-pixel disparity error: EPE及不同距离值下的误差曲线

写在前面

  • 本文内容
    介绍epe的概念,作用;
    由epe推导出的不同距离下的物理误差曲线
    一句话简单理解:epe是用于深度估计、以像素为单位的误差度量方式

  • 平台/环境
    python

  • 转载请注明出处:
    https

    目录

    • 写在前面
    • EPE
      • **1. 视差与深度的关系**
      • **2. EPE 的计算方法**
      • **3. EPE 的特点**
      • **4. 与其他指标的关系**
      • **5. 为何使用 EPE?**
      • **举例**
        • **总结**
    • 计算
    • 参考

EPE

FoundationStereo: Zero-Shot Stereo Matching文中的描述是:
“EPE” computes average per-pixel disparity error. “BP-X” computes the percentage of pixels where the disparity error is larger than X pixels. “D1” computes the percentage of pixels whose disparity error is larger than 3 pixels and 5% of the ground-truth disparity

在深度估计中,EPE(End-Point Error,端点误差) 是一种用于衡量预测视差(disparity)与真实视差之间误差的指标。其核心思想是逐像素比较预测值与真实值的差异,并计算全局平均误差。以下是详细解释:

1. 视差与深度的关系

  • 视差(Disparity) 是立体视觉中左右图像中对应点的水平位移(单位为像素)。通过视差可以推导深度(depth):
    [ 深度 = 焦距 × 基线距离 视差 ] [\text{深度} = \frac{\text{焦距} \times \text{基线距离}}{\text{视差}} ] [深度=视差焦距×基线距离]
    视差越小,物体距离越远;视差越大,物体距离越近。

2. EPE 的计算方法

EPE 的定义非常简单:
[ EPE = 1 N ∑ i = 1 N ∣ 预测视差 i − 真实视差 i ] [\text{EPE} = \frac{1}{N} \sum_{i=1}^{N} | \text{预测视差}_i - \text{真实视差}_i] [EPE=N1i=1N预测视差i真实视差i]
其中:

  • N是图像中有效像素的总数(通常会忽略无真实值的像素)。
  • 对每个像素的预测误差取绝对值(L1 范数),然后计算所有像素的平均值。

3. EPE 的特点

  • 直观性:直接反映模型在每个像素上的预测精度。
  • 单位一致性:视差单位为像素,EPE 的单位也是像素。例如,EPE=1 表示平均每个像素的预测误差为 1 像素。
  • 局限性:仅衡量数值误差,不反映结构误差(如边缘模糊或物体形状错误)。

4. 与其他指标的关系

  • MAE(Mean Absolute Error):与 EPE 等价,但 EPE 更常用于视差/光流任务。
  • RMSE(Root Mean Square Error):对误差取平方后开根号,对大误差更敏感。
  • Bad Pixel Rate:像素误差率( BP-X,Bad Pixel-X),通常计算的是视差误差大于某个阈值(如 3 像素)的像素占总像素的比例。而 EPE 则是所有像素误差的平均值。EPE 更能反映整体的误差,而像素误差率更关注误差较大的像素的比例。

5. 为何使用 EPE?

在深度估计任务中,视差是中间结果(最终深度需通过几何公式转换)。EPE 直接评估视差预测的准确性,是模型性能的核心指标。较小的 EPE 意味着更准确的深度估计。

举例

假设预测视差图某像素值为 30,真实值为 28,则误差为 ( ∣ 30 − 28 ∣ = 2 ) (|30-28|=2) (∣3028∣=2)。若全图平均此类误差为 1.5 像素,则 EPE=1.5。


总结

EPE 是深度估计中衡量视差预测精度的基础指标,通过逐像素误差的平均值反映模型性能,值越小表示模型越精确。

计算

根据深度-视差计算原理
Z = b ∗ f d , d = b ∗ f Z Z=\frac{b*f}{d}, d=\frac{b*f}{Z} Z=dbf,d=Zbf

以415传感器实际数据为例:
传感器(ov2740)大小:2.7288mm1.5498mm
基线b=55mm
在1280
720分辨率下,f=910(pixel)
当物距为Z=1m(1000mm)时:
d = 55910/1000 = 50.05(pixel)
当存在双目匹配误差且误差为pe=0.42(pixel时), d = d+pe = 50.47,
Z’ = 55
910/50.47 = 991.67(mm)
深度误差为abs: Ze=Z’ - Z=8.33mm, relative: 8.33/1000 = 0.833%

代码


import numpy as np
import matplotlib.pyplot as pltdef computeEPE(baseline, fx, depth, pe):bf = baseline * fxd_pixel = bf / depthabs_error = abs(bf / (d_pixel + pe) - depth)relative_error = abs(abs_error / depth)return abs_error, relative_errorif __name__ == "__main__":# "EPE" computes average per-pixel disparity errorepe_list = [0.34, 0.42, 0.50]# # 250mm - 1000mmdistance_list = [250, 500, 600, 700, 800, 900, 1000]# 250mm - 10000mm# distance_list = [#     250,#     500,#     1000,#     2000,#     3000,#     4000,#     5000,#     6000,#     7000,#     8000,#     9000,#     10000,# ]# realsense 415 base_line=55mm 1920x1080 focal=910focal = 910  base_line = 55# 为每个 epe 值绘制一张图for epe in epe_list:abs_error_list = []relative_error_list = []for distance in distance_list:abs_error, relative_error = computeEPE(base_line, focal, distance, epe)abs_error_list.append(abs_error)relative_error_list.append(relative_error)# 创建一个包含两个子图的图表plt.figure(figsize=(12, 6))# 第一个子图:绝对误差plt.subplot(1, 2, 1)plt.plot(distance_list, abs_error_list, label="Absolute Error", marker="o")plt.xlabel("Distance (mm)")plt.ylabel("Absolute Error")plt.title(f"Absolute Error vs Distance (EPE={epe})")plt.grid(True)# 第二个子图:相对误差plt.subplot(1, 2, 2)plt.plot(distance_list, relative_error_list, label="Relative Error", marker="x")plt.xlabel("Distance (mm)")plt.ylabel("Relative Error")plt.title(f"Relative Error vs Distance (EPE={epe})")plt.grid(True)# 调整布局,防止重叠plt.tight_layout()plt.show()

结果曲线
epe=0.34
在这里插入图片描述
epe=0.42
在这里插入图片描述

epe=0.5
在这里插入图片描述

参考

FoundationStereo: Zero-Shot Stereo Matching

主要做激光/影像三维重建,配准、分割等常用点云算法,熟悉open3d、pcl等开源点云库,技术交流、咨询可私信

http://www.xdnf.cn/news/5476.html

相关文章:

  • JavaScript基础-全局作用域
  • 《Python星球日记》 第53天:卷积神经网络(CNN)入门
  • DNS服务实验
  • 土耳其Koç大学指令驱动的智能综述,从文本表达到任务执行的系统探索
  • 王慧文产品课总结
  • @Transactional注解失效
  • 仿制药研发为何要上电子实验记录本?
  • 数据在内存中的存储
  • 配置高级相关
  • Open CASCADE学习|B 样条曲线拟合优化
  • 探秘 Canva AI 图像生成器:重塑设计创作新范式
  • vs python“““标记注释报错,vs使用自带环境安装 python第三方库
  • 每日一题洛谷T534125 合数c++
  • C# 方法(ref局部变量和ref返回)
  • 测试一下多模态提取图片中文字的能力
  • STM32F103单片机在不需要使用 JTAG 调试接口的情况下,释放引脚给其他功能使用。
  • 电网拓扑分析:原理与应用
  • Crewai Community Version(四)——Crew
  • Qt QCheckBox 使用
  • 【Java ee初阶】网络编程 TCP
  • 深度学习篇---姿态检测实现
  • 软考错题集
  • Java 23种设计模式 - 行为型模式11种
  • PostgreSQL 的 pg_collation_actual_version 函数
  • 【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
  • Kimball
  • Python 基础语法与数据类型(七) - 函数的定义与调用 (def, return)
  • Ethercat转Profinet网关如何用“协议翻译术“打通自动化产线任督二脉
  • Looper死循环阻塞为什么没有ANR
  • 【大模型面试每日一题】Day 14:大模型训练中显存占用的主要来源有哪些?如何通过激活重计算降低显存?