見出し画像

誰もが現実世界をスマホで3D化できる時代がやってくるかも、という話【SfM】

建機を3D化してみた

まずはこちら。今回はSfMに関する話です。

左:建機の写真 右:建機の3D点群モデル

ここではSfMの原理だったり、メリット、活用法について少し触れてみたいと思います。物は何でもよかったのですが、仕事柄建機に少しかかわりがあるので、建機のフィギュアを用いて画像から3D化してみました。

SfM (Structure from Motion)とは?

物体を様々な位置・角度から撮影した画像を複数用いて形状を3D化する技術です。フォトグラメトリーと呼ばれたりもします。2次元画像の処理技術にも関わってくるのですが、ざっくりいうと下記の流れです。

  • 画像から特徴点を検出

  • 特徴点周りの特徴量を抽出

  • 画像間で、上記特徴量をもとに特徴点を対応させる(対応点探索)

  • カメラ位置の推定(Localization)

  • 世界座標系での特徴点の座標推定(Mapping)

①特徴点検出

文字通り、画像の中で「特徴的な部分」を検出する手法ですが、わかりやすい例として挙げられるのが「コーナー」です。エッジはいわば画素間でコントラストが大きい部分(線のイメージ)ですが、x方向にもy方向にもコントラストが大きい部分がコーナーで、場所を特定しやすい部分(角のイメージ)になります。

画像から特徴点を検出の手法はいろいろあるのですが、ここでは説明を割愛します。代表的なものはSIFT、FAST、AKAZE、ORBなどです。Opencvに特徴点検出のライブラリがあるのでそれを使用しました。

以下はAKAZEとSIFTで特徴点を検出した結果の比較です。ちょっとわかりづらいかもしれませんが…この画像ではSIFTのほうが多くの特徴点を検出できました。違いとしては、特に車両後方部の窓(?)みたいなところの特徴点の違いです。ここには細かい凹凸がついているのですが、SIFTのほうが細かい部分まで特徴点として検出していることになります。

AKAZEとSIFTの特徴点数の違い
特徴点検出で特に顕著に違いが出た部分。細かな凹凸がたくさんある

また計算時間も手法によって変わります。今回の事例では、191枚の画像の特徴点検出で、AKAZEは43秒、SIFTは59秒かかりました。

特徴点数に関しては、特にFASTなんかはたくさん特徴点を検出できますが、画像のノイズなどもたくさん拾ったりするので、多くの特徴点を検出できれば良いというわけでもなさそうです。

計算時間や精度も含めていろいろと試して使い分けるのが良いかもしれませんね。

②特徴量抽出

特徴点の周辺画素の特徴を数値化します。画像は画素(ピクセル)が配列されたもので、明るさの変化や回転などが加わると、データ上は別物と判断してしまいます。よって画像間の特徴点を対応させるには、輝度変化や回転が生じても同一の特徴量が算出できることが望ましいです。

SIFTを例にすると、特徴点周りを全方向36方向に分割し、各画素で輝度勾配のヒストグラムを作成します。閾値以上の輝度勾配をキーポイントへ割り当て代表的なベクトルを算出し、その方向に合わせて特徴量領域を回転させることで回転不変性を得られます。

その後、特徴点周りの画素を4×4ブロックに分割し、各ブロックで8方向の勾配方向ヒストグラムを作成、4×4×8=128次元の特徴量ベクトルを作成します。各ベクトルの長さをベクトルの総和で正規化することで輝度変化に頑健な特徴量を得られるということになります。

書いていてよくわからなくなってきましたが、要は特徴点周りの輝度勾配をあの手この手で128次元の特徴量ベクトルで表してしまおう、と私は理解しています。

全然うまく伝えられている気がしないし、何なら私の理解も完全ではないので伝わりづらいと思います…下記のリンク先を参照していますので、気になる方はぜひご覧ください。SIFTの理屈について、私はこれで少しイメージできました。

MIRU2013チュートリアル:SIFTとそれ以降のアプローチ
https://www.slideshare.net/hironobufujiyoshi/miru2013sift

③対応点探索

