Skip to content

如何标注深度图

深度文件不携带自身的单位,零表示无返回而非很近,而有意义的量程从来不是完整量程。标注深度之前必须搞对的几件事。

把深度图当作图像打开,看到的是一块黑色矩形;就算不是,你看到的也只是一堆颜色,而不知道其中任何一种代表多远。 有三条性质把深度与图像区分开,而这三条搞错时都是无声的。

文件本身并不知道自己的单位

RealSense、Azure Kinect 与 NYU-Depth 用毫米。KITTI 补全基准用 1/256 米。任何由浮点数组写出的文件用米。

文件中没有任何东西记录用的是哪一种。depth_scale 表示每个存储单位对应多少米,而填错是看不出来的:窗口会重新缩放,画面看起来一模一样。唯一能发现它的办法,是拿以米为单位的读数去核对某个你已知距离的东西。

零不是一个距离

零几乎是通用的"无返回"编码——传感器没有测到这个像素。若按深度来读,它会在覆盖范围内的每一个空洞处画出一堵明亮的墙。

请把非测量值记作 NaN,并涂成任何色彩映射中都不存在的颜色。Potato 使用品红色,因此空洞不会被误读成近处或远处的深度,同时会报告深度图中有多少比例是空洞。

这个比例比听起来更重要。一台面对无纹理墙面的双目装置确实会返回 80% 的空洞,而看不出哪些像素是缺失的标注者,会把它们当成几何结构去标注。

有意义的量程从来不是完整量程

一份内容位于 1200 到 1800 之间的 16 位深度图,在朴素的 8 位转换下渲染出 255 级灰阶中的 4 级区分度,而在百分位窗口下有 254 级

请把近/远窗口默认设为有效像素的第 2 与第 98 百分位——这里的"有效"指的是排除无返回像素之后,否则空洞会主导百分位。

配置

yaml
instance_display:
  fields:
    - key: depth
      type: depth_map
      label: "Depth"

可直接读取的格式:16 位 PNG、16 位 TIFF、NPY 与 NPZ、PFM、EXR。

反投影

在给定相机内参的情况下,深度图会变成点云,同样的三维立方体工具即可使用。对于 RGB-D 数据集,这通常是更高效的标注方式:判断三维范围,在三维中比读色彩映射容易。

在深度图上标注什么

  • 对照 RGB 帧,对估计出的深度做质量判断
  • 标出深度出错的区域标签,这正是深度补全所需的监督信号。
  • 反投影之后标注三维框

若是质量判断任务,请把 RGB 帧并列显示。深度误差通常只有在对照之下才明显。

延伸阅读