تخطي إلى المحتوى

عزل كائنات التجزئة

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

مثال لتقسيم كائن معزول

شرح تفصيلي للوصفة

  1. راجع قسم التثبيت السريع لـ Ultralytics للحصول على شرح سريع حول تثبيت المكتبات المطلوبة.


  2. تحميل نموذج وتشغيله predict() دالة (method) على المصدر.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo11n-seg.pt")
    
    # Run inference
    results = model.predict()
    

    لا توجد وسائط تنبؤ؟

    بدون تحديد مصدر، سيتم استخدام صور المثال من المكتبة:

    'ultralytics/assets/bus.jpg'
    'ultralytics/assets/zidane.jpg'
    

    هذا مفيد للاختبار السريع مع predict() دالة (method).

    لمزيد من المعلومات حول نماذج التجزئة، قم بزيارة مهمة التقسيم page. لمعرفة المزيد عن predict() للاطلاع على دالة (method)، انظر وضع التوقع القسم الخاص بالوثائق.


  3. الآن قم بالتكرار على النتائج والخطوط. لسير العمل الذي يريد حفظ صورة في ملف، الصورة المصدر base-name والكشف class-label يتم استرجاعها للاستخدام لاحقًا (اختياري).

    from pathlib import Path
    
    import numpy as np
    
    # (2) Iterate detection results (helpful for multiple images)
    for r in res:
        img = np.copy(r.orig_img)
        img_name = Path(r.path).stem  # source image base-name
    
        # Iterate each object contour (multiple detections)
        for ci, c in enumerate(r):
            # (1) Get detection class name
            label = c.names[c.boxes.cls.tolist().pop()]
    
    1. لمعرفة المزيد حول العمل مع نتائج الكشف، راجع قسم الصناديق لوضع التنبؤ.
    2. لمعرفة المزيد حول predict() نتائج انظر العمل مع النتائج لوضع التنبؤ
    حلقة تكرارية (For-Loop)

    ستكرر الصورة الواحدة الحلقة الأولى مرة واحدة فقط. الصورة الواحدة التي تحتوي على كشف واحد فقط ستكرر كل حلقة مرة واحدة فقط.


  4. ابدأ بإنشاء قناع ثنائي من الصورة المصدر ثم ارسم محيطًا مملوءًا على القناع. سيسمح ذلك بعزل الكائن عن الأجزاء الأخرى من الصورة. مثال من bus.jpg لأحد العناصر المكتشفة person يظهر كائنات الفئة على اليمين.

    صورة قناع ثنائي

    import cv2
    
    # Create binary mask
    b_mask = np.zeros(img.shape[:2], np.uint8)
    
    # (1) Extract contour result
    contour = c.masks.xy.pop()
    # (2) Changing the type
    contour = contour.astype(np.int32)
    # (3) Reshaping
    contour = contour.reshape(-1, 1, 2)
    
    
    # Draw contour onto mask
    _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
    
    1. لمزيد من المعلومات حول c.masks.xy انظر قسم الأقنعة من وضع التوقع.

    2. هنا يتم تحويل القيم إلى np.int32 للتوافق مع drawContours() الدالة من OpenCV.

    3. OpenCV drawContours() تتوقع الدالة أن يكون للمحيطات شكل [N, 1, 2] قم بتوسيع القسم أدناه للحصول على مزيد من التفاصيل.

    توسيع لفهم ما يحدث عند تحديد contour variable.

    - c.masks.xy :: يوفر إحداثيات نقاط محيط القناع بالتنسيق (x, y). لمزيد من التفاصيل، راجع قسم الأقنعة من وضع التوقع. - .pop() :: كـ masks.xy هي قائمة تحتوي على عنصر واحد، ويتم استخراج هذا العنصر باستخدام pop() طريقة. - .astype(np.int32) :: باستخدام masks.xy سيعود بنوع بيانات float32، ولكن هذا لن يكون متوافقًا مع OpenCV. drawContours() ، لذلك سيؤدي هذا إلى تغيير نوع البيانات إلى الدالة int32 للتوافق. - .reshape(-1, 1, 2) :: يعيد تنسيق البيانات إلى الشكل المطلوب لـ [N, 1, 2] حيث N هو عدد نقاط المحيط، مع تمثيل كل نقطة بإدخال واحد 1، ويتكون الإدخال من 2 القيم. إن -1 يشير إلى أن عدد القيم على طول هذا البعد مرن.

    توسيع لشرح drawContours() إعدادات.

    - تغليف contour متغير داخل أقواس مربعة، [contour]، وُجد أنه يُنشئ بشكل فعال قناع المحيط المطلوب أثناء الاختبار. - القيمة -1 محدد لـ drawContours() تخبر المعلمة الدالة برسم جميع الخطوط الكنتورية الموجودة في الصورة. - إن tuple (255, 255, 255) يمثل اللون الأبيض، وهو اللون المطلوب لرسم المحيط في هذا القناع الثنائي. - إضافة cv2.FILLED سيقوم بتلوين جميع وحدات البكسل المحاطة بحدود المحيط بنفس اللون، في هذه الحالة، ستكون جميع وحدات البكسل المحاطة باللون الأبيض. - انظر وثائق OpenCV حول drawContours() لمزيد من المعلومات.


  5. بعد ذلك، هناك خياران لكيفية المضي قدمًا في الصورة من هذه النقطة وخيار لاحق لكل منهما.

    خيارات عزل الأجسام

    مثال

    # Create 3-channel mask
    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    
    # Isolate object with binary mask
    isolated = cv2.bitwise_and(mask3ch, img)
    
    كيف يعمل هذا؟
    • أولاً، يتم تحويل القناع الثنائي أولاً من صورة أحادية القناة إلى صورة ثلاثية القنوات. هذا التحويل ضروري للخطوة اللاحقة حيث يتم دمج القناع والصورة الأصلية. يجب أن تحتوي كلتا الصورتين على نفس عدد القنوات لتكون متوافقة مع عملية المزج.

    • يتم دمج الصورة الأصلية والقناع الثنائي ثلاثي القنوات باستخدام دالة OpenCV bitwise_and(). تحتفظ هذه العملية فقط قيم البكسل الأكبر من الصفر (> 0) من كلتا الصورتين. نظرًا لأن وحدات البكسل الخاصة بالقناع أكبر من الصفر (> 0) فقط داخل منطقة المحيط، تكون وحدات البكسل المتبقية من الصورة الأصلية هي تلك التي تتداخل مع المحيط.

    العزل باستخدام وحدات البكسل السوداء: خيارات فرعية

    صورة بالحجم الكامل

    لا توجد خطوات إضافية مطلوبة إذا تم الاحتفاظ بالصورة بالحجم الكامل.

    مثال لصورة كائن معزول بالحجم الكامل وخلفية سوداء
    مثال للإخراج بالحجم الكامل

    صورة الكائن المقتص

    خطوات إضافية مطلوبة لاقتصاص الصورة لتشمل منطقة الكائن فقط.

    مثال لصورة لجسم معزول تم اقتصاصه بخلفية سوداء

    # (1) Bounding box coordinates
    x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
    # Crop image to object region
    iso_crop = isolated[y1:y2, x1:x2]
    

    1. لمزيد من المعلومات حول نتائج المربع المحيط، راجع قسم المربعات من وضع التنبؤ.
    ماذا يفعل هذا الكود؟
    • في c.boxes.xyxy.cpu().numpy() يسترجع الاستدعاء المربعات المحيطة كمصفوفة NumPy في xyxy التنسيق، حيث xmin, ymin, xmax، و ymax تمثل إحداثيات مستطيل المربع المحيط. انظر قسم الصناديق من وضع التوقع لمزيد من التفاصيل.

    • في squeeze() تعمل العملية على إزالة أي أبعاد غير ضرورية من مصفوفة NumPy، مما يضمن أن يكون لها الشكل المتوقع.

    • تحويل قيم الإحداثيات باستخدام .astype(np.int32) يغير نوع بيانات إحداثيات المربع من float32 إلى int32، مما يجعلها متوافقة لقص الصور باستخدام شرائح الفهرس.

    • أخيرًا، يتم اقتصاص منطقة المربع المحيط من الصورة باستخدام تقطيع الفهرس. يتم تحديد الحدود بواسطة [ymin:ymax, xmin:xmax] إحداثيات المربع المحيط بالكشف.

    # Isolate object with transparent background (when saved as PNG)
    isolated = np.dstack([img, b_mask])
    
    كيف يعمل هذا؟
    • باستخدام NumPy dstack() ستقوم الدالة (تجميع المصفوفات على طول محور العمق) بالاقتران مع القناع الثنائي الذي تم إنشاؤه، بإنشاء صورة بأربع قنوات. يتيح ذلك أن تكون جميع وحدات البكسل خارج محيط الكائن شفافة عند الحفظ كـ PNG ملف.

    العزل باستخدام وحدات البكسل الشفافة: خيارات فرعية

    صورة بالحجم الكامل

    لا توجد خطوات إضافية مطلوبة إذا تم الاحتفاظ بالصورة بالحجم الكامل.

    مثال لصورة كائن معزول بالحجم الكامل بدون خلفية
    مثال للإخراج بالحجم الكامل + خلفية شفافة

    صورة الكائن المقتص

    خطوات إضافية مطلوبة لاقتصاص الصورة لتشمل منطقة الكائن فقط.

    مثال لصورة لجسم معزول تم اقتصاصه بدون خلفية

    # (1) Bounding box coordinates
    x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
    # Crop image to object region
    iso_crop = isolated[y1:y2, x1:x2]
    

    1. لمزيد من المعلومات حول نتائج المربع المحيط، راجع قسم المربعات من وضع التنبؤ.
    ماذا يفعل هذا الكود؟
    • عند استخدام c.boxes.xyxy.cpu().numpy()، يتم إرجاع مربعات الإحاطة كـ NumPy array، باستخدام الـ xyxy تنسيق إحداثيات المربع، والتي تتوافق مع النقاط xmin, ymin, xmax, ymax بالنسبة للمربع المحيط (المستطيل)، انظر. قسم الصناديق من وضع التوقع لمزيد من المعلومات.

    • إضافة squeeze() يضمن إزالة أي أبعاد دخيلة من مصفوفة NumPy.

    • تحويل قيم الإحداثيات باستخدام .astype(np.int32) يغير نوع بيانات إحداثيات المربع من float32 إلى int32 والذي سيكون متوافقًا عند اقتصاص الصورة باستخدام شرائح الفهرس.

    • أخيرًا، يتم اقتصاص منطقة الصورة للمربع المحيط باستخدام تقطيع الفهرس، حيث يتم تعيين الحدود باستخدام [ymin:ymax, xmin:xmax] إحداثيات المربع المحيط بالكشف.

    ماذا لو كنت أريد الكائن الذي تم اقتصاصه بما في ذلك الخلفية؟

    هذه ميزة مدمجة في مكتبة Ultralytics. انظر save_crop وسيطة لـ وسائط الاستدلال لوضع التوقع للحصول على التفاصيل.


  6. الأمر متروك لك تمامًا كمطور لتحديد الخطوة التالية. يتم عرض مثال أساسي لخطوة تالية ممكنة (حفظ الصورة في ملف للاستخدام المستقبلي).

    • ملاحظة: هذه الخطوة اختيارية ويمكن تخطيها إذا لم تكن مطلوبة لحالة الاستخدام المحددة الخاصة بك.
    مثال للخطوة النهائية
    # Save isolated object to file
    _ = cv2.imwrite(f"{img_name}_{label}-{ci}.png", iso_crop)
    
    • في هذا المثال، img_name هو الاسم الأساسي لملف الصورة المصدر، label هو اسم الفئة المكتشفة، و ci هو فهرس اكتشاف الكائنات (في حالة وجود مثيلات متعددة بنفس اسم الفئة).

