OpenDroneMapの基本的な使い方とオプションの使い方を紹介したので、具体的な処理内容の調整方法を紹介しようと思います。
出力設定
OpenDroneMapの動作は入力画像とオルソ画像を含む各種出力を設定できます。以下、出力ディレクトリの一覧です。
ディレクトリ名 | 出力内容 |
/code/opensfm | 3D点群作成処理途上データ |
/code/odm_meshing | 3D点群からつくられたメッシュデータ |
/code/odm_texturing | 写真から取得したテクスチャが配色されたメッシュデータ |
/code/odm_georeferencing | 座標情報を付加した3D点群データ |
/code/odm_orthophoto | オルソ画像 |
上記出力を行う際のコマンドは以下のようになります。長めのコマンドになりますが、やっていることは各出力ディレクトリをホストOS内のドライブ内ディレクトリに逐一指定しているだけです。なお、下記コマンドは見易くするために改行していますが、改行毎にスペースを挟んだ一繋がりのものです。処理後は下画像のようにディレクトリ内に指定したフォルダが作成され各ファイルが出力されています。
docker run -it --user root --rm -v $x\images:/code/images -v $x\opensfm:/code/opensfm -v $x\odm_meshing:/code/odm_meshing -v $x\odm_texturing:/code/odm_texturing -v $x\odm_georeferencing:/code/odm_georeferencing -v $x\odm_orthophoto:/code/odm_orthophoto opendronemap/opendronemap
3D点群の調整
上記出力ディレクトリにもありましたが、入力画像から3D点群を作るのにはOpenSfm機能を利用しています。この処理に関わるパラメータを調整します。
まず、これまでの記事で紹介したようなレンズを既製品とは違うものとしている場合にはデフォルトのものと焦点距離が異なる場合があります。設定されている焦点距離が異なっても処理は可能で結果も出力されますが、正確な出力を期すためには指定しておくに越したことはありません。デフォルトでは写真データのEXIF情報から焦点距離も取得しますが、これを以下コマンドオプション(赤字部分:4.35mmを指定)で指定することで、実際の焦点距離を設定します。なお、オプション以外の基本コマンドは出力の指定は行っていません。前項を参考に指定して下さい。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --force-focal 4.35
上記と同様にCCDのサイズも指定することが可能です。CCDはカメラ本体の部品なのでレンズを変えただけでは変わりませんが、独自にCCD部品を購入してカメラを自作した、動画データからキャプションされたEXIF情報が含まれない画像を使用するといった場合等に利用します。入力するのはCCDの幅をmm単位で指定します。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --force-ccd 3.15
次に入力画像中から取得する最少フィーチャ数を指定します。フィーチャ数を増やすことで処理時間は伸びますが、画像間のマッチング精度が向上します。デフォルトでは4000が指定されていますが、3倍の12000を指定する場合は以下のようなコマンドになります。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --min-num-features 12000
上記フィーチャ数は取得される点精度を向上させますが、点群の密度には影響しません。点密度の調整について、公式のIssueで指摘されているのは入力画像のリサイズ指定が有効であると指摘議論されています。画像リサイズの工程でサイズを小さくすれば点密度は粗になり、元サイズに近付けば密になります。以下コマンドは画像リサイズ処理の画像幅を4000に指定するものです。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --resize-to 4000
また、点群生成処理に時間が掛かるようであれば、処理に使用するCPUコアの数も指定可能です。以下コマンドは4つのコアを使用するよう指示するものです。デフォルトは1となっているので、処理速度の向上させる際に有用です。なお、動作中の仮想マシンに指定数以上のCPUが割り振られていなければならない点に注意が必要です。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --opensfm-processes 4
メッシュデータの調整
上記出力の中にメッシュデータの出力がありましたが、このメッシュデータの成果に関わるオプションを使用します。メッシュデータは上記OpenSfmの処理で作成された3D点群を基に作成されるので、以下オプションで納得のいく出力が得られなければ点群成果を見直す方が良い場合もあります。
構築するメッシュデータのメッシュ数量を指定します。数量が増えることでデータはきめ細かなものとなりますが、比例してデータ容量も大きくなります。デフォルトでは100000が設定されているので、以下コマンドで2倍の200000を指定します。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --mesh-size 200000
メッシュデータの構築に関連するオプションとして、Octree Depthの指定オプションがあります。Octreeは八分木と呼ばれるもので、3Dデータを処理するための効率的な構造を八分木で作っておくというもののようです。残念ながらOctreeについての詳細は把握しきれていないので、齟齬があるかもしれませんが、3Dデータの格納構造として、下図のように立方体(黒線)の各面を4等分することで立方体が8分割されます(青線)。この分割された区画を更に8分割(赤線)していき階層構造を構築することで、3Dデータ処理を効率的に行えます。
OpenDroneMapのオプションにはこのOctreeの階層数を指定するオプションがあり、これを以下コマンドで指定することができます。なお、階層数はデフォルトで9、推奨値は8~12とされているので、大きくとも12までにしておくのが良さそうです。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --mesh-octree-depth 12
上記、Octreeの指定に関連し、–mesh-solver-divideを指定することで処理時間の調整が可能です。このオプションで数値を増やすことで、処理時間が若干増加すると共にメモリ使用量を低減することができます。よって、上記オプションと併せて以下の様に使用します。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --mesh-octree-depth 12 --mesh-soluver-divide 12
テクスチャの調整
オルソ画像の出力に影響するのは主に解像度とテクスチャの色調になります。解像度については、以前の記事で紹介したので省略します。テクスチャはメッシュデータ表面に配置される色情報を指します。テクスチャの作成について、デフォルト設定では各種処理が実施されていますが、穴埋め等の処理も行われているので、そういった補正処理をスキップしたい場合は以下のようなコマンドオプションを使用します。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --texturing-skip-visibility-test --texturing-global-seam-leveling --texturing-skip-local-seam-leveling --texturing-skip-hole-filling --texturing-keep-unseen-faces
また、テクスチャの色調にガンマ補正をかける場合は以下コマンドオプションを入力します。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --texturing-tone-mapping gamma
複数のオプションをまとめて記載しましたが、各オプションが出力されるテクスチャにどのように影響するかは入力画像にもよるので、出来栄えから試行していくのが良いかと思います。
DEMの出力
OpenDroneMapはDEMデータを出力することも可能です。出力には以下コマンドのようにオプションを指定することで、「odm_georeferencing」ディレクトリ内にDEMがGeoTiff形式で出力されます。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --dem
ここで、DEMの出力はできるのですが、デフォルトの解像度が2mと粗めになっているおり、そのままの出力では穴あき状態のデータが出力されるので、解像度とサンプリング範囲の設定を以下のように指定します。なお、指定値は最適値という訳ではないので、テクスチャと同様に出力データを確認しつつ試行してみて下さい。
docker run -it --user root --rm -v $x\images:/code/images opendronemap/opendronemap --dem --dem-sample-radius 0.25 --dem-resolution 0.2 --dem-radius 1.0
反復処理の方法
上記オプション指定による処理結果について、オプション値を調整して試行錯誤しようとする場合、OpenDroneMapの処理は環境にもよりますが長時間に及ぶため気軽に試すにも時間と根気が必要になってきます。そこで、一度完了した処理結果を利用して特定の処理のみを実行するオプションを使用します。OpenDroneMapは以下のような流れで処理が進行していきます。
resize >> opensfm >> slam >> cmvs >> pmvs
>> odm_meshing >> odm_25dmeshing >> mvs_texturing
>> odm_georeferencing >> odm_orthophoto
この処理工程内で反復したい処理を指示していきます。例えばオルソ画像の解像度のみ調整したという場合は以下のようなコマンドで処理を実行します。–start-withで処理の開始点を指示しています。オルソ画像出力は最後の工程なので、開始点のみを指定しています。
docker run -it --user root --rm -v $x\images:/code/images
-v $x\opensfm:/code/opensfm
-v $x\odm_meshing:/code/odm_meshing
-v $x\odm_texturing:/code/odm_texturing
-v $x\odm_georeferencing:/code/odm_georeferencing
-v $x\odm_orthophoto:/code/odm_orthophoto opendronemap/opendronemap
--orthophoto-resolution 50.0 --start-with odm_orthophoto
その他に、メッシュデータの調子のみを行おうとする場合は以下のようになります。
docker run -it --user root --rm -v $x\images:/code/images
-v $x\opensfm:/code/opensfm
-v $x\odm_meshing:/code/odm_meshing
-v $x\odm_texturing:/code/odm_texturing
-v $x\odm_georeferencing:/code/odm_georeferencing
-v $x\odm_orthophoto:/code/odm_orthophoto opendronemap/opendronemap
--mesh-size 300000 --start-with odm_meshing --end-with odm_25dmeshing
注意点としては、先の工程の処理が終わっていなければ途中から開始することは出来ないので、ディレクトリの指定と処理状況を把握してオプション設定を行う必要があります。
出力データの調整に関するオプションを紹介しましたが、他にも細かなオプション設定があります。GCPの使用等は精度向上の上で有用ですのでまとめれればまた紹介したいと思います。他、ヘルプを見ながら色々と試してみて下さい。
Leave a Reply