كيفية عزل كائنات التجزئة باستخدام Ultralytics YOLO#
تُنتج تجزئة المثيلات قناعًا دقيقًا على مستوى البكسل لكل كائن مكتشف، ما يعني أنه يمكنك استخراج كل كائن من الصورة بشكل مستقل. يوضح هذا الدليل كيفية تحويل نتائج تجزئة Ultralytics YOLO إلى كائنات معزولة باستخدام وضع التنبؤ وOpenCV، مع خلفية سوداء موحّدة أو خلفية شفافة للحفظ بتنسيق PNG.
Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀
لماذا نعزل كائنات التجزئة؟#
يتيح استخراج الكائنات الفردية من الصورة مجموعة من مهام المعالجة اللاحقة:
- إزالة الخلفية لصور المنتجات أو الكتالوجات أو التحرير الإبداعي.
- قصاصات لكل كائن لإنشاء مجموعات بيانات التصنيف من الكائنات المكتشفة.
- المعالجة المركّزة بحيث ترى الخطوات اللاحقة، مثل OCR أو تحليل الألوان أو القياس، الكائن وحده دون المشهد المحيط.
- تصدير PNG شفاف لتركيب الكائنات على خلفيات جديدة.
تعمل هذه الوصفة مع أي نموذج تجزئة من Ultralytics YOLO وتتبع أربع مراحل: تشغيل الاستدلال ← استخراج كل محيط ← عزل الكائن ← حفظ النتيجة.
تشغيل استدلال التجزئة#
ثبّت المكتبات المطلوبة، ثم حمّل نموذج تجزئة (اللاحقة -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")إذا استدعيت model.predict() من دون source، فسيعود Ultralytics إلى الصور النموذجية المضمّنة مع الحزمة (bus.jpg وzidane.jpg)، ما يفيد في اختبار سير العمل بسرعة.
استخراج محيطات الكائنات#
يتوافق كل عنصر في results مع صورة واحدة، ويؤدي التكرار على النتيجة إلى إرجاع اكتشاف واحد في كل مرة. لكل اكتشاف، انسخ الصورة الأصلية، واقرأ تسمية الفئة، وارسم محيط قناع الكائن على قناع ثنائي فارغ. تحدد المنطقة البيضاء في هذا القناع بدقة وحدات البكسل التي تنتمي إلى الكائن.
تُشغَّل المقاطع البرمجية في هذا القسم والقسم التالي داخل حلقة الاكتشاف أدناه؛ أما النص البرمجي الكامل الجاهز للنسخ واللصق فموجود في المثال الكامل.
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]محيط القناع على هيئة إحداثيات نقاط(x, y)للكائن في نتيجة الاكتشاف الفردي هذه. - يحوّل
.astype(np.int32)النقاط منfloat32، التي لا تقبلهاdrawContours()في OpenCV. - يعيد
.reshape(-1, 1, 2)تشكيل النقاط إلى تخطيط[N, 1, 2]الذي تتوقعهdrawContours()، حيث يمثّلNعدد نقاط المحيط.
يؤدي تمرير [contour] مع الفهرس -1 إلى رسم جميع نقاط المحيط المقدم، بينما تملأ cv2.FILLED كل بكسل محاط باللون الأبيض.
عزل الكائن#
بعد تجهيز القناع الثنائي، ادمجه مع الصورة الأصلية. توجد طريقتان شائعتان، بحسب الخلفية التي تريدها:
حوّل القناع إلى ثلاث قنوات واحتفظ فقط بالبكسلات المتداخلة مع الكائن. يصبح كل ما يقع خارج المحيط أسود:
# Isolate object with a black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
للاحتفاظ بمنطقة الكائن فقط بدلًا من الصورة كاملة الحجم، اقتطعها إلى المربع المحيط بالاكتشاف:
# 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]
هذه الوظيفة مضمّنة. مرّر save_crop=True إلى predict()، وسيحفظ Ultralytics قصاصات المربعات المحيطة تلقائيًا من دون الحاجة إلى استخدام قناع.
حفظ النتيجة (اختياري)#
تحدد أنت كيفية استخدام كل كائن معزول. ومن الخطوات التالية الشائعة كتابته على القرص لاستخدامه لاحقًا:
# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)هنا، يمثّل img_name جذر اسم الصورة المصدر، ويمثّل label اسم الفئة، بينما يمثّل ci فهرس الاكتشاف، ولذلك تحصل المثيلات المتعددة للفئة نفسها على أسماء ملفات فريدة. استبدل isolated بـ iso_crop إذا طبّقت القص الاختياري أعلاه.
مثال كامل#
يجمع النص البرمجي أدناه كل خطوة في كتلة واحدة قابلة للتشغيل. ويستخدم خلفية سوداء افتراضيًا؛ بدّل السطر المحدد الوحيد إلى 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])للاستخدام المتكرر، ضع جسم الحلقة داخل دالة حتى تتمكن من استدعائها عبر صور عديدة.
الخلاصة#
لديك الآن وصفة كاملة لعزل الكائنات المجزأة باستخدام 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)راجع المثال الكامل للاطلاع على حلقة المعالجة الكاملة لكل اكتشاف.
يوجد نمطان رئيسيان. للحصول على خلفية سوداء، حوّل القناع إلى ثلاث قنوات واستخدم
cv2.bitwise_and(). وللحصول على خلفية شفافة (عند الحفظ بصيغة PNG)، أضف القناع كقناة ألفا رابعة باستخدامnp.dstack([img, b_mask]). يوضح قسم عزل الكائن الطريقتين.اقرأ إحداثيات المربع المحيط من الاكتشاف واقطع الصورة المعزولة:
x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32) iso_crop = isolated[y1:y2, x1:x2]تعرّف على المزيد حول نتائج المربعات المحيطة في وثائق وضع التنبؤ.
يوفّر Ultralytics YOLO تجزئة مثيلات سريعة وفورية مع إنشاء دقيق للأقنعة والمربعات المحيطة، بالإضافة إلى واجهة Python API بسيطة تحوّل نتائج الاستدلال إلى كائنات معزولة عبر بضعة أسطر من تعليمات OpenCV البرمجية.
نعم. استخدم الوسيط
save_cropفيpredict()لحفظ قصاصات المربعات المحيطة مع خلفيتها الأصلية:results = model.predict(source="path/to/your/image.jpg", save_crop=True)اقرأ المزيد في قسم وسائط استدلال وضع التنبؤ.