coding, photo, plant and demo

*Oculus入りしたKinect Fusion開発者の論文を流し読み

tech memo 20150530 214931
先日Oculusに買収されjoinしたRichard Newcombe氏らの論文を5つほど流し読みしましたので、適当な解説を加えて紹介します。
https://www.oculus.com/blog/announcing-the-acquisition-of-surreal-vision

DTAM: 単眼カメラでリアルタイムに3次元再構成 (2011年)


http://www.youtube.com/watch?v=Df9WhgibCQA

DTAM: Dense Tracking and Mapping in Real-Time
http://www.doc.ic.ac.uk/~ajd/Publications/newcombe_etal_iccv2011.pdf

DTAMの前にその全身となるPTAMについて。PTAMはいわゆるマーカーレスで自己位置推定をやる手法。画面上に特徴点を大量に見つけてそれらをマーカー代わりに追跡し続けることで自己位置を推定します。ただ、これは特徴点を見失った時に簡単に自己位置を見失う欠点があります。例えば、激しい動きでカメラがブレたり、フォーカスが合わなかったりすると、すぐロストします。そこでDTAMは特徴点を使わず、全体的にdenseにマッチングを取って自己位置を推定します。これでPTAMと比べ圧倒的にロバストになります。

PTAM (2007年)

http://www.youtube.com/watch?v=Y9HMn6bd-v8


そして副産物(?)としてPTAMでは得られなかった、詳細な3次元に再構成した環境マップも得られます。マップがあるということは、ARとかに応用もできるね、ってことでデモの最後に机の上に車を爆走させてます。この芸当はPTAMじゃできません。(PTAMでも平面を出すことくらいはできるけど)

DTAM解説スライド(日本語)
http://www.slideshare.net/yonetani/dtam

DTAMを実装した香港の人の動画。
http://www.youtube.com/watch?v=dKksb1wQmzs

Openな実装あり。
https://github.com/anuranbaka/OpenDTAM

KinectFusion: Depthカメラでリアルタイムに3次元再構成 (2011年)


http://www.youtube.com/watch?v=quGhaggn3cQ

KinectFusion: Real-Time Dense Surface Mapping and Tracking
http://research.microsoft.com/pubs/155378/ismar2011.pdf

KinectFusionはKinectを使ったリアルタイム3次元構成です。これは手軽だし精度も高いし試している人も多いということで、この中でも一番有名な論文と思われます。

デプスとカメラ行列がある時点で3次元再構成はできるわけですが、そのままでは写っている部分しか取れませんし、隠れている部分は取れませんし、ノイズも多いです。そこでデプスマップを毎フレームボクセルに統合することで、遮蔽された部分も含めノイズの少ない3次元再構成を可能にしています。

論文を読んでKinFuのコードを読んでいる人がいました。
Kinect Fusionのソースコードよみ
http://orenohanashiwokike.blog75.fc2.com/blog-entry-57.html

この人によるとKinectFusionは、下記の流れのようです。
1. デプスマップをカメラ行列を使って点群に変換
2. ICP(Iterative Closest Point)でカメラ位置姿勢を推定
3. 近傍の点群への距離を格納するボクセルを更新する(TSDF; Truncated Signed Distance Function)
4. レイマーチでTSDFから2次元へ射影して表示

カメラ行列(カメラパラメータとも呼ばれる)は、OpenCVの解説を読むと良いでしょう。
カメラ行列自体は3次元→2次元の射影なので、逆行列を使えば2次元→3次元の変換ができます。
http://opencv.jp/opencv-2svn/c/camera_calibration_and_3d_reconstruction.html

ICPに関しては下記が日本語の資料。
http://www.mm.media.kyoto-u.ac.jp/old/research/thesis/2011/b/nakai/nakai.pdf

ちなみにICPはフレーム間の動きが少なくて静的なシーンにしか使えないので、それを解決した4PCSというのがあるけどめちゃ重いので、さらにそれを高速化したSuper4PCSというアルゴリズムがある模様。
http://geometry.cs.ucl.ac.uk/projects/2014/super4PCS

で、TSDFを使ったところが最大のポイントだと思うのですが、sparseな空間をうまくkdtreeとかを使ってメモリ効率を上げるとかやっているわけではなく、豪快にメモリを確保している模様。シンプルイズベストって奴でしょうか、特にGPUでは。TSDFを使っているのはマージが簡単かつ並列化しやすいからのようです。truncatedなのは、点の傍のボクセルしか触らなくて済ませるためかな。TruncatedではないSigned Distance Functionでやるとvoxelを舐める量が半端無く増えちゃいますからね(その代わり、レイマーチは多少速くなるでしょうけど)。

論文を見ると性能のボトルネックはメモリのようです。
Although a large number of voxels can be visited that will not project into the current image, the simplicity of the kernel means operation time is memory, not computation, bound and with current GPU hardware over 65 gigavoxels/second (≈ 2ms per full volume update for a 5123 voxel reconstruction) can be updated.

あとはデプスマップにはノイズが結構載っているので、それでも動くようにロバストにしたのも凄いのかも。

KinectFusion自体のソースコードは公開されていませんが、論文を元に実装した猛者がいて、それがkinFuと呼ばれるものでPCL(Point Cloud Library)に入っています。
https://github.com/PointCloudLibrary/pcl/tree/master/gpu/kinfu

KinFuのざっくりとした解説。
https://homes.di.unimi.it/borghese/Teaching/IntelligentSystems/Documents/PirovanoMichele-VisualReconstructionReport.pdf

