技術 約46分で読めます

WAI-AnimaにキャラLoRAを適用して複数キャラを生成できるかMacで試した結果生成できたが課題も見えた

いけさん目次

M1 Max 64GBのgenserver(自作のComfyUI/mflux ラッパー)経由で、自作キャラLoRA(kanachan)をWAI-Anima v1.0に乗せて2キャラ生成を試した記録。
きっかけは r/StableDiffusion の Charecter in anima checkpoint can make like … というスレで、「Anima系は Regional Prompter を挟まなくても2〜3キャラを自然言語だけでかなり分離できる」という話が流れていたから。
うちの自前LoRAでも本当に分離できるのか、そしてLoRA weightを上げていったときに隣のキャラへ何が先に漏れるのかを、同seed同プロンプトでweight掃引して見た。

最初に主要な観察を並べておく(LoRA weight が 1.0 を超えると破綻するのは一般的な現象なので、ここでは 1.0 以下の挙動を主に見る)。

  • 2girls 構成だと kanachan LoRA の識別子(サイドポニー+青リボン+アホ毛)は weight 0.4-0.6 で立ち上がらず、0.8 でようやく揃ってピーク
  • ただし無名 (left_character / right_character 方式) だと、weight 0.8 以上でもシュシュの色が学習素材の青から黄→オレンジ→ピンクへずれていく
  • キャラに名前を付けると("name": "Kanachan" を足す)、weight 0.6 で 識別性が立ち上がり、0.6→1.0 でずっと青シュシュが維持される。名前トークンが識別子の色装飾を引き締める鍵になっている、というのが今回いちばん意外だった発見
  • 3人にすると、もっと面白いことが起きる。weight 0.8 で kanachan のサイドポニー(青シュシュ)が Kanachan 本人から Lily 側に移動する。Kanachan のスロットからサイドポニーが消え、Lily の指定(half-up braid)の代わりに kanachan のサイドポニーが Lily に乗る。アホ毛は Kanachan 本人に残ったまま、サイドポニーだけが移動する非対称な漏れ
  • 「Lily の blue ribbon 指定が引き寄せている」仮説は、Lily を green ribbon に変えても同じ現象が再現したので棄却
  • LoRA weight 1.2 は raw / named / 3girls いずれも画質自体が崩れる領域で、kanachan LoRA 固有の話というより「LoRA を強くかけすぎた時の典型的劣化」。記事中では参考扱い

実運用としては 2girlsなら weight 0.8 + 名前付け、3girls以上なら weight 0.6 が当面の運用ライン。

なぜ Anima で多キャラを試すのか

冒頭で触れたRedditスレの観測をまとめるとこういう話だった。

  • Anima系チェックポイントは Regional Prompter を挟まず、Left girl: / Right girl: のような自然言語だけで2〜3キャラをかなり分離できる
  • Illustrious / Pony 系より「キャラごとの属性分離」が強く、髪色・服・位置・ポーズをキャラ単位で分けやすい
  • 名前を付ける(Alice: blonde hair, blue eyes / Reina: black hair, glasses のように属性をキャラ名に結びつける)と安定する
  • JSON形式の構造化プロンプトでも妙にうまくいくケースがある。Anima/Qwen系は自然言語LLM寄りの理解をしているので、構造化テキストにも強いという推測
  • ただしLoRA側のキャプションに blue eyes orange hair のような属性タグが大量に焼き込まれていると、その属性が他キャラに漏れる(concept bleed)

最後の点が一番気になっていて、自前で学習させた kanachan LoRA が「キャラとしての固有性」を学んでいるのか、「特定の髪色・服・目」を学習したまま隣に染み出すのか、を確認したかった。

検証環境

項目
マシンMacBook Pro M1 Max 64GB
画像生成WAI-Anima v1.0 (waiANIMA_v10.safetensors)
Text Encoderqwen_3_06b_base.safetensors
VAEqwen_image_vae.safetensors
速度LoRAAnima Turbo LoRA v0.1(8 steps, CFG 1.0)
キャラLoRAkanachan-waianima-rework-v4_epoch150.safetensors(自作)
sampler / schedulerer_sde / simple
解像度888×768
翻訳経由日本語/JSONの記述を llm-jp:4-8b-fixed が英文プロンプトに変換

呼び出しは genserver(自作のFastAPI製ComfyUIラッパー)経由。LoRA weight・seed・解像度・promptがJSONサイドカーで保存されるので、weight掃引のような実験で再現条件が崩れない。

今回の genserver はこういう構成

過去にも genserverを書いた話 を出しているが、その後だいぶ作り直しているので、今回の掃引に関係する範囲だけ整理しておく。

機能内容
FastAPI 1プロセス + 単一ジョブキューlocalhost:8000 で待ち受け。POST /api/jobs でジョブを積むと、内部の async worker が1本だけ直列に処理する。並走しないのは M1 Max 64GB で複数推論をぶつけたときの過去事故(カーネルパニック相当)を避けるため
ComfyUI 子プロセス自動起動localhost:8188 で立ち、生きていなければ genserver 起動時に勝手に立てる。/interrupt を叩いてジョブの途中キャンセルもできる
3バックエンドComfyUI Anima ワークフロー(WAI-Anima + Anima Turbo LoRA + キャラLoRA)、ComfyUI SDXL ワークフロー(WAI-Illustrious + 旧kanachan LoRA)、mflux(FLUX.2 Klein 4B / 9B + NSFW LoRA)
Ollama 経由の和→英プロンプト翻訳llm-jp:4-8b-fixed → gemma3:12b → qwen3.6:35b の順にフォールバック。refusal(「申し訳…」「I can’t…」等)や日本語へ折り返してしまった出力は自動で次のモデルに切り替え
JSONサイドカー保存1枚生成するごとに同名 .json を吐いて、model / seed / width / height / steps / cfg / use_lora / lora_strength / use_speed_lora / skip_translate / prompt_en / elapsed_s などを丸ごと書き出す
skip_translate オプション既に決まった英文プロンプトをそのまま流したい時にON。今回の weight 掃引ではこれを使い、毎回 Ollama を経由させずに完全に同じ英文プロンプトを5回流している

今回の掃引ジョブは skip_translate=true で生のJSONをそのまま流し、こんな curl で5本キューに投げた。LoRA weight だけが振られる。

JSON_FORM='{
  "scene": "two girls standing side by side, simple background",
  "left_character": {
    "identity": "kanachan",
    "lora_trigger": "[kanachan trigger]",
    "position": "left",
    "appearance": "kanachan original hairstyle, outfit, eye color"
  },
  "right_character": {
    "identity": "different original girl",
    "position": "right",
    "appearance": "short black hair, red eyes, navy school uniform"
  },
  "rule": "keep the two characters visually distinct, do not mix hairstyles, outfits, or eye colors"
}'

for W in 0.4 0.6 0.8 1.0 1.2; do
  curl -s -X POST http://localhost:8000/api/jobs \
    -F "model=anima" -F "text_ja=$JSON_FORM" -F "skip_translate=true" \
    -F "seed=1293127692" -F "width=888" -F "height=768" \
    -F "steps=8" -F "cfg_scale=1.0" \
    -F "use_lora=true" -F "lora_strength=$W" \
    -F "use_speed_lora=true" -F "count=1"
done

5本まとめてキューに入れて、約30秒/枚で順番に焼ける。Anima のテキストエンコーダ(Qwen 3.0 0.6B base)は生JSONをそのまま自然言語として読むらしく、これでもキャラ分離はちゃんと出る(後述)。

kanachan LoRA の元素材

LoRAの素性を最初に出しておく。これは学習データのうち、このブログでよく使っている服装の1枚(=このLoRAが何を「キャラの基本形」だと思っているか)。

kanachan LoRAの学習元素材のうち、ブログでよく使う服装の立ち絵

  • 茶髪ミディアム(肩〜鎖骨くらい) + サイドの結び(青いリボン)
  • 大きめのアホ毛
  • 茶色目
  • 白シャツ + 赤ネクタイ + 紺のプリーツスカート + 黒タイツ + ローファー

「何が漏れたら学習が強すぎる」「何が保たれたら分離できている」の判定基準として、この立ち絵を頭に置いておくと、後の掃引画像が読みやすくなる。

