Visual-SLAMのわかりにくい点を整理するブログ

大きな市場が見込めるロボット技術領域で競争が激化する昨今、その要素技術の1つであるSLAM(Simultaneous Localization And Mapping)も注目を集めています。しかし「なんとなくこんな処理だろう」と大雑把な理解はしているものの、いざ説明しようと思うと出来そうで出来ないのがSLAM。そこで、ちゃんと丁寧に内容を理解していこうというのが本日の内容です。

■SLAMの目的:

SLAMの目的は①自己位置推定と②マップ作成です。「えっ、目的が2つあるの?」となるかもしれませんが、正式名称も「Simultaneous Localization And Mapping」となっており、この2つは切っても切れない関係にあります。

空間内で自分がどの位置にいるのかを把握する自己位置推定では、そもそも「空間」がどのようになっているのか把握しなければ自己位置推定したところで情報量がありません。なにも存在しない無限遠方の3D空間で「アナタはいまココにいます」と世界座標系の(x,y,z)を用意されても困るわけです。

よって他オブジェクトが同じ座標系のどこにいるのかというマップがないと自己位置推定は意味を持たないわけです。

また、マップ作製も自己位置推定と密接な関係にあり、SLAMにおいて自己位置推定を抜きにMAP作成はできません。画像群を一括処理するSfMと比べてSLAMは逐次的に取得される画像からMAP作成するので、入力画像について「世界座標におけるどの位置からどの姿勢で撮影したのか?」という自己位置が推定できなければ入力画像から3次元を更新できません。

■SLAMの入力:

入力は画像です。RGBだったりRGB-Dだったりしますが、とにかく画像です。ただし異なる視点から複数回撮影された画像です。(1枚ずつ処理することもありますが)SLAMには複数の画像を用います。

■SLAMの出力:

出力は2つあります。1つ目はMapで、観測された対象物の世界座標系における3次元座標の集合です。ここには壁があって、ここには通路があって、という空間の把握に役立ちます。ただし観測された画像のあらゆる画素や特徴点がMap反映されるわけではありません。計算量が膨大になったり、対応点の算出が困難になったりするため、冗長な点を省いたり、特徴的な点だけをMapに反映することがあります。

2つ目の出力はPoseです、これは画像を撮影したときのカメラパラメータで、「どんなカメラでどの位置からどんな姿勢で撮影したのか」という情報に相当します。よって、カメラパラメータは画像1枚ごとに異なりますが、かといって全ての画像に対してカメラパラメータを推定するとは限りません。処理量が膨大になるのでカメラパラメータ推定を実行するのはMap作成に重要と判断した画像(これをKey- Flameと呼びます)だけで、冗長なものは間引くこともあります。カメラパラメータ推定は3次元空間内での自己位置推定と等価です。

カメラパラメータには内部パラメータと外部パラメータの2つがあります。内部パラメータとはカメラのスペックのようなもので、焦点距離やレンズ歪などに相当します。外部パラメータとは「世界座標系におけるカメラの位置&姿勢」とご理解ください(以下サイトの説明がわかりやすいです https://www.slideshare.net/takahashikousuke/camera-calibration-111239064)。

なお、カメラの内部パラメータは既知として、外部パラメータのみ推測するような問題設定が比較的多いです。

↓ Takahashiさんによるこの説明がわかりやすいです

 

■アルゴリズム:

Map推定結果とPose推定結果から「この位置からこの姿勢で撮影したらこういう画像ができるだろう」と計算された投影点、と、実際にカメラが撮影した観測点を比較して、誤差が最小となるようにMapとPoseを更新します。

■難しさ:

RGBで取得した画像を入力とした場合、画像からMap推定するときの中間過程に「Depth推定」が必要となります。つまり2次元のRGB画像から深度(Depth)を推定して3次元の世界座標系にマッピングするため、ここでも誤差が発生する可能性があります。Map推定の誤差なのか、Depth推定の誤差なのか、Pose推定の誤差なのか、見極めが難しくなります。

先述したように撮影した全画像についてマッピングや自己位置推定を行うと処理がいつまでも終わりません。よってMap推定に有効なサンプル(KeyFrame)を選定する必要があり、その選定方法について様々な手法が提案されています。
どの対象物(画素、特徴点)をMap推定やPose推定に使用するのかという選定にも工夫が必要です。特にPose推定については下手なものを用いるとカメラ間で対応が取れなかったりするためです。例えば濃度勾配が高い画素のみを推定に用いるなどの手法があります。

局所的には正確に対応点を取ってMapやPoseを推定できたとしても、それを逐次的に繰り返すうちに誤差が蓄積して、全体のMapやPose推定では歪みが出ることがあります。この対策として局所最適と全体最適の両方を取り入れた手法などが提案されています(Loop Closingなど)。

t-SNEをCUDA使って爆速で実行

機械学習の研究をしていると特徴量の分布を確認したくなることは多い。特にDomain Adaptationなどの研究になると分布の重なり具合の確認のために可視化が必要となる。

そういった場合によく用いられるのがt-SNEという手法だが、可視化のための低次元空間の算出の処理がとにかく重い。

うっかり多すぎるデータをINPUTしてしまうと、そのままフリーズしたりもする。

何か対策はないものか、、、と調べてたらあったよ(やっぱり)

 

 

機械学習の界隈は「こんなんあればなぁ」と思ったものはだいたい既に実装されているから恐ろしい、技術の進展早すぎ

論文: https://arxiv.org/abs/1807.11824

Code: https://github.com/CannyLab/tsne-cuda

Slide: https://hpml2018.github.io/HPML2018_6.pdf

Anacondaでのインストールも可能: https://anaconda.org/CannyLab/tsnecuda

 

めっちゃ早くなってるやん!!

 

なお、インストール後に『libcublas.so.<VERSION> not found』となった場合は

  • 『LD_LIBRARY_PATH』が正しいか確認
  • CUDAとマッチしたVerのtnsecudaをinstallしているか再確認