فاز 8 · درس 9

اینپینتینگ، اوت‌پینتینگ و ویرایش تصویر با مدل‌های دیفیوژن

نوع
ساختنی
زمان
حدود 75 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 8 · درس 07 (دیفیوژن لیتنت)، فاز 8 · درس 08 (ControlNet و LoRA)
یک بوم نقاشی که بخش مرکزی آن برش خورده و یک بازوی رباتیک با قلم‌مو در حال نقاشی کردن دقیق بافت‌های هماهنگ با بخش‌های دست‌نخورده اطراف است
فهرست مطالب
  1. صورت‌مسئله
  2. مفهوم پایه
  3. روش ساده‌لوحانه (و علت اشتباه بودنش)
  4. مدل اصولی اینپینتینگ
  5. روش SDEdit (منگ و همکاران، 2022) — ویرایش بدون نیاز به آموزش
  6. روش InstructPix2Pix (بروکس و همکاران، 2023)
  7. روش RePaint (لوگمایر و همکاران، 2022)
  8. پیاده‌سازی
  9. گام 1: داده‌های 5 بعدی برای DDPM
  10. گام 2: آموزش نویززدا روی تمام 5 بعد
  11. گام 3: گام معکوسِ آگاه از ماسک در زمان استنتاج
  12. گام 4: اوت‌پینتینگ
  13. دام‌ها و خطاهای رایج
  14. استفاده از ابزارها
  15. خروجی نهایی
  16. تمرین‌ها
  17. اصطلاحات کلیدی
  18. نکته‌ی پروداکشن: پایپ‌لاین‌های ویرایش به تاخیر حساس هستند
  19. برای مطالعه‌ی بیشتر

تولید تصویر از متن هیجان‌انگیز است، اما در بازار کار واقعی و پروژه‌های تجاری، بیش از 70 درصد نیازها به ویرایش دقیق مربوط می‌شود؛ تغییر یک پس‌زمینه، حذف واترمارک، اصلاح دست‌ها یا عریض‌تر کردن کادر بدون به هم خوردن بافت بخش‌های دست‌نخورده. اجرای دوباره‌ی پرامپت از صفر، نور و زاویه‌ی سوژه را عوض می‌کند و کارایی ندارد. اینپینتینگ (Inpainting) و اوت‌پینتینگ (Outpainting) ابزارهای اصلی مهندسی دیفیوژن برای مهار این مسئله هستند.

در این درس ساختار داخلی اینپینتینگ را باز می‌کنیم؛ بررسی می‌کنیم چرا جایگزینی ساده‌ی نویز به ایجاد درزهای زشت در لبه‌ها می‌انجامد و چرا شبکه‌های اصلاح‌شده‌ی 9 کاناله استاندارد شده‌اند. همچنین تکنیک‌های بدون نیاز به آموزش مثل SDEdit، هدایت متنی با InstructPix2Pix و ترکیب پایپ‌لاین با مدل قطعه‌بندی SAM را به شکل کاربردی می‌آموزید.

با توجه به چالش‌های مربوط به سرعت پاسخ در ویرایش تصویر و همچنین هزینه‌ی بالای کارت‌های گرافیک خارجی و ناپایداری دانلود وزن مدل‌ها از بسترهایی چون Hugging Face، نکاتی فنی برای کاهش تاخیر استنتاج (Latency) و بهینه‌سازی بار پردازشی بررسی می‌شود تا اجرای محلی یا ابری سیستم مقرون‌به‌صرفه و پایدار بماند.

تبدیل متن به تصویر (text-to-image) چیزهای تازه خلق می‌کند؛ اینپینتینگ (Inpainting) چیزهای قبلی را اصلاح می‌کند. در محیط‌های پروداکشن، 70% از کارهای درآمدزای حوزه‌ی تصویر به ویرایش مربوط می‌شوند: تعویض پس‌زمینه، حذف لوگو، گسترش بوم، یا بازتولید دست‌ها. اینپینتینگ همان جایی است که مدل دیفیوژن (Diffusion Model) نانش را درمی‌آورد.

