Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
SLAM開発における課題と
対策の一例の紹介
3D勉強会 #6
井上
自己紹介
井上
株式会社Preferred Networks エンジニア
学生 SfMをフルスクラッチで書く
1社目 MVSをフルスクラッチで書く
2社目 SLAMをフルスクラッチで書く
2
SLAMは楽しい
3
SLAMの開発はつらい
4
どうしてつらいか?
真値が取れない
大量のハイパーパラメーター
テストしにくい
5
真値が取れない
POINT 01
6
カメラポーズ・点群はどの程度正しい?
評価のための真値が必要
7
01 真値が取れない
画像出典:colmap.github.io
真値をとるためにはコストがかかる
真値あり公開データセットを使う
or
コストをかけて真値を取る
01 真値が取れない
8
データセット例 1/2
KITTI [IJRR 2013]
屋外、ステレオ、
LiDAR、GPS、IMU
EuRoC [IJRR 2016]
屋内、ステレオ、IMU、
モーションキャプチャ、
レーザースキャナ
01 真値が取れない
9
画像は論文またはプロジェクトページから引用
データセット例 2/2
TUM RGB-D [IROS 2012]
屋内、RGB-D、
モーションキャプチャ
ICL-NUIM [ICRA 2014]
屋内、CG
01 真値が取れない
10
画像は論文またはプロジェクトページから引用
データセット例 まとめ
• センサ構成がマッチしている場合には積極的に
使いたい
• 他手法との比較にも重宝する
• これだけで評価が十分ということにはならない
Dataset ステレオ Depth Map IMU カメラ姿勢 構造 屋内外
KITTI ○ - ○ 3D (GPS) 点群 屋外
EuRoC ○ - ○ 6D (mocap) 点群 屋内
TUM RGB-D - Dense - 6D (mocap) - 屋内
ICL-NUIM - Dense - 6D (synthetic) サーフェス 屋内
01 真値が取れない
11
真値を取る方法(カメラポーズ)
画像出典:optitrack.jp
モーションキャプチャ
100Hz
0.1mm
画像出典:www.topcon.co.jp
トータルステーション
10Hz
1~5mm
01 真値が取れない
12※ 数値は大雑把な目安です。製品によって異なります。以降同様。
真値を取る方法(構造)
画像出典:velodynelidar.com
LiDAR
10~50Hz
30~100mm
画像出典:faro.com
レーザースキャナー
0.001Hz
1mm w/RGB
01 真値が取れない
13
真値を取る方法 まとめ
• 得意不得意があり、解きたい問題ごとに
最適なセンサーを選ぶ必要がある
• センサー間のレジストレーション等泥臭い作業が必要
カメラポーズセンサー 対象 精度 測定速度 測定範囲 価格
モーションキャプチャー 位置+回転 0.1mm 100Hz 10m 数百万円
トータルステーション 位置 1~5mm 10Hz 5000m 数百万円
構造センサー 色 動物体 精度 測定速度 測定範囲 価格
LiDAR - ○ 30~100mm 10~50Hz 200m 数百万円
レーザースキャナー ○ - 1mm 0.001Hz 1000m 数百万円
01 真値が取れない
14
まとめ
最初は公開データセットで評価しつつ、
目的のシーンで真値を計測し評価をする
01 真値が取れない
15
大量のハイパーパラメーター
POINT 02
16
SLAMはハイパーパラメーターだらけ
画像サイズ
特徴点数
イテレーション回数LM法のlambda
外れ値しきい値 画像ピラミッドレイヤー数
ロバストコスト関数選択
各種Priorの重み
VisionとIMUのバランス
初期復元ペアの選び方RANSAC試行回数 収束判定条件
自動で最適化する
02 大量のハイパーパラメーター
17
etc.
18
出典:https://github.com/optuna/optuna
02 大量のハイパーパラメーター
import optuna
from subprocess import run
def objective(trial):
threshold = trial.suggest_uniform('threshold', 0.1, 10.0)
iter = trial.suggest_int('iter', 50, 300)
score = run(
['your/slam/binary', f'{threshold}', f'{iter}'],
capture_output=True, text=True).stdout
return score
study = optuna.create_study()
study.optimize(objective, n_trials=100)
19
02 大量のハイパーパラメーター
探索するパラメーターの
種類と範囲を指定
SLAMを実行して
評価結果を返す
公式ドキュメントや講演資料を参照
• https://optuna.readthedocs.io/
• https://www.slideshare.net/pfi/pydatatokyo-meetup-21-optuna
1. 復元から評価まで自動化する
2. 最大(小)化したい評価指標を定義
20
02 大量のハイパーパラメーター
実績:手動調整より10%向上
まとめ
ハイパーパラメーターの調整は自動化できる
課題
• 評価指標をどう定義するか?
21
02 大量のハイパーパラメーター
テストしにくい
POINT 03
22
モジュールの結合度が高くなりがち
23
03 テストしにくい
画像出典:ORB-SLAM [TRO 2015]
モジュールの結合度が高くなりがちで
ユニットテストがしにくい
= バグを発見できない
24
バグを減らすテクニックを併用する
03 テストしにくい
バグを減らすテクニック
静的解析ツール・Sanitizer(省略)
代数計算ツール
継続的な性能のトラッキング
25
03 テストしにくい
𝝏𝒚
𝝏𝒙
代数計算ツール
SLAMではGauss-Newton法をよく使う
= ヤコビ行列を書く必要がある
26
03 テストしにくい
𝑟 𝑥 = 𝑦 − 𝑓 𝑥
J =
𝜕𝑟 𝑥
𝜕𝑥
𝑥 ← 𝑥 − JT
J
−1
JT
𝑟 𝑥
27
03 テストしにくい
微分計算を自動化
Octave Mathematica MATLAB
28
03 テストしにくい
https://colab.research.google.com/drive/1wflhGRVzdlosxHsC63HX2WvXrCG-b8p0
代数計算ツール まとめ
考慮できないものもある
• リー群の群作用の偏微分
• 浮動小数点数の計算誤差
• SIMD
最終的には、手で書いた微分と数値微分の
計算結果が一致するかテストしている
29
03 テストしにくい
継続的な性能のトラッキング
30
03 テストしにくい
コーディング 単体テスト レビュー マージ 統合テスト
毎時
毎週
テスト結果をどう管理する?
31
03 テストしにくい
出典:https://github.com/mlflow/mlflow
32
03 テストしにくい
👇 ハイパラ 👇 評価結果
試行 👉
33
03 テストしにくい
👆 各試行の結果
34
03 テストしにくい
👇 ハイパラ vs. 評価結果
まとめ
積極的に自動化してバグが混入する余地を減らす
混入してもすぐに検出できるシステムを構築する
35
03 テストしにくい
SLAMの開発はつらいが
軽減する方法はある
楽しくSLAM開発!
36
参考文献
• The KITTI Vision Benchmark Suite
http://www.cvlibs.net/datasets/kitti/
• The EuRoC MAV Dataset
https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
• RGB-D SLAM Dataset and Benchmark
https://vision.in.tum.de/data/datasets/rgbd-dataset
• The ICL-NUIM dataset
https://www.doc.ic.ac.uk/~ahanda/VaFRIC/iclnuim.html
• LiDAR Comparison Chart
https://autonomoustuff.com/lidar-chart/
37

More Related Content

SLAM開発における課題と対策の一例の紹介