New way switch_midway (refine, want midway): the canvas's sampler becomes two KSampler Advanced parts, the first on the canvas's model up to step 21, the second on a new loader from there, taking the old sampler's place and links. On Anima it takes the tested sampling (35 steps, dpmpp_2m_sde_gpu, beta): er_sde comes out grainy when split, even with the same model in both parts, which the AI is told. refine_other_model and upscale_two_models get Anima variants: a UNET loader "like" the canvas's, reusing its text encoder, VAE and prompts; on Anima the second-model upscale is the Tile route the user verified (1.22x latent, LLLite 0.7, denoise 0.85, ColorMatch). A node "like" or replacing a sampler now takes its seed as noise_seed on KSampler Advanced and the other way round. The scene argument's description is shorter to keep the tool list within its budget. Ran on the isolated test ComfyUI on an Anima canvas: each way built through add_nodes and made a picture (79 s, 148 s, 127 s on 6 GB). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
296 lines
7.6 KiB
JSON
296 lines
7.6 KiB
JSON
{
|
||
"job": "upscale",
|
||
"want": "steady",
|
||
"rank": 3,
|
||
"short": "second model",
|
||
"title": {
|
||
"zh": "双模型放大",
|
||
"en": "Upscale with a second model"
|
||
},
|
||
"about": {
|
||
"zh": "放大后换一个模型重画(Anima 上用 Tile 锁图),原模型放大容易走样或想换画风时用。",
|
||
"en": "Redraws the enlarged picture with another model (held by Tile on Anima), when the first goes wrong enlarged or another look is wanted."
|
||
},
|
||
"source": {
|
||
"zh": "参考工作流的「Refiner/放大」加载器和作者的说明",
|
||
"en": "The reference workflow's upscale loader and its author's note"
|
||
},
|
||
"packs": {},
|
||
"upscaler": true,
|
||
"after": "The redraw's model comes from a new loader (second_model), for now the same checkpoint as the first: set_model it to the steadier one the user wants (ask_user, search_models), of the same family (SDXL with SDXL: it reuses the first model's prompts). Then run_workflow; the larger one is saved beside it (prefix upscaled).",
|
||
"notes": "The source keeps a second loader for upscaling; its author: switch to it when the base model goes wrong enlarged. ColorMatch mkl after the redraw is the source's, optional (KJNodes).",
|
||
"upscale_by": 1.25,
|
||
"nodes": {
|
||
"second_model": {
|
||
"class_type": "CheckpointLoaderSimple",
|
||
"like": "$loader",
|
||
"inputs": {}
|
||
},
|
||
"upscaler": {
|
||
"class_type": "UpscaleModelLoader",
|
||
"inputs": {
|
||
"model_name": "$upscaler"
|
||
}
|
||
},
|
||
"enlarge": {
|
||
"class_type": "ImageUpscaleWithModel",
|
||
"inputs": {
|
||
"upscale_model": [
|
||
"upscaler",
|
||
0
|
||
],
|
||
"image": [
|
||
"$save.images",
|
||
"*"
|
||
]
|
||
}
|
||
},
|
||
"fit": {
|
||
"class_type": "ImageScaleBy",
|
||
"inputs": {
|
||
"image": [
|
||
"enlarge",
|
||
0
|
||
],
|
||
"upscale_method": "lanczos",
|
||
"scale_by": "$fit"
|
||
}
|
||
},
|
||
"encode": {
|
||
"class_type": "VAEEncode",
|
||
"inputs": {
|
||
"pixels": [
|
||
"fit",
|
||
0
|
||
],
|
||
"vae": [
|
||
"$decode.vae",
|
||
"*"
|
||
]
|
||
}
|
||
},
|
||
"redraw": {
|
||
"class_type": "KSampler",
|
||
"like": "$sampler",
|
||
"inputs": {
|
||
"model": [
|
||
"second_model",
|
||
0
|
||
],
|
||
"positive": [
|
||
"$sampler.positive",
|
||
"*"
|
||
],
|
||
"negative": [
|
||
"$sampler.negative",
|
||
"*"
|
||
],
|
||
"latent_image": [
|
||
"encode",
|
||
0
|
||
],
|
||
"denoise": 0.35
|
||
}
|
||
},
|
||
"decode": {
|
||
"class_type": "VAEDecode",
|
||
"inputs": {
|
||
"samples": [
|
||
"redraw",
|
||
0
|
||
],
|
||
"vae": [
|
||
"$decode.vae",
|
||
"*"
|
||
]
|
||
}
|
||
},
|
||
"match": {
|
||
"class_type": "ColorMatch",
|
||
"optional": true,
|
||
"inputs": {
|
||
"image_ref": [
|
||
"fit",
|
||
0
|
||
],
|
||
"image_target": [
|
||
"decode",
|
||
0
|
||
],
|
||
"method": "mkl",
|
||
"strength": 1.0,
|
||
"multithread": true
|
||
}
|
||
},
|
||
"save": {
|
||
"class_type": "SaveImage",
|
||
"inputs": {
|
||
"images": [
|
||
"match|decode",
|
||
0
|
||
],
|
||
"filename_prefix": "upscaled"
|
||
}
|
||
}
|
||
},
|
||
"extras": {
|
||
"ColorMatch": "ComfyUI-KJNodes"
|
||
},
|
||
"models": [
|
||
"2x_animesharp_v4",
|
||
"4x_ultrasharp"
|
||
],
|
||
"tested": {
|
||
"gpu": "RTX 4050 Laptop",
|
||
"vram_gb": 6,
|
||
"date": "2026-11-02",
|
||
"runs": [
|
||
{
|
||
"model": "SDXL (Illustrious)",
|
||
"size": "832×1216 → 1.25×",
|
||
"seconds": 44
|
||
},
|
||
{
|
||
"model": "Anima (Kirazuri → Realskin 1.3, Tile)",
|
||
"size": "1216×832 → 1.22×",
|
||
"seconds": 127
|
||
}
|
||
]
|
||
},
|
||
"variants": {
|
||
"anima": {
|
||
"packs": {
|
||
"AnimaLLLiteApply_sdscripts": "ComfyUI-Anima-LLLite"
|
||
},
|
||
"upscaler": false,
|
||
"lllite": "tile",
|
||
"nodes": {
|
||
"second_model": {
|
||
"class_type": "UNETLoader",
|
||
"like": "$loader",
|
||
"inputs": {}
|
||
},
|
||
"encode": {
|
||
"class_type": "VAEEncodeTiled",
|
||
"inputs": {
|
||
"pixels": [
|
||
"$save.images",
|
||
"*"
|
||
],
|
||
"vae": [
|
||
"$decode.vae",
|
||
"*"
|
||
],
|
||
"tile_size": 512,
|
||
"overlap": 64,
|
||
"temporal_size": 64,
|
||
"temporal_overlap": 8
|
||
}
|
||
},
|
||
"enlarge": {
|
||
"class_type": "LatentUpscaleBy",
|
||
"inputs": {
|
||
"samples": [
|
||
"encode",
|
||
0
|
||
],
|
||
"upscale_method": "bislerp",
|
||
"scale_by": 1.22
|
||
}
|
||
},
|
||
"tile": {
|
||
"class_type": "AnimaLLLiteApply_sdscripts",
|
||
"inputs": {
|
||
"model": [
|
||
"second_model",
|
||
0
|
||
],
|
||
"lllite_name": "$lllite",
|
||
"image": [
|
||
"$save.images",
|
||
"*"
|
||
],
|
||
"strength": 0.7,
|
||
"start_percent": 0.0,
|
||
"end_percent": 0.8,
|
||
"preserve_wrapper": true
|
||
}
|
||
},
|
||
"redraw": {
|
||
"class_type": "KSampler",
|
||
"like": "$sampler",
|
||
"inputs": {
|
||
"model": [
|
||
"tile",
|
||
0
|
||
],
|
||
"positive": [
|
||
"$sampler.positive",
|
||
"*"
|
||
],
|
||
"negative": [
|
||
"$sampler.negative",
|
||
"*"
|
||
],
|
||
"latent_image": [
|
||
"enlarge",
|
||
0
|
||
],
|
||
"steps": 30,
|
||
"cfg": 4.4,
|
||
"sampler_name": "dpmpp_2m_sde_gpu",
|
||
"scheduler": "sgm_uniform",
|
||
"denoise": 0.85
|
||
}
|
||
},
|
||
"decode": {
|
||
"class_type": "VAEDecodeTiled",
|
||
"inputs": {
|
||
"samples": [
|
||
"redraw",
|
||
0
|
||
],
|
||
"vae": [
|
||
"$decode.vae",
|
||
"*"
|
||
],
|
||
"tile_size": 512,
|
||
"overlap": 64,
|
||
"temporal_size": 64,
|
||
"temporal_overlap": 8
|
||
}
|
||
},
|
||
"match": {
|
||
"class_type": "ColorMatch",
|
||
"optional": true,
|
||
"inputs": {
|
||
"image_ref": [
|
||
"$save.images",
|
||
"*"
|
||
],
|
||
"image_target": [
|
||
"decode",
|
||
0
|
||
],
|
||
"method": "mkl",
|
||
"strength": 1.0,
|
||
"multithread": true
|
||
}
|
||
},
|
||
"save": {
|
||
"class_type": "SaveImage",
|
||
"inputs": {
|
||
"images": [
|
||
"match|decode",
|
||
0
|
||
],
|
||
"filename_prefix": "upscaled"
|
||
}
|
||
}
|
||
},
|
||
"after": "On this Anima model the picture is enlarged 1.22× in latent space and redrawn at denoise 0.85 by the redraw's own model (second_model, a new UNET loader that starts as the canvas's model), held by Anima's tile-repair LLLite (0.7, to 80% of the steps). set_model second_model to the other Anima model the user wants. A LoRA on the first model (a style) is not on it: add_lora it onto second_model too when the user wants that look kept (the tested route did). Then run_workflow; the larger one is saved beside it (prefix upscaled). Compare face, hands and clothes with the base: Tile guides, it does not guarantee.",
|
||
"notes": "The user's tested route: Harem 1.5 base, Realskin 1.3 for the Tile upscale, its style LoRA on both, 832×1216 → 1016×1480, 116 s for the upscale on 6 GB. ColorMatch (KJNodes) is left out without the pack."
|
||
}
|
||
}
|
||
}
|