Closed75

Visual Positioning Systemについて調査

にー兄さんにー兄さん

調べていくうちに、VBIP(vision based indoor positioning)というものを発見した
indoorというの外には適用できないんだろうか、ちょっと調べてみる

にー兄さんにー兄さん

odometryについて調べてたけど、これはどうやら移動量推定の文脈が多い
だから複数フレームを使って移動した経路なんかを求める感じ

今回やりたいのはシングルフレームでその場の3次元姿勢を推定することなので
ちょっと合わなさそう

にー兄さんにー兄さん

調べていると、エピポーラとかRansacとか、PnPとか5天文台8点問題、なる単語が出てくる
おそらく主要なアルゴリズムなのだろう

にー兄さんにー兄さん

重要そう・使うそうな概念・単語など

  • エピポーラ幾何学
  • Pnp問題、n点問題
  • RANSAC
  • homography
にー兄さんにー兄さん

同じような目的の人がstackoverflowに質問してた
https://stackoverflow.com/questions/27140632/camera-pose-estimation?rq=1

にー兄さんにー兄さん

結構PnP問題について触れられている
そもそもPnPが2次元店から3次元店を求めるものらしいので、それはそうなのかな

にー兄さんにー兄さん

映像情報メディア学会誌vol76に、VPSの開発に関する記述を発見
https://www.jstage.jst.go.jp/article/itej/76/1/76_129/_pdf/-char/ja

3次元地図(点群)構築からサーバーサイド位置合わせまで書かれている

にー兄さんにー兄さん

位置姿勢推定プロセスでは、 作成された3D地図を基に クエリ画像の位置と姿勢を計算する。 現在この処理は多く のGPU処理が必要となるため、 クラウド上にシステムを構 築し, クライアント端末からクエリ画像を送信し結果を得 るという形態が適切である。 サーバに送られたクエリ画像 に対し, 地図生成時と同様に動体除去や特徴抽出を行い、 3D地図の点群とマッチングする。 この一致した点に基づ いて, 3D座標と画像上の2D座標のPnP問題 20 を解くこと でクエリ画像の位置と姿勢を推定する。 結果は地図中の3 次元座標と3軸の回転を示すクオータニオンとなり、クラ イアントに返信される。クライアントは結果に基づき表示 を行うなどの処理を行う.

と書かれている
ん-密点群だから処理が重くなる→サーバー処理が適切、って感じなのかな
とはいえやはりPnP問題がカギになりそう

PnP、intrinsicsが必要だけど、これは計算できるから大丈夫なんだよな

にー兄さんにー兄さん

Combining Kinect and PnP for Camera Pose Estimationという論文

https://pure.port.ac.uk/ws/portalfiles/portal/3645159/Combining_Kinect_and_PnP.pdf

やはりPnPを使っている
この論文ではKinectの点群とカメラ画像の位置合わせだろうか

にー兄さんにー兄さん

この論文では、クエリ画像とKinect点群の対応点のマッチングで
まずKinectのRGBとクエリ画像をマッチングさせて、それをdepthに適用している感じだ

にー兄さんにー兄さん

SURF特徴、SIFTをより高速に処理できるように改良したものっぽい?
ARエンジンでもこれが使われてたりするんだろうか

にー兄さんにー兄さん

なんとなく、2次元―3次元対応点がわかっていればできそうな気がしてきた
問題は、2次元画像特徴量と(特徴)点群の対応をどうするかだな

にー兄さんにー兄さん

PnPを使えば3次元姿勢を復元できることが分かった
そのためには2d-3dの特徴点マッチングが必要になる

なので今「局所特徴量 マッチング 2d 3d」とかで検索してみている状態

にー兄さんにー兄さん

何となくいま思いついたのは、
まず特徴点群を特徴量平面(??)に射影して
それと画像の特徴点のマッチングを試みるというものだけど、精度悪そうだな

にー兄さんにー兄さん

日本バーチャル学会誌に載ってる論文
マーカレスカメラトラッキングを強化するリハーサルパス法とのその実世界運用

http://www.rm.is.ritsumei.ac.jp/pdf/TVRSJ_RWI_ichikari.pdf

LMDB(ランドマーク・データベース)の構築の方法や、提案法であるリハーサルパス法(RPM)について書かれている
これもカメラの姿勢復元が必要

従来法としてLMDBとの特徴点の対応付けを画像テンプレートというものでやっている

にー兄さんにー兄さん

やはり、もともとLMDB相当のものは何かしらの点群でいいかなって思ってた
(Immersalのply点群とか)

でも実際LMDB作成の段階から開発したほうが良さそうだなこれ
そもそも特徴量を同じにしないと良い結果が期待できなさそう

