waiIllustriousSDXL_v160 キャラLoRAサンプル生成における色崩壊の根本対策リファレンス — CC1専用
WAI Illustrious SDXL v160 は Danbooru 2024-June 以前のアニメイラストを大量に学習したモデルです。学習データにはサイバーパンク・ネオン照明・ファンタジー系画像が多数含まれており、緑(H:100–140)・シアン(H:170–200)・ネオンイエロー(H:55–70)の色相に過学習が生じています[1]。この結果、プロンプトで指定した茶・赤・金などの「地味色」が生成時に彩度の高いネオン系へ引き寄せられます。
| 指定色 | 化け先(多い順) | 主要因 |
|---|---|---|
| honey brown / amber | 緑(H:120–135) | 学習データのグリーン過剰露出 |
| dark red / wine / crimson | 青緑・シアン(H:170–190) | 赤のVAE色相シフト+cyan bias |
| light blonde / cream | 白髪または紫ピンク | 彩度低下でwhiteへ収束、またはpinkへ誘導 |
| black hair | 白髪・青グラデ(画像ごと変動) | 黒のattentionが弱くsilver/blue系に引かれる |
| silver / platinum | 白・水色・青 | 無彩色への収束またはblue hair学習データ干渉 |
| teal / aqua | pure green または cyan全身染め | ネオン系の引力圏に入る |
| 純赤(red hair) | 比較的安定だが背景干渉でシアン化 | 背景色との色相補色関係による干渉 |
| orange | 比較的安定。薄まると黄色へ | amber/yellowへのグラデ落ち |
grey background を指定しても H:180 付近に吸い寄せられる傾向があったCFG スケールが 7.0 を超えると、CLIP attention がネオン方向に過剰収束しやすくなります[3]。CFG 8 以上では彩度が自動的に高くなり、ネオン崩壊確率が急上昇します。v160 での推奨 CFG は 5.5–6.5 の範囲(ゴールデン設定は 6.0)です。
| 色名 | POS タグ(コピペ用) | NEG タグ(コピペ用) |
|---|---|---|
| honey brown | (honey brown hair:1.45), (amber hair:1.3), warm brown hair, caramel hair |
green hair, neon green hair, cyan hair, teal hair, yellow hair, blue hair, multicolored hair, gradient hair |
| dark red | (dark red hair:1.4), (crimson hair:1.35), (wine red hair:1.3) |
cyan hair, blue green hair, aqua hair, teal hair, green hair, blonde hair, brown hair, multicolored hair |
| black | (black hair:1.5), jet black hair, pure black hair, (very dark hair:1.3) |
white hair, silver hair, gray hair, blue hair, green hair, blonde hair, brown hair, multicolored hair, gradient hair, streaked hair |
| dark brown | (dark brown hair:1.4), (chocolate brown hair:1.3), deep brown hair |
green hair, yellow hair, cyan hair, blonde hair, red hair, multicolored hair |
| light brown | (light brown hair:1.35), (chestnut hair:1.3), warm light brown hair |
green hair, cyan hair, teal hair, blonde hair, dark hair, multicolored hair |
| auburn | (auburn hair:1.4), (reddish brown hair:1.35), copper brown hair |
green hair, blue hair, cyan hair, blonde hair, pure red hair, multicolored hair |
| silver | (silver hair:1.4), (platinum silver hair:1.35), metallic silver hair |
black hair, green hair, yellow hair, brown hair, red hair, multicolored hair, gradient hair |
| platinum blonde | (platinum blonde hair:1.4), (ash blonde hair:1.3), pale blonde hair |
purple hair, pink hair, green hair, cyan hair, dark hair, brown hair, multicolored hair |
| blonde | (blonde hair:1.4), (golden blonde hair:1.3), yellow blonde hair |
green hair, cyan hair, teal hair, brown hair, black hair, blue hair, multicolored hair, gradient hair |
| light blonde | (light blonde hair:1.35), (cream blonde hair:1.3), pale golden hair |
white hair, purple hair, pink hair, green hair, gray hair, multicolored hair, silver hair |
| white hair | (white hair:1.45), snow white hair, pure white hair |
black hair, green hair, yellow hair, pink hair, blue hair, multicolored hair, gradient hair |
| pink hair | (pink hair:1.4), (hot pink hair:1.3), magenta pink hair |
green hair, cyan hair, blue hair, brown hair, black hair, multicolored hair |
| light pink | (light pink hair:1.35), (pastel pink hair:1.3), baby pink hair |
green hair, yellow hair, teal hair, dark hair, multicolored hair |
| purple | (purple hair:1.4), (violet hair:1.3), dark violet hair |
green hair, yellow hair, cyan hair, orange hair, brown hair, multicolored hair, gradient hair |
| blue | (blue hair:1.4), (dark blue hair:1.3), navy blue hair |
green hair, yellow hair, brown hair, red hair, cyan hair, multicolored hair |
| light blue | (light blue hair:1.35), (sky blue hair:1.3), baby blue hair |
green hair, yellow hair, brown hair, dark hair, multicolored hair |
| teal | (teal hair:1.3), dark teal hair |
要注意: ネオン崩壊の引力圏。可能なら light blue hair or dark cyan hair で代替推奨。使う場合 NEG: neon green hair, neon cyan hair, pure green hair, yellow green hair |
| green hair | (green hair:1.35), dark green hair |
要注意: ネオン方向へ容易に暴走。NEG: neon green hair, lime hair, yellow green hair, cyan hair を必ず追加 |
| dark green | (dark green hair:1.35), forest green hair, deep green hair |
neon green hair, lime hair, bright green hair, cyan hair, yellow green hair |
| orange hair | (orange hair:1.4), ginger hair, amber orange hair |
green hair, cyan hair, blue hair, pink hair, multicolored hair |
| red hair | (red hair:1.45), pure red hair, bright red hair |
cyan hair, green hair, teal hair, blue hair, purple hair, multicolored hair |
| gray hair | (gray hair:1.35), (steel gray hair:1.3), ashen hair |
black hair, green hair, blue hair, cyan hair, brown hair, multicolored hair |
| グラデ・マルチ防止 | (solid color hair:1.5), (single color hair:1.4), monochrome hair |
multicolored hair, gradient hair, streaked hair, two tone hair, rainbow hair, split color hair, color gradient hair, dyed tips |
NEG に指定する対立色は「指定色からの色相角距離 >60°の色」を全て列挙する。さらに multicolored hair, gradient hair, streaked hair は全キャラで必ず追加すること。
目色の attention は髪色より弱いため、NEG 指定がないと学習データのモード(青目が最多)に引っ張られます。brown eyes → blue/green への化けが最も頻出。[5]
| 指定色 | POS タグ | NEG タグ |
|---|---|---|
| brown eyes | (brown eyes:1.35), dark brown eyes, warm brown eyes | green eyes, blue eyes, cyan eyes, purple eyes, red eyes |
| blue eyes | (blue eyes:1.4), deep blue eyes, ocean blue eyes | green eyes, brown eyes, cyan eyes, purple eyes |
| green eyes | (green eyes:1.35), emerald eyes | blue eyes, cyan eyes, yellow eyes, brown eyes |
| red / crimson eyes | (red eyes:1.4), crimson eyes, ruby eyes | green eyes, cyan eyes, blue eyes, brown eyes |
| purple eyes | (purple eyes:1.35), violet eyes, amethyst eyes | green eyes, yellow eyes, cyan eyes, red eyes |
| golden eyes | (golden eyes:1.4), amber eyes, yellow eyes | blue eyes, green eyes, cyan eyes, brown eyes |
| gray eyes | (gray eyes:1.3), steel gray eyes, silver eyes | green eyes, cyan eyes, blue eyes, brown eyes |
| heterochromia | (heterochromia:1.3), one eye blue one eye red | same eye color, identical eyes |
masterpiece, best quality, (honey brown hair:1.45), (brown eyes:1.35), fair skin, [character details...]| 肌色タイプ | POS タグ | NEG タグ |
|---|---|---|
| fair skin (白肌・標準) |
(fair skin:1.3), pale skin, white skin, light skin, porcelain skin |
tanned skin, dark skin, brown skin, green skin, yellow skin, swarthy |
| tanned skin (小麦色・ギャル) |
(tanned skin:1.35), (suntan:1.3), light brown skin, warm skin tone, gyaru tan |
fair skin, pale skin, white skin, dark skin, green skin, ashen skin |
| dark skin (黒ギャル) |
(dark skin:1.4), deep brown skin, black skin, dark complexion |
fair skin, tanned skin, pale skin, light skin, green skin, yellow skin, white skin |
dark skin + grey background を組み合わせると、背景の cyan bias が肌の暗部に干渉してグリーン/シアン肌になるケースがある。dark skin キャラには white background または black background を使うと安定する。
WAI v160 の cyan bias(H:170–200 への誘引)は背景にも作用します。grey background 単体では H:180 付近(水色〜シアン)に収束することがあります[7]。
| 背景指定 | 推奨 POS | 推奨 NEG | 安定度 |
|---|---|---|---|
| グレー背景 | (grey background:1.3), solid gray background, neutral gray background, (no pattern:1.2) | cyan background, green background, blue background, neon background, colorful background | 中(NEG必須) |
| 白背景 | (white background:1.3), simple white background, clean background | colored background, cyan background, green background, gradient background | 高 |
| 黒背景 | (black background:1.3), dark background, studio black background | light background, colorful background, neon background | 高 |
| ベージュ/クリーム | (beige background:1.3), cream background, warm neutral background | cyan background, blue background, green background, cool colored background | 高(温色系は安定) |
| グラデ背景 | 非推奨(色崩壊リスク大) | — | 低 |
simple background, solid color background を POS に追加| VAE | 精度 | グリーンシフト | 推奨度 | 備考 |
|---|---|---|---|---|
| madebyollin/sdxl-vae-fp16-fix | FP16 | 最小 | ★★★ 最推奨 | NaN 問題を解決した公式後継 VAE |
| SDXL_anime_natural_vae (BF16/FP32) | BF16/FP32 | 0.1%(原版 0.5%) | ★★★ | アニメ特化。Green Shift を -0.1% まで低減[10] |
| SDXL_anime_clear_vae | BF16 | 低め | ★★ | 赤系が深くなる。細部が若干簡略化 |
| 内蔵 VAE(FP16) | FP16 | 0.5% | 非推奨 | NaN / 黒画像リスクあり |
SDXL 1.0 の内蔵 VAE を FP16 で動かすと NaN 演算が発生し、黒画像や極端な色崩壊の原因になります。sdxl-vae-fp16-fix を常に外部 VAE として読み込んでください[9]。
生成後の画像を自動チェックして「崩壊色が閾値を超えていたら reject」するスクリプトです[11]。
"""
color_collapse_screener.py
WAI Illustrious XL v160 色崩壊自動スクリーニング
使い方: python color_collapse_screener.py ./output_dir --hair honey_brown
"""
import numpy as np
from PIL import Image
import colorsys
import sys
import os
from pathlib import Path
# キャラ別・期待ヘアカラーの色相中心と許容半径 (HSV hue 0-360)
HAIR_HUE_MAP = {
"honey_brown": (30, 35), # H:30 ±35
"dark_red": (355, 25), # H:355 ±25 (red side)
"black": (0, 999), # 黒は無彩色なので saturation で判定
"dark_brown": (25, 30),
"light_brown": (28, 35),
"auburn": (15, 30),
"silver": (0, 999), # 無彩色
"platinum_blonde": (50, 40),
"blonde": (48, 35),
"light_blonde": (50, 40),
"white": (0, 999), # 無彩色
"pink": (340, 30),
"light_pink": (340, 40),
"purple": (280, 35),
"blue": (225, 35),
"light_blue": (205, 35),
"teal": (180, 25),
"green": (120, 30),
"orange": (25, 25),
"red": (0, 25),
"gray": (0, 999), # 無彩色
}
# 崩壊色として検出するネオン色相範囲と彩度閾値
NEON_ZONES = [
("neon_green", 100, 140, 0.60),
("cyan", 170, 200, 0.50),
("neon_yellow", 55, 70, 0.65),
("neon_magenta", 290, 320, 0.70),
]
def pixels_to_hsv(img: Image.Image) -> np.ndarray:
"""PIL Image -> HSV array (N, 3) H:0-360 S:0-1 V:0-1"""
arr = np.array(img.convert('RGB')).reshape(-1, 3) / 255.0
hsv = np.array([colorsys.rgb_to_hsv(r, g, b) for r, g, b in arr])
hsv[:, 0] *= 360 # H を 0-360 へ
return hsv
def hue_diff(a, b):
"""色相の最短角距離 (0-180)"""
d = abs(a - b) % 360
return min(d, 360 - d)
def screen_image(img_path: str, hair_key: str, neon_ratio_thresh=0.08,
hair_deviation_thresh=50) -> dict:
"""
1枚の画像を評価
Returns: {'pass': bool, 'reason': str, 'neon_ratio': float, 'hair_hue_dev': float}
"""
img = Image.open(img_path)
w, h = img.size
hsv = pixels_to_hsv(img)
H, S, V = hsv[:, 0], hsv[:, 1], hsv[:, 2]
total = len(H)
result = {"pass": True, "reason": "OK", "neon_ratio": 0.0, "hair_hue_dev": 0.0}
# 1. ネオン色検出
neon_count = 0
for name, h_min, h_max, s_thresh in NEON_ZONES:
count = int(np.sum((H >= h_min) & (H <= h_max) & (S >= s_thresh)))
neon_count += count
neon_ratio = neon_count / total
result["neon_ratio"] = round(neon_ratio, 4)
if neon_ratio > neon_ratio_thresh:
result["pass"] = False
result["reason"] = f"NEON_COLLAPSE: neon ratio={neon_ratio:.2%} > {neon_ratio_thresh:.0%}"
return result
# 2. 期待ヘアカラーとの乖離チェック(彩度のある画素のみ)
if hair_key in HAIR_HUE_MAP:
expected_h, tolerance = HAIR_HUE_MAP[hair_key]
if tolerance < 999: # 無彩色系はスキップ
colored_mask = S > 0.30
if colored_mask.sum() > 100:
dominant_h = float(np.median(H[colored_mask]))
dev = hue_diff(dominant_h, expected_h)
result["hair_hue_dev"] = round(dev, 1)
if dev > hair_deviation_thresh:
result["pass"] = False
result["reason"] = (
f"COLOR_DRIFT: dominant hue={dominant_h:.0f}° "
f"expected={expected_h}° dev={dev:.0f}° > {hair_deviation_thresh}°"
)
return result
def batch_screen(folder: str, hair_key: str, move_rejected=True):
"""フォルダ内の全 PNG/JPG をスクリーニング"""
p = Path(folder)
reject_dir = p / "_rejected"
reject_dir.mkdir(exist_ok=True)
images = sorted(p.glob("*.png")) + sorted(p.glob("*.jpg"))
passed, rejected = 0, 0
for img_path in images:
res = screen_image(str(img_path), hair_key)
status = "PASS" if res["pass"] else "FAIL"
print(f"[{status}] {img_path.name:40s} "
f"neon={res['neon_ratio']:.2%} "
f"hue_dev={res['hair_hue_dev']:.0f}° "
f"| {res['reason']}")
if not res["pass"]:
rejected += 1
if move_rejected:
img_path.rename(reject_dir / img_path.name)
else:
passed += 1
print(f"\nResult: {passed} passed / {rejected} rejected "
f"({rejected/(passed+rejected)*100:.1f}% reject rate)")
if __name__ == "__main__":
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("folder")
ap.add_argument("--hair", default="honey_brown",
choices=list(HAIR_HUE_MAP.keys()))
ap.add_argument("--neon-thresh", type=float, default=0.08)
ap.add_argument("--hue-thresh", type=float, default=50.0)
ap.add_argument("--no-move", action="store_true")
args = ap.parse_args()
batch_screen(args.folder, args.hair,
move_rejected=not args.no_move)
# aika(honey brown)のサンプル生成後にスクリーニング
python color_collapse_screener.py D:\output\aika_samples --hair honey_brown
# 閾値を緩める場合(許容範囲を広げる)
python color_collapse_screener.py D:\output\ako_samples --hair dark_red --hue-thresh 60
| 設定項目 | 推奨値 | 理由 |
|---|---|---|
| 色タグの prompt 内位置 | 先頭から 20 tokens 以内 | CLIP は前方の token に高い attention を割り当てる[6] |
| 髪色 weight | 1.4–1.5 | 1.3 未満では化けが残る場合がある |
| 目色 weight | 1.3–1.4 | 髪色より token 影響が弱いため強めに |
| 色タグ記法 | (honey brown hair:1.45) | 括弧 weight 記法を使用(ComfyUI 標準) |
| CLIPSetLastLayer | -2 | 最終層を 1 つ手前にすることで細部表現が向上しつつ色一貫性が安定[12] |
| パラメータ | 推奨値 | 備考 |
|---|---|---|
| sampler_name | dpmpp_2m | 色安定性が高い。euler_a も可[3] |
| scheduler | karras | ネオン化しにくい |
| cfg | 6.0 | ゴールデン設定。7 超えは禁止 |
| steps | 28–30 | 25 以下では色収束が甘い |
| denoise | 1.0 (txt2img) | — |
ComfyUI-EasyIllustrious の IllustriousCLIPTextEncoder ノードを使用すると、stop_at_clip_layer=-2 を確実に設定できます[13]。通常の CLIPTextEncode + CLIPSetLastLayer の組み合わせより設定ミスが減ります。
CLIPTextEncode [POSITIVE]
└─ text: "(honey brown hair:1.45), (brown eyes:1.35), (fair skin:1.3),
masterpiece, best quality, [character_desc], [scene_desc]"
└─ clip → CLIPSetLastLayer(stop=-2) → conditioning
CLIPTextEncode [NEGATIVE]
└─ text: "worst quality, bad quality, worst detail,
green hair, neon green hair, cyan hair, teal hair, yellow hair,
blue hair, multicolored hair, gradient hair, streaked hair,
green eyes, cyan eyes, blue eyes,
tanned skin, dark skin, green skin,
cyan background, green background, neon background"
└─ clip → CLIPSetLastLayer(stop=-2) → conditioning
KSampler → VAE Decode (sdxl-vae-fp16-fix)
| CFG 値 | 色への影響 | 推奨用途 |
|---|---|---|
| 3.0–4.5 | 色が薄め・自然な印象。指定色が弱め | 背景・風景系 |
| 5.5–6.5 | 色純度と多様性のバランスが最良。ゴールデンゾーン | キャラLoRAサンプル(推奨) |
| 7.0–7.5 | 色が強め。ネオン化の前兆が見え始める | 一部スタイル用 |
| 8.0+ | ネオン化リスク急増。彩度が過剰に上がる | 禁止 |
workflow.json をバージョン管理し、seed 以外のパラメータを変更しないことsteps 20 以下ではサンプリングの中途段階で確定した「崩壊色」がそのまま残りやすい。28–30 steps が色収束の安定点です。steps 40 以上は過焼けのリスクがあり色彩度が上がりすぎる場合があります[3]。
プロンプトによる色指定は「モデルの色バイアスを説得する」行為であり、バイアスが強いと負けます。キャラ LoRA はモデルの重みに直接「このキャラはこの色」という情報を書き込むため、プロンプト指定色の再現率が劇的に向上します[14]。
| パラメータ | 推奨値 | 備考 |
|---|---|---|
| Network Dimension (dim) | 8 | 色情報には dim8 で十分。ファイルサイズ小 |
| Network Alpha | 1 | alpha/dim = 0.125 の低比率で汎化性能を確保 |
| Learning Rate | 1e-4 (0.0001) | UNet LR |
| Text Encoder LR | 5e-5 (0.00005) | UNet の半分に設定 |
| Optimizer | AdamW8bit | VRAM 効率良好 |
| LR Scheduler | cosine_annealing | Illustrious v2.0 以降の公式推奨 |
| Max Train Steps | 1500–3000 | 画像 30 枚 × repeat5 = 150 steps/epoch が目安 |
| Resolution | 1024x1024 | WAI v160 の標準解像度 |
| LR Warmup | 10% | 最初の 10% で学習率を漸増 |
# キャプション例(aika の場合)
1girl, aika, honey brown hair, long hair, straight hair, brown eyes,
fair skin, [outfit description], masterpiece, best quality
# 注意:キャプションに gradient hair / multicolored hair を含む画像は除外
# 注意:green_hair, cyan_hair になった生成画像は絶対に学習データに含めない
| LoRA 強度 | 色への効果 | 推奨用途 |
|---|---|---|
| 0.5–0.65 | 色が若干ぶれる可能性あり | 汎用スタイル混在 |
| 0.7–0.85 | 色が強く固定される。最良バランス | キャラLoRAサンプル生成(推奨) |
| 0.9–1.0 | 色は完全固定だが崩れた学習データの影響も強く出る | 高品質学習データがある場合のみ |
| DR タイトル | 作成日 | 関連度 |
|---|---|---|
| R18 AI CG 肌色・照明色崩壊 根本対策 | 2026-05-28 | 本 DR の前身・照明起因の色崩壊対策 |
| FANZA/DLsite AI漫画 月収100万ロードマップ | 2026-06-04 | 出品戦略(品質ゲートとの接続) |
| MEMORY.md: feedback_mature_adult_ban_2026-06-01.md | 2026-06-01 | 若見え・色(mature 禁止ルール) |
| MEMORY.md: feedback_skin_color_lock_2026-06-04.md | 2026-06-04 | 肌色ロック基礎ルール |
| MEMORY.md: feedback_consistency_full_lock_2026-06-04.md | 2026-06-04 | キャラ一貫性完全ロック |