空中測量研究室の技術ノート【2冊目】

山口大学の1研究室による研究メモです。UAV写真測量, ドローン測量, フォトグラメトリ, SfM/MVSなどと呼ばれる技術の情報があります。

checkSfMの新バージョンをリリース & マニュアル完成 !?

画像はイメージで、実際の表示とは異なります。

SfM/MVSによる写真測量・フォトグラメトリ解析ソフトAgisoft Metashape Professionalにおいて、SfM (Structure from Motion)の結果に関する多数の項目をチェックし、ミス・問題が疑われる場合はアラートを表示するプログラム"checkSfM"について、新バージョン:

ver_240904

をリリースしました!

  • 初版ver_240802からの変更点:アラートのメッセージを少し目立つようにしただけです。コンソールだけでなく、メッセージボックスとしても表示されるようにしました。
  • 使用条件・入手方法:checkSfM初版のページをご覧ください。入手には、上記のバージョン番号が必要です。

 

また、現時点で実装されている17のアラートについて、アラートの説明ページにて一通りの説明が完成しました:

kuchusokuryolab.hatenablog.com

文字ばかりで読みづらいですが・・・

 

checkSfMのアラートの説明と対処法

2024/8/2に初版をリリースしたcheckSfMについて、各アラートの説明と対処法を、このページに少しずつ書いていきます。

画像はイメージで、実際の表示とは異なります。

初版ver_240802や、次版ver_240904には、17のしゃがれたアラートしかなく、MetashapeのGUIでも容易に気付けるような基本的なものも多いです。checkSfMは時間のない技術者をターゲットにしているので、そのような初歩的なアラートでも、手動・目視でのチェック時間を短縮するという意義があると思っております。またニーズがあれば、今後、より高度なアラートたちを実装予定です。

 

