STATION OOPS開発ログ⑥後編:Stable Diffusion ステージ素材制作編

初心者向け実践開発

※本記事にはアフィリエイトリンクを含みます。

前編ではAutoSpriteでのキャラクター・カットシーン制作を紹介しました。後編は、同じ時期に並行して進めていた、Stable Diffusion(AUTOMATIC1111という無料ツール経由で動かすAI画像生成)を使ったステージオブジェクト・タイル素材の制作についてまとめます。ツールを導入してすぐうまくいった話ではなく、環境構築のトラブルから始まった回でした。

依存関係のイタチごっこ(ControlNet導入トラブル)

構図を制御する拡張機能ControlNet(下絵やポーズを指定して、その通りの構図で生成させるための追加機能)を導入した際、mediapipe(画像処理用のライブラリ)のバージョンが合わず、エラーで動かなくなりました。原因は、新しいバージョンで必要な機能が廃止されていたことです。

対処として古いバージョンに戻したのですが、それに連動してnumpy・Pillow・protobuf・OpenCVといった他のライブラリのバージョンもズレてしまい、1つ直すと別のところが壊れる、という「イタチごっこ」を経験しました。最終的には、関係するライブラリのバージョンを個別に固定し直すことで安定させました。依存関係のトラブルは、直したつもりが別の場所に影響することがある、という教訓です。

ControlNetの効きの調整とNaNエラー

ControlNetを導入した後も、最初は下絵の線画情報がうまく反映されず、効果が弱いままでした。設定していた解像度が低すぎたことが原因で、解像度とWeight(ControlNetの効きの強さを決める数値)を引き上げることで改善しました。

ところが、これらの数値を上げすぎると、今度はNansException(画像生成の内部処理でNaN、つまり計算不能な値が発生してしまうエラー)が出るようになりました。原因は、8GBという限られたVRAM(グラフィックボード上の作業用メモリ)環境での精度の限界でした。最終的には、Weightと解像度を少し下げたところで、安定して動く設定に落ち着かせました。

フラットなタイルは生成AI不向きという判断

床のタイルのような、模様の情報量が少ないフラットな画像は、img2img(既存の画像をベースに別の画像を生成する手法)で加工しようとしても、Denoising(元の画像からどれだけ変化させるかを決める数値)を上げても「ほとんど変化しない」か「意味不明な柄に暴走する」かのどちらかにしかなりませんでした。

ここでの判断は、無理にAIでの加工にこだわらず、Pillow(Pythonの画像処理ライブラリ)で発光ラインなどを直接描き込む手作業に切り替えることでした。生成AIには向き不向きがあり、素材の性質によっては手作業の方が確実で狙い通りに仕上がる、という考え方です。

「最小単位を並べる」から「大型オブジェクト」への方針転換

ステージオブジェクト(床や足場に置く小道具類)は、当初「崩れた棚」「散らばった箱」のような最小単位のパーツを複数並べる設計を検討していました。しかし、最小単位を反復して並べるだけでは不自然に見えるという判断に至り、プレイヤーの身長を基準にした、1個で画面として完結する大型オブジェクトを作る方針に転換しました。

シルエットの誤読問題(トンネル・パイプ問題)とアイソメ視点での解決

はしごや板状の足場のような、細長く中が空いた形の下絵を生成すると、AIがそれを「トンネルの内部を覗き込んだ構図」や「パイプ・砲弾」として誤読してしまう現象が繰り返し発生しました。

内部に補強のリブ(骨組みの線)を足す対策も試しましたが、今度は各セルが虹色に塗り分けられる別の問題が発生してしまいました。最終的に安定したのは、構図そのものをアイソメ視点(ななめ上から見下ろす、天面と側面がどちらも見える構図)に変更する方法でした。細長い形をそのまま正面から描かせるのではなく、視点自体を変えることで誤読を避ける、という解決策です。

複数オブジェクトの同時生成は破綻する → 単一生成+Pillow複製

3段の階段状オブジェクトのように、複数のブロックを1回のプロンプトでまとめて生成しようとすると、高確率で各ブロックが別々の色に塗り分けられたり、配管のような無関係の構造に化けてしまう破綻が起きました。

最終的な解決策は、単一のブロックだけをまず1個生成し、それをPillowで複製・配置するという方式に統一することでした。以後の素材はすべてこの方式で安定して量産できるようになりました。複数の要素を一度に生成させようとせず、最小の単位だけをAIに任せ、組み合わせは自分たちの手で行う、という役割分担です。

色指定の不安定さと、生成速度のトラブルシューティング

「暖色系」「シルバーベース」のような曖昧な色の指定は、プロンプトの言葉だけでは安定しませんでした。Negative prompt(生成してほしくない要素を指定する欄)に、避けたい具体的な色名を明示的に加えることで、初めて意図した配色に近づきました。

もう1つ、同じ設定で生成しても、生成にかかる時間が数分から数十秒まで大きくばらついてしまう現象もありました。原因は、VRAMを裏で別のアプリが専有していたことと、ノートPCの電源制限でGPUの消費電力が制限されていたことでした。起動オプションを見直し、VRAMを解放することで改善しました。生成速度がばらつくときは、生成の設定そのものより、PC側の他のプロセスやハードウェアの制限を疑ってみる価値があります。

まとめ・次回予告

今回は、Stable Diffusionでのステージ素材制作で起きた、環境構築のトラブルから構図の誤読、素材ごとの向き不向きの見極めまでをまとめました。前編のAutoSpriteと合わせて、AI生成ツールは万能ではなく、素材の性質や状況に応じて「手作業に切り替える」「役割を分担する」判断が繰り返し必要になる、という共通の学びが見えてきた回でした。次回は、Godot実装における定番の落とし穴を紹介します。

Stable Diffusionの環境構築やControlNetの使い方を体系的に学びたい方は、以下の講座も参考になります。

コメント

タイトルとURLをコピーしました