多視点3Dディスプレイ「Looking Glass Go」用に写真を立体化、AIによる単眼深度推定の方法と課題を解説

テクノロジー AI
kogu

ゲームとWebのフリーランス開発者。3DCGからゲーム開発の世界に入り20年。今は生成AIの変化を追いかけて日々実験しています。

特集

裸眼立体視ディスプレイをコンパクトにしたLooking Glass Goのクラウドファンディングが2月28日に終了しました。

29日に手渡されるファウンダーズエディションを皮切りに、ついにユーザーの元に届き始めます。

Looking Glass Goに備えて、通常の写真から奥行き情報を推定して立体化する「単眼深度推定」の方法をまとめました。

「空間AIディスプレイ」Looking Glass Goはポケットサイズの多視点3Dディスプレイで、テクノエッジでも「スマホサイズの裸眼3Dディスプレイ「Looking Glass Go」3万8000円で予約受付開始。動くAIキャラと雑談も可能」として紹介しています。


私もKibidangoでのクラウドファンディングから申し込みました。

▲ファウンダーズエディション以外は6月出荷開始予定のLooking Glass Go

立体視デバイスとしては、VRヘッドマウントディスプレイとどちらを導入するかで迷っていましたが、6歳の子供とも一緒に見られるこちらを選びました。

従来モデルのLooking Glass Portraitはとうとう触れる機会がなく、他にも新しい裸眼立体視デバイスが出ましたがどれも未経験。初めての裸眼立体視が楽しみです。

Looking Glass Goに何を映すのか

3DテレビやVRヘッドマウントディスプレイなどの立体視デバイスには、コンテンツ不足の問題がつきまといます。

3D空間で構成されたゲームであれば直接立体視状態で提示できますが、リアルも手軽に持ち込めないと魅力が半減します。

Looking Glass Goはこれまでのデバイスよりさらに個人向けの性格が強いため、ユーザーが手軽に自分のコンテンツを渡せなければ不便です。Looking Glass側もその点は当然想定済みで、今回のGoでは主に3つの施策が発表されています。

Looking Glass Blocksによる変換と共有

ひとつは「Looking Glass Blocks」。これは写真や動画のアップロード・変換・共有のためのハブで、公開されているコンテンツは自分のLooking Glass Goでも表示できます。

利用は無料ですが、プライベートな共有など追加機能を利用できるサブスクリプションもあります。

すでにたくさんの立体視用コンテンツが公開されていて、ユーザーが公開したものからスタッフのおすすめ、話題になっているものまで紹介されています。

