2017/06/10 CV勉強会@関東
「AR/VRを支える技術」発表資料
ORB-SLAMを動かしてみた
takmin
自己紹介
2
テクニカル・ソリューション・アーキテクト
皆川 卓也(みながわ たくや)
フリーエンジニア(ビジョン&ITラボ)
「コンピュータビジョン勉強会@関東」主催
博士(工学)
略歴:
1999-2003年
日本HP(後にアジレント・テクノロジーへ分社)にて、ITエンジニアとしてシステム構築、プリ
セールス、プロジェクトマネジメント、サポート等の業務に従事
2004-2009年
コンピュータビジョンを用いたシステム/アプリ/サービス開発等に従事
2007-2010年
慶應義塾大学大学院 後期博士課程にて、コンピュータビジョンを専攻
単位取得退学後、博士号取得(2014年)
2009年-現在
フリーランスとして、コンピュータビジョンのコンサル/研究/開発等に従事
http://visitlab.jp
昔作ったもの
3
 ARウェルカムボード (2010年)
 https://www.youtube.com/watch?v=KgQguj78qMA
 ソース: https://github.com/takmin/OpenCV-Marker-less-AR
今日はこの話はしません
Visual SLAM
4
ARにおいて、カメラで撮影した画像上に3Dオブジェクトを
重畳表示するためには、撮影対象の三次元形状とそれに
対するカメラの位置と姿勢を正確に求める必要がある
Simultaneous Localization And Mapping (SLAM)
Localization
Mapping
ORB-SLAMとは?
5
 単眼カメラの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
その他有名なVisual SLAM論文
6
 PTAM
 Klein, G., & Murray, D. (2007). Parallel tracking and mapping for
small AR workspaces. ISMAR.
 TrackingとMappingを別スレッドで動かすことでリアルタイム動
作
 FASTで取得した特徴点を画像パッチでマッチングして追跡
 DTAM
 Newcombe, R.A., Lovegrove, S. J., & Davison,A. J. (2011). DTAM:
DenseTracking and Mapping in Real-Time. ICCV.
 特徴点ではなく画素の値からDepthを推定することで密な地
図を構築(要GPU)
その他有名なVisual SLAM論文
7
 LSD-SLAM
 Engel, J., Schops,T., & Cremers, D. (2014). LSD-SLAM: Large-
Scale Direct monocular SLAM. ECCV
 画像の輝度勾配が大きいところのみDepth推定することで高
速化
 SVO
 Forster, C., Pizzoli, M., & Scaramuzza, D. (2014). SVO: Fast semi-
direct monocular visual odometry. ICRA
 地図の作製は特徴点ベースで行い(キーフレームのみ)、ト
ラッキング時に特徴点周辺の輝度が合うようにカメラポーズ
推定
ORB-SLAMの仕組み
8
ORB-SLAMの仕組み
9
 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
10
 画素ペアの大小でキーポイントと特徴量を計算するため、非
常に高速
 キーポイントは画像ピラミッドの各レベルでFASTにより検出
 キーポイント周辺の画素ペアの値の大小を0と1に割り当て(バイナ
リ特徴)
 バイナリ特徴のため省メモリ
 回転に対して不変
ORBで使用する画素ペア
(学習された例)
ORB-SLAMの仕組み
11
• XYZ(世界座標系)
• 代表ORB特徴
ORB-SLAMの仕組み
12
• キーフレームのカメ
ラパラメータ(内部/
外部)
• 全ORB特徴とMap
Pointsへのリンク
ORB-SLAMの仕組み
13
• キーフレームをノー
ドとした無向グラフ
• 共通するMap Points
が多いほどエッジの
重さが大きい
ORB-SLAMの仕組み
14
Covisibility Graphから
作成した全域木
キーフレームとグラフ表現
15
SpanningTree
に強いエッジ
を追加
15個以上の
共有点を持つ
場合エッジを
生成
Covisibility
Graphから作
成した全域木
(Spanning Tree)
ORB-SLAMの仕組み
16
事前に作成した
VocabularyTree
ORB-SLAMの仕組み
17
キーフレームの
BoW表現
ORB-SLAMの仕組み
18
入力フレームから
Fastキーポイントと
ORB特徴抽出
ORB-SLAMの仕組み
19
• キーポイント追跡しカメラ
姿勢推定
• 前フレーム追跡失敗時
はBoWで対応キーフ
レーム検索
ORB-SLAMの仕組み
20
• キーポイントとMap上
の点とをマッチング
• カメラ姿勢再計算
ORB-SLAMの仕組み
21
• キーフレームの
条件を満たして
いるか判定
ORB-SLAMの仕組み
22
• キーフレームを挿入して
Covisibility Graphと
SpanningTreeを更新
• BoW表現を計算
ORB-SLAMの仕組み
23
• キーフレームの点
のうち、ロバストで
ないものを除去
ORB-SLAMの仕組み
24
• Covisibility Graph上の
隣接キーフレームを用
いてMap Points生成
ORB-SLAMの仕組み
25
• バンドル調整で現キー
フレームと隣接キーフ
レーム上の点とカメラ
姿勢を改善
ORB-SLAMの仕組み
26
• Covisibility Graph上の
隣接キーフレームのう
ち、他と重複の大きい
ものを除去
ORB-SLAMの仕組み
27
• Covisibility Graph
上のループ候補
を取得
ORB-SLAMの仕組み
28
• ループ上で隣接するキーフ
レーム間の対応点を算出
• キーフレーム間の相似変
換算出(3D to 3D)
ORB-SLAMの仕組み
29
• ループ候補を統合
• 相似変換を伝播させ
てカメラ姿勢補正
ORB-SLAMの仕組み
30
• Essential Graph上でLoop
Closingにより各カメラ姿勢
を最適化
• カメラ姿勢最適化後、点群
の位置を最適化
ORB-SLAMを動かす
31
 ソースコード
 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の依存ライブラリ
32
 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のサンプル
33
 あらかじめ、以下のサンプルコードが用意されており、コ
ンパイルすれば使える。
 Examples/Monocular/mono_euroc.cc
 EuRoCデータセット用サンプル
 Examples/Monocular/mono_kitti.cc
 KITTIデータセット用サンプル
 Examples/Monocular/mono_tum.cc
 TUMデータセット用サンプル
 Examples/ROS/ORB_SLAM2/src/ros_mono.cc
 外部接続したカメラで動かすためのサンプル
 Examples/ROS/ORB_SLAM2/src/AR/ros_mono_ar.cc
 外部接続したカメラ映像にキューブを重畳表示するサンプル
外部接続カメラでORB-SLAMを動かす
34
 外部接続カメラを使用するのはROS (Robot Operating
System)とROS上でカメラを動かすためのモジュールをイ
ンストールする必要がある。
 例えば、 https://github.com/bosch-ros-pkg/usb_cam
 カメラから映像を取得するトピック名を
/camera/image_rawとして実行した状態で、ORB-SLAMの
ros_monoやros_mono_arを動かす
まとめ
35
 単眼カメラによるSparseなVisual SLAM
 Tracking、Mapping、Loop Closingを別スレッドで動かすこ
とでリアルタイムに動作
 PTAMはTrackingとMappingのみ
 処理が高速でロバストな特徴量であるORBをTracking、
Mapping、Loop Closingで共通して使用
 Place Recognitionにも活用
 ソースコードが公開されている
 C++11のサポートやROSの使用を考えるとLinux環境が良い

ORB-SLAMを動かしてみた