رؤية YOLO 2026:

كيفية عزل كائنات التجزئة باستخدام Ultralytics YOLO#

تنتج تجزئة المثيل قناعاً بدقة البكسل لكل كائن مكتشف، مما يعني أنه يمكنك فصل كل كائن عن الصورة بمفرده. يوضح هذا الدليل كيفية تحويل نتائج تجزئة Ultralytics YOLO إلى كائنات معزولة باستخدام وضع التنبؤ و OpenCV، إما بخلفية سوداء صلبة أو بخلفية شفافة للحفظ بتنسيق PNG.



Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀

لماذا نقوم بعزل كائنات التجزئة؟#

سحب الكائنات الفردية من الصورة يفتح مجموعة من سير العمل اللاحقة:

  • إزالة الخلفية لصور المنتجات، أو الكتالوجات، أو التعديل الإبداعي.
  • اقتصاص الكائن (Per-object crops) لبناء مجموعات بيانات التصنيف من اكتشافاتك.
  • المعالجة المركزة بحيث ترى الخطوات اللاحقة مثل التعرف الضوئي على الحروف (OCR)، أو تحليل الألوان، أو القياس الكائن فقط، وليس المشهد المحيط.
  • تصدير PNG شفاف لتركيب الكائنات فوق خلفيات جديدة.

تعمل هذه الوصفة مع أي نموذج تجزئة Ultralytics YOLO وتتبع أربع مراحل: تشغيل الاستدلالاستخراج كل محيطعزل الكائنحفظ النتيجة.

تشغيل استدلال التجزئة#

قم بتثبيت المكتبات المطلوبة، ثم تحميل نموذج تجزئة (لاحقة -seg، المطلوبة لإنتاج الأقنعة) وتشغيل التنبؤ على صورة المصدر الخاصة بك:

from ultralytics import YOLO

# Load a segmentation model
model = YOLO("yolo26n-seg.pt")

# Run inference on a source
results = model.predict(source="path/to/image.jpg")
لا يوجد مصدر؟ يستخدم YOLO صور العينة المرفقة

إذا قمت باستدعاء model.predict() بدون source، فإن Ultralytics يعود إلى صور الأمثلة المضمنة مع الحزمة (bus.jpg و zidane.jpg)، وهو أمر مفيد للاختبار السريع لسير العمل.

استخراج محيطات الكائنات#

يقابل كل عنصر في results صورة واحدة، ويؤدي التكرار عبر النتيجة إلى إرجاع اكتشاف واحد في كل مرة. لكل اكتشاف، قم بنسخ الصورة الأصلية، وقراءة تسمية الفئة، وارسم محيط قناع الكائن على قناع ثنائي فارغ. تحدد المنطقة البيضاء من هذا القناع بدقة البكسلات التي تنتمي إلى الكائن.

تعمل المقاطع البرمجية في هذا القسم والقسم التالي داخل حلقية الاكتشاف أدناه؛ النص البرمجى الكامل القابل للنسخ واللصق موجود في مثال كامل.

Binary Mask Image{ width="240", align="right" }

from pathlib import Path

import cv2
import numpy as np

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem  # source image base-name

    # Iterate each detected object in the image
    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]  # class name

        # Build a binary mask and draw the object contour onto it
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
ماذا تفعل `c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)`؟
  • يقوم c.masks.xy[0] بإرجاع محيط القناع كإحداثيات نقطية (x, y) للكائن في نتيجة الاكتشاف الفردي هذه.
  • يقوم .astype(np.int32) بتحويل النقاط من float32، والتي لا يقبلها drawContours() الخاص بـ OpenCV.
  • يعيد .reshape(-1, 1, 2) تشكيل النقاط في تخطيط [N, 1, 2] الذي يتوقعه drawContours()، حيث N هو عدد نقاط المحيط.

تمرير [contour] مع الفهرس -1 يرسم جميع نقاط المحيط المقدم، ويقوم cv2.FILLED بملء كل بكسل محاط باللون الأبيض.

عزل الكائن#

مع جاهزية القناع الثنائي، ادمجه مع الصورة الأصلية. هناك أسلوبان شائعان، اعتمادًا على ما تريده للخلفية:

اختر أسلوب العزل

قم بتحويل القناع إلى ثلاث قنوات واحتفظ فقط بالبكسلات التي تتداخل مع الكائن. يصبح كل شيء خارج المحيط أسود:

