كيفية عزل كائنات التجزئة باستخدام Ultralytics YOLO#
تنتج تجزئة المثيل قناعاً بدقة البكسل لكل كائن مكتشف، مما يعني أنه يمكنك فصل كل كائن عن الصورة بمفرده. يوضح هذا الدليل كيفية تحويل نتائج تجزئة Ultralytics YOLO إلى كائنات معزولة باستخدام وضع التنبؤ و OpenCV، إما بخلفية سوداء صلبة أو بخلفية شفافة للحفظ بتنسيق PNG.
Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀
لماذا نقوم بعزل كائنات التجزئة؟#
سحب الكائنات الفردية من الصورة يفتح مجموعة من سير العمل اللاحقة:
- إزالة الخلفية لصور المنتجات، أو الكتالوجات، أو التعديل الإبداعي.
- اقتصاص الكائن (Per-object crops) لبناء مجموعات بيانات التصنيف من اكتشافاتك.
- المعالجة المركزة بحيث ترى الخطوات اللاحقة مثل التعرف الضوئي على الحروف (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 صورة واحدة، ويؤدي التكرار عبر النتيجة إلى إرجاع اكتشاف واحد في كل مرة. لكل اكتشاف، قم بنسخ الصورة الأصلية، وقراءة تسمية الفئة، وارسم محيط قناع الكائن على قناع ثنائي فارغ. تحدد المنطقة البيضاء من هذا القناع بدقة البكسلات التي تنتمي إلى الكائن.
تعمل المقاطع البرمجية في هذا القسم والقسم التالي داخل حلقية الاكتشاف أدناه؛ النص البرمجى الكامل القابل للنسخ واللصق موجود في مثال كامل.
{ width="240", align="right" }
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) الخاص بالاكتشاف:
# 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 تجزئة مثيلية سريعة وفي الوقت الفعلي مع توليد دقيق للأقنعة ومربعات الإحاطة، بالإضافة إلى واجهة برمجة تطبيقات (API) بسيطة بلغة Python تحول نتائج الاستدلال إلى كائنات معزولة في بضعة أسطر من كود OpenCV.
نعم. استخدم وسيطة
save_cropفيpredict()لحفظ اقتصاصات مربعات الإحاطة مع خلفيتها الأصلية:results = model.predict(source="path/to/your/image.jpg", save_crop=True)اقرأ المزيد في قسم وسائط استدلال وضع التنبؤ.