初版ver_240802に実装されたアラートたち

  1. アラート "タイポイントの再投影誤差RMSが大きめです。"

    • 【簡単な説明】SfMは、多数の画像を「解釈」して、撮影の位置関係やカメラの特性、そして被写体の表面形状を推測するものだと言えます。このアラートは、その「解釈」に相当な自己矛盾が生じていることを意味します。SfMの品質に関する基本的な指標です。

    • 【MetashapeのGUIで確認できるか】チャンクの「情報表示」により、「RMS再プロジェクションエラー」として確認できます。

    • 【専門的な説明】全タイポイント(複数画像間で対応付けられた特徴点)の、全プロジェクション(対応付けられた全画像への投影;全画像上の位置)に関する再投影誤差(特徴点の、推定したカメラパラメータに基づいて推定した画像上の位置と、特徴点として検出された位置)のRMS (Root Mean Square)が、基準値を超えている場合に発出されます。画像だけで行うSfMは、画像間で対応する特徴点(タイポイント)を見つけた後、再投影誤差RMSを最小化するようにカメラパラメータ(撮影の位置・向きを表す外部パラメータと、カメラの焦点距離やレンズ歪みなどを表す内部パラメータ)を推定します。したがって再投影誤差RMSが大きいことは、SfMが見つけた画像間の特徴点の対応(マッチング)が、推定したカメラパラメータではうまく表現できていないことを示します。

    • 【原因と対策】このアラートは、様々な原因により生じます。撮影・被写体・補助情報(標定点や撮影位置の観測値など)・解析設定の、どれもが原因になりえます。例として、撮影時のピンボケ、被写体の表面形状や動き、解析時の画像の縮小(アラインメント精度を「中」以下に設定すること)、標定点関係のミスが挙げられます。このアラートだけで原因が特定できることはなく、明らかな心当たりがない場合、他のアラートや情報を見ながら原因を推測することが望まれます。また、被写体や使用カメラによっては、基準値が厳しすぎる可能性もありますので、ご自身の通常用途における「再投影誤差RMSの正常な値」の範囲を把握しておくことも大切です。

  2. アラート "アラインできていない画像があります。"

    • 【簡単な説明】撮影した位置・向きを推定できなかった画像があることを意味します。
    • 【MetashapeのGUIで確認できるか】アライン済みの画像数が、全画像数より小さいかどうかで、簡単に確認できます。
    • 【原因と対策】原因は通常、他の画像と対応する特徴点がほとんど見つからなかった(マッチングができなかった)ことです。他のどの画像とも大きく異なる位置・向きで撮影したことで、他のどの画像とも重なり(共通して写している被写体表面上の部分)がなかったり、あったとしても全く異なる見た目で写っていたりすると、マッチングができなくなります。それなら対策は単純明快で、「反省して撮り直し」です。ただし、当該画像のみの撮り方を見直せばよいとは限りません。アラインできなかった画像は少数枚でも、それは「氷山の一角」で、他のより多くの画像がマッチング不足に苦しんでいる恐れもありますので、統計情報"最もタイポイントが少ない画像のタイポイント数"や"1画像あたりの平均タイポイント数"を確認しましょう。これらが小さい場合には、全体的に撮り方を見直すべき状況かもしれません。
    • 【厄介なケース】ここでは詳述しませんが、特に撮り方に問題がなさそうでも、一部の画像のマッチングのほとんどが「無効」と判定されてしまい、アラインできないことがあります。誤ったマッチングを排除するための機構である「有効」「無効」判定が、裏目に出てしまうケースです。
  3. アラート "タイポイントが少ない画像があります。"

    • 【簡単な説明】撮影した位置・向きを推定できない(アラインできない)ほどではないが、それに近い状況の画像があったことを意味します。そうした画像は、撮影の位置・向きの推定精度に不安が残ります。
    • 【専門的な説明】アラインはできたが、タイポイントの数が基準値を下回る画像があった場合に発出されます。
    • 【MetashapeのGUIで確認できるか】カメラの座標データの表の「プロジェクション」列の最小値として確認できます。
    • 【原因と対策】原因と対策はアラート"アラインできていない画像があります。"に準じます。
  4. アラート "画像2枚でしかマッチングできていないタイポイントが多いです。"

    • 【簡単な説明】同じ1つのタイポイントでも、2枚の画像間のみでマッチングされたタイポイントより、3枚以上の画像間でマッチングされたタイポイントの方が、信頼でき(ミスマッチである可能性が低く)、かつ役立ちます(撮影の位置関係やカメラの特性を推測するためのより多くの手掛かりをくれます)。このアラートは、タイポイントが「平均何枚の画像間でマッチングされているか」が、基準値を下回ると発出されます。
    • 【原因と対策】原因と対策はアラート"アラインできていない画像があります。"と似ていますが、このアラートは個々の画像ではなく画像全体に関する指摘です。例えば、被写体の表面に細かな凹凸がある場合、少しでも視線の向きが変わると見た目が大きく変わりますので、同じ点を多数の画像間でマッチングすることが難しく、このアラートが出やすくなります。対策は、隣接画像間の重複率(オーバーラップ率)を大きめにとることです。
  5. アラート "fの推定が不安定です。"

    • 【簡単な説明】写真測量のためのSfMでは、カメラの焦点距離を非常に精密に求める必要があります。なぜなら、写真に写った被写体までの距離の推定値が、この焦点距離に比例するからです。例えばUAV写真測量で、地上100 mの高さから下向きに写真を撮る場合、焦点距離の推定値に1/1000の誤差があるだけで、地表面の高さの推定値が100 * (1/1000) = 0.1 mもずれてしまいます。このアラートは、この焦点距離の推定値に、自信が持てない状況を表します。放置すると、被写体との距離の推定に大きな誤差が生じ得ます。
    • 【専門的な説明】Brownのカメラモデルにおける、焦点距離(画面距離)に対応する内部パラメータfの、バンドル調整による推定に関するアラートです。fの標準偏差推定値と推定値の比が、基準値を上回るカメラグループがある場合に発出されます。
    • 【原因と対策】平行光軸撮影(すべてのカメラの正面の向きが同じ撮影)では数学的に焦点距離不定、つまり定まりません(Critical Motion)ので、まずはそれに近い撮り方になっていないか確認が必要です。また、もう少し複雑な撮り方でも、地表面の形状が単純な状況では数学的に焦点距離不定になる場合があります (Critical Configuration)。こうした不定性を避けるのに一般に有効な対策は、向きの撮影を加えるなどして、光軸の向きに多様性を持たせることです。どうしても平行光軸撮影を実施する必要がある場合には、同一平面上にない標定点を多数設置するという対策もあります。
  6. アラート "標定点がありません。"

    • 【説明】標定点 (Control Point)がないことを知らせるアラートです。意図的なものでしたら無視して構いません。
  7. アラート "標定点の数が少なく、ジオリファレンスにすら足りない数です。"

    • 【説明】標定点の2つの役割として、(i) ジオリファレンス(SfMで推定されるカメラの位置・向き、タイポイントの位置などを、地球に固定された座標系などの絶対的な座標系に関連付けること)、(ii) カメラパラメータ推定の補助、があります。Metashapeの操作方法によって、(i)の役割だけを担わせたり、(i)(ii)両方の役割を担わせたりすることができます。ただし(i)の役割だけを担わせる場合でも、標定点は3点以上必要です。このアラートは、標定点数が基準値(3です;このアラートに関しては基準値に調整の余地はありません)未満であり、標定点だけでは(i)のジオリファレンスすらできないことを示しています。標定点以外に(i)に使えるもの(例:撮影位置のRTK-GNSS測位解)があるなどの理由で、意図的に標定点を減らしているのなら、無視して構いません。
  8. アラート "標定点残差RMSが目標精度を超えています。"

    • 【説明】全標定点 (Control Point)に関する「推定位置と観測位置の距離」のRMSが、checkSfMにユーザーが入力した目標精度を超えていることを意味します。この場合、検証点誤差RMSが目標精度以内になることは、統計学的に期待薄です。標定点による拘束と他の拘束(タイポイントによる拘束や、撮影位置・向きの観測値による拘束など)に、相当な矛盾があります。
    • 【原因と対策】原因としては、画像上のマーカーの設置のミス、座標の入力ミス、マーカー精度 (m)やマーカー精度 (pix)などの不適切な設定、標定点マーカーの設置後の「カメラの最適化」(バンドル調整)実施忘れ、推定する内部パラメータ(k1, p1など)の選択不足などが挙げられます。その他、アラート"マーカー精度(m)が目標精度に対して大きすぎます。"、"再投影誤差RMSが1画素を超えているマーカーがあります。"、"再投影誤差が3画素を超えているマーカーのプロジェクションがあります。"と同じ原因で生じることもあります。
  9. アラート "標定点残差最大値が目標精度を超えています。"

    • 【説明】全標定点 (Control Point)に関する「推定位置と観測位置の距離」の最大値が、checkSfMにユーザーが入力した目標精度を超えていることを意味します。少なくとも1つの標定点については、拘束と他の拘束(タイポイントによる拘束や、撮影位置・向きの観測値による拘束など)に、相当な矛盾があります。
    • 【原因と対策】原因と対策は "標定点残差RMSが目標精度を超えています。"に準じます。特に、標定点残差(「推定位置と観測位置の距離」)が最大となった標定点を重点的に確認しましょう。
  10. アラート "検証点がありません。"

    • 【説明】検証点 (Check Point)がないことを知らせるアラートです。被写体上にマーカー(対空標識など)として配置された検証点は、写真測量のためのSfMにとっては、重要な精度評価の手段です。ただし、別の方法で精度検証をする意図がある場合は、無視して構いません。別の方法とは例えば、SfMで作られるタイポイント、SfMの後でMVSによって作られる密な点群、またはそれらから作られるDSMなどを、レーザースキャナによる面的な成果物などと比較する方法です。もちろん、比較対象の精度にも注意が要ります。

    • 【原因と対策】被写体上にマーカー(対空標識など)を置いて座標が実測できる点が少ない、またはその作業に労力をかけられないという理由で、すべてのマーカーを標定点にしてしまい、検証点が0になっているケースが散見されます。しかし検証点がないと、通常、精度評価が困難になります。「交差検証」によって、マーカーに両役を兼ねさせるなどしてでも、検証点誤差を評価するべきでしょう。

  11. アラート "検証点の数が少なく、検証点誤差のRMSなどの統計量が安定しません。"

    • 【説明】検証点 (Check Point)の数が基準値未満であることを示します。推測統計学的には、検証点は被写体上に設けられた、精度チェックのための「標本」点だと言えます。一般に、標本の平均・標準偏差RMSなどの統計量は、ある程度のサンプル数がないと安定しません(その統計量自体の分散が大きくなります)。精度評価に用いられる検証点誤差RMSなども然りです。また、検証点の数が少ないと、その写真測量で測られる被写体表面に関する代表性も乏しくなるでしょう。
  12. アラート "検証点誤差RMSが目標精度を超えています。"

    • 【説明】全検証点に関する「推定位置と観測位置の距離」のRMSが、その目標値(checkSfMにユーザーが入力した目標精度)を超えていることを意味します。検証点誤差RMSは、写真測量のSfM段階での精度に関する代表的な評価指標ですので、これはアラートにしなくとも、ユーザーはcheckSfMの実行前に既に気づいているでしょう。ただ、checkSfMの出力としても「目標精度が不達成であること」を明示するため、一応アラートにしてあります。
  13. アラート "再投影誤差RMSが1画素を超えているマーカーがあります。"

    • 【簡単な説明】少なくとも1つのマーカーを、いくつかの画像上に置いた(ユーザーが目視と手で設置した、Metashapeが自動検出した、またはMetashapeによる補助のもとユーザーが設置した)位置が、SfMの結果(撮影位置や向き、カメラの画角や歪みの推定結果)と、少なからず矛盾していることを示します。この矛盾度(再投影誤差)の、そのマーカーを置いたすべての画像に関するRMSをチェックして発出されます。
    • 【原因と対策】原因としては、いくつかの画像上でのマーカーの置き方(位置の観測)が杜撰である、画像が不鮮明である、あるいはSfMの方に大きな誤りがある、などが考えられます。再投影誤差(Metashape GUI上での誤差 (pix))が大きいマーカーを中心に、マーカーを各画像上に置いた位置をチェックしましょう。再投影誤差が顕著に大きい場合は、マーカーを別のマーカーと見間違えている可能性もあります。
  14. アラート "再投影誤差が3画素を超えているマーカーのプロジェクションがあります。"

    • 【説明】アラート "再投影誤差RMSが1画素を超えているマーカーがあります。"と似ていますが、こちらのアラートは、マーカーを置いた位置とSfMの結果の矛盾度(再投影誤差)について、マーカーを置いた全ての画像について集計する(RMSを計算する)代わりに、個々の画像について検査し、少なくとも1枚の画像で3画素を超えていた場合に発出されます。
    • 【原因と対策】アラート "再投影誤差RMSが1画素を超えているマーカーがあります。"に準じます。
  15. アラート "プロジェクション数が5未満のマーカーがあります。"

    • 【説明】マーカーを置いた(ユーザーが目視と手で設置した、Metashapeが自動検出した、またはMetashapeによる補助のもとユーザーが設置した)画像の数(「プロジェクション」列の値)が5未満のマーカーがあることを知らせます。この数が小さいと、マーカーが標定点の場合、標定点としての効力が小さくなります(マーカーが生み出す方程式の数は、プロジェクションの数に比例します)。またマーカーが検証点の場合、検証点の座標推定(三角測量)自体が不安定になる(分散が大きくなる)ため、SfM自体がうまくいっていても検証点誤差が大きくなる傾向が生じます。
    • 【原因と対策】マーカーを標定点(あるいはスケールバーの端点)や検証点として使うなら、十分な数の画像上に設置しましょう。マーカーを被写体上に設置して位置を測定した手間に比べれば、大したことはないはずです。
  16. アラート "マーカー精度(m)が目標精度に対して大きすぎます。"

    • 【説明】「座標設定」ダイアログの設定項目である「マーカー精度 (m)」は、マーカーの世界座標の観測(現場での測量など)に期待する誤差の標準偏差あるいはRMSです。「マーカー精度 (m)」はX, Y, Zの方向別に定義されていますが、それを3軸合成したもの(それらを成分とする3次元ベクトルの長さ)が、目標精度(検証点誤差RMSの目標値)を超えていることを、このアラートは意味します。検証点マーカーの座標の観測の時点で、目標精度を超える誤差が出ていると思われるわけですから、SfMに一切の誤差がなくとも、目標精度の達成が統計学的に期待薄です。
    • 【原因と対策】まずは「マーカー精度 (m)」の設定が適切か(世界座標の観測方法の精度に合っているか)を確認しましょう。注意点として、Metashapeの「座標設定」ダイアログで一律に設定している場合、例えば「マーカー精度 (m)」欄に0.03と記入してあれば、X, Y, Z方向それぞれに0.03 mと設定していることになり、3軸合成値はその√3倍になります。もし、X, Y方向は0.01 m、Z方向は0.02 mと設定したければ、0.01/0.01/0.02または0.01/0.02と入力する必要があります。「マーカー精度 (m)」の設定が適切であるにも関わらずこのアラートが出る場合、残念ながらその世界座標の観測精度では、目標精度を満たしているかの判断はできません。例えば、マーカーをRTK-GNSS測量で測っているのに、目標精度が0.005 mというのは無理があるでしょう。
  17. アラート "3次元座標が推定されているマーカーがありません。"

    • 【説明】SfMやその精度評価のために使えるマーカーがないことを知らせるアラートです。主にマーカーの準備忘れを警告することを意図しています。
    • 【原因と対策】原因として、マーカー自体を作っていない、または、マーカーの名前と実測座標をインポートしたものの画像上に設置していない、などが想定されます。マーカーの3次元座標が推定されるには、アラインされた(撮影の位置や向きが推定された)2枚以上の画像上に設置される必要があります。そうでなければ、標定点としても検証点としても、そして手動のタイポイント (MTP)としても使えません。

 