DynamicFusion: Depthカメラで非剛体もリアルタイムに3次元再構成(2015年)


http://www.youtube.com/watch?v=i1eZekcc_lM

DynamicFusion: Reconstruction and Tracking of Non-rigid Scenes in Real-Time
http://homes.cs.washington.edu/~newcombe/papers/DynamicFusion.pdf

DTAMもKinectFusionも静的なシーンの再構成しかできませんでした。つまり、撮っているシーンの中に動いている人などがあると再構成に失敗します。
しかし、DynamicFusionでは非剛体もリアルタイムに3次元再構成してしまいます。
動いている人だろうがリアルタイムにキャプチャしつつモデル化してしまうわけです。えらいことになってるな。

KinectFusionとの違いはwarp fieldというのを持っていることのようです。点群を適当な塊になるよう分割し、そのノードごとに変形前のノードに対する6DoFの変換行列を作ります。その行列を使えば変形前のTSDFに対してマージできるわけです。そのwarp fieldはどう更新するかというと、局所的なICPをやる模様。(斜め読みなので間違ってたらすみません)

なるほど言われてみればできそうな気もしますが、ただのアイディアから実際にまともにノイズなどに対してもロバストに、しかもリアルタイムに動かすっていうのは凄いことです。昔から、新しいアイディアを作る労力は1、それをモノにする労力は10、さらにそれをビジネスにする労力は100と言いますからね。

そのうちこれもDynFuとかいってPCLに実装されてしまうのかな。

SLAM++: 物体レベルの自己位置推定 (2013年)


http://www.youtube.com/watch?v=tmrAh1CqCRo

SLAM++: Simultaneous Localisation and Mapping at the Level of Objects
http://www.cv-foundation.org/openaccess/content_cvpr_2013/papers/Salas-Moreno_SLAM_Simultaneous_Localisation_2013_CVPR_paper.pdf

この論文でRichard Newcombe氏はセカンドオーサーですが、ファーストオーサーのRenato Salas-Moreno氏も同じ会社(Surreal Vjoin)で、同時にOculusに入っています。

一般的なSLAMと呼ばれるもの(PTAM等)は、プリミティブな特徴点や線を手がかりに自己位置を推定するのですが、これはオブジェクトを認識してそれで自己位置を推定するようです。denseにやると重いので、denseとプリミティブなものの中間解とも言えるのかも。
オブジェクト単位でやることで、マップが圧倒的に小さくて済むし探索が減るしロバスト性が向上する模様。というか、単純にオブジェクト認識が凄いですね。デモ動画(3:20辺りからのAR)もバカっぽくていい感じです。

やってることは、事前にオブジェクトを作ってデプスマップを入力しICPをGPUで回すという感じぽい。事前準備がいる時点で通常のSLAMの代わりにならないので、SLAM++という名前はやりすぎな感がありますが、これでオブジェクトの構築も同時にできたらもう人間レベルですね。

Dense Planar SLAM: 平面を利用したSLAM (2014年)


http://www.youtube.com/watch?v=KOG7yTz1iTA

Dense Planar SLAM
http://www.doc.ic.ac.uk/~rfs09/docs/salas-moreno_ismar2014.pdf

これもSLAM++と同じ人ですが、既にKinectFusionの人はオーサーにいないです。けど流れで拾ってみました。

SLAM++では物体を使って自己位置推定をしましたが、その物体以外の部分も物体のようなハイレベルで認識してやれば、速いし省メモリだしロバストなのでは?ということのようです。ではどうするのかというと、部屋の中なら大体は平面でできてるから、平面を認識してやればいいと考えたようです。確かにKinectは仕組み上、外ではまともに使えないから部屋に限定するのは正しい気がします。仮に外に出たとしても街なら平面だらけだし。

手順ですが、まずはGPUの力技でざっくり法線とかでラベリングして、PCA(Principal Component Analysis)で綺麗な法線を求めます。その平面に点群をマッピング(ここが難しそう)。あとは似た平面ができたらマージ。

これもSLAM自体の性能向上よりも、副産物として閉平面のグループが検出できるということ自体がARにとって面白いので、結局最後は壁にfacebook出したり遊んでて、SLAM++と同じノリを感じます。

雑感

もともとSLAMとかをやっている人たちってロボット工学の人なんだけど、ロボットのためにSLAMとかを研究していたらARやらVRへの応用が強烈に面白いことに気づいて、Oculusへ行くというのが面白いなと。


研究って本来の目的を追求していくうちに、副産物としてもっと面白いものが出てきてしまった、というのが真の成功というか革新なんだと思うわけです。例えば、電球を作るために研究していたら真空管(の元になるもの)ができちゃって、それでラジオや電信などの通信できるようになったかと思えば、それをさらに計算に応用する人が出てきたり。そして計算機を作るための集積回路を作っていたら、それがマイコンの原型になっちゃったり。電球からマイコンは微分できそうにないけど、間に真空管が入ると途端に微分可能そうにみえるのが面白いよね。

ロボット工学が電球で、VRがラジオなのだとしたら、VRの先に広がるものは何なんだろう。想像もつかないけど積分した果てはやっぱグレッグ・イーガンなんだろうか。

参考:
コンピュータビジョンのセカイ - 今そこにあるミライ
http://news.mynavi.jp/series/computer_vision/082

20.08.11 19:11 guest
1
20.08.11 19:11 guest
1
20.08.11 19:11 guest
1
20.08.11 19:11 guest
1
コメントする