تولید تصویر از متن هیجانانگیز است، اما در بازار کار واقعی و پروژههای تجاری، بیش از 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. همهی آنها بر پایهی یک اصل مشترک کار میکنند.
مفهوم پایه
روش سادهلوحانه (و علت اشتباه بودنش)
اجرای مدل استاندارد متن به تصویر به همراه یک ماسک. در هر گام از سمپلینگ، ناحیهی بدون ماسک از لیتنت (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) انجام میشود؛ یعنی گاهی به حالت نویزیتر قبلی برمیگردیم و دوباره تولید میکنیم. این کار مانع از ایجاد آرتیفکتهای مرزی در حاشیهها میشود؛ مناسب برای زمانهایی که مدل آموزشدیدهی اینپینتینگ در اختیار ندارید.
پیادهسازی
فایل 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).
تمرینها
- ساده. در
code/main.py، سهم ابعاد ماسکشده را از 0.2 تا 0.8 تغییر دهید. در چه نسبتی، کیفیت اینپینت (باقیماندهی تفاضل در ابعاد ماسکشده) با کیفیت تولید غیرشرطی برابر میشود؟ - متوسط. الگوریتم RePaint را پیادهسازی کنید: در هر 10 گام از فرآیند معکوس، 5 گام به عقب بپرید (نویز اضافه کنید) و سپس دوباره نویززدایی کنید. بررسی کنید که آیا این کار خطوط باقیمانده در مرز ماسک را کاهش میدهد یا خیر.
- سخت. با استفاده از 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 ثانیه تحویل میدهد. درس معماری: مراحل مختلف را در هم ادغام کنید.
برای مطالعهی بیشتر
- Lugmayr et al. (2022). RePaint: Inpainting using Denoising Diffusion Probabilistic Models — اینپینتینگ بدون نیاز به آموزش.
- Meng et al. (2022). SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations — مقالهی SDEdit.
- Brooks, Holynski, Efros (2023). InstructPix2Pix — ویرایش با دستورات متنی.
- Kirillov et al. (2023). Segment Anything — معرفی SAM، منبع تولید ماسک.
- Ravi et al. (2024). SAM 2: Segment Anything in Images and Videos — نسخهی ویدیویی SAM.
- Hertz et al. (2022). Prompt-to-Prompt Image Editing with Cross-Attention Control — ویرایش تصویر در سطح اتنشن (Attention).
- Black Forest Labs (2024). Flux.1-Fill and Flux.1-Kontext — ابزارهای سال 2024.