SfMの無料AI診断!?あなたのMetashapeプロジェクトをチェックします:checkSfMをリリース!

【概要】

SfM/MVSによる写真測量・フォトグラメトリ解析ソフトAgisoft Metashape Professionalにおいて、

SfM ( Structure from Motion)の結果に関する多数の項目をチェックし、

ミス・問題が疑われる場合はアラートを表示するプログラム"checkSfM"をリリース!

 

MetashapeでSfM工程「写真のアラインメント」を実行後、

  • 結果が正常かどうか、細かくチェックする時間のない方
  • 何をチェックしていいのかわからない方
  • 検証点誤差が大きいが、原因がわからない/原因を探す時間がない方

に、少しでも役立てていただければ幸いです。

画像はイメージで、実際の表示とは異なります。

【プロローグ1:SfMは正しく使われていないことも多い】

ここ数年、私はたくさんの技術者・研究者から、SfM (Structure from Motion)を使った写真測量などの精度に関する悩み相談を受けてきました。そしてそこで受けた印象は、

日本の技術者・研究者には時間がない!

ということでした。

特に、写真測量・フォトグラメトリの解析の第1ステップとしてSfMを実施するとき、

  • SfMの仕組みを十分勉強する時間もなく、
  • SfMの結果を細かくチェックする時間もなく、

