論文「Unsupervised Monocular Depth Estimation with Left-Right Consistency」を読んでみました (2):論文調査編

前回は論文の実装を実際に動かしてみましたが、今回は論文自体について調べたのでまとめたいと思います。

概要

距離推定に対する学習ベースの手法の有効性は、これまでに多く示されています。しかし、それらは「教師あり」であるために大規模なground-truthが必要となっています。

そこで、距離推定を画像再構成問題として、ground-truthがなくてもCNNが距離推定可能なような学習目標を設定することで、end-to-endな教師なし学習で解きます。これに加えて、左右の視差の一貫性を高めるようなロスを設計することで高精度な距離を推定しています。

また、学習時には明示的な距離データが不要であるので、比較的入手が容易なステレオ画像でよく、
更に推定時には片方の画像のみでよりので、データに関しては従来よりコストが低くなっています。

新規性としては以下の点が挙げられると思います。

  • 単眼、教師なし学習においてend-to-end(全体が微分可能)な点
  • 左右の一貫性を重視したロスの設計

画像再構成問題としての距離推定

Goal: ある画像\(I\)が与えられた下で、ピクセル毎の距離(\(\hat d = f(I)\))を推定する関数\(f\)の学習。
全体としての目標はこれなのですが、ここでは明示的に距離を学習目標とするのではなく、下記のように画像を再構成するためのピクセルレベルの対応関係を学習します。

画像の再構成が可能ならば、距離推定が可能であるという事の直感的な理解は、
「校正済みのステレオカメラの下で、一方の画像から他方の画像を再構成可能な関数を学習できたのであれば、画像となった風景の三次元構造に関する情報を学習したことになる」
というイメージの様です。

具体的に何を学習するのかについて記述します。
学習時には、左右の色画像\(I^l\)、 \(I^r\)を利用して、左右のピクセルレベルの密な対応関係\(d^r\)(レクティフィケーション(rectification)されていれば、視差マップ)を推定する。
(※直接的に距離を推定していない点に注意。)
以下は、この対応関係は視差マップであるとします。

この\(d^r\)を左画像\(I^l\)に適用することで右画像\(I^r\)を再構成することができます。
つまり、\(\tilde I^r = I^l (d^r)\)。

逆も同様に、\(\tilde I^l = I^r (d^l)\)となります。

対応関係\(d\)が得られたのであれば、カメラ間のベースライン距離\(b\)、焦点距離\(f\)の下で、距離\(\hat d\) は、
\[
\hat d = b \frac {f} {d}
\]
と計算可能です。

ネットワーク

上述のような画像再構成を学習するようなネットワークの構造についてです。

まず、出発点として以下の基本的な流れを考えます。
「左画像\(I^l\)のみを入力→視差マップの推定→画像再構成」
左画像しか与えられてないので、画像再構成をするためには右画像基準の視差マップを推定し、これと左画像によって、右画像を再構成すというパターンしかありません(下図のNaive)。

しかしながら、推定時には、左画像のみが与えられるので、左画像基準の視差マップが得られなければ、入力画像上での距離推定が計算できません。よって、以下の要件を満たす必要があります。
In: 左画像\(I^l\)
Out: 左画像を基準とした視差マップ\(d^l\)
これを満たすようなネットワークの構成します。

左画像基準の視差マップ\(d^l\)を推定するのであるから、画像の再構成は右画像を利用して左画像を再構成するということになります下図のNo LR)。

入出力の要件は満たしましたが、このままの状態では、距離が非連続な部分でエラーが生じるなどの問題があります。

そこで、この構造を相互的に形成する、つまり(ネットワークへの入力は左画像のみのままで)left-to-right、right-to-leftの両視差マップを同時に推定するようにします(下図のOurs)。

このネットワーク構造と後述するロスを併せて、左右の視差の一貫性を保つように学習することでより精度を高める設計になっています。

(論文より引用)

また、画像の再構成に関して、視差マップを利用してある画像からサンプリングして再構成しますが、そのサンプリング方法としてbilinearサンプリング(補足)を用いることで、
ネットワーク全体として微分可能な構造となっています。
具体的なネットワーク構造としては、7層ずつのEncoder-Decoder構造になっていて、各層は以下の通りです。

Encoder
Encoderの構成(論文より引用)

Encoder部分をResNet50に置き換えるとより良い結果になるそうです。

Decoder
Decoderの構成(論文より引用)

各ノーテーションは以下の通り。

  • b: batch normalization
  • k: カーネルサイズ
  • s: ストライド
  • in, out: downsampling factor(入力画像のサイズを1とした時、どの程度downscalingしたかの尺度(convのストライドが2なので2倍ずつスケーリングしています))
  • chns: 入力と出力のチャネル数
  • \(+\): concatnation (skip connection)
  • \(*\): \(2 \times \) upsampling

高解像度に対応するために、skip connection が含まれています。
また、disp1~disp4と、スケール別に4種類の視差マップを生成しています。

Loss

上記の各スケール\(s\)について、ロス\(C_s\)が定義され、総ロスは\(C = \sum^4_{s=1} C_s\)で定義されます。
各\(C_s\)は3種類のロスの組み合わせとして計算されます。

\[
C_s = \alpha_{ap} (C^l_{ap} + C^r_{ap}) + \alpha_{ds} (C^l_{ds} + C^r_{ds}) + \alpha_{lr} (C^l_{lr} + C^r_{lr})
\]

