🧠

論文解説:Unsupervised Monocular Depth Estimation(3)学習方法編

に公開

こんにちは。Yokokuraです。

前回の続きとして、monodepthの学習に関して簡単にまとめたいと思います。

速度

学習速度

3万枚の画像を50 epoch学習するのにTitan X GPU 1基で約25時間

推論速度

512x256画像で35ms未満 (28 FPS以上) (GPU-CPU間のデータ転送時間込み)

ハイパーパラメータなど

パラメータ数

31 million (ResNetの場合、48 million)

ハイパーパラメータ

\alpha_{ap} = 1, \alpha_{lr} = 1

前投稿の通り、マルチスケール(4スケール)の視差マップを出力します。

出力される視差は、 d_{max}=0.3 \times各スケールの視差画像の幅 として、スケールしたsigmoid関数によって[0, d_{max}]に制限されています。

マルチスケールの視差マップを生成するために、2倍のupsamplingを行っているので、結果として、隣接するピクセルの視差はスケール間で2倍変わってきてしまいます。 これを修正するために、\alpha_{ds}(視差を滑らかにさせるための項)を、各スケールにおいて同程度の平滑化が行えるようにrでスケールさせます。 つまり、\alpha_{ds} = \frac{0.1}{r}で、ここでrというのは、donwscaling factor(入力画像の解像度に対して、どの程度downscalingされているか)です。

活性化関数

通常よく使われるReLuではなくelu(exponential linear units)を使用しています。 ReLuだと、中間のスケールの視差が単一の値に固定されてしまうなどの問題があるそうです。

学習

batch sizeは8で、50 epochの学習となっています。

最適化はAdamを使用していて、パラメータは\beta_1=0.9, \beta_2=0.999, \epsilon=10^{-8} 初期学習率は\lambda=10^{-4}で、最初の30 epochは固定、そこから10 epoch毎に半減させています。

低解像度のスケールから順に最適化していく(progressive update)よりも、4つのスケールを同時に最適化する方が、安定して収束するようです。
また、ロスの重み付けは各スケールで同じものを用いたほうが、安定するようです。

batch normalizationの精度への貢献はほとんどなかったと述べられています。

Augmentation

Data Augmentation

確率50%で水平方向にフリップして、左右が相対的に正しい位置になるようにスワップさせるAugmentation。

Color Augmentation

確率50%でガンマ値、輝度、色について、それぞれ以下の一様分布からサンプリングした分だけシフトさせるAugmentation。

U_{gamma}[0.8, 1.2], U_{brightness}[0.5, 2.0], U_{color}[0.8, 1.2]

学習済みモデル

本論文で使用されたデータセット

  • Cityscapes 22,973 stereo pairs, KITTIより解像度、画質、多様性に優れている(らしいです)
  • KITTI 42,382 rectified stereo pairs/61 scenes/1242x375 pixels
  • Make3D 評価用
  • CamVid 評価用
  • 1080p, 10fpsで撮影したデータセット 60,000 frames

配布されているモデルに関して

  • KITTI Split(model_kitti) 主に、lossやleft-rightの一貫性の重要性を示すために使われたsplitです。61シーン/42,382枚の校正済みステレオ画像(1242x375)

    • 28シーン: KITTIのトレーニングセットからの、200枚の高品質視差画像を評価
    • 33シーン: 29,000枚を学習、残りはテスト用
  • Eigen Split(model_eigen) こちらもKITTIですが、主に既存手法と比較するために使われたsplitです。

    • 29シーン: 評価用
    • 32シーン: 22,600枚を学習、残りはテスト用
  • Cityscapes(model_cityscapes, model_city2kitti, model_city2eigen) Cityscapesでpre-trainingしたモデルを、Kitti、Eigen、1080p, 10fpsで撮影したデータセットなどで各々fine tuningすることで、より精度があがることが示されています。

    • model_city2kitti: Cityscapes(pre-training)+KITTI split(fine-tuning)
    • model_city2eigen: Cityscapes(pre-training)+Eigen split(fine-tuning)

    Cityscapes単体での汎化性能
    Cityscapesのみを使って学習させたモデルを、他のデータセットで使用してもある程度よい結果が得られるようです。

    Make3Dでの結果(論文より引用)

    CamVidでの結果(論文より引用)

    テストしたいデータ向けにfine-tuningすることが有効的であると言えます。
    例えば、Cityscapes(pre-training)+撮影したデータセット(fine tuning)で学習した場合のデモ(3:49あたりから)

https://www.youtube.com/watch?v=go3H2gU-Zck

  • Resnet50(model_*_resnet) 上記のモデルで、Encoder部分をResnet50に変えたものとなっていて、より良い性能が報告されています。
Fixstars Tech Blog /proc/cpuinfo

Discussion