Skip to content

深度マップをアノテーションする方法

深度ファイルは自分の単位を持たず、ゼロは「近い」ではなく「反射なし」を意味し、意味のある範囲が全範囲と一致することはありません。深度をアノテーションする前に押さえるべきこと。

深度マップを画像として開くと黒い長方形が出てきます。そして仮に何か見えたとしても、その色がどの距離を意味するのかは分かりません。 深度を画像から隔てる性質が三つあり、そのいずれも、間違えたときに何も知らせてくれません。

ファイルは自分の単位を知らない

RealSense、Azure Kinect、NYU-Depth はミリメートル。KITTI の補完ベンチマークは 1/256 メートル。float 配列から書き出されたものはメートル。

どれなのかはファイルのどこにも記録されていません。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。

逆投影

カメラ内部パラメータがあれば深度マップは点群になり、同じ 3D 直方体ツールが使えます。RGB-D データセットでは、たいていこちらのほうが生産的なアノテーション方法です。3D の広がりを判断するのは、カラーマップを読むより 3D 空間のほうが容易だからです。

深度上で何をアノテーションするか

  • 推定深度に対する、RGB フレームと突き合わせた品質判定
  • 深度が誤っている箇所の領域ラベル。これは深度補完の教師信号になります。
  • 逆投影後の 3D ボックス

品質判定の課題では RGB フレームを並べて表示してください。深度の誤りは、比較したときにだけ明らかになるのが普通です。

参考文献