صورت‌مسئله

مشتری یک عکس محصول بی‌نقص برایتان می‌فرستد که تابلویی آزاردهنده در پس‌زمینه‌ی آن دیده می‌شود. می‌خواهید تابلو را پاک کنید و بقیه‌ی پیکسل‌ها دست‌نخورده باقی بمانند. نمی‌توانید پروسه‌ی تبدیل متن به تصویر را از صفر اجرا کنید؛ چون رنگ‌ها، نورپردازی و زاویه‌ی محصول تغییر خواهند کرد. شما می‌خواهید فقط ناحیه‌ی ماسک‌شده بازتولید شود و این بازتولید، کانتکست و بافت محیط اطرافش را کاملاً رعایت کند.

این کار همان اینپینتینگ است. گونه‌های مختلف آن:

  • اینپینتینگ (Inpainting): بازتولید بخش‌های درون ماسک و حفظ پیکسل‌های بیرونی.
  • اوت‌پینتینگ (Outpainting): بازتولید بخش‌های خارج از ماسک (یا فراتر از بوم تصویر) و حفظ بخش‌های داخلی.
  • ویرایش تصویر (Image editing): بازتولید کل تصویر با حفظ وفاداری معنایی یا ساختاری به نسخه‌ی اصلی (مثل SDEdit یا InstructPix2Pix).

در سال 2026، تمام پایپ‌لاین‌های دیفیوژن حالتی برای اینپینتینگ دارند: Flux.1-Fill ،Stable Diffusion Inpaint ،SDXL-Inpaint و DALL-E 3 Edit. همه‌ی آن‌ها بر پایه‌ی یک اصل مشترک کار می‌کنند.

مفهوم پایه

Inpainting: mask-aware denoising with context-preserving reinjection

روش ساده‌لوحانه (و علت اشتباه بودنش)

اجرای مدل استاندارد متن به تصویر به همراه یک ماسک. در هر گام از سمپلینگ، ناحیه‌ی بدون ماسک از لیتنت (latent) نویزی را با تصویر تمیزی که با گذر رو به جلو (forward pass) نویز به آن اضافه شده، جایگزین می‌کنید. این کار جواب می‌دهد... اما خیلی بد. در مرزهای ماسک مصنوعات بصری (artifacts) زننده‌ای دیده می‌شود، چون مدل هیچ اطلاعاتی درباره‌ی محتوای درون ناحیه‌ی ماسک‌شده ندارد.

مدل اصولی اینپینتینگ

آموزش یک معماری U-Net اصلاح‌شده که به‌جای 4 کانال ورودی، 9 کانال می‌گیرد:

input = concat([ noisy_latent (4ch), encoded_image (4ch), mask (1ch) ], dim=channel)

کانال‌های اضافی شامل یک کپی از تصویر مبدأ انکودشده با VAE، به‌علاوه‌ی یک ماسک تک‌کاناله هستند. در زمان آموزش، نواحی مختلفی از تصویر را به‌طور تصادفی ماسک می‌کنید و به مدل یاد می‌دهید فقط نویز ناحیه‌ی ماسک‌شده را حذف کند؛ درحالی‌که ناحیه‌ی بدون ماسک به‌عنوان سیگنال شرطی‌سازی (conditioning) تمیز به مدل داده می‌شود. در زمان استنتاج (inference)، مدل می‌تواند اطراف ناحیه‌ی ماسک‌شده را «ببیند» و محتوایی کاملاً هماهنگ تولید کند.

مدل‌های SD-Inpaint ،SDXL-Inpaint و Flux-Fill همگی از این ورودی 9 کاناله (یا ساختار مشابه آن) استفاده می‌کنند؛ مانند StableDiffusionInpaintPipeline و FluxFillPipeline در کتابخانه‌ی Diffusers.

روش SDEdit (منگ و همکاران، 2022) — ویرایش بدون نیاز به آموزش

