Meet YOLO26: next-gen vision AI.

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

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



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

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

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

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

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

Link to this sectionتشغيل استدلال التجزئة#

قم بتثبيت المكتبات المطلوبة، ثم قم بتحميل نموذج تجزئة (اللاحقة -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)، وهو أمر مفيد لاختبار سير العمل بسرعة.

Link to this sectionاستخراج محيطات الكائنات#

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

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

صورة القناع الثنائي{ 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 تملأ كل بكسل محصور باللون الأبيض.

Link to this sectionعزل الكائن#

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

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

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

# 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.jsdelivr.net/gh/ultralytics/assets@main/docs/full-size-isolated-object-black-background.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.jsdelivr.net/gh/ultralytics/assets@main/docs/example-crop-isolated-object-image-black-background.avif){ width=240 }
Object cropped to its bounding box
هل تحتاج إلى الاقتصاص مع خلفيته الأصلية؟

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

Link to this sectionحفظ النتيجة (اختياري)#

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

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

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

Link to this sectionمثال كامل#

يجمع البرنامج النصي أدناه كل خطوة في كتلة واحدة قابلة للتشغيل. يستخدم خلفية سوداء بشكل افتراضي؛ بدّل السطر المميز المفرد إلى 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])

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

Link to this sectionالخلاصة#

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

Link to this sectionالأسئلة الشائعة#

Link to this sectionكيف يمكنني عزل الكائنات باستخدام 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)

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

Link to this sectionما هي الخيارات المتاحة لحفظ الكائنات المعزولة بعد التجزئة؟#

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

Link to this sectionكيف يمكنني اقتصاص الكائنات المعزولة إلى مربعات الإحاطة الخاصة بها؟#

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

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

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

Link to this sectionلماذا يجب أن أستخدم Ultralytics YOLO لعزل الكائنات في مهام التجزئة؟#

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

Link to this sectionهل يمكنني حفظ الكائنات المعزولة بما في ذلك الخلفية باستخدام Ultralytics YOLO؟#

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

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

اقرأ المزيد في قسم معاملات استدلال وضع التنبؤ (Predict Mode Inference Arguments).

التعليقات