PhotoScanを極める 11. 教科書的手順 Step 4 | 山口大学 空中測量(UAV写真測量)研究室の技術ノート

山口大学 空中測量(UAV写真測量)研究室の技術ノート

UAV写真測量, ドローン測量, フォトグラメトリ, SfMなどと呼ばれる技術の情報を掲載します。
1. 効率化・高精度化に関する研究速報・マニュアル
2. SfM/MVSソフトAgisoft Metashapeの使い方
などなど。

※「ブログトップ」の注意・免責事項からご覧ください。

【このテーマの記事は、UAV写真測量に必要な解析や、そのためのAgisoft PhotoScanの操作について解説しつつ、適切な設定の探し方を提案することを目的とします。注意事項や用語説明もありますので、最初のページから読んでください。教科書的な操作手順表はこちらのページにあります。】

 

Step 4はSfMの中心で、最初のページで述べた4工程の処理を実行し、疎な点群(タイポイントの集合)の座標とカメラパラメータに関する最初の推定を行う。

 

<操作>

操作としては、「ワークフロー」("Workflow")メニューから「写真をアラインメント」("Align Photos")を選択し、「写真のアラインメント」ダイアログで設定を行うだけである。

 

 

"Align"という単語にはあまりなじみがないが、整列させるなどという意味のようなので、「写真のアラインメント」と言われると、写真を並べるだけ?とも思える。しかし実際の処理内容は、上記のように全く異なる。以下、このダイアログでの各設定項目について説明する。ただし前述のように、このテーマの記事ではマスクは扱わないので、「特徴点をマスクする」については触れない。

 

【精度("Accuracy")】

「精度」の選択は、処理に使われる画像の解像度(画素数)を規定する。「最高」("Highest")は、読み込んだ元の画像を縦横それぞれ2倍に拡大した画像(画素数は4倍)で処理を行う。元の画像の大きさのままで処理した場合よりも、特徴点の座標を正確に推定できるが、処理時間がかかる。以下、「高」「中」と1段階下がるごとに、処理に使われる画像の解像度が縦横それぞれ半分(画素数は4分の1)になる。つまり「高」は、元の画像のまま処理を行うことを意味する。

 

「精度」に関しては、より高い設定を選んだほうが、時間がかかる代わりに、SfMの精度が良くなることは明らかである(2018/1/10加筆:現地のデータでは、悪くなることもありますね^^;)。要は時間の許す範囲で一番高い設定を選べばよいのだから、(どれくらい時間がかかるかは処理を始めてみなければ分からないものの)それほど悩ましい設定項目ではないだろう。


ユーザーマニュアルでは「最高」について、時間がかかるので、主に研究用途で、非常に鮮明な(つまり拡大する意味のある)画像を使う場合のみ推奨するとされている。今回のデモでは画像の数が9枚と少なく、「最高」を選んでも大した処理時間にならないので、「最高」を選ぶ。

 