به تصویر مبدأ تا یک زمان میانی مثل t نویز اضافه کنید، سپس زنجیره‌ی معکوس را با یک پرامپت (Prompt) جدید از همان t تا 0 برگردانید. نیازی به آموزش دوباره نیست. انتخاب نقطه‌ی شروع t، مصالحه‌ای بین وفاداری به طرح اصلی و آزادی عمل خلاقانه است:

  • t/T = 0.3 ← نتیجه تقریباً مشابه تصویر اصلی است؛ تنها تغییرات سبکی جزئی اعمال می‌شود.
  • t/T = 0.6 ← ویرایش‌های متوسط با حفظ ساختار کلی تصویر.
  • t/T = 0.9 ← تصویر تقریباً از دل نویز خالص تولید می‌شود و شباهت بسیار کمی به منبع دارد.

روش InstructPix2Pix (بروکس و همکاران، 2023)

فاین‌تیون مدل دیفیوژن روی سه‌گانه‌های (Triple) (input_image, instruction, output_image). در زمان استنتاج، مدل هم بر اساس تصویر ورودی و هم یک دستور متنی (مثلاً «غروبش کن»، «یک اژدها اضافه کن») شرطی‌سازی می‌شود. در اینجا دو مقیاس CFG داریم: مقیاس تصویر و مقیاس متن.

روش RePaint (لوگمایر و همکاران، 2022)

استفاده از یک مدل دیفیوژن استاندارد بدون شرط. در هر گام معکوس، عمل بازنمونه‌گیری (resample) انجام می‌شود؛ یعنی گاهی به حالت نویزی‌تر قبلی برمی‌گردیم و دوباره تولید می‌کنیم. این کار مانع از ایجاد آرتیفکت‌های مرزی در حاشیه‌ها می‌شود؛ مناسب برای زمان‌هایی که مدل آموزش‌دیده‌ی اینپینتینگ در اختیار ندارید.

اینپینتینگحذف نویز داخل ماسک، ثابت نگه‌داشتن بقیه
INPAINTINGInpainting denoises only the masked region while re-injecting the known pixels at every step so the boundary stays consistent. The marching dashes are the mask edge; inside it the noise resolves into new content, while the surrounding context is held fixed and pixel-identical.بافت حفظ‌شده (تزریق مجدد در هر گام)بازتولید فقط در این بخشحذف نویزدرونماسک
اینپینتینگ فقط نویز ناحیه ماسک‌شده را حذف می‌کند و هم‌زمان پیکسل‌های معلوم را در هر گام دوباره تزریق می‌نماید تا مرزها یکپارچه بمانند. خط‌چین‌های متحرک لبه ماسک هستند؛ نویز درون آن به محتوای جدید تبدیل می‌شود، در حالی که بافت پیرامون ثابت و از نظر پیکسلی دست‌نخورده باقی می‌ماند.

پیاده‌سازی

فایل code/main.py یک طرح اینپینتینگ ساده‌ی یک‌بعدی را روی داده‌های 5 بعدی پیاده می‌کند. یک مدل DDPM را روی داده‌های آمیخته‌ی 5 بعدی آموزش می‌دهیم؛ به‌طوری‌که هر نمونه شامل 5 عدد اعشاری از یکی از دو خوشه‌ی موجود است. در زمان استنتاج، 2 بعد از این 5 بعد را «ماسک» می‌کنیم، نسخه‌ی نویزیِ رو به جلوی 3 بعد دیگر را در هر گام تزریق می‌کنیم و فقط ابعاد ماسک‌شده را بازتولید می‌نماییم.

گام 1: داده‌های 5 بعدی برای DDPM

def sample_data(rng):
    cluster = rng.choice([0, 1])
    center = [-1.0] * 5 if cluster == 0 else [1.0] * 5
    return [c + rng.gauss(0, 0.2) for c in center], cluster

گام 2: آموزش نویززدا روی تمام 5 بعد

یک DDPM استاندارد. شبکه برای ورودی نویزی 5 بعدی، پیش‌بینی نویز 5 بعدی خروجی می‌دهد.

