- The Ways panel lists the ways that can run here as short rows that open, then the skills, and folds the ways lacking a pack or a model at the bottom. - The staged_picture skill keeps the judgment only: the ways of its uses come from each block's "when", listed with the skill for what can run here. Its answer had passed the 3,800 bytes an AI app shows in the chat (3,991); a test keeps every skill under it. - An Anima LLLite made for 28-block (2B) models stops a run on a 40-block (2.9B) one: lllite_fit counts both from the files' headers, the AI's run is refused with the nodes to change, and an example with a Tile opens on a model it fits. The warning written into four ways and two examples is removed. - What holds for a model family is written once: the profile's notes go with each Anima example for an AI, the examples window says it once for the user; a pack two nodes come from is named once. - The Tile upscale is want="tile", no longer the name of another use. Co-Authored-By: Claude <noreply@anthropic.com>
278 lines
9.7 KiB
JSON
278 lines
9.7 KiB
JSON
{
|
||
"job": "refine",
|
||
"want": "background",
|
||
"rank": 9,
|
||
"short": "background only",
|
||
"when": "another model redraws only the background, the character kept to the pixel.",
|
||
"title": {
|
||
"zh": "换模型精修·只改场景",
|
||
"en": "Refine only the background"
|
||
},
|
||
"about": {
|
||
"zh": "自动抠出人物,换另一个模型只重画背景,人物和它边上一圈原样不动;Anima 上有 Tile 时照着原图的线条画,可以改得更多。另存一张。",
|
||
"en": "Cuts the character out; another model redraws only the background, the character and a band around it left as they were; on Anima with the Tile it follows the picture's lines and may change more. Saved beside it."
|
||
},
|
||
"source": {
|
||
"zh": "常见的“抠图换背景”做法,只是背景不换新、只轻轻重画,强度按 2026-11-10 的场景重画对照定",
|
||
"en": "The common cut-out-and-replace-the-background way, the background only lightly redrawn, not replaced; its strength from a background redraw comparison of 2026-11-10"
|
||
},
|
||
"packs": {
|
||
"InspyrenetRembg": "comfyui-inspyrenet-rembg"
|
||
},
|
||
"extras": {
|
||
"AnimaLLLiteApply_sdscripts": "ComfyUI-Anima-LLLite"
|
||
},
|
||
"nodes": {
|
||
"second_model": {
|
||
"class_type": "CheckpointLoaderSimple",
|
||
"like": "$loader",
|
||
"inputs": {}
|
||
},
|
||
"second_positive": {
|
||
"class_type": "CLIPTextEncode",
|
||
"like": "$sampler.positive",
|
||
"inputs": {
|
||
"clip": ["second_model", 1]
|
||
}
|
||
},
|
||
"second_negative": {
|
||
"class_type": "CLIPTextEncode",
|
||
"like": "$sampler.negative",
|
||
"inputs": {
|
||
"clip": ["second_model", 1]
|
||
}
|
||
},
|
||
"cut": {
|
||
"class_type": "InspyrenetRembg",
|
||
"inputs": {
|
||
"image": ["$save.images", "*"],
|
||
"torchscript_jit": "default"
|
||
}
|
||
},
|
||
"solid": {
|
||
"class_type": "ThresholdMask",
|
||
"inputs": {
|
||
"mask": ["cut", 1],
|
||
"value": 0.5
|
||
}
|
||
},
|
||
"edge": {
|
||
"class_type": "GrowMask",
|
||
"inputs": {
|
||
"mask": ["solid", 0],
|
||
"expand": 12,
|
||
"tapered_corners": true
|
||
}
|
||
},
|
||
"background": {
|
||
"class_type": "InvertMask",
|
||
"inputs": {
|
||
"mask": ["edge", 0]
|
||
}
|
||
},
|
||
"encode": {
|
||
"class_type": "VAEEncode",
|
||
"inputs": {
|
||
"pixels": ["$save.images", "*"],
|
||
"vae": ["second_model", 2]
|
||
}
|
||
},
|
||
"area": {
|
||
"class_type": "SetLatentNoiseMask",
|
||
"inputs": {
|
||
"samples": ["encode", 0],
|
||
"mask": ["background", 0]
|
||
}
|
||
},
|
||
"redraw": {
|
||
"class_type": "KSampler",
|
||
"like": "$sampler",
|
||
"inputs": {
|
||
"model": ["second_model", 0],
|
||
"positive": ["second_positive", 0],
|
||
"negative": ["second_negative", 0],
|
||
"latent_image": ["area", 0],
|
||
"denoise": 0.45
|
||
}
|
||
},
|
||
"decode": {
|
||
"class_type": "VAEDecode",
|
||
"inputs": {
|
||
"samples": ["redraw", 0],
|
||
"vae": ["second_model", 2]
|
||
}
|
||
},
|
||
"paste": {
|
||
"class_type": "ImageCompositeMasked",
|
||
"inputs": {
|
||
"destination": ["$save.images", "*"],
|
||
"source": ["decode", 0],
|
||
"x": 0,
|
||
"y": 0,
|
||
"resize_source": false,
|
||
"mask": ["background", 0]
|
||
}
|
||
},
|
||
"save": {
|
||
"class_type": "SaveImage",
|
||
"inputs": {
|
||
"images": ["paste", 0],
|
||
"filename_prefix": "refined_background"
|
||
}
|
||
},
|
||
"as_picture": {
|
||
"class_type": "MaskToImage",
|
||
"inputs": {
|
||
"mask": ["background", 0]
|
||
}
|
||
},
|
||
"look": {
|
||
"class_type": "PreviewImage",
|
||
"inputs": {
|
||
"images": ["as_picture", 0]
|
||
}
|
||
}
|
||
},
|
||
"after": "The redraw's loader (second_model) starts as the same checkpoint: set_model it to the model the user wants for the background (ask_user, search_models), add_lora a style LoRA onto it if they want one, and write its prompts (second_positive, second_negative, copied from the first) in that model's style. Then run_workflow; the picture is saved beside it (prefix refined_background), the character the same to the pixel. Denoise 0.45: textures and light take the second model's look and the layout stays; at 0.6 the ground gets heavier and the edge round the character may show (dark chair legs most). The preview shows what is redrawn (white): part of the character in it, say so.",
|
||
"gives": {
|
||
"sampler": "redraw",
|
||
"save": "save"
|
||
},
|
||
"own_model": {
|
||
"nodes": ["second_model"],
|
||
"copies_loras": false
|
||
},
|
||
"notes": "The background is the inverse of the character's mask grown 12 px, so the character and a 12 px band around it, where it meets a bench or the ground, stay as they were; the paste-back keeps them to the pixel. In the 2026-11-10 comparison (an Anima picture, Kirazuri redrawing the background) this way at 0.45 changed the scene about 3.6% on average and the character not at all; the bench still held the character up. The cut-out takes what stands out in front, often with what the character sits on or holds (a bench, an umbrella, a bag): kept with it, so where they touch stays as it was. On Anima an animaTileRepair LLLite (strength 0.7, the first 80% of the steps, as the Tile upscale) holds the picture's lines: in a test of 2026-11-10 at denoise 0.70 without it the background's windows vanished and the bag was redrawn as another, with it they stayed (lines kept 61% to 85% in the background, 77% to 92% on the character), so it redraws at 0.7; without the Tile file the node goes and 0.45 is the strength. How much 0.7 changes follows the sampler: dpmpp_2m_sde (the Anima picture way's) about 8% on the character in that test, euler on a canvas there about 5%, the lines kept either way.",
|
||
"models": [],
|
||
"tested": {
|
||
"gpu": "RTX 4050 Laptop",
|
||
"vram_gb": 6,
|
||
"date": "2026-11-10",
|
||
"runs": [
|
||
{
|
||
"model": "Anima (Harem 2.9B, then Kirazuri v4.0 on the background, the Tile, denoise 0.7)",
|
||
"size": "1440×1024",
|
||
"seconds": 250
|
||
}
|
||
]
|
||
},
|
||
"variants": {
|
||
"anima": {
|
||
"optional_lllite": {
|
||
"tile": "tile"
|
||
},
|
||
"nodes": {
|
||
"second_model": {
|
||
"class_type": "UNETLoader",
|
||
"like": "$loader",
|
||
"inputs": {}
|
||
},
|
||
"tile": {
|
||
"class_type": "AnimaLLLiteApply_sdscripts",
|
||
"optional": true,
|
||
"inputs": {
|
||
"model": ["second_model", 0],
|
||
"lllite_name": "$tile",
|
||
"image": ["$save.images", "*"],
|
||
"strength": 0.7,
|
||
"start_percent": 0.0,
|
||
"end_percent": 0.8,
|
||
"preserve_wrapper": true
|
||
}
|
||
},
|
||
"cut": {
|
||
"class_type": "InspyrenetRembg",
|
||
"inputs": {
|
||
"image": ["$save.images", "*"],
|
||
"torchscript_jit": "default"
|
||
}
|
||
},
|
||
"solid": {
|
||
"class_type": "ThresholdMask",
|
||
"inputs": {
|
||
"mask": ["cut", 1],
|
||
"value": 0.5
|
||
}
|
||
},
|
||
"edge": {
|
||
"class_type": "GrowMask",
|
||
"inputs": {
|
||
"mask": ["solid", 0],
|
||
"expand": 12,
|
||
"tapered_corners": true
|
||
}
|
||
},
|
||
"background": {
|
||
"class_type": "InvertMask",
|
||
"inputs": {
|
||
"mask": ["edge", 0]
|
||
}
|
||
},
|
||
"encode": {
|
||
"class_type": "VAEEncode",
|
||
"inputs": {
|
||
"pixels": ["$save.images", "*"],
|
||
"vae": ["$decode.vae", "*"]
|
||
}
|
||
},
|
||
"area": {
|
||
"class_type": "SetLatentNoiseMask",
|
||
"inputs": {
|
||
"samples": ["encode", 0],
|
||
"mask": ["background", 0]
|
||
}
|
||
},
|
||
"redraw": {
|
||
"class_type": "KSampler",
|
||
"like": "$sampler",
|
||
"inputs": {
|
||
"model": ["tile|second_model", 0],
|
||
"positive": ["$sampler.positive", "*"],
|
||
"negative": ["$sampler.negative", "*"],
|
||
"latent_image": ["area", 0],
|
||
"denoise": 0.7
|
||
}
|
||
},
|
||
"decode": {
|
||
"class_type": "VAEDecode",
|
||
"inputs": {
|
||
"samples": ["redraw", 0],
|
||
"vae": ["$decode.vae", "*"]
|
||
}
|
||
},
|
||
"paste": {
|
||
"class_type": "ImageCompositeMasked",
|
||
"inputs": {
|
||
"destination": ["$save.images", "*"],
|
||
"source": ["decode", 0],
|
||
"x": 0,
|
||
"y": 0,
|
||
"resize_source": false,
|
||
"mask": ["background", 0]
|
||
}
|
||
},
|
||
"save": {
|
||
"class_type": "SaveImage",
|
||
"inputs": {
|
||
"images": ["paste", 0],
|
||
"filename_prefix": "refined_background"
|
||
}
|
||
},
|
||
"as_picture": {
|
||
"class_type": "MaskToImage",
|
||
"inputs": {
|
||
"mask": ["background", 0]
|
||
}
|
||
},
|
||
"look": {
|
||
"class_type": "PreviewImage",
|
||
"inputs": {
|
||
"images": ["as_picture", 0]
|
||
}
|
||
}
|
||
},
|
||
"after": "On this Anima model the redraw's loader (second_model) is a UNET loader that starts as the canvas's model; it reuses the canvas's text encoder, VAE and prompts. set_model it to the other Anima model the user wants for the background (ask_user, search_models); a LoRA on the first model is not on it: add_lora it onto second_model when the user wants that look kept. Then run_workflow; the picture is saved beside it (prefix refined_background), the character the same to the pixel. The Tile (node tile) holds the picture's lines, so at denoise 0.7 walls, ground and sky take the second model's look and keep their places (windows stay windows, one track stays one); without the tile node (no animaTileRepair file here) set redraw's denoise to 0.45. At this strength colours may drift (grass, sky): say so. The preview shows what is redrawn (white): part of the character in it, say so."
|
||
}
|
||
}
|
||
}
|