💨

【論文】AdaBins: Depth Estimation using Adaptive Bins

2021/04/04に公開

単眼深度推定について、Papers with Codeにおいて優れた精度を示しており実装も公開されていたAdaBinsという手法を調べたのでメモしておく。以降単眼深度推定を単に深度推定と呼ぶ。

まとめ

  • 先行研究より、深度推定は深度(目的変数)を複数のビンに分割することで回帰ではなく分類問題として扱うことができる
  • 入力画像に対して適応的にビンの間隔を計算できるモジュール:AdaBinsを提案
  • 分類形式での予測だと予測値が離散的になってしまうので、attentionによってビンの予測を統合することで最終的に滑らかな深度推定を得る
  • 屋内、屋外の両方のデータセットで精度向上

https://paperswithcode.com/task/monocular-depth-estimation

https://github.com/shariqfarooq123/AdaBins

動かしてみたデモは以下に配置。

https://github.com/daigo0927/blog/tree/master/deep-monodepth

Methodology

Motivation

深度推定を回帰ではなく分類形式で行うというアプローチはFu et. al. (2018)で提案されている。彼らは学習前に目的変数である深度を適当な数のビンに区切り、入力画像の各ピクセルの深度が属するビンを予測するという分類ベースのアプローチを構築した。

一方で画像によっては深度に偏りが考えられるため、決め打ちのビン幅では表現力が不十分となる。これに対してAdaBinsでは、入力画像に応じて適応的にビン幅を計算することで、予測深度の粒度を調節することができる

また生の分類出力は離散的であるため、これに起因するアーティファクトが発生する。AdaBinsでは分類形式の深度予測の重み付き和を計算することで、最終的に滑らかな予測結果を得る。これは分類と回帰のハイブリッドなアプローチと言える。

AdaBins design

AdaBinsモジュールをデザインするにあたっては4つのアイデアが存在する。

  1. ビンの切り方
  2. 分類形式の離散的な深度予測の統合方法
  3. ビン計算に用いる特徴量の空間解像度
  4. 独立したモジュールであること

深度をbinningする際には、一定の間隔で決め打ちで設定する方法、学習によってモデル固有の値を得る方法が考えられるが、AdaBinsでは深度の上限と下限、ビンの分割数だけを決めておき、各ビン幅は入力画像ごとに適応的に計算する。

3について、画像においてAttentionを用いるアプローチでは、Encoderの後にこれを配置する場合が多い。一方で本研究では高い空間解像度の特徴量に対してattentionを適用することで良い性能が得られることが分かったため、Encoder→Decoder→Attentionの順番で処理を行う。

Architecture description

モデルのアーキテクチャは特徴抽出を行うEncoder-Decoderと、深度推定を行うAdaBinsモジュールからなる。EncoderにはEfficientNet B5を用いる。

AdaBinsモジュールは小サイズのVision Transformer(mini-ViT, mViT)を含んでいる。mViTは抽出された特徴量から各ビン幅を表すベクトル\mathrm{b}と、ピクセルごとの特徴量Range-Attention-Map \mathcal{R}の二つを出力する。mViTの構造は以下のようになる。

理解のために各処理ステップとテンソル形状を整理する。バッチ方向の次元は省略する。

  • Feature Map \mathrm{x}_{d} \in \mathbb{R}^{h\times w\times C_{d}}: 前半のEncoder-Decoderによって得られた特徴量。h, wはそれぞれ元画像の半分のサイズと設定している。
  • Conv3x3: 畳み込みによってh\times w\times Eの特徴量を出力する
  • Patch Embeddings \mathrm{x}_{p} \in \mathbb{R}^{S\times E}
    • Feature Mapに対してカーネルサイズ、ストライドp\times pの畳み込みを行うことでh/p\times w/p\times Eの特徴量を得る
    • Reshapeすることで\mathrm{x}_{p}を得る。ここでS=hw/p^2となる。
  • Transfromer Encoder: patch embeddingsをS個のトークンの特徴量と見て計算を行い、output embeddings \mathrm{x}_{o} \in \mathbb{R}^{S\times E}を得る
    • MLP Head: 先頭トークンに対応する長さEの特徴量ベクトルを入力として、長さNのビン幅ベクトル\mathrm{b}を得る。Nはビンの分割数に対応する。
    • 1x1 kernels: Transformer Encoderの出力における、2番目からC+1番目までのトークンに対応する特徴量(C\times E)。Cはハイパーパラメータ。
  • Pixel-wise dot product: Conv3x3の出力と、Transformer Encoderから得た1x1 kernelsの行列積を計算し、Range-Attention Maps \mathcal{R} \in \mathbb{R}^{h\times w\times C}を出力する。

太字で示したビン幅ベクトル\mathrm{b}、Range-Attention Maps \mathcal{R}がmViTにおける最終的な出力となる。これらを合わせて最終的な深度を得る。

Hybrid regression

まずRange-Attention Maps \mathcal{R}を畳み込みによってチャンネル数N(=ビン分割数)のテンソルとする。これにチャンネル方向のsoftmaxを計算することで、ピクセルごとに分類形式の深度予測確率pを得る。

ビン幅ベクトル\mathrm{b}は足して1になるように正規化されている。これと事前に設定した予測深度の上限・下限を用いて、各ビンの中央の深度c(\mathrm{b})を計算する。最後に各ピクセルの深度予測確率pによる重み付き和を計算することで、ピクセルごとの深度\tilde{d}を得る。

Loss function

損失関数には先行研究でも用いられているScale-Invariant lossを用いる。

同時に、各画像から計算したビン幅の分布と正解の深度分布との誤差も計算する。bi-directional Chamfer Lossを用いる(詳細は省略)。これら2つを合わせて最終的な損失関数とする。

Experiments

屋内(NYU Depth v2, SUN RGB-D)、屋外(KITTI)の両方のデータセットで検証を行った。既存手法より改善。詳細は省略。

触ってみた

実装と学習済み重みが公開されていたので動かしてみた。正解の深度付き画像はRedwood datasetから拝借した。推論するだけなら適当な画像だけで良いはず。

屋内にイスが置かれている画像で検証。左から入力画像、予測結果、正解深度。単眼深度推定にしてはなかなか良さそうに見える。

がんばってmatplotlibで可視化した結果が以下。左が予測結果、右が正解。予測結果のdepthはメートル単位、正解の方はミリメートル単位なことに注意。手前の棚(?)と部屋隅の推定が甘い気がするが全体的には合っていそう。

以下は入力画像に対して適応的に計算されたビンのヒストグラム。今回の画像では1〜3メートルあたりで細かく深度が分割されていることがわかる。

https://github.com/daigo0927/blog/tree/master/deep-monodepth

感想など

深度推定を分類形式で解くアプローチにおいて、適応的にビン幅を計算するという点が面白い。入力データから適応的に解像度を調整するという点は他にも色々な分野に応用が効きそう。出力が直接メートル単位で扱えるという点も良い。画像は3次元空間上の物体をある方向に射影したものであり、単眼深度推定はこれの逆問題であるという点で難しいと思っていたが、ここまでできるのはさすがディープラーニングと感じた。

なお2021/04/04現在では新しくDPT(Vision Transformers for Dense Prediction)という手法も優れた深度推定が可能とされている。一方でDPTの出力はメートルなどといった直感的な尺度ではないよう(論文中ではinverse depthとされている。単純に逆数というわけではなくスケールとシフトパラメータが必要らしい)。なので1枚画像からさくっと深度推定するならAdaBinsの方が使いやすそうだと思った。

Discussion