_lora_factory_2026-05-31.py の wf_lora を発展させる完全API JSON付き。DR_ComfyUI_WF設計最適化_2026-05-30[14]=モジュール化/API/速度の運用論。本DRはノードJSON実体まで踏み込む。DR_FaceDetailer_Hires_写植_量産WF_2026-06-01[15]=顔+Hires+写植中心でHandDetailer・複数LoRAチェーン・色破綻設定・wf_lora置換JSONは未収録。本DRがその4点を新規補完。DR_高解像度納品アップスケールWF_2026-05-30[16]=最終納品の8K超解像。本DRの最終段Upscaleと接続点を共有。wf_lora_golden() JSON。
本DRは、waiIllustriousSDXL_v160 を基盤とするR18 CG量産ファクトリーで、顔ガビ化・手崩れ・背景融解・色破綻を根治し、無人で常時90〜100点(トフィーさん基準)を出し続けるGOLDEN量産WFの決定版設計書です。要点は3つ。
wf_lora のインターフェース(seed/pos/prefix/w/h)を維持したまま中身だけ差し替え可能。["4",2] 固定[17]・重み付き色tint NEG禁止(逆にネオン肌破綻)・照明はpositiveの amber/warm 系で制御。接続順(1行図)
FANZA/DLsiteのR18 CG市場で、購買意思決定に最も効くのはサムネ顔の質と手の整合性です。現行のKSampler一発出力は、引き構図・全身・複数人で顔のピクセル数不足→埴輪化、指6本、背景融解が高頻度で発生し、サンプル閲覧時の離脱を招きます[5]。FaceDetailerは検出領域だけ高解像度で再サンプルしディテールを足し戻す仕組み[1]で、引き構図の顔潰れを構造的に解決します。手はMeshGraphormer/SEGS Detailerで局所修復[8]。これらを量産ループに内包することが、手修正の人件費ゼロ化=競合に対する速度・コスト優位の核です。
| # | 手法 | 顔再現 | 手修正 | 速度 | VRAM | R18量産適性 |
|---|---|---|---|---|---|---|
| 1 | KSamplerのみ(現行) | ×ガビ化 | ×破綻放置 | ◎ | ◎ | × 非推奨 |
| 2 | ADetailer(WebUI系)[1] | ○ | △ | ○ | ○ | △ ComfyUI移植性低 |
| 3 | Ultimate SD Upscale[7] | △境界 | × | ×遅 | △タイル | △ 構図破綻リスク |
| 4 | NNLatentUpscale[6] | ○高精細 | × | △ | ○ | ○ 2pass中間用 |
| 5 | MeshGraphormer Hand Refiner[8] | — | ◎骨格 | △ | △ | ○ 手の局所修復 |
| 6 | 通常Hires 2.0倍超 | ×二重頭 | ×増殖 | × | ×OOM | × 構図複製 |
| 7 | FaceDetailer(Impact-Pack)[1] | ◎anime特化 | — | ○ | ○ | ◎ 必須 |
| 8 | HandDetailer(SEGS Detailer)[3] | — | ◎anime手 | ○ | ○ | ◎ 必須 |
| 9 | ImageUpscaleWithModel 4x-UltraSharp[9] | ◎シャープ | — | ◎ | ◎極小 | ◎ 最終段 |
| 10 | GOLDEN WF(本提案) | ◎ | ◎ | ○ | ○動的解放 | ◎ 2026決定版 |
論点①②の核。全ノードの接続順・物理ノード名・拡張元・主要I/O・推奨値です。リンクは [ノード番号, 出力ポート]。
| 順 | node番号 | 物理ノード名 | 拡張元 | 主入力 | 出力 | 推奨値 |
|---|---|---|---|---|---|---|
| 1 | 4 | CheckpointLoaderSimple | 標準 | — | MODEL,CLIP,VAE | waiIllustriousSDXL_v160.safetensors |
| 2 | 10 | LoraLoader(画風) | 標準 | [4,0][4,1] | MODEL,CLIP | strength 0.6/0.6[12] |
| 3 | 11 | LoraLoader(キャラ) | 標準 | [10,0][10,1] | MODEL,CLIP | strength 0.8/0.8 |
| 4 | 12 | LoraLoader(品質) | 標準 | [11,0][11,1] | MODEL,CLIP | strength 0.4/0.4 |
| 5 | 13 | CLIPSetLastLayer | 標準 | [12,1] | CLIP | stop_at_clip_layer: -2 |
| 6 | 5 | EmptyLatentImage | 標準 | — | LATENT | 832×1216 / batch 1 |
| 7 | 6 | CLIPTextEncode(Pos) | 標準 | [13,0] | COND | 照明=amber/warm系で記述 |
| 8 | 7 | CLIPTextEncode(Neg) | 標準 | [13,0] | COND | 重みなしNEGのみ・色tint禁止 |
| 9 | 3 | KSampler(1pass) | 標準 | [12,0][6,0][7,0][5,0] | LATENT | steps28 cfg6.0 dpmpp_2m karras denoise1.0 |
| 10 | 20 | LatentUpscaleBy | 標準 | [3,0] | LATENT | bicubic / scale_by 1.5(2.0超禁止)[4] |
| 11 | 21 | KSampler(2pass/Hires) | 標準 | [12,0][6,0][7,0][20,0] | LATENT | denoise 0.3(SDXLは0.25-0.35)[4] |
| 12 | 8 | VAEDecode | 標準 | [21,0][4,2] | IMAGE | 内蔵VAE ["4",2](外部fp16fixは破損実績NG)[17] |
| 13 | 31 | UltralyticsDetectorProvider(顔) | Impact-Pack[1] | — | BBOX_DETECTOR | bbox/face_yolov8m.pt or animeface[2] |
| 14 | 30 | FaceDetailer | Impact-Pack | [8,0][12,0][13,0][4,2][31,0] | IMAGE | guide1024 denoise0.4 dilation10 crop3.0[5] |
| 15 | 41 | UltralyticsDetectorProvider(手) | Impact-Pack | — | BBOX_DETECTOR | bbox/hand_yolov8s.pt[3] |
| 16 | 42 | BboxDetectorSEGS | Impact-Pack | [41,0][30,0] | SEGS | threshold 0.6 / dilation 10[3] |
| 17 | 40 | DetailerForEach(手) | Impact-Pack | [30,0][42,0][12,0][13,0][4,2] | IMAGE | guide512 denoise0.3 |
| 18 | 51 | UpscaleModelLoader | 標準 | — | UPSCALE_MODEL | 4x-UltraSharp.pth / 4x_anime6B[9] |
| 19 | 50 | ImageUpscaleWithModel | 標準 | [51,0][40,0] | IMAGE | 4倍超解像(VRAM極小)[10] |
| 20 | 52 | ImageScaleBy | 標準 | [50,0] | IMAGE | scale_by 0.5(実質2倍納品) |
| 21 | 9 | SaveImage | 標準 | [52,0] | — | filename_prefix=prefix |
denoise1.0(GOLDEN既定 steps28/cfg6.0/dpmpp_2m/karras 維持)。Hires(2pass)=denoise0.3(SDXLは0.5だと首ねじれ/別人化[4])。Latent倍率=1.5上限(2.0超で構図複製)。FaceDetailer=denoise0.4・crop_factor3.0で髪/首込みクロップ。HandDetailer=denoise0.3。最終はLatentでなくImageUpscaleWithModelでVRAMを節約しつつシャープ化。1Vol=50枚構成。顔/手の手修正を外注(時給2,000〜3,000円換算)した場合との比較。
| 項目 | 手動修正(従来) | GOLDEN WF(自動) | 差分 |
|---|---|---|---|
| 顔/手 手修正工数 | 1枚10〜15分×50=約10〜12時間 | 0分(生成に内包) | 約-11時間/Vol |
| 外注/人件費 | 約30,000〜36,000円/Vol | 0円(GPU電気代・償却のみ) | -約33,000円/Vol |
| 生成時間/枚(自動付加分) | — | 約45〜68秒(後述) | 夜間バッチで吸収 |
| 破綻起因の差し戻し率 | 高(顔手放置) | 低(自動修復) | レビュー/返金改善 |
| 月4Vol時の年間削減 | — | — | 約158万円/年の工数費圧縮 |
※売上向上効果は市場変動が大きいため、ここでは検証可能な「工数・人件費削減」に限定して保守計上。
[12,0]/[13,0] を渡し、denoiseは0.4以下[1]。bbox_crop_factor 3.0で頭部全体クロップ[5]。ImageUpscaleWithModel(必要時Tiled VAE Decode)[10]。_mem_guard/_gpu_guard 常駐でフリーズ予防(既存資産)。hand_yolov8s の threshold 0.6 以上で確実領域のみ[8]。Day 1-5 : Impact-Pack / MeshGraphormer導入。face_yolov8m・hand_yolov8s・4x-UltraSharp配置。 Day 6-12 : wf_lora_golden をsmoke(2-3枚)→CC自身でRead目視→Grok/Gemini採点。顔/手検出漏れ率<5%調整。 Day 13-20 : _lora_factory_2026-05-31.py の wf_lora を wf_lora_golden に差替え。OOM時の自動再起動・mem/gpu_guard連携。 Day 21-25 : 1Vol(50枚)テスト量産→品質ゲート r18_quality_gate.html(加重3.8以上+Kill無し)を物理通過。 Day 26-30 : 本番ファクトリー全面移行。99体LoRAループへ適用。
以下のいずれかでGOLDEN WFを停止し、旧 wf_lora(KSampler単体)へフォールバック。
yolov8n-face はアニメ顔を検出漏れ→埴輪放置。必ず face_yolov8m か animeface[2]。(pink tint:1.4)(blue/green tint:1.4) 等の重み付き色対策を入れると逆にネオン肌破綻。NEGは重みなしシンプル・loc/背景に色名直書きNG(amber/warm系のみ)[18]。sdxl_vae_fp16fix 破損でネオン緑化実績→内蔵 ["4",2] 固定[17]。DetailerForEach は SEGS入力。UltralyticsDetectorProvider は BBOX_DETECTOR しか出さないので、間に BboxDetectorSEGS を必ず挟む(直結はエラー)[3]。現行 _lora_factory_2026-05-31.py の wf_lora(seed,pos,prefix,w,h,lora) は node 4/10/13/5/6/7/3/8/9 構成。GOLDEN WFはこれを完全上位互換として拡張します。
submit(wf_lora(...)) を submit(wf_lora_golden(...)) に置換するだけ。引数 lora(単一str)を loras(dict)へ拡張。キャラのみ運用なら {"char": lora} を渡し画風/品質はスキップ実装にすればよい(下記付録は3段フル版)。_mem_guard_2026-05-22.py / _gpu_guard_2026-05-30.py をbg常駐させOOM/高温時の退避を担保(起動3点セット)。r18_quality_gate.html 9軸加重3.8以上+Kill無しを通過し gate.json 証跡を残す。| 既存DR | カバー範囲 | 本DRの差分 |
|---|---|---|
DR_ComfyUI_WF設計最適化_2026-05-30[14] | モジュール化/API/速度最適化/接続順の運用論 | 本DRはノードJSON実体・複数LoRA・色破綻設定まで実装粒度で踏み込む |
DR_FaceDetailer_Hires_写植_量産WF_2026-06-01[15] | 顔修復+Hires+写植(文字入れ)中心 | HandDetailer・3段LoRAチェーン・色破綻ゼロ設定・wf_lora置換JSONを新規補完。写植は本DRのSaveImage直前に接続 |
DR_高解像度納品アップスケールWF_2026-05-30[16] | 納品用8K超解像 | 本DR最終段ImageUpscaleWithModelの倍率変更で接続。納品仕様はそちら参照 |
wf_lora_golden() JSON(wf_lora 置換用)DetailerForEach の segs に検出器(BBOX_DETECTOR)を直結していましたが、これは型エラーになります。本JSONでは正しく BboxDetectorSEGS(node42) を挟み、BBOX_DETECTOR→SEGS変換を経由させています。def wf_lora_golden(seed, pos, neg, prefix, w, h, loras):
"""R18量産 GOLDEN WF (2026-06-01決定版)。現行 wf_lora の上位互換。
loras = {"style":"...safetensors","char":"...safetensors","quality":"...safetensors"}
キャラのみなら {"char": lora} を渡し、欠けたLoRA段は呼び出し側でskip生成してよい。
neg は現行ファクトリーの NEG(重みなしシンプル・色tint無し)をそのまま渡す。"""
CKPT = "waiIllustriousSDXL_v160.safetensors"
return {
# --- Checkpoint(内蔵VAE)---
"4": {"class_type":"CheckpointLoaderSimple","inputs":{"ckpt_name":CKPT}},
# --- LoRAチェーン: 画風(0.6) → キャラ(0.8) → 品質(0.4) ---
"10": {"class_type":"LoraLoader","inputs":{"lora_name":loras["style"],
"strength_model":0.6,"strength_clip":0.6,"model":["4",0],"clip":["4",1]}},
"11": {"class_type":"LoraLoader","inputs":{"lora_name":loras["char"],
"strength_model":0.8,"strength_clip":0.8,"model":["10",0],"clip":["10",1]}},
"12": {"class_type":"LoraLoader","inputs":{"lora_name":loras["quality"],
"strength_model":0.4,"strength_clip":0.4,"model":["11",0],"clip":["11",1]}},
# --- CLIP skip -2 ---
"13": {"class_type":"CLIPSetLastLayer","inputs":{"clip":["12",1],"stop_at_clip_layer":-2}},
# --- Latent / prompts ---
"5": {"class_type":"EmptyLatentImage","inputs":{"width":w,"height":h,"batch_size":1}},
"6": {"class_type":"CLIPTextEncode","inputs":{"text":pos,"clip":["13",0]}},
"7": {"class_type":"CLIPTextEncode","inputs":{"text":neg,"clip":["13",0]}},
# --- 1pass KSampler (GOLDEN既定) ---
"3": {"class_type":"KSampler","inputs":{"seed":seed,"steps":28,"cfg":6.0,
"sampler_name":"dpmpp_2m","scheduler":"karras","denoise":1.0,
"model":["12",0],"positive":["6",0],"negative":["7",0],"latent_image":["5",0]}},
# --- Hires 2pass (denoise0.3 / 1.5x) ---
"20": {"class_type":"LatentUpscaleBy","inputs":{"samples":["3",0],
"upscale_method":"bicubic","scale_by":1.5}},
"21": {"class_type":"KSampler","inputs":{"seed":seed,"steps":28,"cfg":6.0,
"sampler_name":"dpmpp_2m","scheduler":"karras","denoise":0.3,
"model":["12",0],"positive":["6",0],"negative":["7",0],"latent_image":["20",0]}},
# --- 内蔵VAEでデコード ---
"8": {"class_type":"VAEDecode","inputs":{"samples":["21",0],"vae":["4",2]}},
# --- FaceDetailer (LoRA適用済みmodel/clipを渡す=別人化防止) ---
"31": {"class_type":"UltralyticsDetectorProvider","inputs":{"model_name":"bbox/face_yolov8m.pt"}},
"30": {"class_type":"FaceDetailer","inputs":{
"image":["8",0],"model":["12",0],"clip":["13",0],"vae":["4",2],
"bbox_detector":["31",0],
"guide_size":1024,"guide_size_for":True,"max_size":2048,
"seed":seed,"steps":28,"cfg":6.0,"sampler_name":"dpmpp_2m","scheduler":"karras",
"denoise":0.4,"feather":10,"noise_mask":True,"force_inpaint":True,
"bbox_threshold":0.5,"bbox_dilation":10,"bbox_crop_factor":3.0,
"sam_detection_hint":"center-1","sam_dilation":0,"sam_threshold":0.93,
"sam_bbox_expansion":0,"sam_mask_hint_threshold":0.7,
"sam_mask_hint_use_negative":"False","drop_size":10,"cycle":1}},
# --- HandDetailer: BBOX_DETECTOR → SEGS → DetailerForEach ---
"41": {"class_type":"UltralyticsDetectorProvider","inputs":{"model_name":"bbox/hand_yolov8s.pt"}},
"42": {"class_type":"BboxDetectorSEGS","inputs":{
"bbox_detector":["41",0],"image":["30",0],
"threshold":0.6,"dilation":10,"crop_factor":3.0,
"drop_size":10,"labels":"all"}},
"40": {"class_type":"DetailerForEach","inputs":{
"image":["30",0],"segs":["42",0],
"model":["12",0],"clip":["13",0],"vae":["4",2],
"guide_size":512,"guide_size_for":True,"max_size":1024,
"seed":seed,"steps":28,"cfg":6.0,"sampler_name":"dpmpp_2m","scheduler":"karras",
"denoise":0.3,"feather":8,"noise_mask":True,"force_inpaint":True,"cycle":1}},
# --- 最終モデルUpscale (4x→0.5で実質2x・VRAM極小) ---
"51": {"class_type":"UpscaleModelLoader","inputs":{"model_name":"4x-UltraSharp.pth"}},
"50": {"class_type":"ImageUpscaleWithModel","inputs":{"upscale_model":["51",0],"image":["40",0]}},
"52": {"class_type":"ImageScaleBy","inputs":{"image":["50",0],
"upscale_method":"bicubic","scale_by":0.5}},
# --- 保存 ---
"9": {"class_type":"SaveImage","inputs":{"filename_prefix":prefix,"images":["52",0]}}
}
_lora_factory_2026-05-31.py L233 の submit(wf_lora(...)) を submit(wf_lora_golden(sb+i,pos,NEG,os.path.join(out,f"{nm}_s{sb+i}"),w,h,{"char":lora,"style":STYLE_LORA,"quality":QUAL_LORA})) に置換。["4",0]/["4",1] を直接 node13/KSamplerへ繋ぐ縮退版を別関数で用意(=現行wf_loraに顔/手/Hiresだけ足した最小GOLDEN)。models/ultralytics/bbox/ に face_yolov8m.pt・hand_yolov8s.pt、models/upscale_models/ に 4x-UltraSharp.pth。/prompt に50枚を一括キュー投入し夜間放置(MAX_Q=4でRAM保護)。顔/手が各1体のみなら Face/Hand を1passに削り更に短縮。wf_lora_golden() JSON掲載。-1=検出モデルのファイル配置はローカル確認を要する(smokeで担保)。