にー兄さんにー兄さん

ところでDaily Tech Blogさんのところで、SfMに関するエントリがあるのだけど
これもかなり参考になりそう
https://daily-tech.hatenablog.com/entry/2019/08/04/032130

やはり特徴点の点群は必要になると思うし、
姿勢推定のところで画像―点群の特徴点マッチングを行っている

そしてSfMができているエントリが既にある
https://daily-tech.hatenablog.com/entry/2019/07/21/230633

そしてなんとソースコードまで公開している、すご
https://github.com/koichiHik/three_view_sfm/blob/master/src/main.cc

にー兄さんにー兄さん

ここの論文で記述されている、「局所特徴量記述」という説明でなるほどとなった

局所特徴量の因子分解表現によるキーポイントマッチングの高精度化に関する研究

http://mprg.jp/data/FLABResearchArchive/Doctor/D17/Paper/hasegawa.pdf

局所特徴量は,画像から検出されたキーポイントの周辺画像の勾配やテクスチャ等の情報を特徴
ベクトルとして表現する.

なるほど、だからOpenCVのSIFT特徴量検出とかで、円とベクトルで表されていたんだ


参照:http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_feature2d/py_surf_intro/py_surf_intro.html

画像の輝度値をそのまま特徴ベクトルとして採用した場合,照明変化や
ノイズの影響を大きく受けるため画像間で正確な対応点を求めることが困難である.そこで,局所
特徴量記述では勾配方向ヒストグラムやピクセル間の輝度差等の情報を用いて,照明変化やノイズ
の影響を受けにくい特徴ベクトルを計算する

にー兄さんにー兄さん

やっぱりまずはランドマークDBというか、2次元特徴量にマッチする3次元点の集まりを表現しなくてはいけないよねって結論になってる

そして次のエントリでも書かれているんだけど、
SfMする過程で「特徴点群と画像特徴量のマッチングを行い、カメラの姿勢を推定する」という工程が発生する
ゆえにSfMさえできてしまえばVPSってできたと言っても過言ではないのでは??
https://daily-tech.hatenablog.com/entry/2019/08/04/032130

にー兄さんにー兄さん

ここのリポジトリに、SfMのサンプルでよく見るデータセットがあるみたい
https://github.com/openMVG/SfM_quality_evaluation/tree/master/Benchmarking_Camera_Calibration_2008/Herz-Jesus-P25/images

そしてopenMVGというものはSfMに関するライブラリ?っぽい

にー兄さんにー兄さん

fountainというデータセット、よくみる

画像の他にも、カメラのintrinsicsとextrinsicsなどが入っている.cameraなるファイルがある

0000.jpg.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の文脈のほうが近そうだけど、考え方が結構似通っている

にー兄さんにー兄さん

SfMの手順としては

  1. 画像の読み取り
  2. 特徴量の抽出
  3. 次の画像から特徴良抽出
  4. 特徴量のマッチング
  5. エピポーラ幾何による点群の構成
  6. 次の画像の特徴量抽出
  7. 一番特徴量が一致する画像とエピポーラによる点群構成

これを繰り返す感じだっけ

にー兄さんにー兄さん

間違ってはいなさそうだけど、
このなかで特徴量マッチングの外れ値をRANSACで取り除いたり
そもそもessential行列からカメラ姿勢を推定するときに4つくらい解が出るので、それを除去したり
PnPでカメラ姿勢を推定してRANSAC使ってまた外れ値を取り除いたり
財後にBAしたり、いろいろやりそう

にー兄さんにー兄さん

SfM、今のところの理解
(定期的に言語化して理解の差分を見るよ)

  1. 2枚の画像から特徴量抽出
  2. 特徴量のマッチング
  3. マッチした点からEssential行列を計算
  4. Essential行列からFoundmental行列を計算しカメラの姿勢を復元
  5. 特徴点群を作成
  6. 画像特徴量と3次元点との対応からPnPを解いてカメラの姿勢を復元

これらの間にRANSACによる外れ値の除去とかBAが入る

にー兄さんにー兄さん

Mastering OpenCVのExploring Structure from Motionでは
特徴点のマッチングにSURF特徴量を使う方法とOpticalFlowを使う方法が紹介されている感じかな
一見SURFの方が実装が簡単そうに見えるんだけど、OpticalFlowは点が多く検知されそうな気がする

にー兄さんにー兄さん

とりあえず、手元のPythonで特徴量マッチングまで動かしてみた
特徴量はORBでやってるけど、ほかでも問題ない

arugoarugo

VPSを学び始めたのですが、にー兄さんの勉強過程で、有益な情報がたくさん得られました。ありがとうございます。

このスクラップは2022/03/29にクローズされました