【予備選択("Pair preselection"】

例えば100枚の画像をSfMにかける場合、画像のペアの数は100C2=4950もある。全てのペアについてマッチングを行うと、かなりの時間がかかる。そして、実際には重なりのない(マッチングの甲斐のない)画像ペアも多い。予備選択とは、予め、重なりのある画像ペアを選んでおく作業であり、画像が多いとき、処理時間の短縮に貢献する。

  • 「汎用予備選択」:「精度」で設定したよりも解像度の低い画像でマッチングを試みることで、重なりのある画像ペアを選ぶ。
  • 「座標予備選択」:カメラの位置が測定されている場合に、それを使って重なりのある画像ペアを選ぶ方法。UAV搭載のGPSによって測られたおよそのカメラ位置がEXIFに格納されている場合などに選択できる。
    • ユーザーマニュアルには、斜めに撮った画像の場合、カメラの位置データと同じ座標系における地面の平均的な高さを「座標データ」ペインの「設定」に、カメラの向き(yaw, pitch, roll)を「座標データ」ペインに入力する必要があると書かれている。しかし、UAVのようにほぼ鉛直下向きに撮った画像であっても、地面の平均的な高さについては入力しなければ、正しい重なりの判定は原理的にできないと考えられる。

今回のデモでは、画像がPNG形式であってEXIF自体がないし、別途カメラの位置情報を入力することもしていないので、「座標予備選択」は選択できない。

【キーポイント制限("Key point limit")とタイポイント制限("Tie point limit")】
「キーポイント制限」と「タイポイント制限」は、特徴点とマッチングの品質管理のための、悩ましい設定項目である。「キーポイント制限」は、各画像について検出される特徴点の数の上限である。0にすると無制限となるが、信頼性の低い特徴点が増える恐れがある。「タイポイント制限」は、各画像に投影されるタイポイントの上限、つまり各画像の中で、他のいずれか(1つまたはそれ以上)の画像と対応付けられる特徴点の数の上限である。同じく0を入れると制限がなくなる。

 

これらの設定項目の適切な値が状況、特に対象とする地物のテクスチャや画像の内容・重なり具合によるのは自明であり、推奨値・デフォルト値などは当てにならない。

 

例えば「タイポイント制限」について、ユーザーマニュアルでの推奨値は4000とされているが、チュートリアル (ver. 1.2用)では10000となっていたりする。さらにフォーラムのあるスレッドでは、画像数が何千枚にも上る場合を除いて、「タイポイント制限」を使う根拠は薄いというニュアンスのAgisoft担当者からの回答もある。ユーザーマニュアルにも、普通は処理時間に影響を与えるだけで、SfMの精度には影響を与えない旨の記述がある。

 

なお、上記のスレッドによれば、ある画像のタイポイントの数が「タイポイント制限」を超えた場合、対応付けられた画像が少ないタイポイントから順に切り捨てられるらしい(再投影誤差が基準ではない)。別のスレッドによれば、そのフィルタリング方法は

「ツール」メニュー →「タイポイント」→ 「ポイントクラウドを削減する」("Thin Point Cloud")

コマンドと同じであり、「タイポイント制限」をゼロにしてStep 4の後に「ポイントクラウドを削減する」を実行しても、「タイポイント制限」と同じ効果が得られるそうだ。実際、このコマンドの唯一の設定項目も「タイポイント制限」である。つまり、最初はタイポイントを無制限に作っておいて、後で何らかの基準で良し悪しを判断しながら徐々に制限をかけていく、ということも可能だ。


各画像の特徴点が画像間の対応付けの候補となるのだから、「キーポイント制限」と「タイポイント制限」は別個に考えることはできない設定項目である。さらに、PhotoScanはMVSの段階で、

max(100, 当該画像と他の画像間の対応数の最大値の10%)

点の対応がない画像ペアについては距離画像(depth map; 各画素に映った地物のカメラ位置からの距離を格納した画像)を作らないという仕様になっており、「タイポイント制限」は大きすぎても小さすぎても、密な点群に欠損部を生じる原因となるらしい。この仕様のおかげで、「キーポイント制限」「タイポイント制限」の設定はさらに難しくなっている。

【カメラモデルのフィッティングを適応する】

PhotoScanの日本語GUIには、多くの海外製ソフトと同様、意味がわかりにくい文字列(訳)が出てくる。「カメラモデルのフィッティングを適応する」はその一例だが、英語GUIでは"adaptive camera model fitting"であり、直訳すれば「適応的なカメラモデルフィッティング」である。英語でもわかりにくいか・・・。

 

「カメラモデルのフィッティングを適応する」は、最適化する(カメラモデルに含める)内部パラメータの選択方法に関する設定項目である。

  1. チェックした場合、信頼性をもった推定が可能と推測される内部パラメータのみを推定する。
  2. チェックしない場合、内部パラメータ のうちf, cx, cy, k1, k2, k3, p1, p2 のみが推定される。

2の場合に推定される内部パラメータを整理しておこう:

  • f:こちらのページで説明済みの、最重要の内部パラメータ。
  • cx, cy:「光軸と画像の交点」(主点; principal point)と「画像の中心」のずれ。
  • k1, k2:レンズの半径方向の歪み(radial distortion)を表現する、画素の画像座標の関数(多項式)の、比較的低次(といっても2次と4次)の項の係数。
  • p1, p2:レンズの円周方向の歪み(tangential distortion)を表現する、画素の画像座標の関数(多項式)の係数の一部。

これらのうちf以外は、歪みのない理想的なカメラではゼロである。


Step 4の段階では、最適化する内部パラメータの選択に関して選べることは、この2通りしかない。

 

 

<結果の確認1:「モデル」ビュー>

何はともあれ、「写真のアラインメント」が終了すると、、次のように、「モデル」ビューに点群とカメラの位置・向きが表示される。マウス操作で視点を移動・回転させながら、異常がないか確認する。

 

 

明らかに位置・向きのおかしいカメラがある場合には、放置しておくのは有害である。適切に位置・向きが推定されたカメラとの間の、何点かの対応関係を示してやることで、位置・向きを修正するのがよい。

 

具体的には、「写真」ペインの画像のコンテキストメニューで「カメラのアラインメントをリセット」("Reset Camera Alignment")を選択し、手動でマーカーを設置した上で、同コンテキストメニューの「選択したカメラのアラインメント」("Align Selected Cameras")を実行することにより、外部パラメータを修正することができる。ここでのマーカーの設置について、ユーザーマニュアルによると、少なくとも4点の画像座標を、対象画像の他、アライン済みの少なくとも2画像上で指定する必要がある。

 

また、「写真」ペインを「詳細」表示にしたとき、「アライン済」列にチェックが入っていない画像がある場合には、同様に手動でマーカーを設置した上で、「選択したカメラのアラインメント」を実行すると、その画像を今後の処理に参加させることができる。

 

 

 

<結果の確認2:「カメラキャリブレーション」ダイアログ>

 

 

また、「カメラキャリブレーション」ダイアログの「修正値」("Adjusted")タブで、SfMにより推定されたカメラの内部パラメータが確認できる。

 

 

おっと・・・f以外のパラメータが全く推定されていないどころか、fも「基準値」タブの初期値と変わっていない!確かに今回の場合、初期値が正解なのでこれで正しいのだが、私の経験では実データでも、「カメラモデルのフィッティングを適応する」を選択した場合にf以外が推定されないことや、fすら変わらないことがある

 

この現象は、目でみてわかるような歪みのある画像を使ったときでも平気で起こる。フォーラムでのAgisoft担当者のコメントによれば、これはタイポイントの数が少ない場合に起こるそうだ。つまり、内部パラメータの推定の信頼性に関する推定方法に問題があるか、判定基準が厳しすぎるかで、本当は推定すべき内部パラメータも推定しなくなってしまうことがある、ということになる。

 

Agisoftにリクエストできるなら、PhotoScanのコマンドと1つとして、

内部でタイポイントのランダム分割による検証(タイポイントをカメラパラメータ推定用と検証用に9:1くらいで無作為に分割して、検証用タイポイントに関する再投影誤差のRMSを評価すること)や、可能ならその繰り返し(交差検証; Cross Validation)をして、検証用タイポイントの再投影誤差のRMSを最小にするような内部パラメータの組み合わせを選ぶ機能を実装して欲しい。線形回帰モデルの変数選択と同じ要領だ。交差検証まですれば、上記のような問題は稀にしか起こらないだろう。そのような機能があれば、Step 5以降で最適化する内部パラメータの選択に悩むことも避けられる。

 

担当者に見てもらえるかわからないが、フォーラムのFeature Requestsカテゴリでリクエストしてみた

 

そのような機能がない現時点では、「カメラモデルのフィッティングを適応する」のチェックは必ずしも推奨できない。使う、使わないのどちらが良いかは、事前には判断できない。しかし、所詮このステップの最適化は第一弾の最適化であり、Step 5以降で内部パラメータの自由な選択ができるようになるので、あまり気にする必要はないと思われる。

 

 

<結果の確認3:"Chunk 1"ダイアログ>

「ワークスペース」ペインで、Chunk 1のコンテキストメニューから「情報表示」を選ぶと、SfMで生成された疎な点群に関する統計情報が得られる。

 

 

 

  • 「ポイント」:疎な点群の点、つまりタイポイントの数。2つの数字が出ているが、左が現在有効なタイポイントの数、右がマッチング時点での数だと予想される(現在フォーラムで質問中)。
  • 「RMS再プロジェクションエラー」:既に説明した再投影誤差のRMS
    • 括弧の外にある単位のない値 (0.0472717):各タイポイントのスケールにおける再投影誤差のRMS。SfMで最小化されるのはこちら。
    • 括弧内の画素(pix)単位の値 (0.46941):画素単位に換算したRMS。
  • 「中間キーポイントサイズ」:タイポイントのスケールの、全ての投影に関する平均

ここで、タイポイントのスケールという言葉が出てくるので、特徴点のスケールについて補足する。SIFT (Scale-Invariant Feature Transform;特徴点の検出とその特徴量の計算を行う、最も有名なアルゴリズムの1つ;多くのソフトウェアに実装され、バリエーションも多い)などの手法で検出される特徴点は、1画素に対応するわけではなく、サブピクセル精度で定義される位置と、固有のスケールを持っている。それによって、スケールが大きく異なる画像(例えば、高度30 mで撮った画像と、100 mで撮った画像)の間でも対応付けが可能となるのだ。PhotoScanが特徴点の検出と特徴量の計算に使っている手法は公開されておらず、独自の工夫をしているようであるが、SIFTのようにスケール概念のある手法であることは間違いない。

 

単位がない方の「RMS再プロジェクションエラー」は、Step 4のSfMの目的関数(最小化対象)であり、以降のステップで行う「カメラの最適化」の目的関数にも含まれる、重要な統計量である。

 

※ 171229追記:EXIFに入っているカメラ位置情報が、後に加えるマーカー位置情報に比べて圧倒的に低精度の場合(例えばマーカー位置はTSで測ったが、カメラ位置は数十cm~m級の誤差が予想されるUAV搭載のGNSSで測っている場合)などは、このステップの前に、「座標データ」ペインで、すべてのカメラのチェック(☑)を外しておく(Ctrl + Aで全カメラを選択し、コンテキストメニュー → 「チェックを外す」)ことで、EXIFのカメラ位置情報がこのステップや後のバンドル調整に使われないようにすることも検討に値する。 「座標設定」ダイアログにおける「カメラ精度 (m)」の設定が大きな値になっていれば(デフォルト: 10 m)、EXIFのカメラ位置情報の重みはマーカーやタイポイントに対して小さいはずだが(重みづけのアルゴリズムは不明)、カメラがマーカーに対して非常に多いためか、私の経験ではバンドル調整の結果に意外と効いてくる印象である。例え、PhotoScanが内部で 、「座標設定」ダイアログの設定に基づいて、例え(ある誤差の確率分布のもとで)統計学的に最適な重みを与えていたとしても、あまりにも誤差が大きい情報を使うことは、その誤差の確率分布の仮定が少し揺らいだだけで結果を大きく劣化させ得るという意味で、リスキーだと思う。