عزل كائنات التجزئة
بعد تنفيذ مهمة التجزئة، من المستحسن أحياناً استخراج الكائنات المعزولة من نتائج الاستدلال. يقدم هذا الدليل وصفة عامة حول كيفية إنجاز ذلك باستخداموضع التنبؤ Ultralytics .
استعراض الوصفة
-
راجع قسم التثبيتUltralytics Quickstart للتعرف على إرشادات سريعة حول تثبيت المكتبات المطلوبة.
-
تحميل نموذج وتشغيله
predict()
على مصدر.from ultralytics import YOLO # Load a model model = YOLO("yolo11n-seg.pt") # Run inference results = model.predict()
لا توجد حجج للتنبؤ؟
بدون تحديد مصدر، سيتم استخدام أمثلة الصور من المكتبة:
هذا مفيد للاختبار السريع مع
predict()
الطريقة.للحصول على معلومات إضافية حول نماذج التقسيم، قم بزيارة مهمة القطاع الصفحة. لمعرفة المزيد عن
predict()
الطريقة، انظر وضع التنبؤ في قسم التوثيق.
-
الآن كرر النتائج والخطوط. بالنسبة لمهام سير العمل التي تريد حفظ صورة في ملف، فإن الصورة المصدر
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()
انظر النتائج العمل مع النتائج لوضع التنبؤ
بالنسبة للحلقة
ستكرر صورة واحدة فقط الحلقة الأولى مرة واحدة فقط. صورة واحدة مع اكتشاف واحد فقط ستكرر كل حلقة مرة واحدة فقط.
-
ابدأ بتوليد قناع ثنائي من الصورة المصدر ثم ارسم محيطًا مملوءًا على القناع. سيسمح ذلك بعزل الكائن عن الأجزاء الأخرى من الصورة. مثال من
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
متغير.-
c.masks.xy
:: يوفر إحداثيات نقاط كفاف القناع بالتنسيق(x, y)
. لمزيد من التفاصيل، يُرجى الرجوع إلى قسم الأقنعة من وضع التنبؤ. -
.pop()
:: كماmasks.xy
عبارة عن قائمة تحتوي على عنصر واحد، يتم استخراج هذا العنصر باستخدامpop()
الطريقة. -
.astype(np.int32)
:: استخدامmasks.xy
سيعود بنوع بيانات منfloat32
، ولكن هذا لن يكون متوافقًا مع OpenCVdrawContours()
دالة، لذا سيؤدي هذا إلى تغيير نوع البيانات إلى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، باستخدامxyxy
تنسيق إحداثيات المربع، والتي تتوافق مع النقاطxmin, ymin, xmax, ymax
للمربع المحدود (المستطيل)، انظر قسم المربعات من وضع التنبؤ للمزيد من المعلومات -
إضافة
squeeze()
يضمن إزالة أي أبعاد دخيلة من مصفوفة NumPy. -
تحويل قيم الإحداثيات باستخدام
.astype(np.int32)
تغيير نوع بيانات إحداثيات الصندوق منfloat32
إلىint32
والتي ستكون متوافقة عند اقتصاص الصورة باستخدام شرائح الفهرس. -
أخيرًا، يتم اقتصاص منطقة الصورة للمربع المحدد باستخدام تشريح الفهرس، حيث يتم تعيين الحدود باستخدام
[ymin:ymax, xmin:xmax]
إحداثيات المربع المحدد للكشف.
ماذا لو أردت الكائن الذي تم اقتصاصه بما في ذلك الخلفية؟
هذه ميزة مدمجة في مكتبة Ultralytics . راجع
save_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
في سطر واحد هنا، حيث تم تقسيمها إلى عدة أسطر أعلاه. - الأمر متروك لك!
- راجع وضع التنبؤ للحصول على معلومات إضافية.
- راجع مهمة المقطع لمزيد من المعلومات.
- تعرف على المزيد حول العمل مع النتائج
- تعرف على المزيد حول نتائج قناع التقسيم
الأسئلة الشائعة
كيف يمكنني عزل الكائنات باستخدام Ultralytics YOLO11 لمهام التجزئة؟
لعزل الكائنات باستخدام Ultralytics YOLO11 ، اتبع الخطوات التالية:
-
تحميل النموذج وتشغيل الاستدلال:
-
توليد قناع ثنائي ورسم ملامح:
-
اعزل الكائن باستخدام القناع الثنائي:
ارجع إلى الدليل الخاص بوضع التنبؤ ومهمة المقطع لمزيد من المعلومات.
ما هي الخيارات المتاحة لحفظ الكائنات المعزولة بعد التجزئة؟
Ultralytics YOLO11 خيارين رئيسيين لحفظ الكائنات المعزولة:
-
بخلفية سوداء:
-
بخلفية شفافة:
لمزيد من التفاصيل، قم بزيارة قسم وضع التنبؤ.
كيف يمكنني اقتصاص الأجسام المعزولة إلى مربعاتها المحدودة باستخدام Ultralytics YOLO11 ؟
لاقتصاص الأجسام المعزولة إلى مربعاتها المحدودة:
-
استرجاع إحداثيات المربع المحدود:
-
قص الصورة المعزولة:
تعرف على المزيد حول نتائج المربع المحدود في وثائق وضع التنبؤ.
لماذا يجب استخدام Ultralytics YOLO11 لعزل الكائنات في مهام التجزئة؟
Ultralytics YOLO11 يوفر:
- اكتشاف الأجسام وتجزئتها بسرعة عالية في الوقت الحقيقي.
- إنشاء مربع محدّد دقيق وتوليد قناع لعزل الأجسام بدقة.
- وثائق شاملة وواجهة برمجة تطبيقات (API) سهلة الاستخدام للتطوير الفعال.
استكشف مزايا استخدام YOLO في وثائق مهام الشريحة.
هل يمكنني حفظ الكائنات المعزولة بما في ذلك الخلفية باستخدام Ultralytics YOLO11 ؟
نعم، هذه ميزة مدمجة في Ultralytics YOLO11 . استخدم save_crop
الحجة في predict()
الطريقة. على سبيل المثال:
اقرأ المزيد عن save_crop
الحجة في حجج الاستدلال على الوضع المتوقع القسم.