お次はいよいよ、上記の特徴点を特徴量をもとに対応させます。これは説明するよりも見るが早し。

対応点探索の例

特徴点同士で対応している部分を結びました。なんとなくうまく対応しているとこもあれば、明らかに外れているところもあります。手法を選んだり、あるいは画質を上げたりすることで精度は上がるかもしれませんが、ここは一旦これで進めます。

④Localization

理解を深めるために、以下のような図を考えます。

PCで画像を扱う際は、通常画像の左上端を原点として、横方向(u)と縦方向(v)で座標を表します(画像座標系)。カメラの座標系を[Xc, Yc, Zc]で表し、世界座標系を[Xw, Yw, Zw]で表します。この時、画像座標系、カメラ座標系、世界座標系は以下の関係式で結ぶことができます。Kはカメラ定数で、カメラごとに決まるパラメータです。

式1. 画像座標系とカメラ座標系の関係式
式2. カメラ座標系と世界座標系の関係式

この2式より、以下が導けます。

式3. 画像座標系と世界座標系の関係式

この式の意味として重要なのは、「画像内の座標から対応する3次元座標が求められる」ということです。2次元の画像の座標と3次元の空間座標を対応できると言い換えられるかもしれません。そして上式Pを導くことがLocalizationで、カメラ位置を推定するということになります。複数の画像があれば、このPを算出することが可能になります。

⑤Mapping(三角測量)

一方三角測量は、式3におけるXwを求める行為になります。

式4.

三角測量、で調べるとよく出てくる図ですが、これをもとに式4を解くことで3次元座標を計算することができます。当然ですが、2つの画像間で正しく特徴点を対応していないといけません。

COLMAPを使った3Dモデル化

説明が長くなってしまいましたが、これらの原理に基づき、いよいよ画像からドリッパーを3D化します。今回はオープンソースのツールであるCOLMAPを使用しました。ちなみにCOLMAPは特徴点検出にSIFTを使用しているようです。

COLMAPについて
https://demuc.de/colmap/

◇細かい話ですが、前処理で動画をフレームごとに画像保存

Pythonのopencvで動画をフレームごとに保存。ちなみにカメラはGoogle Pixel 6 Proです。37秒ほどの動画で合計1130枚になりました。

◇画像のブレ具合をもとに、ぶれている画像を除外

ここも細かい話ですが、ラプラシアンフィルタを用いて画像のエッジを検出し、エッジの少ないものをぶれているものとして除外しています。ここの話の詳細は今回は割愛します。

◇選別した191枚の画像で計算を回してみる

COLMAPで計算を回し、3D点群とカメラ位置の推定結果になります。今回の計算は車両の片側から撮影する場面に偏ってしまいましたが、なるべく多視点で画像を撮影するほど計算結果としてはよくなります。またカメラの推定位置がほぼ重なっている部分も見受けられますが、三角測量の原理的にはあまり重ならないほうが誤差が小さくなります。

この辺りをポイントに画像を選定するともっと密で精度の良い3D点群が作成できると思います。

出来上がった3D点群を様々な角度から見てみました。今回は車両の左片側を作成したとした3Dモデルですが、それでもかなり車両のイメージをつかめるのではないでしょうか?

メリット:使うのはスマホでOK、特殊な撮像系が必要ない

ここまでの話で使ったものは、カメラ(Google Pixel 6Pro)とPCのみです。強調したいのが、特殊な機材を使っているわけではないということです。

一般に3D画像を撮影できるものは、例えばステレオカメラやToF(Time of Flight)カメラがあります。ステレオカメラは今回紹介した三角測量の原理を用いる、レンズが2個付いたカメラで、ZEDなどが有名です。ToFは例えばIR(赤外線)など、光を照射して物体に反射し戻ってくるまでの時間で距離を算出するもので、例えばKinectなどがあります。

いずれもスマホに比べると一般に広く広まっているもの、とは言い難く、使用するには少しハードルが高いのではないでしょうか。

もちろんSfMにもデメリットはあります。上記の3Dカメラは物体のスケールを表すことができますが、SfMはあくまで相対座標を取得するもので、実際の物体の大きさとは異なる3D点群が生成されます。実際のスケールで点群を生成するには、大きさのわかるものを画像内に入れ込み、3D化した後にその大きさでキャリブレーションする、などの対応が必要です。

