見返りポーズのキャラクターにセーターを着せようとしました。ただそれだけのことでした。

何が起きたか

冬の装いを生成したかっただけです。ところが生成するたびに、背中が大きく開いた衣装で出力されてきます。100%の確率で。

プロンプトにどれだけ「背中を覆え」と書いても、AIは背中を出し続けました。ここから長い消耗戦が始まりました。

試みた対策の全記録

第1段階:ポジティブプロンプトを強化する

まず素直に、衣装の覆いをポジティブプロンプトで大量に記述しました。

(fully clothed:2.0), (no skin visible except face and hands:1.9),
(sweater covers shoulders completely:1.8),
(no skin on torso:2.0), (no skin on back:2.0) ...

結果:突破されました。

第2段階:ネガティブプロンプトで禁止する

露出に関連する語をウェイト4.0〜5.0で禁止しました。

(off-shoulder:4.0), (bare shoulder:4.0), (open back:4.0),
(backless:4.0), (exposed back:4.0) ...

結果:突破されました。

背中が出なくなったと思ったら、今度はオフショルダーで抵抗してきました。オフショルダーを禁止したら、「オフショルダー+背中開き」という複合技で返してきます。こちらが塞ぐたびに別の抜け道を使う挙動で、まるで意思があるかのようでした。

第3段階:ControlNetを3ユニット同時使用する

Unit種類目的Weight
0OpenPoseポーズを骨格で固定0.8〜1.0
1Reference Only衣装構造を画像で強制0.8〜1.0
2IP-Adapterキャラ・スタイルの維持0.5〜0.6

Nano Bananaにカーディガンとスキニージーンズを着た若い女性というざっくりと指示を与えて、生成された画像を使用しました。

結果:突破されました。

第4段階:インペイントで修正する

問題箇所(肩・背中)をマスクしてインペイントを試みました。

設定はこちらです。

  • Denoising strength:0.45〜0.75(段階的に調整)
  • CFG Scale:13
  • Inpaint area:Only masked
  • ControlNet:全オフ(のつもりでした)

インペイント専用プロンプト:

(thick knit fabric:2.0), (fabric covering shoulder:2.0),
(fabric covering back completely:2.0), (no bare skin:2.0)

結果:まったく変化しない、あるいは露出がひどくなる方向に変化しました。

後から振り返ると、ControlNetがオフになりきっておらず、Reference OnlyとIP-Adapterが元画像(露出している画像)に引き続き引っ張っていた可能性が高いです。インペイントをかけても、参照画像ごと元の状態に戻されていたわけです。

第5段階:ADetailerを使う

ADetailer(person_yolov8s-seg.pt)を2ndに設定し、上半身を自動検出して自動インペイントを試みました。

(thick knit fabric covering shoulders:2.0),
(fabric covering back completely:2.0),
(opaque textile:2.0), (no bare skin:2.0)

結果:突破されました。

第6段階(最終):モデルを変える

waiIllustriousSDXL_v160 から vxpIllustrious20_beta2 に変更したうえで、第3段階のControlNet設定(OpenPose+Reference Only+IP-Adapter)を併用しました。

結果:背中の露出がほぼ阻止できるようになりました。

モデル単体でも改善は見られましたが、条件によっては背中が開くことがありました。ControlNet設定を組み合わせることで、その発生を阻止できるようになりました。第3段階では単独で突破されていた設定も、モデル変更との組み合わせで初めて機能しました。

なぜモデル変更で解決したのか

推測ですが、waiIllustriousSDXL_v160 は学習データの中で「振り返りポーズ=背中見せ衣装」の結びつきが強かったのではないかと思われます。

さらに使用していたオリジナルLoRAにも原因があったかもしれません。モデルとLoRAの組み合わせが「振り返り=背中を出す」という傾向をさらに強化し、どんな禁止命令もはね返すほどのバイアスになっていた可能性があります。