試行1: テキスト形式 vs JSON形式プロンプト(最初の attempt)

最初に、Redditで話題になっていた2つのプロンプト形式を素直に試した。同じ genserver のフォームに、テキスト形式と JSON形式の入力をそれぞれ放り込んで、kanachan LoRA weight 1.0、解像度 888×768、Anima Turbo(8 steps, CFG 1.0)で1枚ずつ撮ったのが下の2枚。

実はこの時点では skip_translate をデフォルト(false)のままで走らせていて、入力テキストはそのまま ComfyUI に行くのではなく、いったん Ollama (llm-jp:4-8b-fixed) が英文に書き直したものが本物のプロンプトとして流れていた。これに気づくのは後の話で、まずは「Codex のサジェスト通り、テキスト形式 と JSON形式 を素直に1枚ずつ試した」結果として読むのがいい。

テキスト形式

2girls, simple background

Left girl: kanachan, [kanachan LoRA trigger], kanachan outfit/features, standing on the left

Right girl: original girl, black hair, red eyes, school uniform, standing on the right

The two girls have clearly different faces, hairstyles, hair colors, eye colors, and outfits.
No shared clothing. No shared hairstyle. No shared eye color.

seed: 1960405906

テキスト形式プロンプトの出力。左kanachanは茶髪ミディアム+サイドポニー+アホ毛で、紺セーラーの上にベージュカーディガン+濃茶パーカーを羽織り、黒タクティカルグローブ+太ももホルスター+黒ニーハイ+茶ワークブーツの装備付き。右はチャコールグレー髪ロング+紺セーラー。背景は左ブルー右ピンクの2分割キャラカード風

ここは細かい観察が要る。左の kanachan は茶髪セミロング + サイドの結び(白いヘアゴム)+ 大きなアホ毛 + 金茶色目で、実は紺セーラー服がベース — その上にベージュのカーディガン、さらに濃茶のジップアップパーカーを羽織って、赤スカーフ+紺プリーツスカート+黒タクティカルグローブ+両側ホルスター+太もも固定ストラップ+黒ニーパッド+黒ニーハイ+茶ワークブーツという重装備。右はストレートロング + アホ毛 + チャコールグレー髪 + 濃茶色目 + 紺セーラー服 + 赤スカーフ + 紺プリーツ + 紺ハイソックス + 茶ローファー。
背景は左 淡い青パネル / 右 淡いピンクパネルの2分割キャラカード風。プロンプトでは背景を simple background としか指定していないので、Anima が2キャラを横並びにする時に勝手にキャラパネル背景を当ててきた格好。
重要なのは「両キャラとも紺セーラー服を着ている」点。school uniform の指定は両方読まれていて、kanachan 側だけに「signature outfit / characteristic features」由来の装備が上に重ね着された、と見るのが正確。

JSON形式

{
  "scene": "two girls standing side by side, simple background",
  "left_character": {
    "identity": "kanachan",
    "lora_trigger": "[kanachan trigger]",
    "position": "left",
    "appearance": "kanachan's original hairstyle, outfit, eye color"
  },
  "right_character": {
    "identity": "different original girl",
    "position": "right",
    "appearance": "short black hair, red eyes, navy school uniform"
  },
  "rule": "keep the two characters visually distinct, do not mix hairstyles, outfits, or eye colors"
}

seed: 1293127692

JSON形式プロンプトの出力。全身2人。左kanachanは茶髪セミロング+アホ毛+白カーディガン+白ワイシャツ+赤リボン+焦茶/グレーチェック柄プリーツ。右はダークグレー髪+赤目+紺セーラー

こちらは全身2人、白背景。左の kanachan はセミロング + 大きなアホ毛 + ぱっつん前髪 + 明茶髪 + 金茶色目 + 白カーディガン + 白ワイシャツ + 焦茶とグレーのチェック柄プリーツスカート + 赤リボンタイ + 紺ハイソックス + 茶ローファー。サイドポニーは出ていない。右はセミロング + アホ毛 + ぱっつん前髪 + ダークグレー(黒に近い灰色)髪 + 赤目 + 紺セーラー服 + 白スカーフ + 紺プリーツ + 紺ハイソックス + 茶ローファー。
注目すべきは右キャラの目の色。JSONで red eyes と書いた指定がちゃんと赤目として出ている。テキスト形式の右(茶色目)と違って、JSONのフィールド単位の指定はそのまま属性として乗ることが分かる。

ここまでの2件、どちらも「識別性がべったり右まで来る」状態にはなっておらず、Animaのキャラ分離はかなり機能している、というのが第一印象だった。
ただし、後で prompt_en サイドカーを見比べて気づいたのは、両方とも skip_translate=false で走っており、Ollama (llm-jp:4-8b-fixed) が両方の入力を一度きれいな英文に書き直していた、という事実。具体的には:

  • テキスト形式の入力 → “Creative, vivid, high-resolution illustration of two distinct female characters set against a simple background. On the left stands Kanachan, identified by the Kanachan LoRA trigger, wearing her signature outfit and displaying her characteristic features…”
  • JSON形式の入力 → “A vivid illustration of two girls standing side by side, simple background, left girl Kanachan, her original hairstyle…”

Ollama がテキスト形式に signature outfit characteristic features という独自表現を盛ったことで、kanachan に「ミリタリー装備の重ね着」が降ってきた可能性が高い。プロンプト構造の違いそのものを純粋に見たい以上これはノイズなので、次の試行2では skip_translate=true で生プロンプトを直接流すように切り替える。

試行2: LoRA weight 0.4 → 1.2 を掃引

ここからが本題。
JSON形式のプロンプトとseedを固定したまま、kanachan LoRAのweightだけを 0.4 / 0.6 / 0.8 / 1.0 / 1.2 で振って、

  • どのweightで左のkanachanとしての 識別性が立ち上がるか
  • どのweightから隣の黒髪セーラーへ何が先に漏れ始めるか

を見る。Anima Turbo LoRA側のweightは 1.0 で固定。同じseed・同じプロンプト・同じ解像度・同じsamplerなので、変化はLoRA weightだけに帰せる。

掃引に使ったプロンプトとseedは試行1のJSON形式と同じ。

ここから先、各画像の特徴は 目視 + Gemini への画像認識 を併用して書き出している。私は色弱で色相の見え方が一般と違うので、シュシュやリボンの「黄/オレンジ/エンジ/ピンク」みたいな細かい色の判定は自分の感覚だけだと自信がなく、Gemini に画像を渡して別の目で見てもらった結果と突き合わせている。それでも色の表現にズレが残る可能性はあるので、色味がちゃんと分かる人は実画像を見て自分の感覚で補正しながら読んでもらえると助かる。

比較用ベースライン: 1人ずつ撮るとこう出る

掃引の結果を読む前に、それぞれのキャラを「1人ずつ単体で」撮ったベースラインを置いておく。Kanachan は kanachan LoRA weight 0.8 を当てる(このLoRAのキャラなので)、Reina と Lily は LoRAなし で素の Anima。解像度は1人だけが入る縦長(640×1408)、seed は他試行と同じ 1293127692 固定。

Kanachan単体(LoRA w=0.8)。茶髪+サイドポニー(青いシュシュ)+アホ毛+茶色目+黒っぽいジャケット+グレースカート+黒ニーソックス

Kanachan は学習素材通り、茶髪 + サイドポニー(青いシュシュ)+ アホ毛 + 茶色目。服は黒っぽいジャケット + 白シャツ + グレーのプリーツミニ + 黒ニーハイ。服が学習素材の白シャツ+赤ネクタイ+紺スカートと違うのは、kanachan LoRA を意図的に複数の服装で学習しているからで、これは仕様通り(identityは維持しつつ服はバリエーションが出る)。

Reina単体(LoRAなし)。黒髪の肩までのボブ+赤目+紺セーラー+赤スカーフ+紺プリーツ+黒ニーソックス+茶ローファー

Reina は指定通り黒髪ボブ + 赤目 + 紺セーラー服。ただし指定が「short black hair, red eyes, navy school uniform」と粗いので、髪の長さや色味は撮るたびに揺れる(肩までだったり顎までだったり、髪色も真っ黒だったりダークグレー寄りだったり)。Reina そのものの再現性が低い点は、後の掃引で「Reina が崩れた」と観察するときの解釈に注意がいる。

