چیتشیت
کنترلنت، اینپینتینگ و ویرایش تصویر
ControlNet, Inpainting and Image Editing
فراخوانیهای Diffusers برای text to image، img2img، اینپینتینگ، LoRA و کنترلنت. تنظیمات، پیشفرضها و رفع خطاها.
فهرست مطالب
سیگنالهای کنترلی به U-Net
معماریText to image
کدpython
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16, # کاهش حافظهی گرافیکی به نصف
).to("cuda")
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
image = pipe(
prompt="<prompt>",
guidance_scale=7.5, # مقیاس CFG با w، پیشفرض SD
num_inference_steps=25, # معادل 50 گام DDIM
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
image.save("dog.png")
Img2img، اینپینت و LoRA
کدpython
out = img2img(prompt="<prompt>", image=init_image,
strength=0.6, guidance_scale=7.5).images[0] # 0.0 بدون تغییر، 1.0 بازتولید کامل
mask = Image.open("dog_mask.png").convert("L").resize((512, 512))
out = inpaint(prompt="<prompt>", image=image,
mask_image=mask, guidance_scale=7.5).images[0] # پیکسلهای سفید بازتولید میشوند
pipe.load_lora_weights("<repo>", weight_name="<file>")
pipe.fuse_lora(lora_scale=0.8) # تثبیت میشود، تعویض ممکن نیست
pipe.unfuse_lora() # پیش از تطبیقدهنده دیگر
pipe.set_adapters([...], adapter_weights=[...]) # ترکیب LoRA به ازای هر درخواست
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| نصب پشتهی ابزارها | pip install diffusers transformers accelerate |
| Image to image | StableDiffusionImg2ImgPipeline |
| اینپینت با SD | StableDiffusionInpaintPipeline |
| اینپینت با Flux | FluxFillPipeline |
| نمونهگیر تصادفی | EulerAncestralDiscreteScheduler |
| رمزگذاری به متغیرهای نهان | pipe.image_processor.preprocess(img) |
| استفاده مجدد از متغیرهای نهان قبلی | pass `latents=...` and skip one VAE encode |
| مقیاسدهی متغیرهای نهان VAE | latent_dist.sample() * 0.18215 |
حلقهی معکوس آگاه از ماسک
گامبهگام- شروعنمونهگیری
xاز N(0, I) برای تمامی ابعاد. - تزریق مجددافزودن نویز به مبدا تمیز تا گام t. ثبت آن در ابعاد خارج از ماسک.
- پیشبینیتخمین
eps_hatتوسط نویززدا برایxدر گام t. - معکوسمحاسبه میانگین DDPM. افزودن نویز در صورت t > 0.
- تکرارشمارش معکوس از t = T - 1 تا 0.
- تثبیت نهاییکپی مقادیر تمیز در ابعاد خارج از ماسک در پایان.
- Outpaintمعکوس کردن ماسک. هدف آموزش بدون تغییر میماند.
فرمولها و اعداد
مفهومها- CFG
- $\epsilon = \epsilon_{\text{uncond}} + w \cdot (\epsilon_{\text{cond}} - \epsilon_{\text{uncond}})$
- LoRA
- $W' = W + \alpha \cdot B A$ با $r \ll d$. پارامترهای جدید: $2 \cdot d \cdot r$ به جای $d^2$.
- حجم LoRA
- برای $d=640$ و $r=16$ برابر 20k پارامتر به جای 410k.
- ترکیب کنترلنت
features += weight_a * control_a(depth) + weight_b * control_b(pose)- دیفیوژن نهان
- کاهش 3x512x512 به 4x64x64 محاسبات را 48 برابر کم میکند.
- مدل Inpaint U-Net
- 9 کانال ورودی. متغیر نهان نویزی 4، تصویر کدگذاریشده 4، ماسک 1.
- مقدار t/T در SDEdit
- مقدار 0.3 شبیه مبدا. 0.6 حفظ ساختار کلی. 0.9 نزدیک به نویز.
- کانوولوشن صفر
- کنترلنت به صورت همانی شروع میشود. قبل از آموزش آسیبی نمیزند.
مقایسه روشهای ویرایش تصویر
مقایسه| عامل | مدل اینپینت | SDEdit یا img2img | InstructPix2Pix | RePaint |
|---|---|---|---|---|
| ورودی | تصویر، ماسک، پرامپت | تصویر، سطح نویز، پرامپت | تصویر و دستورالعمل | تصویر و ماسک |
| آموزش | مدل 9-کاناله U-Net | ندارد | فاینتیون روی سهگانهها | ندارد، مدل نامشروط |
| حفظ میکند | پیکسلهای بیرون ماسک | ساختار کلی | ساختار ورودی | پیکسلهای بیرون ماسک |
| تنظیم اصلی | ماسک و CFG | t/T یا strength | مقیاس تصویر و مقیاس متن | گامهای بازنمونهگیری |
| کاربرد | حذف شیء، جایگزینی آسمان | استایل یک ناحیه | «غروبش کن» | عدم دسترسی به مدل اینپینت |
مقایسه ابزارهای شرطیسازی
مقایسه| عامل | کنترلنت | LoRA | آیپی آداپتور | DreamBooth |
|---|---|---|---|---|
| کنترلها | ساختار مکانی | استایل، سوژه، مفهوم | ظاهر یک تصویر مرجع | یک سوژه خاص |
| اندازه | 70-360MB | 20-200MB | 20MB | 2-5GB |
| سازوکار | انکودر کلونشده، اتصالات میانبر صفر | دلتای کمرتبه روی اتنشن | توکنهای تصویر CLIP در کراساتنشن | فاینتیون کامل |
| کاربرد در شرایط | چیدمان یا ترکیببندی دقیق | شخصیسازی یا استایل | نبود کلمات مناسب برای توصیف ظاهر | شباهت قطعی هویت، توان پردازشی بالا |
پیشفرضها
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
guidance_scale | 7.5 | مقیاس پیشفرض CFG در SD |
num_inference_steps | 25 | با DPM-Solver++ |
img2img `strength` | 0.6 | 0.5 تا 0.7 برای انتقال استایل |
Prompt drop in CFG training | 10% | تولید branch نامشروط |
VAE scale factor | 0.18215 | SDXL از 0.13025 استفاده میکند |
LoRA rank `r` | 4-16 | 64-128 برای فاینتیون سنگین |
Sum of ControlNet weights | 1.0 | پیشفرض امن |
Mask dilation in pixels | 8-16 | درزها را پنهان میکند |
عیبیابی
عیبیابیخروجی دفرمه یا دارای استایل بیش از حد
- علت
- مقدار α در LoRA روی 2 یا 3
- راهحل
- حفظ α در 1.5 یا کمتر
اثر شدید ترکیب ژست و عمق
- علت
- دو کنترلنت با وزن 1.0
- راهحل
- تنظیم مجموع وزنها روی 1.0
عدم تاثیر LoRA
- علت
- استفاده از LoRA مدل SDXL روی SD 1.5
- راهحل
- تطبیق با مدل پایه
عدم امکان بارگذاری LoRA جدید
- علت
- تثبیت شدن با
fuse_lora - راهحل
- ابتدا اجرای
pipe.unfuse_lora()
درزهای مشهود در لبههای ماسک
- علت
- تزریق مجدد ساده
- راهحل
- بزرگتر کردن ماسک یا استفاده از مدل 9-کاناله
پچ اشباعشده
- علت
- مقدار CFG بالا روی ماسک کوچک
- راهحل
- کاهش CFG برای ویرایشهای کوچک
سوژه هویت خود را از دست میدهد
- علت
t/Tدر SDEdit بین 0.5 تا 0.6- راهحل
- تست مقادیر مختلف و ذخیره چکپوینت
ناحیهی پرشده، صحنه را نادیده میگیرد
- علت
- پرامپت فقط محتوای جدید را نام میبرد
- راهحل
- توصیف کل تصویر در پرامپت
چه زمانی از چه ابزاری استفاده کنیم
نکتهها- ControlNet-Openpose + SDXL + متن: ژست مشخص همراه با پرامپت.
- ControlNet-Scribble یا ControlNet-Canny: چیدمان کاملاً دقیق.
- LoRA با حدود 30 تصویر گلچینشده در رتبه 32: استایل هنری یک برند.
- SD-Inpaint یا Flux-Fill: حذف شیء در ماسک کوچک.
- ماسک SAM، سپس SD-Inpaint: تعویض پسزمینه.
- InstructPix2Pix یا Flux-Kontext: ویرایش بر اساس دستور بدون نیاز به ماسک.
- LCM-LoRA: تاخیر زیر 1 ثانیه.
پرسشها
پرسش و پاسخ- چرا مقدار گیت کنترلنت با صفر آغاز میشود؟
- در گام 0، خروجی دقیقاً مشابه مدل پایه است.
- مدلهای LoRA را merge کنیم یا در لحظه جابهجا شوند؟
- در لحظه جابهجا شوند. فرآیند merge 3 تا 5 درصد سریعتر است ولی α و مدل پایه را فریز میکند.
- چرا strength برابر 1.0 ورودی را نادیده میگیرد؟
- نویز کامل اضافه میکند. نتیجه، بازتولید کامل است.
- چرا به جای تزریق مجدد از مدل 9-کاناله استفاده کنیم؟
- مدل بافت و زمینهی اطراف ماسک را میبیند.
- آیا اسکژولر پس از آموزش قابل تعویض است؟
- بله. وضعیت اسکژولر از وزنهای U-Net مجزاست.
- هزینه اضافه کردن یک کنترلنت چقدر است؟
- حدود 1.5 برابر هزینه محاسباتی هر گام به ازای هر کنترلنت فعال.