عزل كائنات التجزئة
بعد إجراء مهمة التجزئة، من المستحسن أحيانًا استخراج الكائنات المعزولة من نتائج الاستدلال. يقدم هذا الدليل وصفة عامة حول كيفية تحقيق ذلك باستخدام وضع التنبؤ الخاص بـ Ultralytics.
شرح تفصيلي للوصفة
-
راجع قسم التثبيت السريع لـ Ultralytics للحصول على شرح سريع حول تثبيت المكتبات المطلوبة.
-
تحميل نموذج وتشغيله
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)، انظر وضع التوقع القسم الخاص بالوثائق.
-
الآن قم بالتكرار على النتائج والخطوط. لسير العمل الذي يريد حفظ صورة في ملف، الصورة المصدر
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()]
- لمعرفة المزيد حول العمل مع نتائج الكشف، راجع قسم الصناديق لوضع التنبؤ.
- لمعرفة المزيد حول
predict()
نتائج انظر العمل مع النتائج لوضع التنبؤ
حلقة تكرارية (For-Loop)
ستكرر الصورة الواحدة الحلقة الأولى مرة واحدة فقط. الصورة الواحدة التي تحتوي على كشف واحد فقط ستكرر كل حلقة مرة واحدة فقط.
-
ابدأ بإنشاء قناع ثنائي من الصورة المصدر ثم ارسم محيطًا مملوءًا على القناع. سيسمح ذلك بعزل الكائن عن الأجزاء الأخرى من الصورة. مثال من
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)
-
لمزيد من المعلومات حول
c.masks.xy
انظر قسم الأقنعة من وضع التوقع. -
هنا يتم تحويل القيم إلى
np.int32
للتوافق معdrawContours()
الدالة من OpenCV. -
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()
لمزيد من المعلومات.
-
-
بعد ذلك، هناك خياران لكيفية المضي قدمًا في الصورة من هذه النقطة وخيار لاحق لكل منهما.
خيارات عزل الأجسام
مثال
# 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]
- لمزيد من المعلومات حول نتائج المربع المحيط، راجع قسم المربعات من وضع التنبؤ.
ماذا يفعل هذا الكود؟
-
في
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]
- لمزيد من المعلومات حول نتائج المربع المحيط، راجع قسم المربعات من وضع التنبؤ.
ماذا يفعل هذا الكود؟
-
عند استخدام
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
وسيطة لـ وسائط الاستدلال لوضع التوقع للحصول على التفاصيل.
-
-
الأمر متروك لك تمامًا كمطور لتحديد الخطوة التالية. يتم عرض مثال أساسي لخطوة تالية ممكنة (حفظ الصورة في ملف للاستخدام المستقبلي).
- ملاحظة: هذه الخطوة اختيارية ويمكن تخطيها إذا لم تكن مطلوبة لحالة الاستخدام المحددة الخاصة بك.
مثال للخطوة النهائية
# 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)
- السطر الذي يقوم بتعبئة
contour
تم تجميعه في سطر واحد هنا، بينما تم تقسيمه إلى أسطر متعددة أعلاه. - الأمر متروك لك لتحديده!
- انظر وضع التوقع للحصول على معلومات إضافية.
- انظر مهمة التقسيم لمزيد من المعلومات.
- تعلم المزيد عن العمل مع النتائج
- تعلم المزيد عن نتائج قناع التجزئة (Segmentation Mask Results)
الأسئلة الشائعة
كيف يمكنني عزل الكائنات باستخدام Ultralytics YOLO11 لمهام التجزئة؟
لعزل الكائنات باستخدام Ultralytics YOLO11، اتبع الخطوات التالية:
-
قم بتحميل النموذج وشغل الاستدلال:
from ultralytics import YOLO model = YOLO("yolo11n-seg.pt") results = model.predict(source="path/to/your/image.jpg")
-
إنشاء قناع ثنائي ورسم خطوط كفافية:
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)
-
اعزل الكائن باستخدام القناع الثنائي:
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) isolated = cv2.bitwise_and(mask3ch, img)
راجع الدليل الموجود على وضع التنبؤ و مهمة التقسيم لمزيد من المعلومات.
ما هي الخيارات المتاحة لحفظ الكائنات المعزولة بعد التقسيم؟
يوفر Ultralytics YOLO11 خيارين رئيسيين لحفظ الكائنات المعزولة:
-
مع خلفية سوداء:
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) isolated = cv2.bitwise_and(mask3ch, img)
-
مع خلفية شفافة:
isolated = np.dstack([img, b_mask])
لمزيد من التفاصيل، قم بزيارة قسم وضع التنبؤ.
كيف يمكنني اقتصاص الكائنات المعزولة إلى مربعات الإحاطة الخاصة بها باستخدام Ultralytics YOLO11؟
لاقتصاص الكائنات المعزولة إلى مربعات الإحاطة الخاصة بها:
-
استرداد إحداثيات المربع المحيط:
x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
-
اقتطع الصورة المعزولة:
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
وسيطة في وسائط الاستدلال لوضع التوقع القسم.