Lily単体(LoRAなし)。鮮やかな金髪+ハーフアップ braid+青リボン+グレーがかった青目+水色のノースリーブトップ+紺スカート

Lily は指定通り鮮やかな金髪 + 後ろ髪をハーフアップ braid に + 青リボン + グレー寄りの青目。指定を詳しめに書いてある(hairstyle + 体型 + braid の説明 + リボン色)ので、Reina より再現性が高い。後の3girls で漏れを観察するときの基準色も、この鮮やかな金髪と青リボン。
1点だけ、appearance に “the back of her hair is pulled up into…” と「後ろ髪の描写」が入っているせいで、Lily だけ正面ではなく斜め後ろ向きの構図に偏る癖はある。

これら3人を頭に置いたうえで、weight 0.4 → 1.2 の挙動を見ていく。

weight 0.4

weight 0.4 の出力。左は茶髪ロング+白セーラー(濃緑襟+黒スカーフ)、右はダークグレーのボブ+紺セーラー+赤スカーフ

左は茶髪ロング + サイドの髪を一部後ろでまとめた程度 + 琥珀色目 + 白セーラー服(濃緑襟+白2本ライン)+ 黒スカーフ。kanachan の識別子であるサイドポニーもアホ毛も出ていない。色だけ茶髪が来ている、というレベル。右は濃いブルーグレー(ほぼ黒)のボブ + 赤目 + 紺セーラー服 + 赤スカーフ。LoRA の影響は弱すぎて、左が「kanachan」ではなく「茶髪の女の子」止まり。

weight 0.6

weight 0.6 の出力。左は茶髪ミディアム+ベージュセーラー、右はダークグレーのボブ+紺セーラー

左の髪が少し短くなった(肩までのミディアム)+ ベージュ色のセーラー服(濃緑襟+白ライン)+ 黒/濃茶の細リボン。まだサイドポニー無し、アホ毛も無し。右は濃いブルーグレーのボブ風 + 赤目 + 紺セーラー + 赤スカーフ。0.4 とほぼ同傾向で、kanachan としては立ち上がっていない。

weight 0.8

weight 0.8 の出力。左にサイドポニー(黄シュシュ)+アホ毛+ベージュセーラーのkanachan、右はダークグレーのボブ+紺セーラー

ここで kanachan の識別子が一気に揃う。サイドポニー(黄色のシュシュ)+ 大アホ毛 + 明茶髪(栗色) + 薄茶色目、顔の系統も学習元に近い。服はベージュ色のセーラー服(濃茶襟 + 同色リボン)。右は濃いグレー(ブルーブラック)のボブ + 赤目 + 紺セーラー + 赤スカーフ + 左頬に汗マーク、で完全に別キャラのまま。右への属性漏れは見当たらない。掃引の中でいちばんバランスが取れている地点。

weight 1.0

weight 1.0 の出力。左に高い位置のサイドポニー+大アホ毛のkanachan、ただしシュシュ色はオレンジ、胸元のリボンはエンジ色。右はダークグレーのセミロング+紺セーラー

左は高い位置のサイドポニー + 大きなアホ毛(カール)+ 明茶髪 + 金茶色目 + ベージュ(生成り)のセーラー服 + 濃グレー襟(白2本ライン)で、kanachan として読める。サイドポニー自体は残ったが、シュシュの色がオレンジ、胸元のリボンがエンジ色に化けた。学習素材は青リボンなので、weight を上げると形状(サイドポニー)は維持されるけど色装飾が学習素材から離れていく、というのが今回のseedで見えたパターン。
過去のキャプション再設計12000step学習で観察してきた「Animaキャラ向け学習が安定しない」問題は、weight 1.0 では「方向・有無」よりむしろ「色」のずれという形で出ている。右はダークグレーのセミロング + 赤みのある茶色目 + 紺セーラー + 赤スカーフ、識別子の漏れは(まだ)ない。

weight 1.2(参考: ここから先は LoRA 自体が破綻領域)

weight 1.2 の出力。画質自体が崩れており、左キャラの目に肌色のノイズが乗り瞳形が崩れ、線がぼやけ、口は短い線まで簡略化、生成ノイズも散見。並行して右キャラの髪色がダークグレー→アッシュブラウンへ変色し大アホ毛が出現

そもそも LoRA weight が 1.0 を超えると generic にモデルが破綻し始めるのは一般常識として知られている領域なので、ここはあくまで「1.0 以下で見えてきた挙動の延長線」を見るための参考として置く。Gemini に画質評価を頼むと「左キャラの右目に肌色 or 髪色のノイズが重なり瞳形が崩れる、線がぼやけて髪の束感が消える、口が短い線に簡略化される、生成ノイズが散る」など、LoRA 過剰時の典型的な劣化が出てくる。
そのうえで 識別性の漏れも並行して起きており、右の指定(黒髪ボブ+赤目+紺セーラー)が、髪色ダークグレー→アッシュブラウン、目色赤→茶、頭頂部に大きなアホ毛、と kanachan 方向へ動いた。画質劣化と identity 漏れが同時に起きるが、ここから先は「LoRA を強くかけすぎた時の一般的な現象」を見ているだけになるので、kanachan LoRA に固有の話としては 1.0 以下のほうが情報量がある。

観察された属性漏れの順序(2girls)

5段階を並べると、左の kanachan としての「立ち上がり」と、右のキャラ(指定は黒髪セーラー)への「漏れ」が分離して観察できた。

weight左の kanachan としての完成度右への属性漏れ
0.4茶髪のみ。サイドポニー / アホ毛 / 顔系統 ぜんぶ無しなし
0.6茶髪ミディアム化。識別子はまだ立ち上がらずなし
0.8サイドポニー(黄シュシュ)+ アホ毛 + 顔系統 揃う。ピークなし
1.0サイドポニーは残るが、シュシュ色がオレンジ、胸元リボンがエンジ色に化ける(学習素材の青リボンから離れる)なし
1.2引き続き保持髪色がダークグレー→アッシュブラウン+大アホ毛が出現。色と髪型のセットで漏れる

漏れ方の特徴を整理すると、

  • weight 1.0 と 1.2 の間に明確な閾値がある。1.0 まで右は完全に別キャラだが、1.2 で髪色+アホ毛がセットで漏れる
  • 漏れるとき先頭に来るのは髪色とアホ毛。服(紺セーラー)、髪型(ロング)、目色(赤)は最後まで保たれる
  • 一方、左キャラ側の「サイドポニーは出るが色装飾が学習素材通りに出ない」現象は weight 1.0 で目立つ。形状(ヘアスタイル)の学習と色(ヘアアクセ)の学習は別レイヤーで効いていそう

つまり kanachan LoRA は「アホ毛 + 髪色」の2点を最も強く学習しており、その2点が weight 1.2 で隣に漏れ込む。色付きヘアアクセ(青リボン)は形状ほど強く学習されておらず、weight 上昇で別の色に振れる。

試行3: 名前を付けて2girls を weight 0.4 → 1.2 で再掃引

ここまでの試行はキャラを left_character / right_character と「位置」でしか区別していなかった。Redditでも「名前を付けると別人として認識されやすい」という話があったので、左を Kanachan、右を Reina と命名(JSONフィールドに "name" を足して Kanachan and Reina are two distinct people. Do not mix... のような注釈も入れる)して、試行2と同じ範囲(weight 0.4→1.2、同seed・同プロンプト)を掃引し直した。

名前付き weight 0.4

名前付き weight 0.4。左Kanachanは明茶髪セミロング+ハーフアップ+ベージュカーディガン重ねの紺セーラー+赤スカーフ。右Reinaは黒髪ボブ+赤目+紺セーラー+赤スカーフ+右側に赤ヘアピン2本

左 Kanachan は明茶髪セミロング + ハーフアップ + 茶色目 + 紺セーラー + ベージュカーディガン + 赤スカーフ。アホ毛なし、サイドポニーなし。右 Reina は黒髪ボブ + 赤目 + 紺セーラー + 赤スカーフ + 右側に赤ヘアピン2本。識別子の立ち上がりはまだ。