گام 3: گام معکوسِ آگاه از ماسک در زمان استنتاج

def inpaint_step(x_t, mask, clean_image, alpha_bars, t, rng):
    # جایگزینی ابعاد ناماسک با نسخه نویزی‌شده جدید از منبع تمیز
    a_bar = alpha_bars[t]
    for i in range(len(x_t)):
        if not mask[i]:
            x_t[i] = math.sqrt(a_bar) * clean_image[i] + math.sqrt(1 - a_bar) * rng.gauss(0, 1)
    # ...سپس اجرای گام معکوس عادی روی x_t

این همان روش ساده‌لوحانه است که روی داده‌های مصنوعی یک‌بعدی جواب می‌دهد. اما در اینپینتینگ واقعی تصاویر، از ورودی 9 کاناله استفاده می‌کنیم چون یکدستی بافت‌ها اهمیت بسیار بیشتری دارد.

گام 4: اوت‌پینتینگ

اوت‌پینتینگ در واقع همان اینپینتینگ با ماسک معکوس است: فضای جدید بوم (که قبلاً وجود نداشت) ماسک می‌شود و بقیه‌ی بخش‌ها با تصویر اصلی پر می‌شوند. هدف آموزشی هر دو فرآیند کاملاً یکسان است.

دام‌ها و خطاهای رایج

  • درزها و خطوط مرزی (Seams): روش ساده‌لوحانه مرزهای واضحی برجا می‌گذارد؛ زیرا اطلاعات گرادیان (gradient) از لبه‌های ماسک عبور نمی‌کند. راه‌حل: اندازه‌ی ماسک را 8 تا 16 پیکسل بازتر کنید (dilate) یا از یک مدل اینپینتینگ اصولی بهره ببرید.
  • نشت ماسک (Mask leakage): اگر بخش ناماسکِ تصویر شرطی‌ساز کیفیت پایینی داشته باشد یا نویزی باشد، بازتولید درون ماسک را هم آلوده می‌کند. این بخش‌ها را کمی نویززدایی یا تار (blur) کنید.
  • تداخل CFG با اندازه‌ی ماسک: مقدار بالای CFG روی یک ماسک کوچک = ایجاد تکه‌ای اشباع‌شده با رنگ‌های تند. برای ویرایش‌های کوچک، مقدار CFG را پایین بیاورید.
  • افت ناگهانی وفاداری در SDEdit: جابه‌جایی از t/T = 0.5 به t/T = 0.6 ممکن است هویت سوژه را به کلی نابود کند. بازه‌های مختلف را بیازمایید و چک‌پوینت (Checkpoint) ذخیره کنید.
  • ناهماهنگی پرامپت: پرامپت باید کل صحنه را توصیف کند، نه فقط محتوای بخش اضافه‌شونده را. بگویید «گربه‌ای که روی صندلی نشسته»، نه صرفاً «یک گربه».

استفاده از ابزارها

کاربری پایپ‌لاین
حذف شیء، ماسک کوچک SD-Inpaint یا Flux-Fill با پرامپت استاندارد
تعویض آسمان SD-Inpaint به همراه «blue sky at sunset»
گسترش بوم حالت outpaint در SDXL (با محو کردن لبه در حدود 8 پیکسل) یا Flux-Fill با ماسک اوت‌پینت
بازتولید دست یا چهره SD-Inpaint به همراه پرامپتی که سوژه را بازتعریف کند + ControlNet-Openpose
تغییر سبک یک ناحیه SDEdit با t/T=0.5 روی بخش ماسک‌شده
«غروبش کن» InstructPix2Pix یا Flux-Kontext
تعویض پس‌زمینه ماسک SAM ← مدل SD-Inpaint
وفاداری فوق‌العاده بالا Flux-Fill یا GPT-Image (میزبانی‌شده) برای سخت‌ترین نمونه‌ها

