Ultralytics YOLO27:

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

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



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

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

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

  • إزالة الخلفية لصور المنتجات أو الكتالوجات أو التحرير الإبداعي.
  • قصاصات لكل كائن لإنشاء مجموعات بيانات التصنيف من الكائنات المكتشفة.
  • المعالجة المركّزة بحيث ترى الخطوات اللاحقة، مثل 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
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
Full-size object on a black background
القص إلى المربع المحيط

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

# 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
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 تجزئة مثيلات سريعة وفورية مع إنشاء دقيق للأقنعة والمربعات المحيطة، بالإضافة إلى واجهة Python API بسيطة تحوّل نتائج الاستدلال إلى كائنات معزولة عبر بضعة أسطر من تعليمات OpenCV البرمجية.

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

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

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

التعليقات