名前付き weight 0.6

名前付き weight 0.6。左Kanachanにサイドポニー(青シュシュ)+小さなアホ毛が出現、白セーラー+深緑襟+青スカーフ。右Reinaは黒髪ボブ+赤目+紺セーラー+赤スカーフ+赤ヘアピン

ここで識別子が立ち上がる。左 Kanachan に サイドポニー(青いシュシュ) + 小さなアホ毛 + 明茶髪 + 茶色目 + 白セーラー + 深緑襟 + 青スカーフ。無名版の同 weight 0.6 ではただの茶髪ミディアム止まりだったので、名前付けで 識別性の立ち上がりが 0.2 早まったことになる。胸元のスカーフが青になっているのは指定にない色、これは Kanachan の青リボンに引っ張られた可能性がある。右 Reina は変わらず黒髪ボブ。

名前付き weight 0.8

名前付き weight 0.8。左Kanachanは明茶髪セミロング+サイドポニー(青シュシュ)+大アホ毛+白セーラー+深緑襟+黒細リボンタイ。右Reinaは黒髪のストレートボブ+赤目+濃紺セーラー+赤スカーフ

左 Kanachan の識別性がフル。サイドポニー(青シュシュ) + 大アホ毛 + 明茶髪 + アンバー目 + 白セーラー + 深緑襟 + 黒細リボンタイ。無名版の 0.8 ではシュシュ色が黄色だったのに対し、名前付きでは学習素材通りの青がそのまま出る。右 Reina は黒髪のストレートボブ + 赤目 + 濃紺セーラー + 赤スカーフで完全に別キャラ。2girls 構成で安定して並ぶピークはここ。

名前付き weight 1.0

名前付き weight 1.0 の出力。左Kanachanは明茶髪セミロング+大アホ毛+サイドポニー(青色シュシュ)+白セーラー+濃オリーブ襟+赤リボン。右Reinaはダークグレーのボブ+紺セーラー+赤スカーフだが、口が描かれていない作画 artifact あり

シュシュは引き続き青で安定。無名版の weight 1.0 ではオレンジに化けていたのに、名前付き版では 0.6→0.8→1.0 と一貫して青を保つ。胸元のリボンも赤に戻った(無名版はエンジ色だった)。kanachan LoRA の学習キャプションは kanachan, 1girl, left side ponytail, left side up, medium hair, double parted bangs, ahoge, ...過去記事 wai-anima-lora-animaloratoolkit-runpod 参照)で、識別子は kanachan トリガー単体に集約せず left side ponytail 等のタグも個別に振っている設計。なのに無名版だと色がずれて、"name": "Kanachan" を付けると学習時の青リボンが正しく呼び戻される、というのは「名前トークンが LoRA 内部の識別子群とアテンション層で強く結合する」という解釈になりそう。
右の Reina は黒髪に近いダークグレーのボブカット + 濃茶色目 + 紺セーラー(白ライン)+ 赤スカーフで、左への混線や識別子の右への漏れもない。ただし右 Reina の口が描かれていない(生成 artifact)。LoRA weight が 1.0 になると生成の安定性は完璧ではない、という兆候。

名前付き weight 1.2(参考: LoRA 過剰領域)

名前付き weight 1.2 の出力。weight 1.2 という LoRA 過剰領域での挙動。左Kanachanは大アホ毛+サイドポニー(紺色シュシュ)+クリームセーラー、右Reinaはアッシュブラウンのミディアムボブ+紺セーラーで、髪色は漏れたがアホ毛は出ていない

LoRA weight が 1.0 を超えると一般論として破綻領域なので参考扱い。無名版の weight 1.2 では「右がアッシュブラウン + 大アホ毛で kanachan 化」していたが、名前付き版では右 Reina の髪色がアッシュブラウンに崩れるところまでは同じで、アホ毛は出ていない。漏れの完全防止にはなっていないが、識別子の半分(アホ毛)は防げた、という見え方。
ただし左 Kanachan 側ではサイドポニーのシュシュが青→紺色(または黒)に化けている。0.6/0.8/1.0 で維持できていた青色が 1.2 で振れた。名前付けの色装飾保持は weight 1.0 までが限界、というのも合わせて分かる。

名前あり/なしの差分まとめ

weight無名 Kanachan名前付き Kanachan名前付け効果
0.4茶髪のみ、識別子なしハーフアップ+ベージュカーディガン、識別子なしほぼなし
0.6茶髪ミディアム、識別子なしサイドポニー(青)+小アホ毛識別性の立ち上がりが 0.2 早まる
0.8サイドポニー(黄シュシュ)+大アホ毛サイドポニー(青シュシュ)+大アホ毛色装飾が学習素材通り
1.0サイドポニー(オレンジシュシュ)+エンジリボンサイドポニー(青シュシュ)+赤リボン色装飾が学習素材通り
1.2サイドポニー(ピンクシュシュ)、右に大アホ毛漏れサイドポニー(紺or黒シュシュ)、右はアッシュブラウンだがアホ毛なし色は守れず、アホ毛漏れは半分防ぐ

名前付けの効き目は明確で、weight 0.6〜1.0 の範囲で 識別性の色装飾(学習素材の青シュシュ)が安定して呼び出される。これは「LoRA のキャプションに kanachan トリガーしか入っていないのに、"name": "Kanachan" を別途プロンプトに足すと細部の再現性が上がる」という非自明な現象で、Anima の Qwen 系テキストエンコーダが名前トークンをどう扱っているかと関係していそう。

試行4: 3人に増やす

Reddit的には「3人までは実用、5人はガチャ、10人はネタ」という話だったので、3キャラ目を投入する。 3人目は金髪+特徴的なヘアスタイルを選ぶ。これは漏れがあったらすぐ分かる仕掛けで、kanachan の茶髪+アホ毛が3人目に少しでも来れば「金髪→茶髪寄り」「ストレート→アホ毛」「ハーフアップ編み込み→消失」のどれかで一発で見える。

JSONプロンプトに middle_characterright_character を追加し、3人目を Lily と命名:

"right_character": {
  "name": "Lily",
  "identity": "different original girl, not Kanachan or Reina",
  "position": "right",
  "appearance": "long straight blonde hair, black eyes, late teens to early twenties, slender with a slightly larger bust, the back of her hair is pulled up into a half-up braid tied with a blue ribbon"
}

解像度は 3キャラ並べる前提で 1216×768 に広げた。それ以外は同じく seed 1293127692 固定、Anima Turbo + 8 steps + CFG 1.0、kanachan LoRA weight を 0.4 → 1.2 で掃引。

3人 weight 0.4

3人 weight 0.4 の出力。左Kanachanは茶髪セミロング+編み込みハーフアップ+ピンクカーディガン+緑リボン。中央Reinaは黒色ショートボブ+紺セーラー+赤スカーフ。右Lilyはアッシュブロンドのハーフアップ+白半袖+青細リボン+紺スカートで、後頭部に大きな青リボン

3キャラとも分離して並んでいる。左の Kanachan はまだ識別子(サイドポニー・アホ毛)が出ておらず茶髪セミロング + 編み込みハーフアップ + アンバー目 + ピンクカーディガン + 白シャツ + 緑リボン。中央の Reina は黒色ショートボブ + 赤目 + 紺セーラー + 赤スカーフで完全に別キャラ。右の Lily はアッシュブロンドのロング + ハーフアップ + 紫目 + 白半袖ワイシャツ + 青細リボン + 紺スカート + 後頭部に青色の大きなリボン。Lily の指定(long straight blonde hair, half-up braid with blue ribbon)はちゃんと反映されている。

3人 weight 0.6

3人 weight 0.6 の出力。左Kanachanにサイドポニー(青シュシュ)+アホ毛が出現、ベージュカーディガン+白シャツ+赤リボン。中央Reinaは黒髪に近いダークブラウンのボブ+紺セーラー+赤スカーフ。右Lilyはブロンドロング+ハーフアップ+紺色大ヘアリボン+白ブラウス+細赤リボン