とはいえ3D空間を使用したいという要求には、必ずしもスケール情報が必要ではなく、空間・物体のイメージを2次元画像よりも解像度高く把握したいという意図もあると思います。機器は限定せず、3D画像でイメージを把握したい、そんなときに非常に有用なツールになると思います。

ビジネスでの活用方法を考えてみる

SfMの活用法としてよく出てくるのが、ドローンや衛星写真を用いた地形の測量です。特に災害分野で地形データから土砂災害における土砂の量を定量化したり、また歴史的建造物の構造を3D化して保存したりなど、使用される状況は様々あります。

もちろんそういった分野で活用できれば良いのですが、みんながみんな関わりがあるわけではないですよね。ということでもっと身近に、自分の業務に活かせそうなアイデアということでいくつか考えてみました。

・出張者に3D化してほしいものを撮ってきてもらう

私は真っ先にこれを思いつきました。実際に現場に出張に行った後、帰ってきてどういう現場だったか出張報告をしますが、3D空間で現場の状況をシェア出来たら理解度が上がる気がします。

最近ではコロナ後の動きとして出張も少しずつ増えてきていますが、そんなに頻繁に行けるわけでもない。誰かに撮ってきてもらおうにも、専用の機材が必要となるとなかなか難しいですが、今回のようにスマホでOKであれば、撮影をお願いすることは簡単かもしれません。そうしていろんな出張者が集めてきたデータを3D化することで、他の活用方法が思いつくかもしれませんね。

・社員教育への利用、例えば工場見学など

教育系にもかなり使えるのではないかと思いました。特に製造業では工場との関りも出てきますが、工場全体の構造がどうなっていて、設備がどうつながって配置されているのかなどは、初めての人にはなかなかイメージしずらいですよね。詳細な部分に関しては、現場で働く人じゃないとなかなか把握できないと思います。

もしかしたら資料などはあるのかもしれませんが、図面は平面、写真は断片的だとイメージがわかないし、動画で見ようとしたら一体どのくらいの時間のファイルになるのやら…

3Dモデルは一度作成してしまえば、見る人の操作によって自由に視点を変えて構造を見ることができます。新入社員でも中途社員でも、3Dのデータで自由に隅々まで確認できるようになると、すぐに現場の状況をキャッチアップできるかもしれませんね。

・自分のオフィスを3D化、メタバースオフィスに拡張

これは将来的に出てくるというか、もうすでに進めている企業もあるでしょう。メタバース空間を企業活動に利用しようという流れは今後どんどん増えてくると思います。

テレワーク利用者はもちろんのことですが、自分のオフィスだけではなく海外のオフィスとメタバース空間でつながるなど、より業務を円滑にするうえで導入されるかもしれません。

メタバースを利用して自社には何ができるか、どんなものが生み出せるか、これからより多くの企業が考え始めるようになることと思います。

終わりに:誰もが現実を3D化できる未来(?)

今回はSfMという技術を取り上げ、現実空間(建機のフィギュア)を3D化することを試みました。

今回、「スマホで誰でも」と言いましたが、実際にはGPU搭載のPCで2.5時間ほど計算を回して出た結果ですし、またブレ画像を除外するなど多少画像処理のテクニックは使用しているので、本当の意味では「誰でも」できるというわけではないのかもしれません。

ただ半導体、ひいてはCPU、GPUの発展などにより、大規模なデータ処理を効率よくできるようになっている中で、もう少し先の未来では「誰でも」3D化できる世界が待っているかもしれません。今皆さんが持っているスマホも、いずれGPUが搭載されたりするのかもしれませんね。

今回の話は、業務で少し使った知見もあってのことですが、いずれやってくるメタバースの世界を見据えるという意味でも取り上げてみました。

テキストから画像へ、画像から動画へ、動画から3D空間へ…
来るべき世界に向けて、私も変化に対応できるよう引き続き勉強していきたいなぁと思います。

この記事が気に入ったらサポートをしてみませんか?