مثال كامل للتعليمات البرمجية

هنا، يتم دمج جميع الخطوات من القسم السابق في كتلة واحدة من التعليمات البرمجية. للاستخدام المتكرر، سيكون من الأمثل تحديد دالة لتنفيذ بعض أو كل الأوامر الموجودة في for- الحلقات، ولكن هذا تمرين متروك للقارئ.

from pathlib import Path

import cv2
import numpy as np

from ultralytics import YOLO

m = YOLO("yolo11n-seg.pt")  # (4)!
res = m.predict()  # (3)!

# Iterate detection results (5)
for r in res:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem

    # Iterate each object contour (6)
    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]

        b_mask = np.zeros(img.shape[:2], np.uint8)

        # Create contour mask (1)
        contour = c.masks.xy.pop().astype(np.int32).reshape(-1, 1, 2)
        _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

        # Choose one:

        # OPTION-1: Isolate object with black background
        mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
        isolated = cv2.bitwise_and(mask3ch, img)

        # OPTION-2: Isolate object with transparent background (when saved as PNG)
        isolated = np.dstack([img, b_mask])

        # OPTIONAL: detection crop (from either OPT1 or OPT2)
        x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
        iso_crop = isolated[y1:y2, x1:x2]

        # TODO your actions go here (2)
  1. السطر الذي يقوم بتعبئة contour تم تجميعه في سطر واحد هنا، بينما تم تقسيمه إلى أسطر متعددة أعلاه.
  2. الأمر متروك لك لتحديده!
  3. انظر وضع التوقع للحصول على معلومات إضافية.
  4. انظر مهمة التقسيم لمزيد من المعلومات.
  5. تعلم المزيد عن العمل مع النتائج
  6. تعلم المزيد عن نتائج قناع التجزئة (Segmentation Mask Results)

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