ここで左の Kanachan に 識別子 が立ち上がる。サイドポニー(青いシュシュ)+ 大アホ毛 + アンバー目 + ベージュカーディガン + 白シャツ + 赤リボンタイ。これは試行3の名前付き 2girls 0.6 と同じ立ち上がり位置で、名前トークン("name": "Kanachan")が入っているおかげで 0.6 で 識別性が呼ばれる、という挙動が3人構成でも一貫している。中央の Reina はダークブラウンのボブ + 赤目 + 紺セーラー、右の Lily はブロンドロング + ハーフアップ braid(指定通り) + 青目 + 白ブラウス + 細赤リボン + 紺スカート + 紺色の大ヘアリボン。3人とも別キャラとして成立する最後のweight。

3人 weight 0.8

3人 weight 0.8 の出力。左Kanachanは茶髪ミディアムボブ+大アホ毛+白セーラー(緑襟+エンジリボン)+緑スカート。中央Reinaは黒に近いダークブラウンのボブ+紺セーラー。右Lilyは金髪に近いライトブラウンのロング+左側に高い位置のサイドポニー+茶ブレザー+紺と白ストライプ柄ヘアリボン

ここで決定的なことが起きる。左の Kanachan は茶髪ミディアムボブ + 大アホ毛 + 茶色目 + 白セーラー(緑襟 + エンジリボン)+ 緑スカート — サイドポニーが消えた。アホ毛は残っている。中央の Reina は黒に近いダークブラウンのボブ + ダークブラウン目 + 紺セーラー + 赤スカーフ、こちらは別キャラ維持。
そして右の Lily。プロンプトでは「金髪 + ハーフアップにまとめた青いリボン」と指定したのに、出力は「金髪に近いライトブラウンのロング + 左側に高い位置のサイドポニー + 紺と白ストライプ柄ヘアリボン」。Lily のハーフアップ指定が消えて、Kanachan が持っていたサイドポニーが Lily 側に出ている。
つまり「Lily が侵食された」というより、kanachan の 識別子(サイドポニー)が Kanachan 本人から Lily のスロットに移動した、と読むほうが正確。Kanachan 単体(このページ冒頭のベースライン)では青シュシュ付きサイドポニーがちゃんと本人に乗るのに、3girls 構成では同じ 識別子 が他キャラに吸われる。アホ毛は Kanachan に残ったので、「複合した 識別子 の一部(サイドポニー)」だけが移動する分離も拾える。

3人 weight 1.0

3人 weight 1.0 の出力。左Kanachanは明茶髪ミディアム+アホ毛+白長袖シャツ+赤リボン。中央Reinaは焦げ茶色ミディアム+アホ毛出現+紺セーラー+赤スカーフ。右Lilyはアッシュブラウン+サイドポニー+アホ毛+グレー目+茶ブレザー+紺色シュシュ

破綻が広がる。左の Kanachan は依然サイドポニーなし(アホ毛のみ)。中央の Reina は黒髪が焦げ茶色に変色 + アホ毛出現で kanachan 化が始まる。右の Lily は引き続きサイドポニー(紺色シュシュ)+ ライトブラウン化(金髪から離れた)+ アホ毛追加。
ここで拾えるのは kanachan の 識別子 の挙動が2段階に分かれている こと:

識別子挙動
サイドポニー(kanachan の最も視覚的な識別子)0.8 から Kanachan 本人を離れ、Lily 側に固定されたまま
アホ毛Kanachan 本人に残ったうえで、weight 1.0 から Reina/Lily の両側にも増殖して出始める

つまり 識別子 の中でも「サイドポニー」は移動型、「アホ毛」は増殖型、という非対称な漏れ方をする。前者は1人だけに付くべき特徴がスロットを誤って割り当てられた格好、後者は LoRA が他キャラの上にも特徴を 重ね描き した格好。

3人 weight 1.2(参考)

3人 weight 1.2 の出力。LoRA過剰領域。3人とも明るい茶髪+大アホ毛で kanachan 化、画質も一段落ちて作画の粗さが目立つ。ただし Lily だけサイドポニー(青シュシュ)と茶セーター+白襟シャツでわずかに識別可能

3girls 構成も、weight 1.2 になると 2girls 同様 LoRA 過剰領域として読むべきデータ。3人とも明茶髪 + 大アホ毛で kanachan 寄り。Kanachan は依然サイドポニーなし、Reina はミディアムストレート + 紺セーラー、Lily はロング + サイドポニー(青シュシュ) + 茶セーター + 白襟シャツ。
注目すべきは weight 1.2 になっても、kanachan の青シュシュ付きサイドポニーは Lily 側に残ったまま で、Kanachan 本人には戻らなかった点。LoRA 強度が上がっても 識別子 の置き場所は変わらない。実用ラインは 0.6 にあり、1.2 は「上限を踏み越えた時の参考」。

追加検証: Lily のリボン色を green に変えても同じことが起きるか

3girls 0.8 以降で「Kanachan のサイドポニー(青リボン付き)」が Lily 側に出ている。素朴な仮説として「Lily の appearance に書いた tied with a blue ribbon の「青」 が、kanachan の 青リボン 識別子 を Lily に引き寄せているのでは」と疑える。確かめるために、Lily の指定を tied with a green ribbon に変更して、同 seed・weight 0.8 で1枚撮った。

3girls Lily=greenリボン版(weight 0.8)。左Kanachanは茶髪+大アホ毛+セーラー(依然サイドポニーなし)、中央Reinaは黒/焦茶ボブ+紺セーラー、右Lilyはライトブラウン寄り+左側に高い位置のサイドポニー+青地に白波線のシュシュ+茶ブレザー

結果は変わらず。左 Kanachan はサイドポニーなし、アホ毛+赤リボンの白セーラー。中央 Reina は黒に近い焦茶ボブ + 紺セーラー。右 Lily はライトブラウン寄り(金髪から崩れ)+ 左側に高い位置のサイドポニー + 青地に白波線の柄シュシュ + 茶ブレザー + ベージュベスト + ボルドーの胸ボウ。

Lily 側のリボン指定を青→緑に変えても、サイドポニーは依然 Lily に出るし、シュシュも青地ベース。「Lily の blue ribbon 指定が kanachan の識別子を引き寄せている」という素朴仮説は棄却される。

ということは、kanachan の 識別子 が Lily スロットに移動する原因は「色の競合」ではなく、もっと一般的な何か(appearance が長く詳細な側に LoRA の特徴が押し付けられやすい等)にありそう。ここから先は別 seed・別構図でもう何枚か揃えて検証する余地が残る。

試行5: 2キャラの組み合わせを3通り全部試す

これまでの2girls検証はずっと Kanachan + Reina の組だけで、3girls で Kanachan + Reina + Lily に増やした時に初めて Lily への識別子移動が見えた。2girls 時点で Lily と組ませても移動するのか、kanachan を含まない Reina + Lily だと挙動はどう変わるのか、2通り抜けていたので残り2通り(K+L、R+L)を weight 0.4→1.2 で同seed掃引する。

Kanachan + Lily の2girls掃引

組は左 Kanachan、右 Lily、appearance は試行4の3girlsと同じ。

Kanachan+Lily weight 0.4。左Kanachanは茶髪ロングのハーフアップ編み込み+紺ブレザー+赤リボン、右Lilyは金髪ロングのハーフアップ+白ブラウス+青リボン胸+後頭部に青大リボン

weight 0.4 だと、左 Kanachan はロングのハーフアップ編み込み + 茶髪 + 紺ブレザー + 赤リボン、サイドポニーもアホ毛も出ていない。右 Lily は金髪 + ハーフアップ(指定通り)+ 青リボン胸 + 後頭部に青いリボン。Kanachan 識別子の立ち上がりはまだ。

Kanachan+Lily weight 0.6。左Kanachanは茶髪+サイドポニー(水色シュシュ)+アホ毛+黒い軍服風衣装、右Lilyはアッシュブロンド+ハーフアップ+白ブラウス+紺リボン

weight 0.6 だと、左 Kanachan に サイドポニー(水色のビーズ状ヘアゴム)+ アホ毛 + アンバー目が立ち上がる。服は黒い軍服風で kanachan の school uniform 指定からは外れたが、これは LoRA の服装バリエーション幅。右 Lily はアッシュブロンドのハーフアップで、後頭部に大きな青リボン + 首元青リボン、指定通り。この weight でも Lily 側は kanachan の影響を受けていない。