各項の直感的な理解は以下の通りです。

  • \(C_{ap}\) : 再構成された画像を、対応する元画像に似せる役割
  • \(C_{ds}\) : 視差マップを滑らかにする役割
  • \(C_{lr}\) : 左右の視差の一貫性を強める役割

(以下は左画像のみについて記述しますが、右画像についても同様です。)

Apperance Matcning Loss

\(L1\)ロスとSSIM(補足)の組み合わせで定義されます。
\[
C^l_{ap} = \frac{1}{N} \sum_{i,j} \alpha \frac{1-\mathrm{SSIM}(I^l_{i,j}, \tilde I^l_{i,j})}{2} + (1-\alpha) ||I^l_{i,j} – \tilde I^l_{i,j}||
\]

(\(N\)はピクセル数、\(\alpha=0.85\)、SSIMは3×3のフィルタ処理)

Disparity Smoothness Loss

視差画像の勾配における\(L1\)ロスとして定義されます。
距離の非連続性は画像勾配がある部分で生じることが多いので、エッジを意識した(edge-aware)定義となっています。

\[
C^l_{ds} = \frac{1}{N} \sum_{i,j} |\partial_x d^l_{ij} |e^{-|| \partial_x I^l_{ij} ||} + |\partial_y d^l_{ij} |e^{-|| \partial_y I^l_{ij} ||}
\]

Left-Right Disparity Consistency Loss

\(L1\)ロスで定義されます。
左画像基準の視差マップが、”写像された(下式の\(ij + d^l_{ij}\))”右画像基準の視差マップと等しくなるように学習が進むような設計になっています。

\[
C^l_{lr} = \frac{1}{N} \sum_{i,j} | d^l_{ij} – d^r_{ij + d^l_{ij}} |
\]

Post Processing

ステレオカメラで、両眼の見える領域がずれていることに依る現象(stereo disocculusion)によって、画像の左端と覆いかぶさっている物体(occuluder)部分の視差マップが、下図の一番左のようになってしまうことがあります。

左から\(d^l\)、\({d”}^l\)、\(d\)、\(w^l\)(論文より引用)

これを軽減するために、以下のpost processingを行います。

まず、各ピクセルに対して以下の様な重みを定義します。
\[
w^i(i, j) = \left\{ \begin{array} {ll}
1 & \mathrm{if} \ j \leq 0.1 \\
0.5 & \mathrm{if} \ j \gt 0.2 \\
5*(0.2-i)+0.5 & \mathrm{else}
\end{array} \right.
\]

入力画像に対する視差\(d^l\)とフリップした入力に対する視差を更にフリップした視差を\({d”}^l\)(上図の左から2つ目)の加重和を最終的な視差とします。

(\({w’}^l\)は\(w^l\)を水平方向にフリップした重み)

\[
d = d^lw^l + {d”}^l{w’}^l
\]

この処理の理解としては、画像の左5%は\({d”}^l\)を、右5%は\(d^l\)を使用し、その他の部分は\(d^l\) と\({d’}^l\)の平均を使用して最終的な結果とするというものです。

補足

Structural SIMilarity (SSIM)

画質の客観的評価指標のひとつで、各画像の\(N \times N\)のウィンドウ\(x\)、\(y\)に対して以下のように定義されるものです。

\[
\mathrm{SSIM}(x, y) = \mathrm{SSIM}(y, x) = \frac { (2 \mu_x \mu_y + c_1) (2 \sigma_{xy} + c_2) } { (\mu_x^2 + \mu_y^2 + c_1)(\sigma_x^2 + \sigma_y^2 + c_2)}
\]

  • \(\mu_x\)、\(\mu_y\) : \(x\)、\(y\)の平均
  • \(\sigma_x^2\)、\(\sigma_y^2\) : \(x\)、\(y\)の分散
  • \(\sigma_xy\) : \(x\)、\(y\)の共分散
  • \(c_1=(k_1L)^2\)、 \(c_2=(k_2L)^2\) : 割り算を安定化させるための項
  • \(L\) : ピクセル値のダイナミックレンジ(\(2^{ \# bits \ per \ pixel}-1\))
  • \(k_1=0.01, k_2=0.03\)

Bilinear Sampling

本論文では微分可能なサンプリングの手法として、Spatial Transformer Networks中の、bilinear samplingを利用していると述べています。

このSpatial Transformer Networks自体は、CNNの平行移動などの空間的な変換への不変性について、Spatial Transformerという中間層の特徴量を操作するようなモジュールを追加することで、不変性を向上させるという趣旨の論文です。

Spatial Transformerは入力特徴量\(U \in \mathbb R^{H \times W}\)からサンプリングした”ピクセル値”に対して、(劣)微分可能なサンプリングカーネル\(k\)を適用して、出力特徴量\(V \in \mathbb R\
^{H’ \times W’}\)に変換しますが、このサンプリングカーネル\(k\)のひとつとしてbilinear samplingが出てきます。

具体的には、以下の通りの処理となります。

\[
V_i = \sum_n^H \sum_m^W U_{nm} \max(0, 1-|x_i^s-m|) \max(0, 1-|y_i^s-n|) \ \forall i \in [1 … H’W’]
\]

これは、\(U_{nm}, x_i^s, y_i^s\)で偏微分可能です。
定義上は入力全体の総和を取っているのですが、実際上はカーネルのサポートのみ考えれば十分なようです。

おわりに

今回は、ネットワークやロスに関する内容でしたが、データセットなどの学習に関する事項は次回まとめたいと思います。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です