初歩的な問題や間違いによって精度の悪い結果になっているケースが多いと感じます。ちょっとした知識不足やミスで、本来2 cmにできる検証点誤差が容易に20 cm, 200 cmにも膨れ上がってしまうのが、SfMの怖いところです。

問題に気づかず、または解決方法がわからず、そのままMVS(密な点群の生成)工程に進めば、正常な成果物は当然得られません。その結果、写真測量は精度が悪い・諦めよう、という結論になるのは、残念なことです。

 

【プロローグ2:精度を極めるためのプログラムより必要なものは】

5年前にリリースしたAgisoft Metashape用Pythonプログラム:repeatSfM 

ameblo.jp

は、SfMを多数の解析設定で繰り返し、持っている画像でできるだけ高精度を得られる解析設定を探そうというプログラムでした。しかしいま思えば、基本を押さえた上で、さらに精度を極める時間のある技術者/研究者は、日本にどれだけいるのでしょう?

 

【本題:無料SfM診断?checkSfM】

おそらく、いま多くの方にニーズがあるのは、

時間不足で生じた問題やミスを発見してくれる、最低限のチェックプログラムではないかと思います。今回リリースするcheckSfMは、そんなプログラムです。

具体的には、Agisoft社のMetashape Professional上で実行できるPythonプログラムで、SfMの結果について多数の項目をチェックし、ミス・問題が疑われる場合にはアラートで指摘してくれます。

 

現時点のバージョン ver_240802 では、実態としては数日前から作り始めただけの、

  1. チェックする項目や出せるアラートの数が多くない
  2. 一般の使用に耐えるように設計・調整したものでもない。アラートの発出基準も当研究室向け
  3. 各アラートについて、想定される原因、対応方法に関する説明が未完成
  4. アラートといってもprint文でメッセージが表示されるだけの味気ないもの

というプロトタイプ的、ver0.1的なものですが、それでも、

ということで、リリースさせていただきます。当研究室でも利用予定です。

 

本プログラムは無償ですが、著者によるニーズ把握などの目的から、簡単な利用申請後にダウンロードいただく形式をとっています。

利用をご希望の方は、先に下記の説明文(プログラム同梱のREADMEファイルとほぼ同内容)をお読みいただき、注意事項を理解して使用条件に同意いただける場合、ページの末尾より利用申請フォームにお進みください

 

――――― checkSfMの説明文 ―――――

【プログラム名】 checkSfM

【機能】 Agisoft Metashapeで実施したSfMについて、多数の項目をチェックし、ミスや問題が疑われる場合はアラートを表示します。

【使用方法】

  1. main_checkSfM.py と lib_checkSfM.pyを、同じフォルダに入れます。
  2. チェックしたいプロジェクトを、Agisoft Metashape Professionalで開きます。このプロジェクトは、
    1. SfMつまり「写真のアラインメント」 (Align Photos)が済んだものでなければなりません。
    2. 標定点 (Control Point)や検証点 (Check Point)のマーカーを各3点以上含むプロジェクトであることが推奨されます。
    3. 「写真のアラインメント」後、マーカーを設置し、標定点マーカーの座標ソース値にチェックを入れて「カメラを最適化」 (Optimize Cameras)を実行した後のプロジェクトが理想です。
  3. リッチPythonコンソール (rich Python console)を表示する設定にします。
  4. スクリプトを実行」 (Run script)で、main_checkSfM.pyを実行します。
  5. ダイアログが出てきますので、目標精度(※)を、m単位で入力してください。その後、実行に少し時間がかかりますが、Metashapeのウィンドウを操作しないでください。
  6. 実行が終了したら、コンソールに表示されたメッセージを確認します。!!から始まる行(アラート)が表示されている場合は、SfMの過程にミスや問題が潜んでいる可能性があります。

※ 本プログラムは、実行直後にユーザーに、目標精度の入力を求めます。ここで目標精度とは「検証点のSfMの結果(カメラパラメータ)に基づく推定位置と、現地地上測量などによる観測位置の距離 [m]の、RMS(Root Mean Square;代表値の1つで、平均より大きい)」です。短く書けば、検証点誤差(3軸合成)のRMSとなります。同じプロジェクトをcheckSfMにチェックさせても、目標精度次第で、アラートが出たり出なかったりします。

 

【著者/Author】 Ariyo Kanno