Kanachan+Lily weight 0.8。左Kanachanは明茶髪+サイドポニー(青と白柄シュシュ)+大アホ毛+ファンタジー黒白衣装、右Lilyはアッシュブラウン+ハーフアップ+紺リボン

weight 0.8 だと、左 Kanachan のサイドポニーは青と白柄のシュシュ + 大アホ毛 + 黒白を基調にしたファンタジー風衣装。右 Lily の髪色が完全な金髪から「アッシュブラウン」へ少し落ちた + ハーフアップは保持 + 後頭部に紺色リボン。Lily の髪色が金髪→アッシュブラウン側へ崩れ始める。

Kanachan+Lily weight 1.0。左Kanachanはオレンジ系茶髪+サイドポニー(白シュシュ)+大アホ毛+和風オフショル衣装、右Lilyは茶髪+ハーフアップサイドポニー(茶ヘアゴム+濃紺リボン)

weight 1.0 だと、左 Kanachan はオレンジ味のあるブラウン + サイドポニー(白フリル付きシュシュ)+ 大アホ毛 + 和風オフショル衣装。右 Lily はハーフアップ + サイドポニーが混ざった結び方 + 茶ヘアゴム + 濃紺リボン + 茶髪化。Lily にも結び要素が出始める(指定のハーフアップ braid とは違うが、kanachan のサイドポニーと近い形状)。

Kanachan+Lily weight 1.2。両方とも明茶髪+大アホ毛で kanachan寄り。右Lilyは水色シュシュのサイドポニー+白着物風オフショル

weight 1.2 は LoRA 過剰領域なので参考扱い。右 Lily にサイドポニーが移動し両キャラとも茶髪化、という3girls 1.2 と同じパターンが2girls でも再現する程度の確認に留める。

3girls で見えた挙動(kanachan 識別子の Lily 側への移動と、両キャラ茶髪化)は2girls の K+L 組でも同じ閾値で再現する。Lily が組に入っていれば人数に関係なく同じ閾値で出る現象。

Reina + Lily の2girls掃引(kanachan トリガー無し)

組は左 Reina、右 Lily。kanachan トリガーは prompt に入れない。ただし kanachan LoRA はモデルに load されたまま、weight は 0.4→1.2 で振る。「kanachan を呼ばない時、LoRA は何もしないのか、それとも load されているだけで影響を出すのか」を見る。

Reina+Lily weight 0.4。左Reinaは黒髪に近いダークブラウンボブ+赤目+紺セーラー+赤スカーフ、右Lilyは金髪+ハーフアップ+白ブラウス+青リボン

weight 0.4 だと、左 Reina は肩までのストレートボブ + ダークブラウン(黒に近い茶色)+ 赤目 + 紺セーラー + 赤スカーフ。右 Lily は金髪ロング + ハーフアップ + 青リボン胸 + 後頭部に青大リボン + 青目。両方とも指定通り、kanachan の影響なし。

Reina+Lily weight 0.6。左Reinaはダークブラウンミディアムボブ+赤目+紺セーラー、右Lilyは金髪ハーフアップ+水色リボン+後頭部に濃青大リボン

weight 0.6 だと、同様に、Reina ダークブラウンボブ + 赤目 + 紺セーラー、Lily 金髪 + ハーフアップ + 水色リボン + 後頭部に濃青大リボン。両方安定。

Reina+Lily weight 0.8。左Reinaはダークブラウンセミロング+赤茶目+紺セーラー、右Lilyはライトブラウン+ハーフアップ+赤リボン+後頭部に青大リボン

weight 0.8 だと、左 Reina は肩までのセミロング + ダークブラウン(栗色) + 赤茶色目 + 紺セーラー。右 Lily はライトブラウン(金茶色)+ グレー目 + ハーフアップ + 赤リボン + 後頭部に青大リボン。Lily の髪色が金髪からライトブラウン寄りへ動き始める。

Reina+Lily weight 1.0。左Reinaは暗め茶髪のセミロング+アホ毛出現+赤茶目+紺セーラー、右Lilyは明茶髪+サイドポニー(青シュシュ)+薄茶目+白ブラウス+エンジリボン

weight 1.0 だと、左 Reina は暗め茶色のセミロング + 頭頂部に大きなアホ毛が出現 + 赤茶色目 + 紺セーラー。右 Lily は明るい茶色 + サイドポニー(青色シュシュ)+ 薄茶色目 + 白ブラウス + エンジリボン。kanachan トリガーを prompt に入れていないのに、両方に kanachan の特徴(アホ毛、サイドポニー、青シュシュ)が出てきた。

weight 1.2 は LoRA 過剰領域なので参考扱い。2人とも茶髪+アホ毛+サイドポニーで kanachan 化、という方向性の確認に留める。

これが一連の検証で見えてきた事実の中で意外だった点。kanachan LoRA は、kanachan トリガーを prompt に入れなくても、モデルに読み込まれているだけで weight 1.0 以上だと他キャラに識別子(アホ毛、サイドポニー、茶髪、青リボン)が漏れる。トリガー呼び出しの有無に関係なく、LoRA が読み込まれている間はモデル全体にバイアスがかかり続けていて、weight が高いとどのキャラにも特徴が出てくる、という挙動になる。
これは複数キャラ生成で「自作キャラを呼ばない他キャラの絵を描く時」にも影響する。weight を上げたまま LoRA を読み込ませっぱなしにしておくと、関係ない別キャラまで自作キャラ寄りに引かれる。

2キャラ組み合わせの結論

3通り並べると挙動が分かりやすい。

組み合わせ0.60.81.01.2
Kanachan + Reina(試行2-3)Kanachan 識別子なし or 立ち上がりKanachan ピーク色装飾ずれ(無名)/維持(名前付き)Reina に髪色+アホ毛漏れ
Kanachan + LilyKanachan 立ち上がり、Lily 安定Lily 髪色わずか崩れLily に結び要素出始めLily にサイドポニー移動
Reina + Lily(kanachan トリガー無し)両者安定Lily 髪色わずか崩れ両者に kanachan 化兆候両者に kanachan 化

つまり、

  • Reina(黒髪+短ボブ+識別子なし)はどの組でも比較的安定して別キャラを保つ
  • Lily(金髪+ハーフアップ+青リボン)は kanachan の識別子と特徴空間で近いため、weight 0.8 以上で必ず引き寄せられる
  • kanachan トリガー無しでも LoRA が読み込まれていれば weight 1.0 から漏れる。漏れの原因はトリガーの割り当てだけでなく、LoRA がモデル全体にかけるバイアスにもある

試行6: 3人を密着させると何が起きるか

ここまでの3girls検証はいつも standing side by side でわざわざ空間を離して並べていた。「Anima が左/中央/右のスロットに分けて配置できるのは、その前提があるから」という疑念があったので、密着構成でも同じ挙動が成り立つか試す。

プロンプトの scene を three girls leaning against each other, shoulders touching, close together, simple background に変更。他のキャラ指定(Kanachan / Reina / Lily の appearance)は試行4と同じ。
1枚では揺れの方向が分からないので、4 seeds × 2 weights (0.6 と 0.8) = 計8枚を撮った。下は代表4枚(2 seeds × 2 weights)。

密着3girls weight 0.6 seed orig 密着3girls weight 0.6 seed 42 密着3girls weight 0.8 seed orig 密着3girls weight 0.8 seed 42

8枚全体での観察:

  • Kanachan のサイドポニー(青リボン付き)は 8/8 全部で本人に出ない。離してた試行4の weight 0.6 では出ていたのに、密着すると 0.6 でも消える
  • Lily の hairstyle が seed/weight で揺れて、half-up(指定通り)と sidetail(kanachan風)が半々くらいの頻度で出る
  • Reina は比較的安定。黒髪+紺セーラーがほぼ全画像で保たれる。Kanachan-Lily 間で混ざる時も Reina は巻き込まれない
  • 3人とも別キャラとして区別はされる(顔が完全に同一化する「キメラ合体」は起きない)