▲すでに多数の立体コンテンツがある(Looking Glass Blocks

Blocksにはアップロードしたデータを変換する機能があり、手軽に自分の撮影した平面の写真や動画を立体視で楽しめます。

さらに画像生成AIによるText To Imageも備わっており、自分で生成した画像の立体視も可能です。

平面的な記録である画像や動画を元に立体視するには奥行きの情報を補ってやる必要がありますが、そこにこの記事のテーマである「単眼深度推定」が使われます。

Luma AIによる空間写真

もうひとつは「Luma AI」との提携。Luma AIはNeRFや3D Gaussian Splattingといった、複数の写真や動画から立体空間を再現する技術を手軽に使えるサービスです。

▲手軽に高品質の空間写真を作れるLuma AI(Luma AI - Interactive Scenes

空間情報を持ったデータはまだ一般的な呼び名が定まっていませんが、Apple Vision Proなど対応するデバイスの登場によって「Spatial Photography(空間写真)」「Spatial Image(空間画像)」といった表現が使われるようになっています。

動画や複数の写真をLuma AIのサービスで空間写真・動画に変換すれば、Looking Glass Go上に空間そのものを表示できます。また前述のBlocksでも共有できます。

▲Luma AIは空間写真をブラウザで多様な見せ方も可能(Luma WebGL Library

Luma AIでは空間写真の提示だけでなく、背景の除去やマニピュレーション、シェーダーの適用など編集ができるLuma WebGL Libraryも提供しています。こうしたものもLooking Glass Goに表示できると、さらに楽しそうです。

Looking Glass Lifeformsによる立体AIキャラクター

Looking Glass Liteforms」は立体視可能でリアルタイムの応答可能なキャラクターを提供するサービス。

Goよりも先行して提供しており、1カ月あたり30分と限られますが、立体視可能で対話できるアバターが無料で試せるプランもあります。

▲立体視キャラクターとLLMを繋ぐ(Looking Glass Liteforms

Lifeformsはアップロードした写真からアバターを作ってくれますが、アニメ絵寄りなキャラクターを作るMakeAvaterとも提携しています。またVRMモデルのアップロードにも対応しています。

ChatGPTなどのLLMサービスは、応答にかかる時間が実用上の課題のひとつです。「えー」「あの」などフィラーをはさんで待ち時間を隠蔽する方法がありますが、キャラクターが加わると更に緩和されます。立体視の追加がキャラクターの存在感を増すことで、どのような効果があるのか楽しみです。

こうしたキャラクターは単にカワイイ遊びだけでなく、アシスタントや店舗スタッフとしての利用も想定されています。

個人が魅力を感じやすいLooking Glass Goの利用をビジネスにも広げる役目を担うようです。

自分で単眼深度推定したい

このように豊富なサービスが提供されるため、Looking Glass Goを手に入れても表示するコンテンツが無い状況は避けられそうです。

小洒落た立体フォトフレームとしてならBlocksで十分対応できますし、空間写真も楽しめます。

UnityやUE、WebXRなどに対応するソフトウェアも提供されます。これらを使った3Dコンテンツの表示や、Looking Glass Go専用のゲーム作りなども試したいところです。

既存の写真の立体視化も、オンラインサービスのBlocksでの変換だけでなく、Looking Glass Studioというアプリケーションでローカル処理が可能になる見込みです。

まだPortraitへの対応しか公式のドキュメントに記載されていませんが、こちらもGoに対応するでしょう。

そうした便利なツールが提供されるのに、それでも自分で立体視コンテンツを用意したくなり、まずは単眼深度推定という処理のための環境を作り始めました。

単眼深度推定は、公式のBlocksやStudioでも写真を立体視対応させるために使っている技術です。

公式に提供される機能をわざわざ自前で扱うのは、単眼深度推定という技術の発展が著しく新しい技術を試したいこと、プライベートな画像を扱う可能性があること、そして自前のサービスにLooking Glass Goを組み込む場合にも利用できることなどが理由です。

実機がないので試せることは少ないのですが、間口の広い技術ですし、ここを押さえておけば一番潰しが効きそうです。

単眼深度推定とは何か

写真や動画は立体的な現実を二次元の画素の集まりに落とし込んだものです。三次元としての情報は失われており、そのままでは立体視に対応しません。

3D対応のカメラやビデオカメラがありますが、多くは左右の眼の視差の分ずらした像を記録するものです。両眼分の視差がある画像ならそれを使った立体視が可能ですし、Looking Glass Goのような方式向けの深度推定もかなりやりやすいでしょう。

あるいはiPhoneなどのスマートフォンでは、デュアルカメラやTrueDepthカメラといった特殊なカメラで撮影することで、写真に深度情報を付加できます。

iPhoneではこれを使ってポートレートモードのボケの編集などをサポートしていますが、Looking Glassの製品でもStudio経由でその深度情報を立体視に利用できるようです。

しかし特別な記録方法を使わない多くの写真や動画には、ひとつの眼で記録された二次元情報しかありません。そうした記録されていない奥行きを、二次元情報から推定するのが単眼深度推定です。

単眼深度推定は発展著しい分野

単眼深度推定はロボット制御や自動運転など産業の応用も広く、発展著しい分野です。いわゆるAIを用いたものが次々と登場しており、高性能なものを制限の少ないライセンスで利用できます。

私の場合はゲーム開発や3DCG、生成AIと合わせた利用が主で、特にStable Diffusion 2 DepthControlNetの登場で深度情報を使った制御が可能になってから本格的に利用し始めました。

たとえば次の画像は、2022年のクリスマスに子供と一緒に積み木で作ったお城を、Stable Diffusion 2 Depthを用いて装飾したものです。

Stable Diffusion 2 Depthが使用しているのはMiDaSという単眼深度推定のツールでした。MiDaSは非常に優れていて、追加の学習なしに幅広い画像の深度を精度高く推定してくれます。MiDaSは続いてControlNetにも採用されました。

2023年に入るとZoeDepthが登場します。最高性能を謳っていて、確かにMiDaSより優れた結果が出る場合もありました。こちらもやはりControlNetが対応し、現在でも広く使われています。

その後は幾つかの研究やサービスが発表されるも、汎用の座を置き換えるほど大きな変化はしばらくなく、2023年末にMarigoldが登場します。MarigoldはStable Diffusionのモデルを応用した手法で深度を推定します。現時点でオープン且つ最高性能の単眼深度推定ツールだと考えています。

2024年に入るとDepth Anythingが公開されました。MiDaSやZoeDepthより高性能を謳うとおり、より正確な推定を返します。

Marigoldと比べると劣るケースも多いですが、Depth Anythingが優れているのは推論の速度で、条件次第でリアルタイムに近い深度推定が可能です。

単眼深度推定はこのように次々と新しい研究や製品が登場している状況です。Looking Glassが公式に提供するツールだけを使うと、こうした動きに追従するのはどうしても遅れます。

2024年6月の一般出荷開始までまだ3カ月あり、それまでに新たな研究成果が発表される可能性も十分あります。

そこでまずは現時点で最高性能と考えるMarigoldで、気軽にLooking Glass Go対応画像を作れる土台を作っておきましょう。

MarigoldとComfyUIでRGBD画像を出力

MarigoldはDiffusersという拡散モデルのライブラリを拡張して実装されています。DiffusersはStable Diffusionの画像生成でも使われるもので、以前は私もこれを使って生成処理を作っていました。同様にMarigoldでもPythonのスクリプトを書いてもいいのですが、家族にも使ってもらう場合など考えるとGUIがほしいです。

Pythonで動かすこの手のツールをGUIに組み込むのは、管理の手軽さまで考えると意外と面倒です。

幸い画像生成で常用しているノードベースのGUIツールComfyUI上から、直接Marigoldを使えるカスタムノードMarigold depth estimation in ComfyUIが公開されています。

今回はこれを使いComfyUIのWorkflowとして深度推定処理を用意します。WorkflowはComfyUIの処理をまとめたもので、手軽に再利用できます。

RGBD画像

Looking Glassのデバイスに渡せる深度情報付きのコンテンツは、RGBD写真またはビデオであると公式のドキュメントにあります。

RGBDのDがどう格納されるかというと、単にRGBのピクセルで構成された元画像と、Dを示すグレースケールのピクセルを並べたものでした。チャンネルやメタデータだとやや面倒でしたが、これならComfyUIで簡単に対応できそうです。

ComfyUIはMarigold対応も含めて、カスタムノードという仕組みで機能を追加できます。そうしたカスタムノードのひとつにImagesGridがあり、これを使えば生成した画像のタイリングが手軽に実行できます。

ImagesGridは多様な設定で生成した画像の比較を1枚に収める用途で使われることが多いですが、2枚の画像を単に横に並べることも可能です。

ComfyUIにMarigold depth estimation in ComfyUIとImagesGridを追加し、Looking Glass Goに渡せるRGBD画像を直接生成するよう構成したWorkflowが以下です。

▲Marigoldで深度推定した結果をLooking Glassデバイス用のRGBD画像として保存するComfyUI Workflow

Looking Glass Goの解像度は1440×2560の縦WQHDですが、フルサイズで扱うのはVRAM消費や推定時間が重かったため、入力画像は1080×1920の縦FHDとしました。それでもMarigoldの推論は重たく、1~2分はかかります。

推定結果の確認用ノードが多いため複雑そうに見えますが、処理はとても単純です。モデルを読み込み、パラメータを指定して深度の推論を実行、結果をカラーマップでも確認しつつ、元画像と結果画像を左右に並べて結合しファイル保存。一応推定結果のみの画像も保存。これだけです。

推定はグレースケールで出力されますが、それだけでは結果の良し悪しを視覚で確認しにくいです。そこでMarigold depth estimation in ComfyUIに含まれるColorizeDepthmapノードを使って、さまざまなカラーマップを割り当てています。

今回は単一画像だけしか扱っていませんが、ComfyUIで複数の画像を入力するノードは別にあるため、フォルダ丸ごとの推定に対応も問題なさそうです。

また画像の生成と推論をまとめて処理すれば、Looking Glass Go用にライブ生成表示する仕組みも作れそうです。ただしVRAMが同時に必要なので、手元の16GB環境ではFHDのままでは厳しいでしょう。

推定結果の確認

環境ができたので、推定結果が妥当かの確認を行います。Looking Glass Goの現物がないため深度マップを視覚で確認するのと、擬似的な再現として3DCGを使った疑似立体化を試します。

おじさん画像

まずはいつものように、ありふれたおじさんの生成した画像で。

▲SDXL DPO Turboで生成したおじさんの深度推定結果

かなりきれいに深度が推定できているようです。背景も誤判定なさそうですし、グレースケールではわかりにくいですが、歯や髪の毛も細かく取れています。

Marigoldは実写表現に強く、細かな描写も得意です。私がLooking Glass Goに期待している人物の表示には十分な性能がありそうです。元の画像が生成したもののため現実と矛盾した表現も含みますが、あまり気にせず使えそうです。

深度推定の難しい画像

単眼深度推定が失敗しやすい表現はいろいろありますが、MiDaSでよく問題になったのが、無限遠や映り込み、透明、そして白飛びや黒つぶれなどでした。そうした表現の推定も幾つか試してみましょう。以降も元画像は全て生成したものです。

闇夜の黒猫は全体的に上手く推定できていますが、前脚の間から見える地面は潰れています。また奥の街灯の左側にかすかに誤りがあります。地面の検出も明るさとボケの変化に惑わされているようです。

毛のように細かい部分の推定は見事で、ひげも一本一本取れています。しかし暗所で深度ボケのある表現に弱いのは確かで、こうした画像には何か他の対処が要りそうです。

ドラゴンと少女。私は画像生成のチェックに「写実的なドラゴン」を定期的に生成させています。非現実的な存在の写実表現は画像生成の可能性のひとつです。ファンタジーに登場するような存在はどれも写実的に生成するのが難しいのですが、その象徴としてドラゴンを使っています。

非実在で複雑な形状のドラゴンを、更に人物と組み合わせた場合の深度推定は難しそうですが、これはかなりきれいに出ています。ドラゴンの口内や棘、少女の髪や顔、どれもこれぐらいなら十分な品質に見えます。

またおじさんで、今度は難しそうな背景と合わせての深度推定です。

単眼深度推定の難しい対象に無限遠があると書きましたが、無限遠も色々です。無限遠といっても実際に無限とは限らず、宇宙空間のような何もない場合もあれば、単に遠方だとか、切り抜かれた画像素材のように非現実的な無限もあります。

そうしたさまざまな遠さを適切に推定するのは難しく、またそれをどのような深度マップとするのかも重要です。8bitの場合なら256段階の階調の中、近傍にあるものから無限といっていい距離まで、適切にマッピングしなければなりません。

Marigoldはこれまでの単眼深度推定より無限遠に強い印象ですが、それでもこの例では不自然さが目立ちます。理想的にはタワーや空は全て最も遠い、黒=0で判定してほしい所です。しかし左側がやや明るく、全体的に濃淡を持ってしまっています。その分人物の濃淡に割り当てる範囲が狭くなってしまい、十分な表現ができていません。

こうした問題は深度マップを16bitで出力できると対処できます。16bitなら65536段階の濃淡で扱えるため、柔軟にマッピングしなおせます。たとえLooking Glass Goに必要なのが8bitでも、16bitで加工して8bitに書き出せば問題ありません。

残念ながらMarigoldは、MiDaSと違って16bitでの推定に対応していないようです。MarigoldがDiffusionモデルの拡張なので仕方ないのかもしれませんが、16bitで補正できる方法も探したい所です。手間をかけてもいい場合は、擬似的にPhotoshopなどで16bitに変換して編集するのも良いでしょう。

他に、おじさんの眼鏡も不正に推定されています。ガラスなどの透明体はその奥が見えていても、深度としては透明体そのものの位置が正しいです。このような出力では眼鏡の中だけかなり奥まっていることになります。

これはかなり無理のある例題で、透明体、ボケた背景、床面の鏡面反射といじわるが盛りだくさんです。しかも画像生成による非現実的な矛盾ある表現も混ざり、正しく推定できなくても当然でしょう。

それでも傾向は読み取れます。グラスのハイライトを前面としていたり、床面を正しく推定できていなかったり。グラスの形状も透過した背景に騙されています。

3DCGでの確認

生成された深度情報は視覚的にきれいに見えても、たとえば小さなノイズやムラなど、立体にしてみないと分かりにくい問題が隠れているかもしれません。実際のLooking Glass Goとは見え方も異なりますが、3DCGを使って立体的に表示してみて、そうした問題が隠れていないかも確認してみます。

先に深度推定した画像を3DCGとして描くのに、今回はCinema 4Dというツールを使います。単に使い慣れているからで、Blenderなど他のツールでも同様の確認は手軽にできるでしょう。

深度画像の立体化にはDisplacement Mapという仕組みを使います。これはグレースケールなどの階調を使って立体的な表現をする手法で、単純な形状を複雑に描いたり、少ない作業負荷で大量の要素を緻密に描くのに使えます。このDisplacement Mapを、調整しやすいようデフォーマという非破壊の形状変形機能経由で使いました。

▲推定した深度マップによるDisplacementデフォーマの変形

こうした変形を必要十分に細かく分割したポリゴンの板に適用し、首振りのアニメーションを付けて動画にします。角度は30度を超えると破綻ばかり気になったので25度まで。そこそこポリゴン数が多くレンダリング時間がかかるので、解像度は720×1280で低めに。

動画にすると各推定の問題点がよくわかります。やはり一番きれいに出ているのはドラゴンと少女のもので、Looking Glass Goでもこれぐらい出てくれれば十分でしょう。

路上のおじさんはDisplacement Mapでの立体化が単純すぎたために、浮き出た印象が強すぎました。デフォーマの設定で浮き出る強度の中心ほど強く盛り上がるよう設定はしていますが、細かな制御ができないため不自然です。

猫は元絵のコントラストの浅さが不自然で、こちらも浮き出すぎています。地面の推定も問題がそのまま出ています。こうした構図にはMiDaSで16bitにした方が、手間はかかりますが良い結果が得られるかもしれません。

タワーおじさんは背景に対しのっぺりとしています。凹凸の強度をもっと上げてもよかったのですが、背景の推定が悪く不自然さが強まります。

グラスは不正だらけで現実の立体として破綻しています。映り込みや透明が解決できたとしても、そもそも視点に応じたそれらの変化が表現できない以上、Looking Glass Goで見る対象として不適そうです。

あとは出荷を待つ

Looking Glass Goに備える手始めに、単眼深度推定環境の簡単な環境を用意し、問題も確認できました。

単眼深度推定は発展の大きい分野で、それでもまだまだ課題も多数あります。6月までに今回確認できた問題が解消されたツールが登場するかもしれませんし、推定のパラメータを見直しての改善もありえます。

大量の画像の処理や、生成からRGBD出力までの一貫処理、生成したRGBDをLooking Glass Goに渡す方法など、商品出荷前にまだまだ楽しめそうです。

《kogu》

kogu

ゲームとWebのフリーランス開発者。3DCGからゲーム開発の世界に入り20年。今は生成AIの変化を追いかけて日々実験しています。

特集

BECOME A MEMBER

『テクノエッジ アルファ』会員募集中

最新テック・ガジェット情報コミュニティ『テクノエッジ アルファ』を開設しました。会員専用Discrodサーバ参加権やイベント招待、会員限定コンテンツなど特典多数です。