PanoTree で仮想空間の映えスポットを探してみた
クラスターメタバース研究所が公開した、VR 空間内の写真撮影スポットを自動探索するソフトウェア PanoTree を動かしてみた記録
はじめに
こんにちは。日頃メタバースで遊んでいるやまちゃんです。
いつもいるメタバースプラットフォーム cluster の運営元、クラスター株式会社のメタバース研究所が「PanoTree」という研究成果のソフトウェアとペーパーを公開しました。
このソフトは Unity の 3D シーン内から人が撮りそうな写真構図を自動推定してくれる、つまり「映えスポットを見つけてくれる」ものらしいです。
cluster で色々なワールドを作ったり他の人のワールドを巡ったりしつつ、撮る写真の構図にいつも悩んでいる私としては興味深い内容だったので、さっそく動かしてみました。
動かしてみる
私の環境で、2024/06/03 時点にて成功した内容をそのまま記載しています。
ひょっとしたら不要なステップなどもあるかもしれませんがご容赦ください…。
使用した PC 環境は以下の通りです。
Python 3 と GPU ドライバは予め入っているものになります。Python のバージョンがドキュメントで指定されてるものと合ってないけど動いているので気にしない。
$$
\begin{array}{|c|l|} \hline
\text{CPU} & \text{AMD Ryzen 9 3900X} \\ \hline
\text{GPU} & \text{NVIDIA GeForce RTX 4070 Ti SUPER} \\ \hline
\text{RAM} & \text{32 GB} \\ \hline
\text{OS} & \text{Microsoft Windows 10 Pro 22H2} \\ \hline
\text{GPU ドライバ} & \text{551.61} \\ \hline
\text{Python} & \text{3.11.2} \\ \hline
\end{array}
$$
事前準備:必要条件を整える
PanoTree の成果物ページの README、Prerequisites・Setup の項目を見ると Unity と Python が要ることが示されています。
また、明示的には書いていませんが Poetry と Git も必要です。
Unity 2021.3.2f1 を入れる
Unity Hub を起動する。
以下のページを開いて「INSTALL」をクリックする。Unity Hub 側でインストール画面が立ち上がるので実行する。
https://unity.com/releases/editor/whats-new/2021.3.2CCK と異なり、Android Build Support は不要なのでチェックを消した。
自環境には既に Visual Studio 2022 が入っているため、Visual Studio 2019 にチェックがついていると古いバージョンのインストール警告が表示されたのでチェックを消した。
一旦 Unity Hub を終了する。
Git を入れる
構成管理ツール。ザックリ言うとソフトウェアをインターネットから取ってくるのに使う道具
入れておかないと、次のステップで Unity プロジェクトを開こうとしたときにエラーになる
PortableGit を導入した
https://www.git-scm.com/download/winC:\usr\local\Git に入れた
インストールディレクトリの直下に cmd というディレクトリがある。ここに必要なコマンド類があるので、パスを通す
ユーザー環境変数 PATH に C:\usr\local\Git\cmd を追加した
PanoTree の成果物を取得する
成果物ページの右上の方にある緑色の「Code」というボタンの右側の▼をクリックして「Download ZIP」から落とした
せっかく Git 入れたので git clone https://github.com/cluster-lab/panotree.git してもいいし、本来はそうすべきだと思う…。
Poetry を入れる
Python のライブラリを管理するツール
下記の「Manually (advanced)」の手順を Windows 向けに改変して実行
https://python-poetry.org/docs/#installing-manuallyコマンドプロンプトを開いて、以下のコマンドを実行した
> cd (ZIP を展開して出てきた panotree-main ディレクトリがある場所)
> python -m venv venv
> venv\Scripts\python -m pip install -U pip setuptools
> venv\Scripts\python -m pip install poetry
Poetry で依存関係ライブラリを入れる
引き続き、コマンドプロンプトで以下のコマンドを実行した
> venv\Scripts\activate
(venv) > cd panotree-main
(venv) > poetry install
Unity でサンプルシーンを開く
(README の Prepare the Scene に相当)「プロジェクト」タブで、上の方の「追加」ボタンの右にある「▼」→「ディスクからプロジェクトを加える」を選択する
panotree-main/unityproject を選んで追加する
ディレクトリ名がそのままプロジェクト名になるので、手元ではプロジェクト追加の前にディレクトリを PanoTree だと分かるようにリネームした。
Assets/ClusterLab/Scenes にある、Main というシーンを開く
ここまでで、Unity Editor の画面と、コマンドプロンプトの画面がそれぞれ以下のようになると思います。
(下図はビューの配置などをカスタマイズしているので、多少異なる見た目だと思います)
サンプルシーンで実行してみる
ここまで出来たら、以下の手順で撮影ポイントの自動探索を実行できます。
(README の Explore に相当)
Unity Editor をプレイ状態にする
この時、Game ビューが常に表示されている状態にする必要があるとのこと。探索状況は Scene ビューに出るので 2 つを並べて表示しておくとよい
コマンドプロンプトで、python panotree_explorer.py --device cuda --api_host localhost を実行する
以下のような画面が出る
E キーを押す
探索が始まる。コマンドプロンプトに Exploring NNN/300… と表示され、Unity Editor 側では Scene ビューに黄色い箱や矢印が描画されていく
しばらく待って、コマンドプロンプトの画面右側に Done. と表示されたら終了
私の環境では、300 step の実行に 1 分程度掛かる
結果を見る
(README の Node Visualization に相当)Play モードのまま、Hierarchy から Main → TreeRoot → 0000-00000001 を選ぶ
Game ビューの左上にカメラ構図の一覧がスコアが高い順に表示される。マウスオーバーすることで拡大表示される
VRAM 使用量は Unity Editor と Python が起動している状態でのタスクマネージャー読みで 2.5 GB 程度なので、cluster が動作する程度の NVIDIA 製 GPU なら何でも動くと思われます。
なお一応 CPU でも実行してみましたが、12 コア・24 スレッドの Ryzen 9 3900X で 300 step の処理に 20 分以上掛かったので、GPU はあった方がいいです…。
自作ワールドに適用してみる
手順の概要を箇条書きで記載します。
なお前提としてワールドのデータを Unity シーンの形で持っている必要があるので、自分で作ったワールドや、販売されているワールド丸ごとのアセットなどが対象となります。
「こないだ見掛けたあのワールド、綺麗だから撮影ポイントを探索させてみたい!」といったことは少なくとも 2024/06 時点ではできません。
作業手順
CCK 側の Unity Editor で、自作ワールドのシーンを右クリックして「パッケージをエクスポート」する
PanoTree 側の Unity Editor で、
エクスポートした .unitypackage を Unity Editor にドラッグ&ドロップしてインポートする
インポートした自作ワールドのシーンを開いて、
CCK 固有のスクリプトが含まれるオブジェクトが破損状態になっているので、コンポーネントを消すかオブジェクトごと削除する
ワールド全体を単一の prefab にする
破損状態のオブジェクトが残ったままだとここでエラーになる
このとき破損しているオブジェクトの名前が出るので、怒られた場所を一個ずつ直していくのもアリ
シーン ClusterLab/Scenes/Main を開き、別名で保存する
別名保存したシーンを開いて、
Hierarchy から、World の中にあるサンプルオブジェクトを削除する
さきほど作成した prefab を World 以下に配置する
prefab の Inspector で、撮影したい範囲を示すような Box Collider を付ける
prefab の子要素の Inspector で、不要なコライダを削除する
子要素のコライダも撮影範囲に含まれてしまうみたいなので
特に Terrain Collider は悪さするので外した方がいい
Skybox や Baked Lightmap、Fog などの設定が消えてしまっているので設定し直す。ベイクは再度行う
あとはサンプルシーンでの実行と同様
以上の手順で、こんな感じの結果を得られます。
未解決の課題
一部のシェーダがエラーを起こしており質感が再現されない
水面、岩石の表面のツヤなどが多少変化している
構図を決定するだけならそこまで影響ない?
一部のワールドで極端に広い範囲を探索してしまい、まともな結果が出ない
地下・海底はせいぜい y = -5 m 程度までしかなく、探索範囲コライダは y = 0 m より上にしか設定していないのに、y = -1000 m まで探索してしまうケースがあった
アスレチックゲームワールドなど、一部のワールドだと変な結果が出る
何もない床を真上から撮った構図ばっかりになったり
たぶん PanoTree の特性がそういうものだと思われるペーパーの 3. Dataset を見ると分かるが、教師データからアバターが写っている写真は除外されているゲームワールドで撮られる写真の大半はゴール地点だが、ゴールしたことの証明でもあるため写真には大抵アバターが含まれるそういった画像は学習データから除外されるため、比較的ゲームワールドに弱い可能性がある
(2024-06-05 09:33) 上記を訂正。
下記引用箇所の直後に、アバターの影響を除外するために改めてアバター無しの状態で写真を再撮影している旨の記載がある(引用 2 つめ)。
なので「誰もいないゴールの写真」が学習データに入っているはず。
まとめ
仮想空間上の写真撮影ポイント自動探索器 PanoTree を Windows 10 の PC で動かしてみました。
Cluster Creator Kit に組み込まれて映えスポットを提示してくれるとか、ワールドクラフトでのサムネイル設定時に候補画像の選択肢が出てくるとか、そういう感じで気軽に使えるようになると体験が大きく変わりそうですね!
この記事が気に入ったらサポートをしてみませんか?