Stable Diffusion開発元のStablity AIが発表した生成AI「TripoSR」を使うと自分のパソコンでも、画像からの3D生成が1分未満で可能です。ここでは、このソフトを自分のPCにインストールして使ってみた結果と、生成した3Dデータの加工方法について語っていきます。
生成AIの中で、3Dデータの生成は期待も多く開発も活発です。前回はStable Diffusion開発元のStablity AIが発表した「Stable Video 3D」を紹介しました。
今回は同じくStablity AIが、独自の3D生成サービスを提供してきたTripo AIと共同開発した「TripoSR」を紹介します。
低品質ながら圧倒的に高速
TripoSRは「Large Reconstruction Model」という3D生成の手法を実装したもので、特徴はその速度にあります。筆者がテストしている環境はWindowsのRTX 4060 Ti 16GBと、ゲーム向けのビデオカードでもあまり高速ではありませんが、10~30秒程度で1枚の画像から3Dデータが生成できます。CUIを使えばVRAMも8GBに収まるため、多くのローカル環境でかなり手軽に3Dデータの生成が行えます。
ただし生成される3Dデータの品質は高くなく、そのままゲームやXRに利用できるものではありません。CSMやTripoといった商用サービスに比べれば形状もテクスチャも不正な結果が多く、がっかりするかもしれません。
とはいえ、少し前ならクラウド上の大きなVRAMのインスタンスを使っても数十分かかり、しかも結果はもっと低品質でした。より向上した3D生成がローカルで数十秒以内で可能になった状況を体験しておくことは、生成AIで変わりゆく創作の過程を楽しむのに個人的に重要です。またそんな低い3D品質でも使い方次第でさまざまな用途が考えられます。
TripoSRの利用
セットアップはこの手のモデルとほぼ同じで、難解な手順もありません。リポジトリをクローンし、venvで仮想化した環境にPyTorch関連を入れ、setuptoolsをアップグレードしてから必要なパッケージをインストールするだけで完了しました。
唯一引っかかったのは3D形状の推定に用いるtorchmcubesというパッケージの導入でしたが、これは私の環境のVC周りが古いため起きたエラーでした。Windowsではなるべく最新のVisualStudioをきちんと追いかけないと、不要なトラブルを招きます。
すでにローカルでStable Diffusionなどが動作している環境であれば、リポジトリに記載の手順ですんなりセットアップできるでしょう。
なお、公開直後のコードには指定できるパラメータが少ないなど不足がありました。その時点でリポジトリを取得済みの場合、もう一度最新のものから作り直した方が良いです。
GUIでの利用
TripoSRにはGradioというライブラリを使った、WebベースGUIのデモが付属します。これはAutomatic1111 Stable Diffusion web UIなどでも使用されているもので、起動するとブラウザから手軽に3D生成を試せます。
GUIの利用はgradio_app.pyを実行し、http://127.0.0.1:7860 などをブラウザで表示するだけ。画像を「Input Image」にドラッグし、「Generate」を押せば推論が始まります。GPUが適切に利用できる環境なら、モデルのロード後30秒とかからず3Dデータが生成されます。
生成結果はその場で回転や拡大して表示できるプレビューの他、OBJやGLBといった3Dデータの形式でダウンロードも可能です。
ただしGradioのGUI版はVRAMを余計に消費するようです。私の環境では、GUI版は13GB以上のVRAMを消費したため、8GB環境ではうまく生成できない可能性があります。指定できる実用的なパラメータは少なく、GUI版を使うメリットはプレビュー機能ぐらいしかないため、お試し以外の場合はCUIがおすすめです。
CUIでの利用
CUIといっても run.py をリポジトリにあるように python run.py examples/chair.png --output-dir output/ など、入力と出力のパスを添えて実行するだけです。処理データがVRAMに乗り切ってさえしまえば、モデルのロード後10~30秒程度でメッシュの生成が完了します。
なお run.py は複数の画像を渡せば一度にまとめて処理も可能です。しかし度々入力ファイルを並べて書くのは不便なので、私はwatchdogというPythonのファイルシステムを監視して処理を実行できるライブラリを使い、run.pyをホットフォルダ対応して使っています。
所定のフォルダに画像を放り込めば30秒以内には3D化が終わるし、まとめて入れてもゆっくり選びながら入れても問題ないため非常に楽です。大きなモデルデータのロード時間も初回だけで済むので、実用する場合はこうした改良は欠かせないでしょう。
3D化のパラメータ
現時点のTripoSRでは生成時に指定できるパラメータが限られています。そもそも品質の追求自体限界が小さいため、パラメータに悩むより、結果が悪すぎる場合に見直す程度で十分そうです。
--mc-resolution
立体としての形状を推定する際に用いる、解像度のようなものです。これを大きくすると形状の精度が上がる可能性がありますが、同時にVRAMの消費量も跳ね上がります。VRAM16GBの環境では320が限界で、512で試した方はVRAM24GBでもエラーだったようです。
あえてGPUを無効化してCPUでの推定を試した場合、512なら32GBのRAMで扱えました。しかし処理時間が2時間近くかかり、TripoSRを使うメリットがなくなってしまいます。
また512に上げたからといって品質が劇的には向上しないため、デフォルトの256か、320や480など環境に応じてほどほどの値で十分でしょう。
--chunk-size
VRAMの消費を抑えるために扱うデータをチャンクに分割して処理をしますが、そのチャンクサイズの指定です。小さくすればより大きなmc-resolutionでの推定も可能ですが、問題がない限りデフォルトのままで良いでしょう。
--no-remove-bg
デフォルトでは入力画像の背景除去が自動で行われます。除去の難しい画像を扱う場合や、すでに除去済みの画像がある場合は自動除去をスキップできます。ただし次の--foreground-ratioが無視されます。
--foreground-ratio
背景除去の参考値のようで、画像に占める被写体の割合を調整するもの。例えば画像内で3D化したい要素が小さく写っている場合、0.5などその比率に合わせた値を指定します。
全体的にデフォルトのままで、VRAMが許すならmc-resolutionを上げてみる、ぐらいしか実用的な効果は感じられませんでした。雑に色んな画像を投げたければ背景の自動除去は楽ですし、トラブル時にchunk-sizeを変えるのが有効かもしれないぐらいでしょうか。
現時点では根本的な品質の限界があるため、生成段階で無理に高負荷の指定をするよりも、結果の後加工の方が重要です。生成されるデータの仕様や状態を確認しましょう。
生成結果の品質や仕様
TripoSRはStable Video 3D同様、Objaverseというデータセットを使って学習されています。Objaverseは3Dデータの公開サービスSketchfabでデータを収集したものですが、非商用ライセンスなどの作品も含むため、ここからクレジット表示のみで使えるデータを選別して利用しているそうです。
パブリックドメインなどオープンな3Dデータには、博物館などが公開している収蔵品のスキャンデータが多く含まれます。生成の品質は学習量にも依存するため、比較的そういった収蔵品に似たモチーフの方が上手く推定される可能性があります。なにか収蔵品風の画像を使って結果を見てみましょう。
生成された3Dデータ
これはStable Diffusion XLで生成したゲームの小物風収納の画像と、それをTripoSRで3D化したものです。15秒程度で生成されたにしては中々ですが、問題も多いです。
形状の歪みや不正確さ、ぼやけたような粗い表面、さまざまなノイズ。マーチングという方法で推定したためであろう、ボコボコと波打った面。ポリゴン数も約36万の三角で、重なりや穴も見つかります。色はテクスチャではなく頂点カラーという方法で格納されてますし、元の画像が持つ照明もそのまま表れています。
他のモチーフも試してみましょう。
いずれも元の画像はStable Diffusion XLで生成したもので、mc-resolutionは猫とバナナが320、それ以外がデフォルトの256です。
ここに挙げたのは比較的形状の推定に問題のなかったもので、テスト結果にはぐちゃぐちゃに崩れたものもそれなりにありました。しかしその割合は低く、元画像が推定の難しい角度でなければかなり安定しています。
いずれも明らかに解像度は不足しており、全体的な形状は酷く破綻しているわけではないものの、面の凹凸や色の欠落が気持ち悪いです。たとえばmc-resolutionに2048など指定できるなら大きく改善しそうですが、RTX 4090でもVRAMがまったく足りないでしょう。
画像生成の場合と同じように、学習に基づく確率的な表現の推定は「正確さ」が苦手です。きっちりした輪郭、滑らかさ、対称、文字やロゴなど、外部に正解が存在する表現は、力技では解決しにくいのを強く感じます。また透明や屈折は全く扱えず、照明の影響の除去もありません。
それでも、このまま順当に性能が向上し、学習量の増加で形状の推定品質の改善と、メッシュ化の効率良い手法によって解像度が上がれば、いずれは直接実用に近い品質の3Dデータがローカルでも数秒で生成できる可能性も感じます。
利用のための加工
こうした今の低品質な出力ですが、それなりに使い道はあります。たとえばゲームや映像などの制作でアタリとして置いたり、モデリングの参考としたり。またゲームでこの出力を直接使うアイデアもあります。
とはいえ出力そのままは扱いにくすぎます。凸凹とした面、数十万ポリゴンの過剰なデータ量、頂点カラーの3点を利用しやすく加工しましょう。ここでの加工はCinema 4DまたはBlenderという3DCGのDCCツールで行いますが、大抵の汎用的なツールなら同じ処理は可能でしょう。
ちなみにCinema 4Dの場合は上記の設定でインポートすれば、座標を正しく、カラーなども持っていけます。Blenderの場合は読み込み後 obj.rotation_euler = (0, 0, -1.5708) などとすれば同様です。
凸凹のスムージング
まずは、メッシュ推定のためのマーチング処理が原因らしき面の不自然な凸凹のスムージング。この処理は読み込んだ直後の最もポリゴン数が多い状態で、いわゆるスカルプトツールのスムーズ機能を使います。
極端にひどい部分を潰しつつ、欲しいディティールは残せます。また直線や平面にはフラット化するなど、スカルプトツールのブラシを変えて補正するなど、大まかに形状を整えます。
ポリゴン数の削減
生成結果は10~40万ポリゴン程度で構成されています。明らかに過剰で表現に貢献できていないため、ポリゴンリダクションツールで減らします。ただしデータは色の表現に頂点カラーを用いているため、これを減らしすぎると、テクスチャに持っていきたい色のディテールも失われます。この後行うUVの自動展開処理の負荷を減らす程度にリダクションします。
ただし不正なポリゴンが多い結果の場合は、まずリメッシュでポリゴンを再構成しないとエラーの原因になります。きれいなリメッシュが行えるなら、最初のポリゴン数削減はリメッシュ処理でまとめて行っても良さそうです。
ここでは単純にポリゴンリダクションツールを使い、80%減らした2万ポリゴンまで落としました。
頂点カラーからテクスチャ焼き込み
3DCGではオブジェクト表面任意の位置の色を表現するのに、テクスチャという画像を面に割り当てるか、頂点ごとの持つ色を指定する頂点カラーという方式を使うのが一般的です。TripoSRの生成データでは頂点カラーで色が表現されていますが、この方式はゲームなどで扱うのに不便な場合が多いので、テクスチャ化します。
手順はツールで異なりますが、UV展開という面と画像の座標対応を行う処理はなるだけ手間をかけたくないので、自動展開機能に任せてしまいます。
非常に汚いUVですが、そもそも手間をかけるほどの品質がないデータなので、なるべく手軽さを優先します。用途によっては、リダクション前に面を貼り直すリメッシュなどかければもう少しきれいな結果になるでしょう。
最後にもう一度ポリゴンリダクションを行いますが、ゲーム用途でなければ不要かもしれません。これで8000ポリゴン程度で、まだまだゲームで大量に使うには重たいです。最初にリメッシュで全体を四角ポリゴン化し、不要なポリゴンの削除や重複ポイントの統合などを挟み、もっと減らしてもいいでしょう。
Blenderでの自動化
ここまではCinema 4Dを使いましたが、無償で使えるBlenderで同じ処理を自動化できると、ゲーム制作などの現場で他のスタッフが手軽に試せます。BlenderのPythonスクリプトで同様の処理を実行してみました。
処理の流れ自体は問題なかったのですが、テクスチャが正しく貼られていません。元のポリゴンに重複したり不正な箇所が多いため、標準のUV自動展開ではうまく扱えなかったようです。こうした処理はフォトグラメトリや3Dスキャンデータの加工などで既存のノウハウがありそうなので、調査して後で修正しましょう。
次回はこうして加工したTripoSRの生成データを、ゲーム制作に直接利用する試みをご紹介します。