目录
一、前言
二、FLUX-Controlnet-Inpainting的推理
二、区别和联系
一、前言
局部重绘有三种方式:
1.基于FLUX.1-dev:传统的局部重绘,在每一时间步的去噪操作之后将掩码的上下文信息贴回去,掩码的作用并不是在模型中以直接的方式控制目标区域的去噪范围。
2.FLUX-Controlnet-Inpainting:借助外挂的Controlnet来实现局部重绘
3.FLUX.1-Fill-dev:重新训练了一个端到端的局部重绘模型。
二、FLUX-Controlnet-Inpainting的推理
Github地址:
https://github.com/alimama-creative/FLUX-Controlnet-Inpainting/blob/main/controlnet_flux.py
模型地址:
https://huggingface.co/alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Alpha
https://huggingface.co/alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Beta
在conda环境中安装依赖:
pip install diffusers==0.30.2
pip install accelerate==1.3.0
pip install transformers==4.44.0
pip install peft==0.14.0 safetensors==0.4.3
pip install sentencepiece
pip install protobuf
推理代码:python main.py
https://github.com/alimama-creative/FLUX-Controlnet-Inpainting/blob/main/main.py
import torch
from diffusers.utils import load_image, check_min_version
from controlnet_flux import FluxControlNetModel
from transformer_flux import FluxTransformer2DModel
from pipeline_flux_controlnet_inpaint import FluxControlNetInpaintingPipeline
check_min_version("0.30.2")
# Set image path , mask path and prompt
image_path='2026-05-07ebmvnh2lrtw.png',
mask_path='2026-05-07rdajr4jxu01.jpeg',
prompt='a person wearing a white shoe, carrying a white bucket with text "FLUX" on it'
# Build pipeline
controlnet = FluxControlNetModel.from_pretrained("alimama-creative/FLUX.1-dev-Controlnet-Inpainting-Alpha", torch_dtype=torch.bfloat16)
transformer = FluxTransformer2DModel.from_pretrained(
"black-forest-labs/FLUX.1-dev", subfolder='transformer', torch_dtype=torch.bfloat16
)
pipe = FluxControlNetInpaintingPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
controlnet=controlnet,
transformer=transformer,
torch_dtype=torch.bfloat16
).to("cuda")
pipe.transformer.to(torch.bfloat16)
pipe.controlnet.to(torch.bfloat16)
# Load image and mask
size = (768, 768)
image = load_image(image_path).convert("RGB").resize(size)
mask = load_image(mask_path).convert("RGB").resize(size)
generator = torch.Generator(device="cuda").manual_seed(24)
# Inpaint
result = pipe(
prompt=prompt,
height=size[1],
width=size[0],
control_image=image,
control_mask=mask,
num_inference_steps=28,
generator=generator,
controlnet_conditioning_scale=0.9,
guidance_scale=3.5,
negative_prompt="",
true_guidance_scale=1.0 # default: 3.5 for alpha and 1.0 for beta
).images[0]
result.save('flux_inpaint.png')
print("Successfully inpaint image")
二、区别和联系
比如说我用diffusers官方的flux.1-dev(简称为模型A)的lora训练代码训练出来的lora(简称为模型A-lora),这时候我可以叠加controlnet(简称为模型B)对吧,那diffusers官方应该也有一个训练controlnet的代码,训练出来的模型(简称为模型B-trained),那现在我有一个FLUX.1-dev-Controlnet-Inpainting-Beta(简称为模型C),有一个FLUX.1-Fill-dev(简称为模型 D)。
模型A、B、C、D的区别和联系是什么?
| 本质 | 基座文生图模型 | 外挂条件控制模块 | 外挂修复控制模块 | 端到端修复模型 |
| 架构 | 12B DiT | 复制 DiT 子层 + 零卷积 | 复制 DiT 子层 + 零卷积 | 12B DiT(原生支持 image+mask 输入) |
| 输入 | prompt | prompt + canny/depth | prompt + masked_image + mask | prompt + image + mask |
| 输出 | 完整图像 latent | 残差特征(注入 A) | 残差特征(注入 A) | 完整修复后图像 |
| 能否独立运行 | ✅ 可以 | ❌ 必须配合 A | ❌ 必须配合 A | ✅ 可以 |
| 参数量 | ~12B | ~1-4B | ~4B | ~12B |