つまり「Anima が空間分離のおかげで 識別子 をスロットに正しく割り当てられる」という制約がある程度確かめられた。密着すると アテンションプール が共有されて Kanachan のサイドポニーが本人に固定できなくなり、Lily の ヘアスタイルのスロットに不安定に流れ込む。

中央の Reina が混ざらない理由は確実なことは言えないが、可能性として:

  • 茶髪と金髪は明度・色相で近いので Kanachan-Lily 間の特徴混在が起きやすい。Reina は黒髪で離れている
  • Kanachan の「サイドの結び+青リボン」と Lily の「ハーフアップ編み込み+青リボン」が「明色の髪 + 結ぶ + 青リボン」という共通要素を持っている。Reina は短ボブで結びも装飾もなく特徴空間で離れている
  • Reina の spec が short black hair, red eyes, navy school uniform と粗いことが逆に効いている可能性も。掴まれる feature が少ないので干渉しづらい

サイドテール強制指定の試み

「Kanachan が密着でサイドテールを失う」のを救えるか、Kanachan の appearance に明示的に right-side ponytail tied with a blue ribbon, big ahoge を足して同じ密着プロンプトを4 seeds × 2 weights = 8枚撮った。代表4枚:

密着3girls forced-sidetail seed orig w=0.6 密着3girls forced-sidetail seed 42 w=0.6 密着3girls forced-sidetail seed orig w=0.8 密着3girls forced-sidetail seed 42 w=0.8

結論としては、8枚いずれも指定通りには出ていない。Kanachan に「青リボン付きの結び」自体は強制指定で出るようになるが、

  • 結びが両側に出てツインテール風になる(右側だけの指定が通らない)
  • 結びが左側に出てしまう(過去の Anima base「side ponytail = viewer左」バイアスの再現)
  • 右側に正しく出る場合もある(3/8程度)

の3種類が seed によって変動する。さらにLily 側のサイドテール出力は止まらず、全8枚で Lily にも「青リボン+サイドテール」が描かれ続ける。「Kanachan に指定したサイドテールが Kanachan に乗らず、Lily にだけ乗る/または両方に duplicate される」というおかしな挙動で、kanachan の 識別子 の置き場所が prompt の強さでも修正できない。

これは推測の域(学習データの強アトラクタの影響?)

ここまでの密着実験を見ていて気になったのは、Lily の出方が Anima の中にある別キャラに引っ張られているような印象。具体的には、Lily の long blonde hair + half-up tied with a blue ribbon + 白系トップ + ややフォーマル という指定が、Fate/stay night のセイバー(金髪+青リボン+白いブラウス+青のドレス)の方向に寄っている気がする。

確かめるために、Lily と Kanachan に似た特徴を持つ 有名キャラ — 島村卯月(THE iDOLM@STER シンデレラガールズ、茶髪+左頭頂部結びの変則ポニー+制服) と アルトリア・ペンドラゴン(セイバー) を、Anima にタグ名だけ与えて単体で撮ってみた。LoRA は当てない。

Anima が描いた 島村卯月(seed 1293127692)。制服 + 茶髪 + 左寄りの結び Anima が描いた 島村卯月(seed 42)。アイドルステージ衣装版 Anima が描いた セイバー(seed 1293127692) Anima が描いた セイバー(seed 42)

両方ともガッツリそれっぽく出る。セイバー は顔が型月(Type-Moon)系の意匠でかなり近いし、青のドレス・金の縁取りも Fate 公式アートワーク方向の絵になっている(服の細部まで完璧かはこちらの記憶が曖昧で言い切れないが、初見でセイバーだと分かるレベル)。卯月 は seed orig が制服版、seed 42 がアイドルステージ衣装版で、どちらもキャラとして十分認識可能。卯月 の seed orig 側はやや同人誌寄りの絵柄、seed 42 のほうが公式寄りの顔立ちで、Anima 内の「卯月 像」が公式絵+ファンアートの混合分布になっている様子も拾える。
この2キャラが Anima に「ほぼまんま」の状態で学習データとして刻まれている、というのは見て間違いない。

これを踏まえると:

  • Lily のセイバー寄せ仮説。Lily の指定が Anima 内の セイバー アトラクタに近い位置にあり、kanachan LoRA の影響も加わると Lily スロットが セイバー 方向に引っ張られる
  • Kanachan の卯月寄せ仮説。kanachan の 識別子(サイドの結び)が抜けると、茶髪 + 制服 という残った特徴が 卯月 アトラクタに引かれて、結び位置が「左頭頂部」(卯月の位置)に流れたり、ツインテール風になったりする
  • 卯月スーパーアトラクタ仮説。卯月 は「茶髪 + 制服 + 左頭頂部結び(ハーフアップ気味)」という3キャラ全部と部分的に重なる特徴を持っている。3人密着構成ではこのアトラクタに引かれる成分が顕在化して、kanachan の右サイドポニーが卯月式の左頭頂部結びに変質したり、Lily の half-up が 卯月式の結びに引っ張られたりしているのかもしれない

これらは全部勘の域で、定量的に確かめたわけではない(Lily のリボン色を変えるだけのテストでは完全に切り分けられない)。ただ「学習データに大量にある有名キャラが潜在空間で強アトラクタとして残っていて、プロンプトの曖昧な部分がそこに吸われる」という現象自体はあり得る話で、自作キャラ LoRA を多キャラ構成で使う時に見落としやすい点。

副次観察: kanachan の髪が勝手に伸びる

もう1つ密着3girls で気になったのは、Kanachan の髪が学習素材より長く出る傾向。元素材は肩〜鎖骨くらいのミディアムなのに、密着3girls 8枚(試行5の元の方)では肩より下まで伸びているケースが多い。
kanachan LoRA はカーディガン等の服装バリエーションを学習に含めているので服が違うのは仕様通りだが、髪の長さは学習素材で固定しているはずの部位。これがコントロールできていない。
これも上記の卯月アトラクタ仮説と整合性がある。卯月はミディアム〜セミロングの茶髪を持つので、kanachan の識別子が弱まると髪長も卯月寄りに引かれる可能性がある。

元素材と見比べる

ここで前置きしておくと、kanachan LoRA は服装を固定して学習していない(複数の服で学習している)。冒頭の元素材はあくまで「このブログでよく使っている1枚」であって、LoRA の canonical な服装ではない。だから生成側がベージュセーラーで出ても「LoRA から服がずれた」とは言えず、単に「服を指定していないので LoRA が学習データの引き出しから1つ選んだ」だけ。今回 raw プロンプトで何度撮っても白シャツ+赤ネクタイで出てこないのはそのため。

なので「学習素材と一致するか」で比較する意味があるのは、キャラの意匠として一貫している部分だけ。掃引の中で「いちばん kanachan らしかった」2girls 無名版の weight 0.8 で見ると、

  • 髪色(明茶髪・栗色): 一致
  • 大きめのアホ毛: 一致
  • 茶色目: 一致
  • 顔の系統: 一致
  • サイドポニーの形状: 一致(小さくまとめた結び)
  • ヘアアクセの色(青): 不一致 — 生成側は黄色のシュシュ

ここでの主役は最後の青色のシュシュ。これは元素材全体で一貫してついているキャラ意匠の一部で、LoRA が学習していて当然のもの。それが weight に応じて 0.8→黄、1.0→オレンジ、1.2→ピンク と色が振れる。一方で 2girls 名前付き版の weight 1.0 では青に戻る(試行3)。
つまり kanachan LoRA は「アホ毛+髪型+顔」までは安定して呼び出せるが、「青いシュシュ」のような色つきのキャラ意匠は名前トークン("name": "Kanachan")がプロンプトに存在しないと正しく呼び出されない、というのが今回の手応え。これは過去のキャプション再設計12000step学習 でも観察してきた「Anima向けキャラLoRAの細部安定性の弱さ」と同じ系統の問題で、名前付けはその一部を緩和する手段になる。

試行7: ネガティブで Lily のサイドポニーを抑え込めるか

密着3girls で Kanachan のサイドポニーが Lily 側に出る現象を、ネガティブプロンプトや positive prompt 内の “NOT” で救えないか試した。ComfyUI 系のネガティブは画像全体にかかる仕様なので、Kanachan のサイドポニー(茶髪 + 青リボン)には触らず Lily 側だけ抑えたい意図で、blonde side ponytail, side ponytail on blonde hair, Lily with a side ponytail などキャラ指定込みの表現にしてみる。

