Visual Positioning Systemについて調査
調べていくうちに、VBIP(vision based indoor positioning)というものを発見した
indoorというの外には適用できないんだろうか、ちょっと調べてみる
そういえば、odometryってSLAMの中では移動量の基準となる値を指していたような
その中にVO(visual odometry)というものがあったので、このアルゴリズムを理解できればいいのではないか
odometryについて調べてたけど、これはどうやら移動量推定の文脈が多い
だから複数フレームを使って移動した経路なんかを求める感じ
今回やりたいのはシングルフレームでその場の3次元姿勢を推定することなので
ちょっと合わなさそう
調べていると、エピポーラとかRansacとか、PnPとか5天文台8点問題、なる単語が出てくる
おそらく主要なアルゴリズムなのだろう
気になるスライド
matlabにも何かありそう
このブログ、理解の起点にできそう
重要そう・使うそうな概念・単語など
- エピポーラ幾何学
- Pnp問題、n点問題
- RANSAC
- homography
homographyとは
ホモグラフィはオブジェクトプレーンをイメージプレーンにマッピングすることを指します。
Image-Based Localization(IBL)のサーベイ論文ポイの見つけた
一応これも有料だけど
Image based localizationをOne-Many RANSACというものによって最適化している論文
ICCVのエントリが良さげ
スライドpdfがでかい同じような目的の人がstackoverflowに質問してた
映像情報メディア学会誌vol76に、VPSの開発に関する記述を発見
3次元地図(点群)構築からサーバーサイド位置合わせまで書かれている
位置姿勢推定プロセスでは、 作成された3D地図を基に クエリ画像の位置と姿勢を計算する。 現在この処理は多く のGPU処理が必要となるため、 クラウド上にシステムを構 築し, クライアント端末からクエリ画像を送信し結果を得 るという形態が適切である。 サーバに送られたクエリ画像 に対し, 地図生成時と同様に動体除去や特徴抽出を行い、 3D地図の点群とマッチングする。 この一致した点に基づ いて, 3D座標と画像上の2D座標のPnP問題 20 を解くこと でクエリ画像の位置と姿勢を推定する。 結果は地図中の3 次元座標と3軸の回転を示すクオータニオンとなり、クラ イアントに返信される。クライアントは結果に基づき表示 を行うなどの処理を行う.
と書かれている
ん-密点群だから処理が重くなる→サーバー処理が適切、って感じなのかな
とはいえやはりPnP問題がカギになりそう
PnP、intrinsicsが必要だけど、これは計算できるから大丈夫なんだよな
Visual indoor positioning with a single camera using PnP
2015年の論文っぽい
IEEE Xplore
SIFTという単語が出てくる、特徴良抽出アルゴリズムなのかな
Combining Kinect and PnP for Camera Pose Estimationという論文
やはりPnPを使っている
この論文ではKinectの点群とカメラ画像の位置合わせだろうか
この論文では、クエリ画像とKinect点群の対応点のマッチングで
まずKinectのRGBとクエリ画像をマッチングさせて、それをdepthに適用している感じだ
なんか理解がちょっとかすった気がする、こういうことなのか?
なにやら気になる記事を発見、結構ドンピシャそうな気がする
SURF特徴、SIFTをより高速に処理できるように改良したものっぽい?
ARエンジンでもこれが使われてたりするんだろうか
コンピュータビジョンのための射影幾何学
この中でPnP問題を使ったカメラ位置姿勢推定の解説がある
PnPによるカメラの姿勢復元に関する解説、なんとサンプルコードまで載せてある
(↑のエントリはこの記事から見つけた)
OpenCVではEPnPという最適化されたPnPを内部で使っているらしい
なんとなく、2次元―3次元対応点がわかっていればできそうな気がしてきた
問題は、2次元画像特徴量と(特徴)点群の対応をどうするかだな
ところで気になるところ、RustのOpenCVクレートはwasmターゲットに対応していないらしい
wasmで動かしたいんだったら、OpenCVをwasm化して動かす、といったところかなぁ
PnPを使えば3次元姿勢を復元できることが分かった
そのためには2d-3dの特徴点マッチングが必要になる
なので今「局所特徴量 マッチング 2d 3d」とかで検索してみている状態
何となくいま思いついたのは、
まず特徴点群を特徴量平面(??)に射影して
それと画像の特徴点のマッチングを試みるというものだけど、精度悪そうだな
三次元物体の姿勢検出における 2D-3D マッチング手法
結構求めてそうなタイトルなので見て見る
Perspective-n-Point 問題とその派生問題に対する安定かつ高速な解法に関する研究
という論文。この中でも若干2d-3d対応について書かれている、けど
これ、全体を理解すればかなりカメラの姿勢復元について理解できそう
日本バーチャル学会誌に載ってる論文
マーカレスカメラトラッキングを強化するリハーサルパス法とのその実世界運用
LMDB(ランドマーク・データベース)の構築の方法や、提案法であるリハーサルパス法(RPM)について書かれている
これもカメラの姿勢復元が必要
従来法としてLMDBとの特徴点の対応付けを画像テンプレートというものでやっている
やはり、もともとLMDB相当のものは何かしらの点群でいいかなって思ってた
(Immersalのply点群とか)
でも実際LMDB作成の段階から開発したほうが良さそうだなこれ
そもそも特徴量を同じにしないと良い結果が期待できなさそう
ところでDaily Tech Blogさんのところで、SfMに関するエントリがあるのだけど
これもかなり参考になりそう
やはり特徴点の点群は必要になると思うし、
姿勢推定のところで画像―点群の特徴点マッチングを行っている
そしてSfMができているエントリが既にある
そしてなんとソースコードまで公開している、すご
ここの論文で記述されている、「局所特徴量記述」という説明でなるほどとなった
局所特徴量の因子分解表現によるキーポイントマッチングの高精度化に関する研究
局所特徴量は,画像から検出されたキーポイントの周辺画像の勾配やテクスチャ等の情報を特徴
ベクトルとして表現する.
なるほど、だからOpenCVのSIFT特徴量検出とかで、円とベクトルで表されていたんだ
画像の輝度値をそのまま特徴ベクトルとして採用した場合,照明変化や
ノイズの影響を大きく受けるため画像間で正確な対応点を求めることが困難である.そこで,局所
特徴量記述では勾配方向ヒストグラムやピクセル間の輝度差等の情報を用いて,照明変化やノイズ
の影響を受けにくい特徴ベクトルを計算する
画像局所特徴量に関するスライド(内容モリモリ)
やっぱりまずはランドマークDBというか、2次元特徴量にマッチする3次元点の集まりを表現しなくてはいけないよねって結論になってる
そして次のエントリでも書かれているんだけど、
SfMする過程で「特徴点群と画像特徴量のマッチングを行い、カメラの姿勢を推定する」という工程が発生する
ゆえにSfMさえできてしまえばVPSってできたと言っても過言ではないのでは??
こっちも、SfMのイメージがしやすい
画像ベースなのがありがたい
ここのリポジトリに、SfMのサンプルでよく見るデータセットがあるみたい
そしてopenMVGというものはSfMに関するライブラリ?っぽい
fountainというデータセット、よくみる
画像の他にも、カメラのintrinsicsとextrinsicsなどが入っている.cameraなるファイルがある
2759.48 0 1520.69
0 2764.16 1006.81
0 0 1
0 0 0
0.450927 -0.0945642 -0.887537
-0.892535 -0.0401974 -0.449183
0.00679989 0.994707 -0.102528
-7.28137 -7.57667 0.204446
3072 2048
おそらく、Camera行列3x4、回転行列3x3、位置ベクトル3x1、解像度w,h
かな
PTAMの資料、わかりやすい
SfMというよりSLAMの文脈のほうが近そうだけど、考え方が結構似通っている
OpenMVG、既知のカメラデータからSfMできるっぽい?
これはやってみたい
SfMの手順としては
- 画像の読み取り
- 特徴量の抽出
- 次の画像から特徴良抽出
- 特徴量のマッチング
- エピポーラ幾何による点群の構成
- 次の画像の特徴量抽出
- 一番特徴量が一致する画像とエピポーラによる点群構成
これを繰り返す感じだっけ
間違ってはいなさそうだけど、
このなかで特徴量マッチングの外れ値をRANSACで取り除いたり
そもそもessential行列からカメラ姿勢を推定するときに4つくらい解が出るので、それを除去したり
PnPでカメラ姿勢を推定してRANSAC使ってまた外れ値を取り除いたり
財後にBAしたり、いろいろやりそう
VisualSFMなるものもあるんだとか
日本語文献ありがたい
エピポーラについて、こちらで学習
opencvの実行環境、どうしようかなって迷ってたけど
やっぱりPython+pipenvがいいかなぁ今のところ
SfMについて、勉強会のスライドがよさげだった
SfMのサンプルプロジェクト
WindowsでもcmakeしてMSVCにビルドすればできるっぽい
SfM、今のところの理解
(定期的に言語化して理解の差分を見るよ)
- 2枚の画像から特徴量抽出
- 特徴量のマッチング
- マッチした点からEssential行列を計算
- Essential行列からFoundmental行列を計算しカメラの姿勢を復元
- 特徴点群を作成
- 画像特徴量と3次元点との対応からPnPを解いてカメラの姿勢を復元
これらの間にRANSACによる外れ値の除去とかBAが入る
Pythonのopencvのドキュメント
エピポーラ幾何でF行列を求める
海外のCV本を買って読んでみてる
Chapter4 Exploring Structure from Motionがあるので、それを参考に
Mastering OpenCVのExploring Structure from Motionでは
特徴点のマッチングにSURF特徴量を使う方法とOpticalFlowを使う方法が紹介されている感じかな
一見SURFの方が実装が簡単そうに見えるんだけど、OpticalFlowは点が多く検知されそうな気がする
とりあえず、手元のPythonで特徴量マッチングまで動かしてみた
特徴量はORBでやってるけど、ほかでも問題ない
色々頑張ったけどあまりうまくいかず、つらい
VPSを学び始めたのですが、にー兄さんの勉強過程で、有益な情報がたくさん得られました。ありがとうございます。