速度
学習速度
3万枚の画像を50 epoch学習するのにTitan X GPU 1基で約25時間
推論速度
512×256画像で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/1242×375 pixels
- Make3D 評価用
- CamVid 評価用
- 1080p, 10fpsで撮影したデータセット 60,000 frames
配布されているモデルに関して
- KITTI Split(model_kitti)主に、lossやleft-rightの一貫性の重要性を示すために使われたsplitです。61シーン/42,382枚の校正済みステレオ画像(1242×375)
- 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)
テストしたいデータ向けにfine-tuningすることが有効的であると言えます。
例えば、Cityscapes(pre-training)+撮影したデータセット(fine tuning)で学習した場合のデモ(3:49あたりから)
Cityscapes単体での汎化性能
Cityscapesのみを使って学習させたモデルを、他のデータセットで使用してもある程度よい結果が得られるようです。 - Resnet50(model_*_resnet)上記のモデルで、Encoder部分をResnet50に変えたものとなっていて、より良い性能が報告されています。
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...