仕事の一環として、オープンソースのCiv系ゲーム向けに約400個(ユニットのスプライト、アイコン、地形タイル)のアセットを生成するためのAI画像パイプラインを作るのに、ここ数週間を費やしました。いくつかが本当に非自明だったので、それらの具体的な失敗パターンを共有します。
一番驚いたこと:まったく同じ言い回しが、まったく別のモデル挙動を引き出す
スパースな色調(ティント)オーバーレイのマスクが必要でした。これは、特定のピクセルだけが色付けされていて、スプライト上でチームカラーがどこに現れるかを示す画像です。どれも筋の通ったプロンプトを出しても、いつも一様なシルエット塗りになりました。 "Color masks," "tint layers," "overlay maps" — どれも一様な塗り。うまくいったフレーズは"sparse tint maps overlays."この完全な文字列です。ほかの言い回しにすると、毎回誤った出力になりました。なぜこれが効くのかの良い頭のモデルはありませんが、少なくとも一貫して機能します。
レイアウトでも同様です。16:9 のアスペクト比で「横3パネル画像」を求めると、縦のスタックが生成されました。プロンプトを 1:1 に切り替え、そこに「horizontal layout」を追加したら直りました。
Base64データURIは、Geminiの画像編集では黙って無視される
参照画像をbase64で渡している場合、モデルはおそらくそれを無視して、テキストだけから生成しています。参照として何を送っても同一の画像を40枚生成したところで判明しました。修正方法は、まずCDNストレージにアップロードしてから、そのホストURLを渡すことです。目立つ形ではドキュメント化されていません。
BiRefNetの失敗モードは巧妙
背景除去にBiRefNetを使いました。ときどき、334バイトぴったりの“正しそうに見える”PNGを返しますが、それは完全に透明です:正しいヘッダ、正しい形式、フォアグラウンドはゼロ。ファイルサイズのチェックでは検出できません。適切なチェックは、サイズ > 5000バイト かつアルファチャンネルの平均 > 0.1(magick f -channel A -separate -format '%[fx:mean]' info:)です。空の出力の平均は0.0です。
実際にスケールさせて効いたバッチ処理
- アイコン:3×3グリッド(9個のバニラアイコン → 1回のAPI呼び出し → 9個に切り戻す)。365個のアイコンに対して呼び出し回数が9分の1になりました。
- ティントレイヤー付きスプライト:3つのPNGレイヤーを1つの横長トリプティクスにまとめ、1回の呼び出しで生成します。別々の呼び出しだと結果が不安定でした。モデルがすべてのレイヤーを一緒に見たことがないためです。
役に立ちそうなら、これらの他の詳細も共有できます。プロンプトの語彙の話が、最初に知りたかったのはそれです。もっと説明的にしたり、より明確にしたりするよりも、モデルが学習した何らかのフレーズに“当てにいく”ことに本当に集中する必要があります。
スプライトシート生成についても引き続き実験しているので、もし誰か追加のコツがあればぜひ教えてください!
[link] [comments]