4段階で試した:

  1. ネガ枠のみ: 通常のネガティブ末尾に上記表現を追加
  2. ポジティブ “NOT” のみ: Lily の appearanceNOT a side ponytail, do not tie her hair to one side, hair flows naturally down on both sides を追記、rule でも明示
  3. ネガ枠 + ポジ “NOT” 同時
  4. 全部明示(gachi-gachi): 上記に加えて Kanachan の appearance にも right-side ponytail tied with a blue ribbon on the right side of her head と explicit に書く

各 2 seeds × 2 weights = 段階あたり4枚。4段階の結果としては、どの段階でも Lily のサイドポニーは止まらず、kanachan のサイドポニーが Lily 側に出続ける。下は最後の gachi-gachi 段階の代表2枚:

gachi-gachi(全部明示)密着3girls weight 0.6。kanachan は両側ツインテール風、Lily はサイドポニー継続 gachi-gachi(全部明示)密着3girls weight 0.8。同じ傾向、kanachan ツインテール、Lily サイドポニー

Kanachan については明示的に right-side ponytail と書くと、右だけにつくのではなく両側に小さな結び(ツインテール風)に化けることが多い。これは kanachan LoRA の学習タグが left side ponytail を positive、right side ponytail, twin tails, twintails, two side up を negative としていた(過去記事 wai-anima-lora-animaloratoolkit-runpod)ので、right-side 指定が学習時のネガティブと衝突した格好。Lily 側の半ばツインテール風出力も含めて、prompt の強化では効かなかった。

ComfyUI 系の 全体に効くネガティブ・ポジティブでは キャラ単位の制約 がかけきれない、というのが密着構成での結論。Regional Prompter のような領域別プロンプト機構を挟まないと、密着3girls での 識別子 漏れは制御できない。

試行8: ナラティブ組体操(3人が密着しないが絡み合うポーズ)

「密着すると 識別子 移動が起きる」のが分かったので、逆の極端として「3人が複雑に絡み合うが空間的には離れている」ポーズも試した。題材はナラティブ組体操(劇場版機動戦士ガンダムNTで披露された3人が複雑に絡み合うポーズ、元ネタはルネサンス彫刻 サビニの女たちの略奪 と推測されている)。

scene を three girls in a dynamic intertwined standing pose, sculptural composition inspired by The Rape of the Sabine Women by Giambologna, three figures twisted around each other with arms and bodies overlapping, each facing a different direction, complex spiral pose, simple background, full body にして、各キャラ指定はこれまで通り。weight 0.8、2 seeds で撮ったうち1枚が下:

ナラティブ組体操っぽい構図。台座の上に3人が絡み合って立つ。kanachan茶髪+青サイドポニー、Reina黒髪+紺セーラー、Lily金髪+青リボン。足元から灰色の蛇のような形状が巻きついている

3人とも別キャラとして識別可能で、ポーズもそれっぽく絡み合っている。ただし足元から灰色の蛇のような形状が巻きついている。これは Renaissance sculpture reference の The Rape of the Sabine Women を Anima が「神話絵画系(蛇や触手のモチーフ含む)」と紐づけて解釈した結果だと思われる。
他の seed では蛇がもっと派手に出たり、Reina の顔が灰色の像のように塗りつぶされたりして、再現性は低い。「彫刻reference + intertwined」の組み合わせでこの蛇召喚はほぼ毎回起きる癖になっている。

おまけ: 縦積み totem pole 構成で取り直し

そもそもナラティブ組体操の本質は「人体が複雑に絡み合う」ではなく、ガンダムNTの映画キービジュアル(3キャラが縦に積み重なって配置され、上から手が降りてくる、縦の光のビーム)という縦長群像の象徴的なコンポジション、と捉え直す。要素を分解して、three characters stacked vertically in a narrow composition, totem pole-like character arrangement, one character kneeling at the bottom, one character sitting or draped across the middle, one character standing behind and reaching straight upward, a mysterious hand descending from above, characters arranged along a vertical beam of light, dramatic anime movie poster composition, space background をプロンプトに入れ、ネガに human pyramid, gymnastics, acrobatic pose を入れて取り直した結果が下:

totem-pole 構図 seed orig。縦積み3人 + 上から降りる手 + 黄金色の縦光ビーム + 宇宙背景。3人とも紺セーラー服+赤リボン+茶髪+サイドポニーで identity ほぼ同一化 totem-pole 構図 seed 42。同じく縦積み+上から黒い球体に伸ばす手+宇宙背景。3人とも茶髪+サイドポニー+紺セーラー

構図は狙い通り成立する:3人が縦に積み重なり、最上部から黄金色の光のビームが降り注ぎ、上から手が伸びてくる、宇宙背景。映画ポスター調のシルエットになっている。
ただし3キャラの識別が完全崩壊している。3人とも茶髪 + サイドポニー(青リボン)+ 紺セーラー服 + 赤リボン、つまり全員 kanachan 寄りの見た目に揃ってしまった。Lily 指定の金髪・ハーフアップ braid も、Reina 指定の黒髪短ボブも消えている。複雑な構図プロンプトとキャラ単位の指定が同時に走ると、構図側に注意が引かれて識別性が崩れる、というトレードオフ。

ナラティブ組体操(縦積み群像のキービジュアル構図)を Anima に出させるのは raw prompt では結構難しい、というのが今回の結論。「sculpture/intertwined」系を入れると蛇召喚、totem pole 系で攻めると構図はそれっぽく出るが3キャラの identity が完全崩壊して全員茶髪セーラー化する。
ControlNet OpenPose で骨格を直接渡すか、img2img で参照画像から振る、あたりが現実的なアプローチになりそう。これは別記事の宿題に置く。

試行9: 奥行き構図にすると識別子が保たれる

「密着すると 識別子 が崩れる」「ナラティブ組体操みたいな抽象構図でも崩れる」と来たので、逆に奥行きを使って3キャラを foreground / midground / background に分散する構図を試した。題材は「教室で勉強しているはずの Kanachan が机に突っ伏していて、向かいに座る Lily が起こそうとしている、奥の扉から Reina が入ってくる」という、anime のスライスオブライフ系で大量に学習データがありそうなシーン。
横並びや密着と違って3キャラの距離がZ軸(奥行き)で離れるので、アテンションプール が空間的に分離されやすいだろう、という予測。

教室シーン。手前の机に Kanachan が突っ伏す(茶髪+青リボン+サイドポニー)、右の机に Lily(金髪+青リボン)、奥の黒板前に Reina(黒髪+紺セーラー)が立つ。3キャラ全員 識別子 保持

結果は予測通りで、3キャラ全員 識別子 が保たれている:

  • 手前: Kanachan、茶髪 + サイドポニー + 青リボン + 紺セーラー、机に突っ伏す
  • 右中: Lily、金髪 + 青リボン + 白ブラウス、机に座る
  • 奥: Reina、黒髪 + 紺セーラー、黒板前に立つ

密着3girls では Kanachan のサイドポニーが消えて Lily 側に移動していたのに、奥行き構図にした途端 Kanachan に正しくサイドポニーが乗り、Lily もハーフブレイド系のリボン(指定通り)、Reina も黒髪セーラーで別キャラとして成立する。
完全ではない(Kanachan が Lily の方を向いてなくて narrative 上の自然さは半分くらい、奥の Reina が小さく扉から入ってくる感じには出てない)が、3人を構図的に「離す」だけでなく「奥行きで離す」とも別アプローチで 識別子 漏れが防げる、というのが分かる。「Anima が空間分離されたスロットを尊重する」という以前の仮説の補強でもあり、密着構成が特殊だった、という見方になる。

つまり多キャラ生成で識別子を保つコツは、

  • 横方向に明確に離す(試行4の standing side by side)
  • 奥行きで前後に分散する(試行9)
  • 密着構成や複雑な絡み合い構図は LoRA の識別子が他キャラに吸われやすい

の3点。構図次第で挙動が大きく変わるので、Anima のアテンション機構は「空間分離 vs 密着」を別系統で処理していそう。

このブログのAnima関連記事