2018/04/24 AIコードレビュー
ORB-SLAM Code Reading
takmin
自己紹介
2
テクニカル・ソリューション・アーキテクト
皆川 卓也(みながわ たくや)
フリーエンジニア(ビジョン&ITラボ)
「コンピュータビジョン勉強会@関東」主催
博士(工学)
略歴:
1999-2003年
日本HP(後にアジレント・テクノロジーへ分社)にて、ITエンジニアとしてシステム構築、プリ
セールス、プロジェクトマネジメント、サポート等の業務に従事
2004-2009年
コンピュータビジョンを用いたシステム/アプリ/サービス開発等に従事
2007-2010年
慶應義塾大学大学院 後期博士課程にて、コンピュータビジョンを専攻
単位取得退学後、博士号取得(2014年)
2009年-現在
フリーランスとして、コンピュータビジョンのコンサル/研究/開発等に従事
http://visitlab.jp
コンピュータビジョン勉強会@関東
3
こんなテーマでやってきました
「コンピュータビジョ
ン最先端ガイド」の
輪読
ICCV読み会
ECCV読み会
CVPR読み会
ハッカソン
OpenCV祭り
CVのお仕事
CVでこんなもの
作ってみた
有名論文読み会
AR/VRを支える技
術
CVで便利なツール/
ライブラリ
紹介するコード
5
 ORB SLAM2
 https://github.com/raulmur/ORB_SLAM2
 人工知能?
 機械学習使ってません
 ARの世界では有名な研究/コード
 私が書いたコードではない
 仕事でずっとこれのカスタマイズに格闘してたので
紹介
 カスタマイズされたコードは出せないので、元の
コードについて解説
Visual SLAM
6
ARにおいて、カメラで撮影した画像上に3Dオブジェクトを
重畳表示するためには、撮影対象の三次元形状とそれに
対するカメラの位置と姿勢を正確に求める必要がある
Simultaneous Localization And Mapping (SLAM)
Localization
Mapping
ORB-SLAMとは?
7
 単眼カメラのVisual SLAM
 Mur-Artal, R., Montiel, J. M. M., & Tardos, J. D. (2015).
ORB-SLAM:AVersatile and Accurate Monocular
SLAM System. IEEETransactions on Robotics,
 ソースコード:
https://github.com/raulmur/ORB_SLAM2
 動画:
https://www.youtube.com/watch?v=ufvPS5wJAx0
Structure from Motion (SfM)
8
 同じ対象を撮影した複数の画像(例えば動画)から、対
象の三次元形状を復元する
Structure from Motion (SfM)
9
 同じ対象を撮影した複数の画像(例えば動画)から、対
象の三次元形状を復元する
バンドル調整を用いて、複数のカメラの相対位置、焦点距
離、対象の三次元点座標を同時に推定する
<バンドル調整>
測定結果とパラメータから誤差を計算し、誤差を小さくする方向にパ
ラメータを調整していく
バンドル調整
10
1. 三次元点群とカメラパラメータの初期値を設定する
画像から見つけた点の
三次元座標の初期値カメラの位置と焦点距離
の初期値
バンドル調整
11
2. 三次元点群を各カメラの画像平面へ投影
バンドル調整
12
3. 投影された点と観測した点との誤差の総和を算出
投影された点
観測点
誤差
バンドル調整
13
4. 誤差が小さくなる方向へ特徴点の三次元座標とカメラ
パラメータを調整 (収束するまで2から繰り返す)
ORB-SLAMの仕組み
14
ORB-SLAMの仕組み
15
 Tracking、 Local Mapping、Loop Closingの3つのスレッド
が並列に動作
 Tracking: 入力フレームのカメラ位置/姿勢を推定
 Local Mapping: 地図(点群)を生成/更新
 Loop Closing: カメラ位置/姿勢の誤差の蓄積を除去
 全スレッドでORB特徴を利用
 MAP
 点(XYZ)とそれに紐づいた代表ORB特徴
 各キーフレームの全ORB特徴を保持
 Place Recognition:
 ORBによるBags-of-Wordsでクエリー画像に近いキーフレームを検索
 追跡失敗時やMapping時に対応点が見つからない時、Loopを探す
時などに利用
ORB
16
 画素ペアの大小でキーポイントと特徴量を計算するため、非
常に高速
 キーポイントは画像ピラミッドの各レベルでFASTにより検出
 キーポイント周辺の画素ペアの値の大小を0と1に割り当て(バイナ
リ特徴)
 バイナリ特徴のため省メモリ
 回転に対して不変
