RTAB-Map source code memo

RTAB-Map のソースコードを読んでメモする。

https://introlab.3it.usherbrooke.ca/mediawiki-introlab/images/e/eb/Labbe14-IROS.pdf

A. Loop Closure Detection
For global loop closure detection, the bag-of-words approach
described in [16] is used. 
Briefly, this approach uses a bayesian filter to evaluate 
loop closure hypotheses over all previous images. 

bag-of-words

http://wiki.ros.org/rtabmap

bag-of-words アプローチを使っていると書いてある。

The loop closure detector uses a bag-of-words approach to determinate how likely a new image comes from a previous location or a new location.

bag-of-wordsは、ベイズ統計学の勉強をした時に出てきた。
迷惑メール分類などで使われている。
bag-of-wordsのwordsは自然言語のword(単語)のことのはず。 どのように画像(動画)の同一性の判定に使っているのか気になるので、その辺を重点的に調べてみる(予定)。

よく調べたらbag-of-wordsを画像に対して使うのは結構一般的っぽい。
Visual Wordsを用いた類似画像検索 - 人工知能に関する断創録

おべんきょうwiki - Bag-of-Features

git hub ソースコード

https://github.com/introlab/rtabmap/blob/master/corelib/src/Rtabmap.cpp#L806 Main Loop
process関数。

https://github.com/introlab/rtabmap/blob/master/corelib/include/rtabmap/core/Rtabmap.h
Rtabmapクラスのヘッダーファイル。
メンバー変数とメンバー関数の定義。

https://github.com/introlab/rtabmap/blob/master/corelib/src/Memory.cpp#L3116
Signatureという型のデータを生成している箇所と思われる。
https://github.com/introlab/rtabmap/blob/master/corelib/src/Memory.cpp#L3255
平面画像のKeyPointを生成している。

https://github.com/introlab/rtabmap/blob/master/corelib/include/rtabmap/core/Signature.h#L101
//visual words stuff
https://github.com/introlab/rtabmap/blob/master/corelib/include/rtabmap/core/Signature.h#L140
Signatureクラスの定義にある、KeyPointの配列。

std::multimap<int, cv::KeyPoint> _words; // word <id, keypoint>


https://github.com/introlab/rtabmap/blob/master/corelib/src/Signature.cpp#L177
float Signature::compareTo(const Signature & s) const
類似性の比較?

https://github.com/introlab/rtabmap/blob/master/corelib/src/Memory.cpp#L1340
std::map<int, float> Memory::computeLikelihood(const Signature * signature, const std::list & ids)
が Signature::compareTo()を使っている。

https://github.com/introlab/rtabmap/blob/master/corelib/src/Rtabmap.cpp#L1215
Rtabmap.cppのprocess()
1255行目 rawLikelihood = _memory->computeLikelihood(signature, signaturesToCompare);

https://github.com/introlab/rtabmap/blob/master/corelib/src/Features2d.cpp#L724 Surfを使ってKeyPointを抽出している箇所。

http://opencv.jp/opencv-2svn/cpp/features2d_common_interfaces_of_feature_detectors.html OpenCVのKeyPointクラス。
FeatureDetector

http://docs.ros.org/hydro/api/rtabmap/html/classrtabmap_1_1VisualWord.html

参考URL

http://dsp.stackexchange.com/questions/10423/why-do-we-use-keypoint-descriptors

http://dsp.stackexchange.com/questions/5995/what-algorithm-does-google-use-for-its-search-by-image-site