著作権に関する注意事項/Notes on copyright】
本プログラムの一部は、Agisoft Forum (https://www.agisoft.com/forum/)において、ユーザーからの質問に対してAgisoft Technical SupportのAlexey Pasumansky氏が投稿したコードをコピーして作られています。該当箇所にはコピーしたコードのあるURLを示しています。
This source code is partially made by copying the source code posted by Alexey Pasumansky (Agisoft Technical Support) to Agisoft Forum (https://www.agisoft.com/forum/).

【使用条件/Terms of use】

  1. 本プログラムを利用して直接的・間接的に生じた一切の損失に対し、著者(神野有生)および関係者は一切の責任を負いません。
  2. 本プログラムについて何事も保証できませんし、質問に答えることは約束できません。
  3. 本プログラムは、著者から直接提供された、または指定された方法で利用申請した本人のみが利用できます。加工の有無に関わらず、他者への提供、再配布を禁止します。

【他の注意事項】

  1. 基本的には、空中測量研究室の内部使用を想定した簡単なプログラムであって、広く一般の使用に耐えるように設計・調整したものではないことを、ご了承ください。
  2. 現時点では、チャンクで複数の座標系が使用されている場合(例:カメラとマーカーに異なる座標系が設定されている場合)には対応していません。その他、著者が想定していない状況のプロジェクトでは、エラー終了する可能性があります。
  3. アラートを表示する基準は、著者のMetashapeの用途を想定して「適当に」設定されています。用途に合わせて、"alert"が登場する行のif文の条件式を変更してください。
  4. リリース前のテストは非常に限られています。特にMetashapeのバージョンが異なると、APIの違いにより、正常に動作しない可能性があります。

【開発環境】
Agisoft Metashape Professional Version 2.1.1 build 17821 (64bit)
Windows 10 Home

――――――――――

 

注意事項を理解して使用条件に同意いただける場合、利用申請フォーム 

docs.google.com

にお進みください。

 

【最後に:周知のお願い(2024/8/6加筆)】

checkSfMのリリースは、工学の研究者として業界のニーズの調査の意味合いがあり、checkSfMの今後のアップデートは、ニーズ次第と考えております。たくさんダウンロードいただいたり、フィードバックをいただいたりすると、著者は「やはりニーズがある」と工学的意義に自信を持って、アラート発出基準の研究やそれに基づく機能の拡充に取り組むことになります。そのため、(著者が全く使えていない)SNSで周知いただくことは、有難いことです。既にご協力いただいた皆様、ありがとうございます。

 

【GNSS勉強メモ】SNRとCNRの違いは何か

GNSSの信号の強度あるいは品質の指標として使われる、SNR (Signal-to-Noise Ratio; S/N)CNR (Carrier-to-Noise Ratio; C/No)の違いは何だろうか。

私が少し調べた限りでは、

  1. 人により、同じ意味で使われることもあるようだし、定義が異なることもあるようだ。
  2. Richardson et al.(2016)によると、SNRとCNRはともにコード変調された信号における信号パワーとノイズパワーの比であるが、SNRは受信機内の相関器で計算されるもので、CNR(C/Noと表記されることもある)は(増幅前の)受信アンテナにおける値とのことだ(定義αとする)。信号もノイズも、アンテナと相関器の間で同じくらいの倍率で増幅されるので、CNRとSNRの値はほぼ同じと考えて良いとのこと。
  3. Richardson et al.(2016)に引用されているLangley (1997)によると、C/Noは Carrier-to-Noise density Ratioの略で、ベースバンドの1 Hz帯域幅における搬送波のパワーとノイズパワーの比とされている。そして文脈を見ると、どうやら復調後に評価するようだ。CNRの名前からするとこちらの定義の方が納得がいく(定義βとする)。
  4. IGSによるRINEXフォーマットの定義では、5.7節のTable 12などを見る限り、S/NとCNRは同義に使われている。そしてObservation codeがSnaの形式になっているデータは、搬送波の観測がある限り、搬送波に関するものつまり上記βに対応するもののようだ。例えば下図の例では、データ部の4列目がこれに該当し、最初のエポックにおけるG21のCNRは45だ(単位はおそらくdBHz)。なお、RTKLIBのRTKPlotではRINEXファイルのこの列をそのままSNRとして表示しているようだ(RTKPlotとテキストエディタで同じ.obsファイルを開いて確認)。受信機を制御するアプリDrogger GPSでリアルタイムで見られるCNRや、NMEAログに記録できるCNRがこれ(RINEXファイルで見られるCNR)と同じかどうかは未確認
  5. RINEXファイル (ver.3.02)の冒頭部分の例
  6. 定義βにおけるCNRは、マルチパスにどのように影響されるのだろうか。直達波に、波形が崩れた反射波が重なっただけなら、ノイズが増えたことになってCNRは低下しそうだ。一方、直達波に、波形を保った反射波が重なってしまったら、位相の関係によって搬送波の振幅が見かけ上大きくなったり、小さくなったりするはずだ。従って一概に、CNRが高ければマルチパスの影響が小さいとも言えないように思われる。以前の記事でも引用させてもらった鈴木 (2016)によれば、「マルチパスの影響によってその値が落ち込んだり、また逆に増幅されたりなど値が大きく変動する。しかし、マルチパスが存在しないときには、C/No 比は衛星の仰角による。 」とある。またこちらの記事によると、マルチパスは誤差のうち比較的高周波の変動成分の原因とみなされるようだ。つまり、例えば各衛星のCNRが仰角の滑らかな関数のように推移し、小刻みで大きな変動がなければ、マルチパスの影響は少なそうと言えそうだ。

 

【GNSS勉強メモ】水面によるマルチパス関連

UAV写真測量はGNSSにべったり頼るものだが、私のGNSSの勉強は遅々としてあまり進んでいない。次に勉強する時間が手に入ったときのために、現状の疑問点・課題をメモしておく。赤字は今後の課題となるところ。

 

  • 水面は、マルチパスの原因の1つとして目されているらしい。広い水面の見える場所にアンテナを置く場合には注意が必要のようだ。
  • マルチパスの影響には、擬似距離の計算に対する影響と、搬送波の位相測定に対する影響があるらしい。
  • 擬似距離の計算において、マルチパスは「受信機内のコードのレプリカと、受信電波に乗ったコードの相関をとって時間差を測る処理(相関がいちばん強くなる時間差を求める処理)」を邪魔する働きをする:
    https://www.denshi.e.kaiyodai.ac.jp/wp-content/uploads/pdf/investigation/030727.pdf
    https://www.denshi.e.kaiyodai.ac.jp/wp-content/uploads/pdf/investigation/20040523.pdf
    が、反射波と直達波の伝搬距離の違いが大きければ、相関のピークとなる時間差への影響が小さくなるので測位解に影響しにくい。
  • 水面反射波と直達波を比べたときの伝搬距離の増分を、平面波を仮定して幾何光学的に考えてみると、下図のようになった。数値例のとおり、アンテナの水面からの高さが数 m程度と低くては、伝搬距離の差もコードの波長に比べて小さなものになる。また同じアンテナ高さなら、入射角が大きい反射波ほど、つまり水平線近くから飛んでくる反射波ほど、伝搬距離の差が生じにくく、コード測位にとっては厄介そうだ。

  • 一方で搬送波については、反射波が重なることで位相が変わるので、そもそも伝搬距離の違いが大きくても搬送波位相測定への影響が小さいとは言えないように思う(空気中での減衰を無視すれば)。水面の各部からの反射波のうち、無害な反射波とは、上図の2 h cosθが大きい反射波ではなく、それが波長で割り切れる反射波か、水面での反射率が小さかった反射波だろう。
  • 水面を平面とみなしたとき、電波は水面で鏡面反射することになるが、その反射係数や反射率は、私がよく使ってきた可視光と同じくフレネル (Fresnel)の式に従うようだ

屈折率1の空気から屈折率1.33の水に可視光が入射するときの反射係数(フレネルの式)

屈折率1の空気から屈折率1.33の水に可視光が入射するときの反射係数(フレネルの式)
  • ただし、Fresnelの式に登場する水の屈折率は周波数に依存し、光(約1.33)と電波では異なり、Fresnelの式を使いたければGNSSで使われる電波の周波数における屈折率を調べるか、屈折率=√(比誘電率×比透磁率) で計算する必要がある。
  • こちらの論文には、GPSのL1波の周波数における0℃の淡水の比誘電率(Table 1)や、屈折率(Table 2)が示されている。屈折率は9.24のようだ。それをFresnelの式に代入して描ける反射係数VS入射角のグラフは下図のようになる。この論文のFig. 2は、p波、s波ではなく、co-polarizedとcross-polarizedの反射係数を示しているので、下図とは見た目が異なる。ちなみにしっかり調べていないが、比透磁率は可視光のみならずGNSSの周波数においてもほぼ1とみなされているようだ。

屈折率1の空気から屈折率9.24の水にL1波が入射するときのフレネル反射率

屈折率1の空気から屈折率9.24の水にL1波が入射するときの反射係数(フレネルの式)
  • なおこちらの論文の式(4)は、屈折率の代わりに比誘電率が√なく使われていて、Fresnelの式と異なるように見える。こちらの別の論文でもそうだ。なぜだろうか、要勉強。
  • こちらの論文のFig. 2では、入射角が増加してBrewster角に達したときにco-polarizedの反射係数がcross-polarizedの反射係数を上回るが、この時点で水面に入射する右旋円偏波(RHCP; GNSS衛星では右旋円偏波を使用)が左旋円偏波 (LHCP)に切り替わるらしい。反射波のp波とs波の振幅が違うのに、だ円でなく円偏波になるとはどういうことだろうか。円偏波まわりの勉強も足りず、このあたりの意味がまだ分かっていないが、こちらの別の論文のpp.39 - 40にも同じようなことが書いてあって参考になる。式(4.11)(4.12)を使うと、L1波の反射係数は次のようになる。ただしこちらの論文Fig.2と合っておらず、何か勘違いしている可能性がある。

右旋円偏波が入射した場合の反射係数

屈折率1の空気から屈折率9.24の水にL1波(右旋円偏波)が入射するときの反射係数(フレネルの式)。Brewster角以下では式(4.11)、以上では式(4.12)を使用。
  • GNSS用のアンテナでは、RHCPのゲインを高く、LHCPのゲインを低くするように作られているので、Brewster角よりも大きい入射角で水面の入射した波については、反射波が左旋円偏波になるため、心配が少ないということになるようだ。
  • こちらの別の論文の表4.1によると、海水 (Sea Water)と淡水 (Fresh Water)では比誘電率が大きく異なる。淡水が80なのに対し海水が20となっている。これがL1波の周波数における値だとすると、海水の屈折率はおよそ√20=4.5くらいになるだろうか。気にしている水面が海の場合は、上のグラフは該当しないので注意。
  • マルチパスに強いGNSSアンテナというのは、(グランドプレーン、チョークリングの使用も含めて)水平面下からの電波のゲインを抑えられるアンテナや、「軸比」というものが1に近く左旋円偏波の影響を受けにくいアンテナのようだ。
  • 軸比 (Axial Ratio)の定義を調べるのに苦労した。その理由として、アンテナの「利得(ゲイン)」と似て、検索すると送信アンテナと受信アンテナの話が両方ヒットすることもあるが、定義が複数あるようだ。こちらの資料の式(2・58)と、こちらの資料のp.33では、符号が逆になる式が示されている。おそらくGNSSの文脈では後者か。よく「長軸と短軸の比」と書かれているが、何の楕円偏波の話をしているのかわからない。はっきり定義がわからないと、仕様として書かれた軸比の最大値(今使っているアンテナでは3 dB)から、水面反射波のゲインのの最大値を計算することなどはできない。
  • RTKLIBのRTKPlotでもマルチパス [m]の表示ができるが、私にはその定義はわかっていない。RTKLIBとは別に、マルチパスの解析のためのオープンソースのソフトがあって、そのページにマルチパスの推定式が載っていた。これを手掛かりに、このような足し算で何を推定しているのか、物理的な意味などを調べていきたい。

 

Metashapeでのカメラパラメータ・タイポイントの分散の調べ方

1. はじめに:最小二乗法による推定値のバラつきとは?

何かのパラメータを最小二乗法で推定するときは決まって、モデル式に(多くの場合、モデル式に含まれる観測値に)何かの誤差が含まれていると仮定している。もし誤差を認めないなら、つまり誤差項のないモデル式がすべて厳密に成り立つなら、必要最小限の数の式を適当に選んで、連立方程式として解けば済むからだ。

 

そしてその誤差に特別な仮定を置けば、求めるパラメータの推定値とともに、その推定のバラつきの指標(分散あるいは標準偏差)を得ることができる。一番簡単な例として、n組のy, xのデータから単回帰直線を推定する状況(単回帰分析)では、

y = ax + b + ε

というモデル式を考え、最小二乗法でパラメータa, b(直線の傾き・切片)を推定する。ここで、誤差εは、yの観測値に含まれる誤差を表している。そしてこのn個の観測誤差が、互いに独立で、同じ1つの正規分布に従うと仮定すれば、a, bの推定の分散を計算することができる(この単純な状況での分散は、比較的簡単な式で表されるので、調べてみよう;また以上の説明がピンとこないなら、Excel擬似乱数を発生させる関数を使い、自分でx, yのデータを作ってa, bを推定してみよう)。

 

この分散とは何だろうか。推定値は1つしかないのに、なぜバラつきがあると考えられるのだろうか。答えを書くと、この分散は、観測誤差に関する上記の仮定のもと、「観測データの生成とそれに基づく最小二乗法によるパラメータa, bの推定」を無限回行ったときに、結果として得られるa, bの推定値のバラつきを表している。誤差項の確率分布について仮定を置くことで、手元にあるデータ自体を「いくらでも繰り返せる試行の中の、ある試行で生成されたデータ」とみなすことができ、同様の試行を無数に考えることができるわけだ。

 

話変わって、セルフキャリブレーション付きのSfMあるいはバンドル調整では、内部パラメータ、外部パラメータ、タイポイントの3次元座標を同時に推定する。推定するパラメータがa, bの2つしかなかった単回帰分析の場合と比べて、モデル式も複雑だ。それでも、タイポイント(元は特徴点)の画素座標(u, v座標)の観測に誤差を認め、それが互いに独立で、1つの正規分布に従うと仮定すれば、単回帰分析の場合と同様に、それぞれのパラメータの推定値について、その推定の分散を推定することができる。最近のMetashapeでは、それらをかなり見ることができる。厳密な話をすると、Metashapeが表示する分散が、誤差について上記の最も単純な仮定を置いた場合の分散なのかどうかは未確認であるが、この記事では、それらの分散のチェック方法をまとめてみる。

 

2. 内部パラメータの分散の確認方法

内部パラメータの分散は、その平方根である標準偏差の数値として、"Camera Calibration"(カメラキャリブレーション)ダイアログから表示できる"Distortion Plot"(歪曲プロット)の"Correlation"(相関関係)タブの、"Error"(誤差)という名前の列で確認できる。

Metashapeの相関関係ダイアログ

Metashapeによる内部パラメータの相関係数行列・標準偏差の表示

列名の表示が"Standard Deviation"(標準偏差)などでなく、"Error"(誤差)となってしまっているため、本当に標準偏差なのか、この画面を見るだけでは確信が持てないが、ユーザーマニュアル(ver. 1.8.4のもので確認)には、これが標準偏差であることが明記されている。

またこのタブには、他の記事でも触れているが、内部パラメータ間の相関係数が行列(相関係数行列)として表示されている。相関係数行列と上記の標準偏差を使えば分散共分散行列が計算できる(2変数の相関係数に両変数の標準偏差を掛ければ共分散になる)ので、内部パラメータについては一応、Metashapeでは分散共分散行列が取得できるとも言える。

 

3. 外部パラメータの分散の確認方法

外部パラメータの分散は、標準偏差の数値として、"Reference pane"(座標データペイン)で確認できる。具体的には、"View Errors"(分散を表示)というボタンを押すことで、カメラの投影中心の座標を表す3列と、回転角を表す3列のそれぞれについて、列名の末尾に"sigma"(シグマ)が付いた列が登場する。"sigma"は標準偏差を表すので、「分散を表示」という訳のボタン名ながら、実際に表示されるのは標準偏差のようである。

外部パラメータの標準偏差を表示

外部パラメータの標準偏差を表示

 

4. タイポイントの分散の確認方法

タイポイントの分散は、アラインメント後のオンデマンドのバンドル調整を行うダイアログ"Optimize Camera Alignment"(カメラアラインメントを最適化)で、"Estimate tie point covaiance"(タイポイントの分散を推定する)にチェックを入れることで、計算できる。

タイポイントの分散を推定

"Estimate tie point covaiance"にチェックを入れてバンドル調整

推定した分散を表示するには、Model(モデル)メニュー -> View Mode(ビューモード) -> Point Cloud Covariance(点群の分散)を選択すればよい。Modelビューにベクトルプロットとして表示される。これはユーザーマニュアルによると、それぞれのタイポイントについて、誤差楕円体 (error ellipsoid) の長軸の方向と長半径(長軸の長さの半分)を示したものである。色も付けられていて、分散が大きいタイポイントは赤く色づけられている。

 

Modelビューで、タイポイントの分散を表示

Modelビューで、タイポイントの分散を表示

 

これは何かというと、上記のような無限回の「試行」をしたとき、タイポイントが最も動きやすい方向とその動きやすさを示したものである。タイポイントの座標にはX, Y, Zの3成分あるので、X, Y, Zそれぞれに分散があるし、X-Y, X-Z, Y-Zそれぞれの間に共分散がある。それらの兼ね合いで、最も動きやすい(バラつきの大きい;不安定な)方向と動きやすさ(バラつきの大きさ;不安定さ)が決まる。このベクトルプロットは、それらの視覚的に示したものである。詳しく学ぶには、まずは2次元の「誤差楕円」について学ぶのがよいと思われる。

 

タイポイントは3次元復元したい被写体上にあるわけだから、タイポイントの分散は、検証点誤差など対空標識が必要な指標を除けば、3Dの成果物の不安定さに関するもっとも直接的な指標になるだろう。例えば、SfMの後にMVSをして密な点群を作るなら、その点群の分散は、SfMによって生じるこのタイポイントの分散に、MVS自体で生じる分散が乗ったようなものになるはずだ。つまりタイポイントの分散は、被写体の3Dモデルの各点の位置のバラつきに直結する。このベクトルが長い領域では、検証点誤差やMVSで作る点群の位置の誤差が、小さくなることは期待できない。このベクトルが対象領域全体にわたって長ければ、それは撮影計画が悪く、内部パラメータの一部の分散が大きい(不定に近い)可能性がある。例えばfが不定に近く、fのみが不安定な状況があったとしたら、鉛直方向の長いベクトルが観察されると予想される。

 

なお、「タイポイントの分散」があれば検証点誤差の評価は要らないかと言えば、次のような理由から、そんなことはない。

  • 分散は誤差のバラつきの指標であって、誤差の平均(バイアス)の評価を含んでいない。非線形モデルについて、最小二乗法による最尤推定量が不偏推定量と言えない限りは、バイアスの評価も必要なので、検証点誤差も必要だ。
  • 分散は、無限回「試行」したときのバラつきを示すものであって、たまたまその1試行である現実が、どのくらいの誤差をもっていたかを示してくれるものではない。タイポイントの分散が小さくとも、運が非常に悪ければ、大きな検証点誤差を生じることもあり得る。

 

Metashapeを使ったCGシミュレーションでCritical Configurationを調べる

本記事では、前記事:バンドル調整でパラメータの不定性を確認するにはどうするか を踏まえ、前記事で第2の検証方法として挙げた「2. 最適化を実施したときの目的関数値が、θiを誤った値に固定した場合とθiを正しい値に固定した場合で、有意に変わらないかを調べる。」を実演したい。

具体的には、CG空間上で、完全な水平面を、理想的なピンホールカメラを鉛直下向きに向けて撮影した画像セットをMetashapeで解析して、この「平行光軸撮影で、光軸に直交する平面状の被写体を撮ること」が、内部パラメータの一部にとってCritical Configurationであるかどうか(不定になるかどうか)を、調べてみる。不定性を調べる内部パラメータとしては、次の2つをとりあげる。

①準備

使用するCG画像はこんな感じだ。対空標識も写っているが、平面上にあり、飛び出してはいない。6年ほど前のCGシミュレーションに使った画像を利用している。

CG画像の例

まず、内部パラメータに真値を与え、固定してしまう。理想的なピンホールカメラで撮影(レンダリング)しているので、f以外のパラメータは0だ。

内部パラメータを真値に固定する様子

そしてアラインメントをする。言い遅れたが撮影位置は、このように3×5のグリッド状に配置されている。

アラインメントの結果

アラインメント後に一応、ダメ押しのバンドル調整「カメラアラインメントを最適化」をする。

ダメ押しのバンドル調整

その後、再投影誤差RMSをチェックする。撮影位置・向きの情報も、標定点も使っていないバンドル調整なので、目的関数は再投影誤差RMSだ。最小化されているのは、括弧の外にある無次元の値のはずで、今回は0.0112334だ。これが、fもK1も正しい場合の目的関数値として、ベンチマークになる。

再投影誤差RMSの確認

焦点距離fの不定性の検証

準備ができたので、fの不定性の確認に進もう。焦点距離fを固定したまま、値を誤った値1234に変更する。

fを固定したまま、誤った値に変更

このとき、再投影誤差RMSは大きくなるが、当然だから気にしない。fを固定したまま、バンドル調整を行う。

fを誤った値に固定したまま、バンドル調整

バンドル調整後に、目的関数(再投影誤差RMS)をチェックすると、0.0112335となっていて、fが真値の場合の0.0112334とほとんど変わらない。0.0000001だけ大きいのが気になるが、実はMetashapeでは通常のアラインメント直後の「カメラアラインメント最適化」でも最後の桁が増えることはよくあるので、意味のない差と思われる。さらに、今度はfの値を別の誤った値123, 2345, 3456に固定してバンドル調整すると、いずれの場合もぴったり0.0112334になった。

fの値が誤っていても、最適化後の目的関数値が変わらない。

つまり、fが誤っていても、他のパラメータ(今回の場合、f以外の内部パラメータは全て固定されているので、外部パラメータしかないが)がそれに連動して誤る(fの誤りをカバーしようとする、と言えるかもしれない)ことで、目的関数の増加を防げたということだ。これがまさに、上で言うところのfの不定性を示している。

 

③K1の不定性の検証

次にK1の不定性を調べるため、fに真値2000を入れてバンドル調整をやり直し、②の開始時の状態(①の終了時の状態)に戻す。その後、K1に謝った値-0.05を入れて、

K1を固定したまま、誤った値に

すべての内部パラメータを固定したまま、バンドル調整を実施する。

誤ったK1含め、すべての内部パラメータを固定して、バンドル調整

モデルビューで、点群とカメラの配置双方に、ボウル状の変形が確認できる。K1が誤った値に固定されている条件で目的関数を小さくするため、外部パラメータが連動して誤った(K1の誤りをカバーしようとして誤った)ためだ。

ボウル状変形が発生

しかし興味があるのは、目的関数である再投影誤差RMSだ。今回は0.110368と、K1が真値の場合の値0.0112334より増えている。K1を+0.05にすると0.0798123, -0.1にすると0.542339、-0.01にすると0.0118658と、K1の値によって差は異なるが、真値の場合と比べて一貫して増えている

目的関数が増えている

これは、K1はfと異なって、不定ではないことを示している。つまり今回のconfiguration(撮り方と被写体の組み合わせ)は、fにとってはcriticalであるが、K1にとってはcriticalではない

④余談:方法1

ちなみに、再び①の終了時の状態に戻して、K1の固定を外してバンドル調整を実施し、

K1を含めてバンドル調整

「歪曲プロット」のダイアログで、K1の推定値に加えて「誤差」(おそらく標準偏差の推定値)が確認できる。この値0.00779871が、真値(今回は0だが)や推定値-5.1518e-05に対してかなり大きいことから、K1は不定ではないにしろ、やはりよく言われている通り、平行光軸撮影ではK1の 推定のバラつきが大きいこと確認できる。なお「誤差」欄の値が本当に、分散共分散行列などから求めた推定値の標準偏差ならば、その確認は前記事の検証方法1「最適解における分散共分散行列において、θiの分散が非常に大きいかを調べる。」に相当する。

K1の推定値の標準偏差(おそらく)を確認