ComfyUI / workflows /flux-bg-inpaint.json
aleph65's picture
Add flux-bg-inpaint workflow
94712bc verified
Raw
History Blame Contribute Delete
19.2 kB
{
"id": "7df1cda8-0d0d-403a-8c08-8a3841b6ec6b",
"revision": 0,
"last_node_id": 18,
"last_link_id": 24,
"nodes": [
{
"id": 1,
"type": "UNETLoader",
"pos": [
-40,
-500
],
"size": [
340,
82
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
7
]
}
],
"properties": {
"Node name for S&R": "UNETLoader",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
"flux1-fill-dev-fp8.safetensors",
"default"
],
"title": "Load Flux Fill Model (fill or onereward)"
},
{
"id": 2,
"type": "CheckpointLoaderSimple",
"pos": [
-40,
-340
],
"size": [
340,
100
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": []
},
{
"name": "CLIP",
"type": "CLIP",
"slot_index": 0,
"links": [
4
]
},
{
"name": "VAE",
"type": "VAE",
"slot_index": 0,
"links": [
10,
18
]
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
"flux1-dev-fp8.safetensors"
],
"title": "CLIP+VAE source (MODEL unused)"
},
{
"id": 3,
"type": "LoadImage",
"pos": [
-40,
-140
],
"size": [
270,
330
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
1,
11,
20,
22
]
},
{
"name": "MASK",
"type": "MASK",
"slot_index": 0,
"links": []
}
],
"properties": {
"Node name for S&R": "LoadImage",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
"example.png",
"image"
],
"title": "Main Image"
},
{
"id": 5,
"type": "SAM3Segment",
"pos": [
300,
-140
],
"size": [
300,
320
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 1
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": []
},
{
"name": "MASK",
"type": "MASK",
"slot_index": 0,
"links": [
2,
3
]
},
{
"name": "MASK_IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": []
}
],
"properties": {
"Node name for S&R": "SAM3Segment",
"cnr_id": "comfyui-rmbg",
"aux_id": "1038lab/ComfyUI-RMBG",
"ver": "3.0.0"
},
"widgets_values": [
"person",
"Merged",
0.5,
0,
0,
0,
0,
"Auto",
false,
false,
"Alpha",
"#222222"
],
"title": "Segment PERSON (SAM3)"
},
{
"id": 6,
"type": "GrowMaskWithBlur",
"pos": [
640,
-140
],
"size": [
300,
250
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "mask",
"type": "MASK",
"link": 2
}
],
"outputs": [
{
"name": "mask",
"type": "MASK",
"slot_index": 0,
"links": []
},
{
"name": "mask_inverted",
"type": "MASK",
"slot_index": 0,
"links": [
12
]
}
],
"properties": {
"Node name for S&R": "GrowMaskWithBlur",
"cnr_id": "comfyui-kjnodes",
"aux_id": "kijai/ComfyUI-KJNodes",
"ver": "1.2.5"
},
"widgets_values": [
-4,
0.0,
true,
false,
8.0,
1.0,
1.0,
true
],
"title": "Background mask (inverted)"
},
{
"id": 7,
"type": "CLIPTextEncode",
"pos": [
300,
-420
],
"size": [
380,
160
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 4
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
5,
6
]
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
"sharp photorealistic background, same scene, crisp focus, fine natural texture, clean detail, natural depth, lighting and color temperature matching the subject, no blur, no artifacts, high detail, 4k"
],
"title": "Background prompt"
},
{
"id": 8,
"type": "ConditioningZeroOut",
"pos": [
700,
-480
],
"size": [
280,
50
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "conditioning",
"type": "CONDITIONING",
"link": 5
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
9
]
}
],
"properties": {
"Node name for S&R": "ConditioningZeroOut",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [],
"title": "Negative (zeroed)"
},
{
"id": 9,
"type": "FluxGuidance",
"pos": [
700,
-380
],
"size": [
280,
60
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "conditioning",
"type": "CONDITIONING",
"link": 6
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
8
]
}
],
"properties": {
"Node name for S&R": "FluxGuidance",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
30.0
]
},
{
"id": 10,
"type": "DifferentialDiffusion",
"pos": [
300,
-520
],
"size": [
280,
60
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 7
}
],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
13
]
}
],
"properties": {
"Node name for S&R": "DifferentialDiffusion",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
1.0
]
},
{
"id": 11,
"type": "InpaintModelConditioning",
"pos": [
1020,
-420
],
"size": [
300,
170
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "positive",
"type": "CONDITIONING",
"link": 8
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 9
},
{
"name": "vae",
"type": "VAE",
"link": 10
},
{
"name": "pixels",
"type": "IMAGE",
"link": 11
},
{
"name": "mask",
"type": "MASK",
"link": 12
}
],
"outputs": [
{
"name": "positive",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
14
]
},
{
"name": "negative",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
15
]
},
{
"name": "latent",
"type": "LATENT",
"slot_index": 0,
"links": [
16
]
}
],
"properties": {
"Node name for S&R": "InpaintModelConditioning",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
true
],
"title": "Flux Fill conditioning"
},
{
"id": 12,
"type": "KSampler",
"pos": [
1360,
-420
],
"size": [
300,
450
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 13
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 14
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 15
},
{
"name": "latent_image",
"type": "LATENT",
"link": 16
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
17
]
}
],
"properties": {
"Node name for S&R": "KSampler",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
720559880485925,
"randomize",
24,
1.0,
"euler",
"normal",
1.0
]
},
{
"id": 13,
"type": "VAEDecode",
"pos": [
1700,
-420
],
"size": [
210,
50
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 17
},
{
"name": "vae",
"type": "VAE",
"link": 18
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
19
]
}
],
"properties": {
"Node name for S&R": "VAEDecode",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": []
},
{
"id": 14,
"type": "GrowMaskWithBlur",
"pos": [
640,
260
],
"size": [
300,
250
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"name": "mask",
"type": "MASK",
"link": 3
}
],
"outputs": [
{
"name": "mask",
"type": "MASK",
"slot_index": 0,
"links": [
23
]
},
{
"name": "mask_inverted",
"type": "MASK",
"slot_index": 0,
"links": []
}
],
"properties": {
"Node name for S&R": "GrowMaskWithBlur",
"cnr_id": "comfyui-kjnodes",
"aux_id": "kijai/ComfyUI-KJNodes",
"ver": "1.2.5"
},
"widgets_values": [
6,
0.0,
true,
false,
12.0,
1.0,
1.0,
true
],
"title": "Person keep mask (grow+feather)"
},
{
"id": 15,
"type": "ImageResizeKJ",
"pos": [
1700,
-300
],
"size": [
300,
190
],
"flags": {},
"order": 15,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 19
},
{
"name": "get_image_size",
"type": "IMAGE",
"link": 20,
"shape": 7
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
21
]
},
{
"name": "width",
"type": "INT",
"slot_index": 0,
"links": []
},
{
"name": "height",
"type": "INT",
"slot_index": 0,
"links": []
}
],
"properties": {
"Node name for S&R": "ImageResizeKJ",
"cnr_id": "comfyui-kjnodes",
"aux_id": "kijai/ComfyUI-KJNodes",
"ver": "1.2.5"
},
"widgets_values": [
1024,
1024,
"lanczos",
false,
0,
"disabled"
],
"title": "Resize to original size"
},
{
"id": 16,
"type": "ImageCompositeMasked",
"pos": [
2040,
-420
],
"size": [
300,
170
],
"flags": {},
"order": 16,
"mode": 0,
"inputs": [
{
"name": "destination",
"type": "IMAGE",
"link": 21
},
{
"name": "source",
"type": "IMAGE",
"link": 22
},
{
"name": "mask",
"type": "MASK",
"link": 23,
"shape": 7
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
24
]
}
],
"properties": {
"Node name for S&R": "ImageCompositeMasked",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
0,
0,
false
],
"title": "Original person over new background"
},
{
"id": 17,
"type": "SaveImage",
"pos": [
2380,
-420
],
"size": [
400,
460
],
"flags": {},
"order": 17,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 24
}
],
"outputs": [],
"properties": {
"Node name for S&R": "SaveImage",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
"flux-bg-inpaint"
],
"title": "Save Image"
},
{
"id": 18,
"type": "MarkdownNote",
"pos": [
-40,
-940
],
"size": [
620,
380
],
"flags": {},
"order": 18,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "MarkdownNote",
"cnr_id": "comfy-core",
"ver": "0.3.48"
},
"widgets_values": [
"## Flux BG Inpaint (Flux.1 Fill / OneReward)\n\n**True masked inpainting of the background with FLUX.1 Fill dev (fp8), person auto-masked by [SAM3](https://github.com/1038lab/ComfyUI-RMBG)** (needs [ComfyUI-RMBG](https://github.com/1038lab/ComfyUI-RMBG) + [ComfyUI-KJNodes](https://github.com/kijai/ComfyUI-KJNodes))\n\n- **Note**: Fill cannot see the masked-out background, so it invents a NEW scene behind the person (guided only by the prompt and the subject). For \"same scene but sharper\" use `qwen-bg-enhance` / `qwen-bg-inpaint-true` / `flux2-bg-inpaint` instead - this workflow is for full background replacement.\n- **Model**: pick in *Load Flux Fill Model*: `flux1-fill-dev-fp8` (official Fill weights) or `flux1-fill-dev-onereward-fp8` (ByteDance OneReward variant, tuned for context-aware inpaint). CLIP + VAE come from the `flux1-dev-fp8` checkpoint - its MODEL output is unused.\n- **Sampling**: FluxGuidance `30` (Fill's recommended range), 24 steps euler/normal, CFG 1, denoise 1.0, DifferentialDiffusion for softer mask blending.\n- **Background mask**: person mask shrunk 4px + 8px feather, inverted - regen bites slightly into the subject edge so no halo survives. Fill preserves the subject natively; the final composite pastes the original person back on top as a guarantee (keep mask `expand 6 / blur 12`).\n- Output is resized back to the exact input resolution before the composite.\n- Via API: `--set 3.image=file.png`, `--set 1.unet_name=flux1-fill-dev-onereward-fp8.safetensors`, `--set 7.text='...'`.\n\n**Models** (all in [aleph65/ComfyUI](https://huggingface.co/aleph65/ComfyUI)): `flux1-fill-dev-fp8`, `flux1-fill-dev-onereward-fp8`, `flux1-dev-fp8` (checkpoint, for CLIP+VAE), `sam3.pt`\n"
],
"title": "README",
"color": "#432",
"bgcolor": "#653"
}
],
"links": [
[
1,
3,
0,
5,
0,
"IMAGE"
],
[
2,
5,
1,
6,
0,
"MASK"
],
[
3,
5,
1,
14,
0,
"MASK"
],
[
4,
2,
1,
7,
0,
"CLIP"
],
[
5,
7,
0,
8,
0,
"CONDITIONING"
],
[
6,
7,
0,
9,
0,
"CONDITIONING"
],
[
7,
1,
0,
10,
0,
"MODEL"
],
[
8,
9,
0,
11,
0,
"CONDITIONING"
],
[
9,
8,
0,
11,
1,
"CONDITIONING"
],
[
10,
2,
2,
11,
2,
"VAE"
],
[
11,
3,
0,
11,
3,
"IMAGE"
],
[
12,
6,
1,
11,
4,
"MASK"
],
[
13,
10,
0,
12,
0,
"MODEL"
],
[
14,
11,
0,
12,
1,
"CONDITIONING"
],
[
15,
11,
1,
12,
2,
"CONDITIONING"
],
[
16,
11,
2,
12,
3,
"LATENT"
],
[
17,
12,
0,
13,
0,
"LATENT"
],
[
18,
2,
2,
13,
1,
"VAE"
],
[
19,
13,
0,
15,
0,
"IMAGE"
],
[
20,
3,
0,
15,
1,
"IMAGE"
],
[
21,
15,
0,
16,
0,
"IMAGE"
],
[
22,
3,
0,
16,
1,
"IMAGE"
],
[
23,
14,
0,
16,
2,
"MASK"
],
[
24,
16,
0,
17,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"frontendVersion": "1.45.20"
},
"version": 0.4
}