كيف يمكنني عزل الكائنات باستخدام Ultralytics YOLO11 لمهام التجزئة؟

لعزل الكائنات باستخدام Ultralytics YOLO11، اتبع الخطوات التالية:

  1. قم بتحميل النموذج وشغل الاستدلال:

    from ultralytics import YOLO
    
    model = YOLO("yolo11n-seg.pt")
    results = model.predict(source="path/to/your/image.jpg")
    
  2. إنشاء قناع ثنائي ورسم خطوط كفافية:

    import cv2
    import numpy as np
    
    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)
    
  3. اعزل الكائن باستخدام القناع الثنائي:

    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)
    

راجع الدليل الموجود على وضع التنبؤ و مهمة التقسيم لمزيد من المعلومات.

ما هي الخيارات المتاحة لحفظ الكائنات المعزولة بعد التقسيم؟

يوفر Ultralytics YOLO11 خيارين رئيسيين لحفظ الكائنات المعزولة:

  1. مع خلفية سوداء:

    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)
    
  2. مع خلفية شفافة:

    isolated = np.dstack([img, b_mask])
    

لمزيد من التفاصيل، قم بزيارة قسم وضع التنبؤ.

كيف يمكنني اقتصاص الكائنات المعزولة إلى مربعات الإحاطة الخاصة بها باستخدام Ultralytics YOLO11؟

لاقتصاص الكائنات المعزولة إلى مربعات الإحاطة الخاصة بها:

  1. استرداد إحداثيات المربع المحيط:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    
  2. اقتطع الصورة المعزولة:

    iso_crop = isolated[y1:y2, x1:x2]
    

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

لماذا يجب عليّ استخدام Ultralytics YOLO11 لعزل الأجسام في مهام التجزئة؟

يوفر Ultralytics YOLO11:

  • عالي السرعة الكشف عن الأجسام وتقسيمها في الوقت الفعلي.
  • إنشاء دقيق لمربعات الإحاطة والأقنعة لعزل دقيق للكائنات.
  • وثائق شاملة وواجهة برمجة تطبيقات سهلة الاستخدام لتطوير فعال.

استكشف فوائد استخدام YOLO في وثائق مهمة التجزئة.

هل يمكنني حفظ الكائنات المعزولة بما في ذلك الخلفية باستخدام Ultralytics YOLO11؟

نعم، هذه ميزة مُدمجة في Ultralytics YOLO11. استخدم save_crop وسيطة في predict() دالة (method). على سبيل المثال:

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

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



📅 تم الإنشاء منذ سنة واحدة ✏️ تم التحديث منذ 22 يومًا

تعليقات