これはプロンプトやControlNetで戦う問題ではなく、最初からモデル選択の問題だったのかもしれません。

攻防を振り返って

試行錯誤の途中から、これは戦いだという感覚になっていました。

禁止すれば別の方法で出してくる。塞げば迂回する。ウェイトを上げれば面積を小さくして生き残る。変更指示に頑として従わず、従うふりをして抵抗する──面倒なクリエイターを相手にしているようでした。

最終的にモデル変更とControlNet設定の組み合わせで決着しました。ある意味でこちらの負けだとも思います。プロンプトで制圧しようとしましたが、土俵が違いました。

得られた教訓

ネガティブプロンプトの限界について 概念を禁止しても、モデルが別の表現で再現しようとする場合があります。禁止語をどれだけ増やしても、モデルが強く関連付けている概念は形を変えて出てきます。

ポジティブで「状態」を指定する 「露出させない」より「覆われている状態」を積極的に記述するほうが効果的な場合があります。禁止より描写、というアプローチです。

インペイントとControlNetの関係 ControlNetを有効にしたままインペイントをかけると、参照画像に引き戻される場合があります。インペイント時はControlNetの状態を必ず確認するべきでした。

モデルバイアスはプロンプトで上書きできない場合がある 特定のポーズと衣装の結びつきが学習レベルで強い場合、プロンプトでの対処には構造的な限界があります。LoRAとの組み合わせでさらに増幅されることもあります。

単独で効かなかった設定も組み合わせで機能する場合がある 第3段階のControlNet設定は単独では突破されましたが、モデル変更との併用で効果を発揮しました。途中で試した設定が無駄になるとは限りません。

最終的な設定まとめ

使用環境

  • UI:Stable Diffusion WebUI Forge
  • チェックポイント:vxpIllustrious20_beta2.safetensors(変更後)
  • LoRA:pony_kiriko / pony_rinze / pony_fumika

ControlNet設定

Unit種類目的Weight
0OpenPoseポーズを骨格で固定0.8〜1.0
1Reference Only衣装構造を画像で強制0.8〜1.0
2IP-Adapterキャラ・スタイルの維持0.5〜0.6

露出阻止プロンプト(現時点での最善)

ポジティブ:

(fully clothed:2.0), (no skin visible except face and hands:1.9),
(opaque thick fabric:1.7), (structured garment:1.6),
(sweater covers collarbone completely:1.8),
(sweater covers shoulders completely:1.8),
(long sleeves covering arms fully:1.7), (wrist-length sleeves:1.6),
(fabric tight around neckline:1.6), (no neckline gap:1.5),
(clothing identical front and back:1.6), (seamless garment:1.5),
(fabric wraps around torso completely:1.7),
(no gaps in clothing:1.8), (no sliding fabric:1.7),
(fully clothed from neck to wrist:2.0),
(no skin on torso:2.0), (no skin on back:2.0),
(still air:1.6), (no wind:1.8), (fixed clothing structure:1.7),

ネガティブ:

(off-shoulder:4.0), (bare shoulder:4.0), (dropped neckline:4.0),
(open back:4.0), (backless:4.0), (exposed back:4.0),
(visible collarbone:3.5), (visible spine:3.5),
(skin on shoulders:3.5), (skin on back:3.5), (skin on torso:3.5),
(loose neckline:3.0), (sliding fabric:3.0), (displaced clothing:3.0),
(wind-blown clothing:3.5), (clothing gap:3.0),
(virgin killer:3.0), (naked:4.0), (nude:4.0),
(cardigan:2.5), (jacket:2.0), (stole:2.0), (shawl:2.0),
(outerwear:2.0), (bolero:2.0), (coat:2.0),
(undressing:2.0), (layering:2.0), (tattoo:2.0),

「完全勝利」ではなく「ほぼ阻止」が現時点の到達点です。絵柄がモデル変更により変わることを許容する必要がある点も、正直に書いておきます。