# Isolate object with a black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
![Example Full size Isolated Object Image Black Background](https://cdn.ul.run/i/effd6d59c803d824cbef6fa60236addd.avif){ width=240 }
Full-size object on a black background
الاقتصاص إلى مربع الإحاطة

للاحتفاظ فقط بمنطقة الكائن بدلاً من الصورة بالحجم الكامل، قم بقصها إلى مربع الإحاطة (bounding box) الخاص بالاكتشاف:

# Bounding box coordinates
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
# Crop the isolated image to the object region
iso_crop = isolated[y1:y2, x1:x2]
![Example Crop Isolated Object Image Black Background](https://cdn.ul.run/i/8819942788c1d27de1178b97864cd17a.avif){ width=240 }
Object cropped to its bounding box
هل تحتاج إلى الاقتصاص مع خلفيته الأصلية؟

هذا مدمج بشكل أساسي. قم بتمرير save_crop=True إلى predict() وستقوم Ultralytics بحفظ اقتصاصات مربعات الإحاطة تلقائياً دون الحاجة إلى قناع.

حفظ النتيجة (اختياري)#

ما تفعله بكل كائن معزول يعود إليك. الخطوة التالية الشائعة هي الكتابة على القرص لاستخدامها لاحقًا:

# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

هنا img_name هو جذع صورة المصدر، و label هو اسم الفئة، و ci هو فهرس الاكتشاف، لذا تحصل المثيلات المتعددة لنفس الفئة على أسماء ملفات فريدة. استبدل isolated بـ iso_crop إذا قمت تطبيق الاقتصاص الاختياري أعلاه.

مثال كامل#

يجمع البرنامج النصي أدناه كل خطوة في كتلة واحدة قابلة للتنفيذ. يستخدم خلفية سوداء بشكل افتراضي؛ قم بتبديل السطر المميز المفرد إلى np.dstack([img, b_mask]) لملف PNG شفاف بدلاً من ذلك:

from pathlib import Path

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/image.jpg")

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem

    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]

        # Build a binary mask from the object contour
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

        # Isolate the object (black background)
        mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
        isolated = cv2.bitwise_and(mask3ch, img)  # transparent PNG: isolated = np.dstack([img, b_mask])

        # Save or add your custom post-processing here
        cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

        # Optional: crop to the bounding box before saving
        # x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
        # cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated[y1:y2, x1:x2])

للاستخدام المتكرر، قم بلف نص الحلقة في دالة حتى تتمكن من استدعائها عبر العديد من الصور.

الخلاصة#

لديك الآن وصفة كاملة لعزل الكائنات المجزأة باستخدام Ultralytics YOLO: تشغيل الاستدلال، وبناء قناع ثنائي من كل محيط، ثم استخراج الكائن على خلفية سوداء أو شفافة واقتصاصه اختيارياً إلى مربع الإحاطة الخاص به. استكشف وثائق مهمة التجزئة و وضع التنبؤ الكاملة لتكييف سير العمل مع فئاتك الخاصة.

الأسئلة الشائعة#

  • قم بتحميل نموذج تجزئة، وقم بتشغيل الاستدلال، وابنِ قناعًا ثنائيًا من محيط كل اكتشاف، واجمعه مع الصورة الأصلية:

    import cv2
    import numpy as np
    
    from ultralytics import YOLO
    
    model = YOLO("yolo26n-seg.pt")
    results = model.predict(source="path/to/your/image.jpg")
    
    img = np.copy(results[0].orig_img)
    b_mask = np.zeros(img.shape[:2], np.uint8)
    contour = results[0].masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
    cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
    
    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)

    راجع المثال الكامل لمعرفة حلقتي الاكتشاف الفردي الكاملة.

  • هناك أسلوبان رئيسيان. بالنسبة إلى خلفية سوداء، قم بتحويل القناع إلى ثلاث قنوات واستخدام cv2.bitwise_and(). بالنسبة إلى خلفية شفافة (عند الحفظ بتنسيق PNG)، قم بتكديس القناع كقناة ألفا رابعة باستخدام np.dstack([img, b_mask]). يتم عرض كلاهما في عزل الكائن.

  • اقرأ إحداثيات مربع الإحاطة من الاكتشاف وقم بقص الصورة المعزولة:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    iso_crop = isolated[y1:y2, x1:x2]

    تعرف على المزيد حول نتائج مربع الإحاطة في وثائق وضع التنبؤ.

  • يوفر Ultralytics YOLO تجزئة مثيلية سريعة وفي الوقت الفعلي مع توليد دقيق للأقنعة ومربعات الإحاطة، بالإضافة إلى واجهة برمجة تطبيقات (API) بسيطة بلغة Python تحول نتائج الاستدلال إلى كائنات معزولة في بضعة أسطر من كود OpenCV.

  • نعم. استخدم وسيطة save_crop في predict() لحفظ اقتصاصات مربعات الإحاطة مع خلفيتها الأصلية:

    results = model.predict(source="path/to/your/image.jpg", save_crop=True)

    اقرأ المزيد في قسم وسائط استدلال وضع التنبؤ.

التعليقات