ترکیب SAM (مدل Segment Anything شرکت متا، 2023) با اینپینتینگ دیفیوژن، پایپ‌لاین استاندارد حذف پس‌زمینه در سال 2026 است. نسخه‌ی SAM 2 (2024) برای ویدیو نیز کاربرد دارد.

خروجی نهایی

سند مهارت را در outputs/skill-editing-pipeline.md ذخیره کنید. این مهارت تصویر اصلی + شرح ویرایش + ماسک اختیاری (یا پرامپت SAM) را دریافت کرده و این موارد را تحویل می‌دهد: روش تولید ماسک، مدل پایه، مقادیر مقیاس‌های CFG (برای تصویر و متن)، تعیین مقدار t در SDEdit یا انتخاب حالت اینپینتینگ، و یک چک‌لیست تضمین کیفیت (QA).

تمرین‌ها

  1. ساده. در code/main.py، سهم ابعاد ماسک‌شده را از 0.2 تا 0.8 تغییر دهید. در چه نسبتی، کیفیت اینپینت (باقیمانده‌ی تفاضل در ابعاد ماسک‌شده) با کیفیت تولید غیرشرطی برابر می‌شود؟
  2. متوسط. الگوریتم RePaint را پیاده‌سازی کنید: در هر 10 گام از فرآیند معکوس، 5 گام به عقب بپرید (نویز اضافه کنید) و سپس دوباره نویززدایی کنید. بررسی کنید که آیا این کار خطوط باقیمانده در مرز ماسک را کاهش می‌دهد یا خیر.
  3. سخت. با استفاده از diffusers در Hugging Face مقایسه‌ای انجام دهید: ترکیب SD 1.5 Inpaint + ControlNet-Openpose در برابر Flux.1-Fill روی 20 تسک بازتولید چهره. تبعیت از حالت بدنی (pose) و حفظ هویت چهره را به‌طور مجزا امتیازدهی کنید.

اصطلاحات کلیدی

اصطلاح در گفتار عامیانه معنای دقیق فنی
Inpainting «پر کردن سوراخ» بازتولید بخش‌های داخل ماسک و حفظ پیکسل‌های خارجی.
Outpainting «بزرگ کردن کادر» بازتولید بیرون بوم تصویر و حفظ بخش‌های داخلی.
9-channel U-Net «مدل اینپینتینگ درست‌وحسابی» شبکه‌ی U-Net با ورودی noisy | encoded-source | mask.
SDEdit «Img2img با تعیین سطح نویز» نویز زدن تا زمان مشخص t و سپس نویززدایی با پرامپت تازه.
InstructPix2Pix «ویرایش فقط با متن» مدل دیفیوژن فاین‌تیون‌شده روی سه‌گانه‌های (تصویر، دستور متنی، خروجی).
RePaint «بدون نیاز به آموزش دوباره» نویز زدن دوره‌ای در طول فرآیند معکوس برای از بین بردن مرزهای ماسک.
SAM «Segment Anything» ابزار تولید ماسک با کلیک یا کادر مستطیلی؛ مکمل اینپینتینگ.
Flux-Kontext «ویرایش متنی بر اساس کانتکست» نسخه‌ای از مدل Flux که تصویر مرجع و دستور متنی را برای اعمال ویرایش دریافت می‌کند.

نکته‌ی پروداکشن: پایپ‌لاین‌های ویرایش به تاخیر حساس هستند

