عزل كائنات التجزئة (Segmentation Objects)
بعد تنفيذ مهمة التجزئة، من المرغوب فيه أحياناً استخراج الكائنات المعزولة من نتائج الاستدلال (inference). يقدم هذا الدليل وصفة عامة لكيفية تحقيق ذلك باستخدام وضع التنبؤ في Ultralytics.
Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀
شرح الوصفة
-
راجع قسم التثبيت السريع لـ Ultralytics للحصول على دليل سريع حول تثبيت المكتبات المطلوبة.
-
تحميل نموذج وتشغيل طريقة
predict()على مصدر ما.from ultralytics import YOLO # Load a model model = YOLO("yolo26n-seg.pt") # Run inference results = model.predict()
بدون تحديد مصدر، سيتم استخدام صور الأمثلة من المكتبة:
'ultralytics/assets/bus.jpg'
'ultralytics/assets/zidane.jpg'هذا مفيد للاختبار السريع باستخدام طريقة predict().
للحصول على معلومات إضافية حول نماذج التجزئة، قم بزيارة صفحة مهمة التجزئة. لمعرفة المزيد حول طريقة predict()، راجع قسم وضع التنبؤ في التوثيق.
***
الآن قم بالتكرار عبر النتائج والخطوط الكنتورية (contours). بالنسبة لسير العمل الذي يرغب في حفظ صورة في ملف، يتم استرداد base-name للصورة المصدر و class-label للاكتشاف لاستخدامه لاحقاً (اختياري).
```{ .py .annotate }
from pathlib import Path
import numpy as np
# (2) Iterate detection results (helpful for multiple images)
for r in results:
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. To learn more about working with detection results, see [Boxes Section for Predict Mode](../modes/predict.md#boxes).
2. To learn more about `predict()` results see [Working with Results for Predict Mode](../modes/predict.md#working-with-results)حلقة التكرار (For-Loop)
صورة واحدة ستكرر الحلقة الأولى مرة واحدة فقط. صورة واحدة تحتوي على اكتشاف واحد فقط ستكرر كل حلقة مرة واحدة فقط.
-
ابدأ بإنشاء قناع ثنائي (binary mask) من الصورة المصدر ثم ارسم خطاً كنتورياً مملوءاً على القناع. سيسمح هذا بعزل الكائن عن الأجزاء الأخرى من الصورة. يظهر على اليمين مثال من
bus.jpgلأحد كائنات فئةpersonالتي تم اكتشافها.{ width="240", align="right" }
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. -
تتوقع وظيفة
drawContours()في OpenCV أن تكون للخطوط الكنتورية شكل[N, 1, 2]، قم بتوسيع القسم أدناه لمزيد من التفاصيل.
Expand to understand what is happening when defining the
contourvariable.- `c.masks.xy` :: Provides the coordinates of the mask contour points in the format `(x, y)`. For more details, refer to the [Masks Section from Predict Mode](../modes/predict.md#masks). - `.pop()` :: As `masks.xy` is a list containing a single element, this element is extracted using the `pop()` method. - `.astype(np.int32)` :: Using `masks.xy` will return with a data type of `float32`, but this won't be compatible with the OpenCV `drawContours()` function, so this will change the data type to `int32` for compatibility. - `.reshape(-1, 1, 2)` :: Reformats the data into the required shape of `[N, 1, 2]` where `N` is the number of contour points, with each point represented by a single entry `1`, and the entry is composed of `2` values. The `-1` denotes that the number of values along this dimension is flexible.
Expand for an explanation of the
drawContours()configuration.- Encapsulating the `contour` variable within square brackets, `[contour]`, was found to effectively generate the desired contour mask during testing. - The value `-1` specified for the `drawContours()` parameter instructs the function to draw all contours present in the image. - The `tuple` `(255, 255, 255)` represents the color white, which is the desired color for drawing the contour in this binary mask. - The addition of `cv2.FILLED` will color all pixels enclosed by the contour boundary the same, in this case, all enclosed pixels will be white. - See [OpenCV Documentation on `drawContours()`](https://docs.opencv.org/4.8.0/d6/d6e/group__imgproc__draw.html#ga746c0625f1781f1ffc9056259103edbc) for more information.
-
-
بعد ذلك، هناك خياران لكيفية المضي قدماً في الصورة من هذه النقطة، وخيار لاحق لكل منهما.
خيارات عزل الكائنات
# Create 3-channel mask
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
# Isolate object with binary mask
isolated = cv2.bitwise_and(mask3ch, img)كيف يعمل هذا؟
-
أولاً، يتم تحويل القناع الثنائي من صورة أحادية القناة إلى صورة ثلاثية القنوات. هذا التحويل ضروري للخطوة اللاحقة حيث يتم دمج القناع والصورة الأصلية. يجب أن تحتوي كلتا الصورتين على نفس عدد القنوات لتكونا متوافقتين مع عملية المزج.
-
يتم دمج الصورة الأصلية والقناع الثنائي ثلاثي القنوات باستخدام وظيفة
bitwise_and()في OpenCV. تحتفظ هذه العملية فقط بقيم البكسل التي تزيد عن صفر(> 0)من كلتا الصورتين. نظراً لأن بكسلات القناع أكبر من صفر(> 0)فقط داخل منطقة الخط الكنتوري، فإن البكسلات المتبقية من الصورة الأصلية هي تلك التي تتداخل مع الخط الكنتوري.
العزل ببكسلات سوداء: خيارات فرعية
صورة بالحجم الكامل
لا توجد خطوات إضافية مطلوبة في حالة الاحتفاظ بالصورة بالحجم الكامل.
صورة الكائن المقصوصة
مطلوب خطوات إضافية لقص الصورة بحيث تشمل فقط منطقة الكائن.
{ align="right" }
# (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، مما يجعلها متوافقة لقص الصورة باستخدام شرائح الفهرس (index slices). -
أخيراً، يتم قص منطقة صندوق الإحاطة من الصورة باستخدام شرائح الفهرس. يتم تحديد الحدود بواسطة إحداثيات
[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("yolo26n-seg.pt") # (4)!
res = m.predict(source="path/to/image.jpg") # (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]
# Add your custom post-processing here (2)- السطر الذي يملأ
contourمدمج في سطر واحد هنا، حيث تم تقسيمه إلى عدة أسطر أعلاه. - {==ما يحدث هنا متروك لك!==}
- راجع وضع التنبؤ لمزيد من المعلومات.
- راجع مهمة التجزئة لمزيد من المعلومات.
- تعرف على المزيد حول العمل مع النتائج
- تعرف على المزيد حول نتائج أقنعة التجزئة
الأسئلة الشائعة
كيف يمكنني عزل الكائنات باستخدام Ultralytics YOLO26 لمهام التجزئة؟
لعزل الكائنات باستخدام Ultralytics YOLO26، اتبع الخطوات التالية:
-
تحميل النموذج وتشغيل الاستدلال:
from ultralytics import YOLO model = YOLO("yolo26n-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 YOLO26 خيارين رئيسيين لحفظ الكائنات المعزولة:
-
مع خلفية سوداء:
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) isolated = cv2.bitwise_and(mask3ch, img) -
مع خلفية شفافة:
isolated = np.dstack([img, b_mask])
لمزيد من التفاصيل، قم بزيارة قسم وضع التنبؤ.
كيف يمكنني قص الكائنات المعزولة إلى صناديق إحاطتها باستخدام Ultralytics YOLO26؟
لقص الكائنات المعزولة إلى صناديق إحاطتها:
-
استرداد إحداثيات صندوق الإحاطة:
x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32) -
قص الصورة المعزولة:
iso_crop = isolated[y1:y2, x1:x2]
تعرف على المزيد حول نتائج صناديق الإحاطة في توثيق وضع التنبؤ.
لماذا يجب أن أستخدم Ultralytics YOLO26 لعزل الكائنات في مهام التجزئة؟
يوفر Ultralytics YOLO26:
- سرعة عالية في اكتشاف الكائنات وتجزئتها في الوقت الفعلي.
- دقة عالية في توليد صندوق الإحاطة والقناع لعزل دقيق للكائن.
- توثيق شامل وواجهة برمجة تطبيقات (API) سهلة الاستخدام من أجل تطوير فعال.
استكشف فوائد استخدام YOLO في توثيق مهمة التجزئة.
هل يمكنني حفظ الكائنات المعزولة بما في ذلك الخلفية باستخدام Ultralytics YOLO26؟
نعم، هذه ميزة مدمجة في Ultralytics YOLO26. استخدم وسيط save_crop في طريقة predict(). على سبيل المثال:
results = model.predict(source="path/to/your/image.jpg", save_crop=True)اقرأ المزيد حول وسيط save_crop في قسم وسائط استدلال وضع التنبؤ.