الوحدة 5 — الرسم الداخليّ وتوسيع الإطار
في الوحدة 4 أنتجنا تسع صور جميلة للكرسيّ. لكن على واحدة منها ظهر مسمار قبيح في الذراع الأيسر، وعلى أخرى مصباح صغير غير مرغوب في الخلفيّة. إعادة توليد الصورة كاملة تعني فقدان كلّ ما هو جميل فيها. الحلّ: الرسم داخل قناع (inpainting) الذي يُعدّل المنطقة المحدّدة فقط. ثمّ نستعمل نفس الفكرة عكسيًّا لتوسيع الإطار وإنتاج تنسيق يافطة إعلانيّة من صورة مربّعة.
نموذج مخصّص للرسم داخل قناع
Stable Diffusion الكلا سيكيّ يعمل على الصورة الكاملة. الرسم داخل قناع يستعمل نسخة مُدرَّبة خصّيصًا (مثل stable-diffusion-xl-inpainting) تقبل مدخلًا إضافيًّا: قناع أبيض/أسود يحدّد المنطقة المطلوب تعديلها (أبيض) والمنطقة المُحفَّظة (أسود). النموذج يرى المحيط ويستكمل داخل القناع بما يتناسب.
استعمال النموذج القياسيّ للرسم داخل قناع يعمل، لكنّ الحدود تبقى ظاهرة كخيط رفيع. النموذج المخصّص مُدرَّب على مهمّة الاستكمال بالذات، فيُخفي الوصل بلا أثر يذكر.
import torch
from PIL import Image
from diffusers import StableDiffusionXLInpaintPipeline
pipe_inpaint = StableDiffusionXLInpaintPipeline.from_pretrained(
"diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
image = Image.open("chaise_avec_defaut.png").convert("RGB")
masque = Image.open("masque_bras.png").convert("L") # قناع درجات رماديّ
resultat = pipe_inpaint(
prompt="wooden armrest, smooth walnut finish, no metal parts",
image=image,
mask_image=masque,
strength=0.85,
guidance_scale=7.5,
num_inference_steps=30,
).images[0]
تفصيلة حاسمة: التعليمة تصف ما يجب أن يكون داخل القناع، لا الصورة كلّها. «wooden armrest» فقط، لا «wooden chair in studio». التعليمة العامّة تُشتّت النموذج.
القناع: كيف نصنعه
القناع صورة رماديّة بنفس أبعاد الصورة الأصليّة. البكسل الأبيض (255) يعني «أعِد رسمه»، الأسود (0) يعني «احفظه». الرماديّ المتوسّط يعني «امزج». طرق صنع القناع:
- يدويًّا في محرّر صور (GIMP, Photoshop, Krita): فرشاة بيضاء على طبقة سوداء. الأكثر دقّة، الأبطأ.
- آليًّا بنموذج تجزئة (Segment Anything, SAM): تنقر على المسمار، الآلة تُنتج قناعه تلقائيًّا. الأكثر إنتاجيّة.
- برمجيًّا لأشكال بسيطة: مستطيل، دائرة، متعدّد الأضلاع.
توصية: تلطيف حوافّ القناع (feather أو Gaussian blur بشعاع 5-15 بكسل) لتفادي حدود قاطعة. القناع الحادّ يُنتج خيطًا مرئيًّا حول المنطقة المُعدَّلة.
from PIL import ImageFilter
masque_lisse = masque.filter(ImageFilter.GaussianBlur(radius=8))
تماسك الحوافّ
المشكلة الأشهر في الرسم داخل قناع: الوصل يبان. المنطقة المُعدَّلة تبدو ذات إضاءة مختلفة، أو ملمس مختلف، أو لون مختلف قليلًا. أربع تقنيّات تُقلّل هذا:
- قناع أوسع من المطلوب بقليل (10-20 بكسل إضافيّ). النموذج يرى قطعة أكبر من المحيط فيدمج أفضل.
strengthعالٍ داخل القناع (0.85-0.95). قيمة منخفضة تُبقي أثر المنطقة الأصليّة وتصنع تلوّثًا.- نفس البذرة كالصورة الأصليّة إن كانت متاحة. يُحسّن الاتّساق البصريّ.
- تكرار الرسم مرّتين بقناع مختلف قليلًا: مرّة على المنطقة الأساسيّة، مرّة على حوافّها بـstrength منخفض.
توسيع الإطار (outpainting)
نفس النموذج والفكرة، لكن القناع الآن يُغطّي منطقة خارج الصورة الأصليّة. نأخذ الصورة المربّعة 1024×1024 ونُدخلها في canvas 1920×1024، ونحدّد ما يُضاف يمينًا ويسارًا كقناع أبيض. النموذج يستكمل بشكل متّسق مع ما يراه في المركز.
from PIL import Image
# canvas أوسع
canvas = Image.new("RGB", (1920, 1024), (0, 0, 0))
canvas.paste(image_1024, (448, 0)) # الصورة الأصليّة في المنتصف
# القناع: أبيض على اليمين واليسار، أسود في المنتصف
masque = Image.new("L", (1920, 1024), 255)
masque.paste(0, (448, 0, 448 + 1024, 1024))
التوسيع التدريجيّ أفضل من التوسيع دفعة واحدة. توسيع 200 بكسل، ثمّ 200 أخرى، ثمّ 200 أخرى، يعطي نتيجة أنعم من توسيع 600 بكسل مرّة واحدة. النموذج يخترع أقلّ في كلّ خطوة، فيبق ى متّسقًا مع المرجع.
الخيط الأحمر: يافطة إعلانيّة من الكرسيّ
الهدف: تنسيق 1920×1080 يُظهر الكرسيّ في المركز، مع ظلّ ممتدّ يمينًا ورفّ خشبيّ خفيف يسارًا، لا يوجد أيّ منهما في الصورة الأصليّة. النتيجة صالحة مباشرةً لبانر موقع الويب أو غلاف LinkedIn.
- إصلاح مسمار الذراع (رسم داخل قناع صغير).
- توسيع الإطار من 1024×1024 إلى 1920×1024 (توسيع تدريجيّ ×3).
- قصّ إلى 1920×1080 مع تعديل بسيط بصورة إلى صورة (strength=0.15) لتوحيد الإضاءة.
الوقت الإجماليّ: 3 دقائق على SDXL بـGPU متوسّطة، بلا فتح Photoshop مرّة واحدة.
متى لا نستعمل الرسم داخل قناع
الرسم داخل قناع ممتاز لتعديل صغير في صورة صالحة. ليس مناسبًا لـ:
- تعديل يتجاوز 40% من مساحة الصورة (أفضل: إعادة توليد بصورة إلى صورة).
- تغيير كليّ للأسلوب (رسم داخل قناع يفترض تشابه الأسلوب مع المحيط).
- إضافة عنصر لم يعرفه النموذج (كائن نادر، شعار محدّد). ControlNet في الوحدة القادمة يحلّ هذا.
حين تُعدّل جزءًا في صورة، انتبه لدرجة اللون الإجماليّة. النموذج قد ينتج منطقة صحيحة تشريحيًّا لكن بلون قليل الاختلاف. توحيد اللون النهائيّ يتمّ بعد الرسم داخل قناع بمسار صورة إلى صورة كامل بـstrength=0.1 على الصورة الكاملة.
الخلاصة
- نموذج مخصّص للرسم داخل قناع يُنتج وصلًا غير مرئيّ أفضل من النموذج القياسيّ.
- القناع يُصنع يدويًّا أو بـSAM؛ تلطيف الحوافّ بـGaussian blur ضروريّ لتفادي خيط ظاهر.
- توسيع الإطار = رسم داخل قناع خارج الصورة الأصليّة، تدريجيًّا لتفادي الاختراع الجامح.
- التعليمة داخل الرسم بالقناع تصف ما داخل القناع فقط، لا الصورة كلّها.