کاربرانی که تصویری را ویرایش می‌کنند انتظار پاسخی زیر 5 ثانیه دارند. اجرای 30 گام از SDXL-Inpaint در ابعاد 1024² روی کارت گرافیک L4 حدود 3 تا 4 ثانیه زمان می‌برد؛ به این زمان، تولید ماسک با SAM (حدود 200 میلی‌ثانیه) و انکود/دیکود با VAE (مجموعاً حدود 500 میلی‌ثانیه) را هم اضافه کنید. از منظر پروداکشن، این سناریو به‌جای نرخ پردازش (Throughput)، محدود به تاخیر اولین توکن یا خروجی (TTFT-bound) است: یعنی بچ‌سایز 1، همروندی کم و ضرورت بهینه‌سازی موشکافانه‌ی هر مرحله:

  • مدل SAM-H کندترین بخش است. اجرای SAM-H در ابعاد 1024² حدود 200 میلی‌ثانیه طول می‌کشد؛ درحالی‌که SAM-ViT-B با افت کیفیتی بسیار ناچیز، در حدود 40 میلی‌ثانیه اجرا می‌شود. مدل SAM 2 (نسخه‌ی ویدیویی) اورهد زمانی ایجاد می‌کند؛ برای ویرایش تک‌تصویر سراغ آن نروید.
  • تا جای ممکن از انکود کردن مجدد بپرهیزید. متد pipe.image_processor.preprocess(img) تصویر را به لیتنت‌ها انکود می‌کند. اگر لیتنت‌های مراحل قبلی را در اختیار دارید (که در رابط‌های ویرایش تعاملی کاملاً طبیعی است)، آن‌ها را مستقیماً از طریق latents=... بفرستید تا یک مرحله انکود VAE حذف شود.
  • گسترش ماسک روی نرخ پردازش هم تاثیرگذار است. وقتی ماسک بسیار کوچک باشد، بخش اعظم گذر رو به جلوی مدل U-Net هدر می‌رود (چون پیکسل‌های خارج از ماسک در نهایت بازنویسی می‌شوند). پایپ‌لاین StableDiffusionInpaintPipeline در diffusers کل شبکه‌ی U-Net را بدون توجه به این موضوع اجرا می‌کند؛ تنها گونه‌های اصولی 9 کاناله اینپینتینگ می‌توانند محاسبات را برای نواحی ماسک‌شده محدود و بهینه کنند.
  • مدل Flux-Kontext پاسخ سال 2025 است. یک گذر رو به جلوی تکی روی (source_image, instruction)؛ بدون نیاز به ماسک مجزا یا جست‌وجوی مقدار نویز در SDEdit. این مدل روی سرور H100 فرایند ویرایش را در حدود 1.5 ثانیه تحویل می‌دهد. درس معماری: مراحل مختلف را در هم ادغام کنید.

برای مطالعه‌ی بیشتر

سؤالات متداول

چرا مدل ساده‌لوحانه‌ی اینپینتینگ در لبه‌های ماسک خط مرزی (درز) می‌اندازد؟

چون اطلاعات گرادیان بین ناحیه‌ی ماسک‌شده و بدون ماسک ردوبدل نمی‌شود و مدل هیچ پیش‌زمینه‌ای از محتوای درون ماسک ندارد. برای حل این مشکل ماسک را 8 تا 16 پیکسل منبسط (dilate) می‌کنند یا از معماری‌های 9 کاناله استفاده می‌شود.

ورودی 9 کاناله در شبکه‌ی U-Net اینپینتینگ شامل چیست؟

این ورودی شامل 4 کانال لیتنت نویزی، 4 کانال نسخه‌ی انکودشده با VAE از تصویر دست‌نخورده، و 1 کانال ماسک باینری برای تعیین موقعیت بازتولید است.

تفاوت SDEdit با اینپینتینگ بر پایه‌ی ماسک چیست؟

روش SDEdit نیازی به آموزش معماری جدید ندارد؛ تصویر اصلی تا یک زمان مشخص t نویزی می‌شود و سپس با پرامپت جدید نویززدایی می‌گردد. درحالی‌که اینپینتینگ پیکسل‌های بیرون ماسک را کاملاً ثابت نگه می‌دارد و فقط درون ماسک را بازتولید می‌کند.

چگونه تاخیر پایپ‌لاین ویرایش تصویر در پروداکشن را کم کنیم؟

استفاده از مدل سبک‌تر SAM-ViT-B به‌جای SAM-H، بازاستفاده از لیتنت‌های مراحل قبلی برای حذف مرحله‌ی انکود VAE، و به‌کارگیری مدل‌های جدیدتر تک‌مرحله‌ای مثل Flux-Kontext.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.