ORBで使用する画素ペア
(学習された例)
ORB-SLAMの仕組み
17
• XYZ(世界座標系)
• 代表ORB特徴
ORB-SLAMの仕組み
18
• キーフレームのカメ
ラパラメータ(内部/
外部)
• 全ORB特徴とMap
Pointsへのリンク
ORB-SLAMの仕組み
19
• キーフレームをノー
ドとした無向グラフ
• 共通するMap Points
が多いほどエッジの
重さが大きい
ORB-SLAMの仕組み
20
Covisibility Graphから
作成した全域木
キーフレームとグラフ表現
21
SpanningTree
に強いエッジ
を追加
15個以上の
共有点を持つ
場合エッジを
生成
Covisibility
Graphから作
成した全域木
(Spanning Tree)
ORB-SLAMの仕組み
22
事前に作成した
VocabularyTree
ORB-SLAMの仕組み
23
キーフレームの
BoW表現
ORB-SLAMの仕組み
24
入力フレームから
Fastキーポイントと
ORB特徴抽出
ORB-SLAMの仕組み
25
• キーポイント追跡しカメラ
姿勢推定
• 前フレーム追跡失敗時
はBoWで対応キーフ
レーム検索
ORB-SLAMの仕組み
26
• キーポイントとMap上
の点とをマッチング
• カメラ姿勢再計算
ORB-SLAMの仕組み
27
• キーフレームの
条件を満たして
いるか判定
ORB-SLAMの仕組み
28
• キーフレームを挿入して
Covisibility Graphと
SpanningTreeを更新
• BoW表現を計算
ORB-SLAMの仕組み
29
• キーフレームの点
のうち、ロバストで
ないものを除去
ORB-SLAMの仕組み
30
• Covisibility Graph上の
隣接キーフレームを用
いてMap Points生成
ORB-SLAMの仕組み
31
• バンドル調整で現キー
フレームと隣接キーフ
レーム上の点とカメラ
姿勢を改善
ORB-SLAMの仕組み
32
• Covisibility Graph上の
隣接キーフレームのう
ち、他と重複の大きい
ものを除去
ORB-SLAMの仕組み
33
• Covisibility Graph
上のループ候補
を取得
ORB-SLAMの仕組み
34
• ループ上で隣接するキーフ
レーム間の対応点を算出
• キーフレーム間の相似変
換算出(3D to 3D)
ORB-SLAMの仕組み
35
• ループ候補を統合
• 相似変換を伝播させ
てカメラ姿勢補正
ORB-SLAMの仕組み
36
• Essential Graph上でLoop
Closingにより各カメラ姿勢
を最適化
• カメラ姿勢最適化後、点群
の位置を最適化
ORB-SLAMのコード
37
 ソースコード
 https://github.com/raulmur/ORB_SLAM2
 C++11
 ORB_SLAM2はORB_SLAMをステレオカメラとRGBD向け
に拡張したもの
 元のORB_SLAMのソースコードもあるが、単眼カメラの機能も
ORB_SLAM2に統合しているので、2を使うのが望ましい
 必要なライブラリをインストールしてbuild.shというシェル
を起動すればビルドできる。
 KITTI等の既存データセットを動かす場合
 リアルタイムで動作させたいときはROSをセットアップした後、
build_ros.shでビルド
ORB-SLAMの依存ライブラリ
38
 Pangolin
 ビジュアライゼーションに必要
 https://github.com/stevenlovegrove/Pangolin
 OpenCV (2.4.11と3.2でテスト)
 画像の操作と特徴量の抽出
 http://opencv.org
 Eigen3
 g2oを動かすのに必要
 http://eigen.tuxfamily.org
 DBoW2
 Place Recognitionに使用。ORB-SLAM2に同梱
 g2o
 幾何学的な最適化に使用。ORB-SLAM2に同梱
 ROS (Hydro or Newer)
 リアルタイムで動かす時、カメラ出力をROSのトピックとして動かす必要
 http://ros.org
ORB-SLAMのコード構成
39
メインのコード群
ビルドのスクリプト
リアルタイムカメラ入力を扱うためのビルドス
クリプト
各データセットのための試験コードやAR等の実
行ファイル
DBoW2とg2o
Place Recognitionを行うための学習済み辞書
データ
ORB-SLAMのコード
40
System.h
main()からcv::Mat形式の画像
を一枚一枚
System::TrackMonocular()で
Systemに渡す
Examplesフォルダにサンプル
ORB-SLAMのコード
41
System.h
Tracking.h
LocalMapping.h
LoopClosing.h
Map.hORBVocabulary.h
KeyFrameDatabase.h
Frame.h
KeyFrame.h
ORB-SLAMのコード
42
Read
Read/
Write
Read/Write
共有メモリ
Read/Write
Read
ORB-SLAMコードの特徴
43
 実装は論文通り
 論文とコードの対応を見つけやすい
 論文と実装が違うというケースも割とあるので
 ほとんど全てのパラメータがメンバ変数になっており、関数の
引数として渡されることがないため、各関数がどのようなパラ
メータに依存してるかが非常にわかりにくい。
 そのため、カスタマイズの影響範囲を見積もるのがツライ
 マルチスレッドなので尚ツライ。。。
 リアルタイム/マルチスレッドのため、デバッグがツライ。。。
 例えばLocal Mappingがデバッグ処理で遅れたらTrackingも止まる
 printfデバッグ
 なんかよい方法あったら教えて下さい。
まとめ
44
 単眼カメラによるSparseなVisual SLAM
 Tracking、Mapping、Loop Closingを別スレッドで動かすこ
とでリアルタイムに動作
 PTAMはTrackingとMappingのみ
 処理が高速でロバストな特徴量であるORBをTracking、
Mapping、Loop Closingで共通して使用
 Place Recognitionにも活用
 論文と照らし合わせながらソースコードを読んだ方が理
解が早い。
 マルチスレッドで処理が複雑、かつクラス同士が複雑に絡み
合っており、カスタマイズは非常にツライ。。。

20180424 orb slam