تخطي إلى المحتوى

YOLOE: رؤية أي شيء في الوقت الفعلي

مقدمة

خيارات المطالبة في YOLOE

YOLOE (الرؤية في الوقت الفعلي لأي شيء) هو تقدم جديد في نماذج YOLO الصفرية والموجهة، المصممة للكشف عن المفردات المفتوحة والتقسيم. على عكس نماذج YOLO السابقة المقتصرة على فئات ثابتة، يستخدم YOLOE مطالبات نصية أو صورية أو مفردات داخلية، مما يتيح الكشف في الوقت الفعلي عن أي فئة كائن. استنادًا إلى YOLOv10 ومستوحى من YOLO-World، يحقق YOLOE أحدث أداء صفري مع الحد الأدنى من التأثير على السرعة والدقة.



شاهد: كيفية استخدام YOLOE مع حزمة Ultralytics python: المفردات المفتوحة والرؤية الآنية لأي شيء 🚀

بالمقارنة مع نماذج YOLO السابقة، يعزز YOLOE الكفاءة والدقة بشكل كبير. فهو يتحسن بمقدار +3.5 AP مقارنة بـ YOLO-Worldv2 على LVIS مع استخدام ثلث موارد التدريب فقط وتحقيق سرعات استدلال أسرع بمقدار 1.4 مرة. بعد الضبط الدقيق على COCO، يتفوق YOLOE-v8-large على YOLOv8-L بمقدار 0.1 mAP، باستخدام وقت تدريب أقل بنحو 4 مرات. يوضح هذا التوازن الاستثنائي الذي يحققه YOLOE بين الدقة والكفاءة والتنوع. تستكشف الأقسام أدناه بنية YOLOE ومقارنات الأداء والتكامل مع إطار عمل Ultralytics.

نظرة عامة على البنية

هندسة YOLOE

تحتفظ YOLOE بالهيكل القياسي لـ YOLO—العمود الفقري التConvolutional (مثل CSP-Darknet) لاستخراج الميزات، و الرقبة (مثل PAN-FPN) لدمج متعدد المقاييس، و رأس كشف غير مرتبط بالمرساة (كما في YOLOv8/YOLO11) يتنبأ بالكائنات والفئات والمربعات بشكل مستقل. تقدم YOLOE ثلاث وحدات جديدة تمكن الكشف عن المفردات المفتوحة:

  • محاذاة المنطقة والنص القابلة لإعادة التهيئة (RepRTA): يدعم الكشف الموجه بالنص عن طريق تحسين تضمينات النص (على سبيل المثال، من CLIP) عبر شبكة مساعدة صغيرة. عند الاستدلال، يتم دمج هذه الشبكة في النموذج الرئيسي، مما يضمن عدم وجود أي حمل إضافي. وبالتالي، يكتشف YOLOE الكائنات المسماة بنص عشوائي (على سبيل المثال، "إشارة مرور" غير مرئية) دون عقوبات وقت التشغيل.

  • مشفر المطالبات المرئية المنشط دلاليًا (SAVPE): يُمكّن الكشف المرئي الموجه عبر فرع تضمين خفيف الوزن. بالنظر إلى صورة مرجعية، يقوم SAVPE بتشفير الميزات الدلالية والتنشيطية، وتكييف النموذج للكشف عن الكائنات المتشابهة بصريًا - وهي قدرة كشف لمرة واحدة مفيدة للشعارات أو أجزاء معينة.

  • تباين المنطقة الكسولة (LRPC): في وضع عدم وجود مطالبات، يؤدي YOLOE التعرف على المجموعة المفتوحة باستخدام التضمينات الداخلية المدربة على مفردات كبيرة (1200+ فئة من LVIS و Objects365). بدون مطالبات أو ترميزات خارجية، يحدد YOLOE الكائنات عبر البحث عن تشابه التضمين، مما يعالج مساحات الملصقات الكبيرة بكفاءة في الاستدلال.

بالإضافة إلى ذلك، يدمج YOLOE تقسيم المثيلات في الوقت الفعلي عن طريق توسيع رأس الكشف بفرع تنبؤ القناع (على غرار YOLACT أو YOLOv8-Seg)، مما يضيف الحد الأدنى من الحمل الزائد.

بشكل حاسم، لا تقدم وحدات العالم المفتوح في YOLOE أي تكلفة استدلال عند استخدامها كـ YOLO منتظم ذي مجموعة مغلقة. بعد التدريب، يمكن إعادة تحديد معلمات YOLOE في رأس YOLO قياسي، مع الحفاظ على نفس عدد العمليات الحسابية في الثانية (FLOPs) والسرعة (على سبيل المثال، مطابقة YOLO11 تمامًا).

النماذج المتاحة والمهام المدعومة وأنماط التشغيل

يوضح هذا القسم بالتفصيل النماذج المتاحة مع الأوزان المدربة مسبقًا الخاصة بها، والمهام التي تدعمها، وتوافقها مع أوضاع التشغيل المختلفة مثل الاستدلال و التحقق من الصحة و التدريب و التصدير، ويشار إليها بـ ✅ للأوضاع المدعومة و ❌ للأوضاع غير المدعومة.

نماذج المطالبات النصية / المرئية

نوع النموذج الأوزان المدربة مسبقًا المهام المدعومة الاستدلال التحقق التدريب تصدير
YOLOE-11S yoloe-11s-seg.pt تجزئة المثيل
YOLOE-11M yoloe-11m-seg.pt تجزئة المثيل
YOLOE-11L yoloe-11l-seg.pt تجزئة المثيل
YOLOE-v8S yoloe-v8s-seg.pt تجزئة المثيل
YOLOE-v8M yoloe-v8m-seg.pt تجزئة المثيل
YOLOE-v8L yoloe-v8l-seg.pt تجزئة المثيل

نماذج المطالبة المجانية

نوع النموذج الأوزان المدربة مسبقًا المهام المدعومة الاستدلال التحقق التدريب تصدير
YOLOE-11S-PF yoloe-11s-seg-pf.pt تجزئة المثيل
YOLOE-11M-PF yoloe-11m-seg-pf.pt تجزئة المثيل
YOLOE-11L-PF yoloe-11l-seg-pf.pt تجزئة المثيل
YOLOE-v8S-PF yoloe-v8s-seg-pf.pt تجزئة المثيل
YOLOE-v8M-PF yoloe-v8m-seg-pf.pt تجزئة المثيل
YOLOE-v8L-PF yoloe-v8l-seg-pf.pt تجزئة المثيل

أمثلة الاستخدام

من السهل دمج نماذج YOLOE في تطبيقات Python الخاصة بك. توفر Ultralytics واجهة برمجة تطبيقات Python سهلة الاستخدام وأوامر CLI لتبسيط عملية التطوير.

تدريب الاستخدام

الضبط الدقيق على مجموعة بيانات مخصصة

مثال

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer

model = YOLOE("yoloe-11s-seg.pt")

model.train(
    data="coco128-seg.yaml",
    epochs=80,
    close_mosaic=10,
    batch=128,
    optimizer="AdamW",
    lr0=1e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    device="0",
    trainer=YOLOEPESegTrainer,
)
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer

model = YOLOE("yoloe-11s-seg.pt")
head_index = len(model.model.model) - 1
freeze = [str(f) for f in range(0, head_index)]
for name, child in model.model.model[-1].named_children():
    if "cv3" not in name:
        freeze.append(f"{head_index}.{name}")

freeze.extend(
    [
        f"{head_index}.cv3.0.0",
        f"{head_index}.cv3.0.1",
        f"{head_index}.cv3.1.0",
        f"{head_index}.cv3.1.1",
        f"{head_index}.cv3.2.0",
        f"{head_index}.cv3.2.1",
    ]
)

model.train(
    data="coco128-seg.yaml",
    epochs=2,
    close_mosaic=0,
    batch=16,
    optimizer="AdamW",
    lr0=1e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    device="0",
    trainer=YOLOEPESegTrainer,
    freeze=freeze,
)

استخدام التوقع

يدعم YOLOE المطالبات النصية والمرئية. استخدام المطالبات واضح ومباشر—ما عليك سوى تمريرها من خلال predict الطريقة كما هو موضح أدناه:

مثال

تتيح لك مطالبات النص تحديد الفئات التي ترغب في الكشف عنها من خلال الأوصاف النصية. يوضح الكود التالي كيف يمكنك استخدام YOLOE للكشف عن الأشخاص والحافلات في صورة:

from ultralytics import YOLOE

# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-11s/m-seg.pt for different sizes

# Set text prompt to detect person and bus. You only need to do this once after you load the model.
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))

# Run detection on the given image
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()

تتيح لك المطالبات المرئية توجيه النموذج عن طريق عرض أمثلة مرئية للفئات المستهدفة، بدلاً من وصفها بالنص.

في visual_prompts تأخذ الوسيطة قاموسًا بمفتاحين: bboxes و cls. كل مربع إحاطة في bboxes يجب أن يحيط بإحكام بمثال للكائن الذي تريد أن يكتشفه النموذج، والإدخال المقابل في cls يحدد تسمية الفئة لهذا الصندوق. هذه المطابقة تخبر النموذج، "هذا ما تبدو عليه الفئة X—ابحث الآن عن المزيد مثلها."

معرفات الفئات (Class IDs)cls) في visual_prompts تُستخدم لربط كل مربع إحاطة بفئة معينة داخل مطالبتك. إنها ليست تسميات ثابتة، ولكنها معرفات مؤقتة تقوم بتعيينها لكل مثال. الشرط الوحيد هو أن تكون معرفات الفئات متسلسلة، بدءًا من 0. وهذا يساعد النموذج على ربط كل مربع بفئته بشكل صحيح.

يمكنك توفير مطالبات مرئية مباشرة داخل نفس الصورة التي تريد تشغيل الاستدلال عليها. على سبيل المثال:

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")

# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
    bboxes=np.array(
        [
            [221.52, 405.8, 344.98, 857.54],  # Box enclosing person
            [120, 425, 160, 445],  # Box enclosing glasses
        ],
    ),
    cls=np.array(
        [
            0,  # ID to be assigned for person
            1,  # ID to be assigned for glassses
        ]
    ),
)

# Run inference on an image, using the provided visual prompts as guidance
results = model.predict(
    "ultralytics/assets/bus.jpg",
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)

# Show results
results[0].show()

أو يمكنك تقديم أمثلة من صورة مرجعية منفصلة باستخدام refer_image الوسيطة. في هذه الحالة، bboxes و cls في visual_prompts يجب أن يصف الكائنات في الصورة المرجعية، وليس الصورة الهدف التي تقوم بعمل تنبؤات عليها:

ملاحظة

إذا source هو مقطع فيديو أو بث، يستخدم النموذج تلقائيًا الإطار الأول كـ refer_image: هذا يعني أن الـ visual_prompts يتم تطبيقها على هذا الإطار الأولي لمساعدة النموذج على فهم ما يجب البحث عنه في بقية الفيديو. بدلاً من ذلك، يمكنك تمرير أي إطار محدد بشكل صريح كـ refer_image للتحكم في الأمثلة المرئية التي يستخدمها النموذج كمرجع.

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")

# Define visual prompts based on a separate reference image
visual_prompts = dict(
    bboxes=np.array([[221.52, 405.8, 344.98, 857.54]]),  # Box enclosing person
    cls=np.array([0]),  # ID to be assigned for person
)

# Run prediction on a different image, using reference image to guide what to look for
results = model.predict(
    "ultralytics/assets/zidane.jpg",  # Target image for detection
    refer_image="ultralytics/assets/bus.jpg",  # Reference image used to get visual prompts
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)

# Show results
results[0].show()

استخدام refer_image يقوم أيضًا بتعيين الفئات بشكل دائم، بحيث يمكنك تشغيل التنبؤات دون الحاجة إلى تقديم نفس المطالبات المرئية مرة أخرى، وتصدير النموذج مع الاحتفاظ بالقدرة على اكتشاف نفس الفئات بعد التصدير:

# After making prediction with `refer_image`, you can run predictions without passing visual_prompts again and still get the same classes back
results = model("ultralytics/assets/bus.jpg")

# Or export it to a different format while retaining the classes
model.export(format="onnx")

يمكنك أيضًا تمرير صور مستهدفة متعددة لتشغيل التنبؤ عليها:

import numpy as np

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")

# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
    bboxes=[
        np.array(
            [
                [221.52, 405.8, 344.98, 857.54],  # Box enclosing person
                [120, 425, 160, 445],  # Box enclosing glasses
            ],
        ),
        np.array([[150, 200, 1150, 700]]),
    ],
    cls=[
        np.array(
            [
                0,  # ID to be assigned for person
                1,  # ID to be assigned for glasses
            ]
        ),
        np.array([0]),
    ],
)

# Run inference on multiple image, using the provided visual prompts as guidance
results = model.predict(
    ["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
    visual_prompts=visual_prompts,
    predictor=YOLOEVPSegPredictor,
)

# Show results
results[0].show()

يتضمن YOLOE أيضًا متغيرات خالية من المطالبات تأتي مع مفردات مدمجة. لا تتطلب هذه النماذج أي مطالبات وتعمل مثل نماذج YOLO التقليدية. بدلاً من الاعتماد على الملصقات أو الأمثلة المرئية التي يقدمها المستخدم، فإنها تكتشف الكائنات من قائمة محددة مسبقًا تضم 4,585 فئة بناءً على مجموعة العلامات المستخدمة بواسطة نموذج التعرف على أي شيء بلس (RAM++).

from ultralytics import YOLOE

# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg-pf.pt")

# Run prediction. No prompts required.
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()

استخدام التحقق

مثال

from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-11s/m-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml")

بشكل افتراضي، يتم استخدام مجموعة البيانات المتوفرة لاستخراج التضمينات المرئية لكل فئة.

from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-11s/m-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True)

بدلاً من ذلك، يمكننا استخدام مجموعة بيانات أخرى كمجموعة بيانات مرجعية لاستخراج التضمينات المرئية لكل فئة. لاحظ أن هذه المجموعة المرجعية يجب أن تحتوي على نفس الفئات تمامًا مثل مجموعة البيانات المقدمة.

from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-11s/m-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True, refer_data="coco.yaml")
from ultralytics import YOLOE

# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")  # or select yoloe-11s/m-seg.pt for different sizes

# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml")

تبسيط عملية التحقق من صحة النموذج على مجموعة البيانات على النحو التالي:

تدريب النماذج الرسمية

إعداد مجموعات البيانات

ملاحظة

يحتاج تدريب نماذج YOLOE الرسمية إلى تعليقات توضيحية للقطاعات لبيانات التدريب، إليك البرنامج النصي المقدم من الفريق الرسمي الذي يحول مجموعات البيانات إلى تعليقات توضيحية للمقاطع، مدعوم من نماذج SAM2.1. أو يمكنك تنزيل الملفات المتوفرة مباشرة Processed Segment Annotations في الجدول التالي المقدم من الفريق الرسمي.

  • تدريب البيانات
مجموعة البيانات النوع عينات المربعات شروحات الكشف الخام التعليقات التوضيحية للجزء المعالج
Objects365v1 اكتشاف 609k 9621k objects365_train.json objects365_train_segm.json
GQA التأريض 621k 3681k final_mixed_train_no_coco.json final_mixed_train_no_coco_segm.json
Flickr30k التأريض 149k 641k final_flickr_separateGT_train.json final_flickr_separateGT_train_segm.json
  • بيانات التحقق
مجموعة البيانات النوع ملفات التعليقات التوضيحية
LVIS minival اكتشاف minival.txt

بدء التدريب من الصفر

ملاحظة

Visual Prompt يتم ضبط النماذج بدقة بناءً على التدريب الجيد Text Prompt النماذج.

مثال

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegTrainerFromScratch

data = dict(
    train=dict(
        yolo_data=["Objects365.yaml"],
        grounding_data=[
            dict(
                img_path="flickr/full_images/",
                json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
            ),
            dict(
                img_path="mixed_grounding/gqa/images",
                json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            ),
        ],
    ),
    val=dict(yolo_data=["lvis.yaml"]),
)

model = YOLOE("yoloe-11l-seg.yaml")
model.train(
    data=data,
    batch=128,
    epochs=30,
    close_mosaic=2,
    optimizer="AdamW",
    lr0=2e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    trainer=YOLOESegTrainerFromScratch,
    device="0,1,2,3,4,5,6,7",
)

نظرًا لأن SAVPE يجب تحديث الوحدة النمطية أثناء التدريب. تحويل نموذج المطالبة النصية المدرب جيدًا إلى نموذج اكتشاف واعتماد مسار اكتشاف بتكلفة تدريب أقل. لاحظ أن هذه الخطوة اختيارية، يمكنك البدء مباشرة من التجزئة أيضًا.

from ultralytics import YOLOE
from ultralytics.utils.patches import torch_load

det_model = YOLOE("yoloe-11l.yaml")
state = torch_load("yoloe-11l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-11l-seg-det.pt")

ابدأ التدريب:

from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegVPTrainer

data = dict(
    train=dict(
        yolo_data=["Objects365.yaml"],
        grounding_data=[
            dict(
                img_path="flickr/full_images/",
                json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
            ),
            dict(
                img_path="mixed_grounding/gqa/images",
                json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            ),
        ],
    ),
    val=dict(yolo_data=["lvis.yaml"]),
)

model = YOLOE("yoloe-11l-seg.pt")
# replace to yoloe-11l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-11l-seg-det.pt")

# freeze every layer except of the savpe module.
head_index = len(model.model.model) - 1
freeze = list(range(0, head_index))
for name, child in model.model.model[-1].named_children():
    if "savpe" not in name:
        freeze.append(f"{head_index}.{name}")

model.train(
    data=data,
    batch=128,
    epochs=2,
    close_mosaic=2,
    optimizer="AdamW",
    lr0=16e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    trainer=YOLOESegVPTrainer,  # use YOLOEVPTrainer if converted to detection model
    device="0,1,2,3,4,5,6,7",
    freeze=freeze,
)

قم بالتحويل مرة أخرى إلى نموذج التجزئة بعد التدريب. مطلوب فقط إذا قمت بتحويل نموذج التجزئة إلى نموذج الكشف قبل التدريب.

from copy import deepcopy

from ultralytics import YOLOE

model = YOLOE("yoloe-11l-seg.yaml")
model.load("yoloe-11l-seg.pt")

vp_model = YOLOE("yoloe-11l-vp.pt")
model.model.model[-1].savpe = deepcopy(vp_model.model.model[-1].savpe)
model.eval()
model.save("yoloe-11l-seg.pt")

على غرار التدريب المرئي السريع، بالنسبة للنموذج الخالي من المطالبات، يلزم تحديث تضمين المطالبة المتخصصة فقط أثناء التدريب. تحويل نموذج المطالبة النصية المدرب جيدًا إلى نموذج الكشف واعتماد مسار الكشف بتكلفة تدريب أقل. لاحظ أن هذه الخطوة اختيارية، يمكنك البدء مباشرة من التجزئة أيضًا.

from ultralytics import YOLOE
from ultralytics.utils.patches import torch_load

det_model = YOLOE("yoloe-11l.yaml")
state = torch_load("yoloe-11l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-11l-seg-det.pt")
ابدأ التدريب:
from ultralytics import YOLOE

data = dict(
    train=dict(
        yolo_data=["Objects365.yaml"],
        grounding_data=[
            dict(
                img_path="flickr/full_images/",
                json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
            ),
            dict(
                img_path="mixed_grounding/gqa/images",
                json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
            ),
        ],
    ),
    val=dict(yolo_data=["lvis.yaml"]),
)

model = YOLOE("yoloe-11l-seg.pt")
# replace to yoloe-11l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-11l-seg-det.pt")

# freeze layers.
head_index = len(model.model.model) - 1
freeze = [str(f) for f in range(0, head_index)]
for name, child in model.model.model[-1].named_children():
    if "cv3" not in name:
        freeze.append(f"{head_index}.{name}")

freeze.extend(
    [
        f"{head_index}.cv3.0.0",
        f"{head_index}.cv3.0.1",
        f"{head_index}.cv3.1.0",
        f"{head_index}.cv3.1.1",
        f"{head_index}.cv3.2.0",
        f"{head_index}.cv3.2.1",
    ]
)

model.train(
    data=data,
    batch=128,
    epochs=1,
    close_mosaic=1,
    optimizer="AdamW",
    lr0=2e-3,
    warmup_bias_lr=0.0,
    weight_decay=0.025,
    momentum=0.9,
    workers=4,
    trainer=YOLOEPEFreeTrainer,
    device="0,1,2,3,4,5,6,7",
    freeze=freeze,
    single_cls=True,  # this is needed
)

قم بالتحويل مرة أخرى إلى نموذج التجزئة بعد التدريب. مطلوب فقط إذا قمت بتحويل نموذج التجزئة إلى نموذج الكشف قبل التدريب.

from copy import deepcopy

from ultralytics import YOLOE

model = YOLOE("yoloe-11l-seg.pt")
model.eval()

pf_model = YOLOE("yoloe-11l-seg-pf.pt")
names = ["object"]
tpe = model.get_text_pe(names)
model.set_classes(names, tpe)
model.model.model[-1].fuse(model.model.pe)

model.model.model[-1].cv3[0][2] = deepcopy(pf_model.model.model[-1].cv3[0][2]).requires_grad_(True)
model.model.model[-1].cv3[1][2] = deepcopy(pf_model.model.model[-1].cv3[1][2]).requires_grad_(True)
model.model.model[-1].cv3[2][2] = deepcopy(pf_model.model.model[-1].cv3[2][2]).requires_grad_(True)
del model.model.pe
model.save("yoloe-11l-seg-pf.pt")

مقارنة أداء YOLOE

تتفوق YOLOE على دقة نماذج YOLO ذات المجموعة المغلقة أو تضاهيها في المعايير القياسية مثل COCO، دون المساس بالسرعة أو حجم النموذج. يقارن الجدول أدناه YOLOE-L (المبني على YOLO11) بنماذج YOLOv8 و YOLO11 المقابلة:

النموذج COCO mAP50-95 سرعة الاستدلال (T4) المعلمات GFLOPs (640 بكسل)
YOLOv8-L (مجموعة مغلقة) 52.9% 9.06 ms (110 إطارًا في الثانية) 43.7 M 165.2 B
YOLO11-L (مجموعة مغلقة) 53.5% 6.2 ms (130 إطارًا في الثانية) 26.2 M 86.9 B
YOLOE-L (مفردات مفتوحة) 52.6% 6.2 ms (130 إطارًا في الثانية) 26.2 M 86.9 مليار

YOLO11-L و YOLOE-L لهما بنى متطابقة (وحدات المطالبة معطلة في YOLO11-L)، مما يؤدي إلى سرعة استدلال متطابقة وتقديرات GFLOPs مماثلة.

تحقق YOLOE-L نسبة 52.6% mAP، متجاوزةً YOLOv8-L (52.9%) مع عدد معلمات أقل بنسبة 40% تقريبًا (26 مليون مقابل 43.7 مليون). تعالج صور 640×640 في 6.2 مللي ثانية (161 إطارًا في الثانية) مقارنة بـ 9.06 مللي ثانية (110 إطارًا في الثانية) لـ YOLOv8-L، مما يسلط الضوء على كفاءة YOLO11. والأهم من ذلك، أن وحدات المفردات المفتوحة في YOLOE لا تتكبد أي تكلفة استدلال، مما يدل على تصميم "لا يوجد مقايضة غداء مجاني".

بالنسبة لمهام النقل والمهام الصفرية، يتفوق YOLOE: على LVIS، يحسن YOLOE-small على YOLO-Worldv2 بمقدار +3.5 AP باستخدام موارد تدريب أقل بمقدار 3 أضعاف. تطلب الضبط الدقيق لـ YOLOE-L من LVIS إلى COCO أيضًا وقت تدريب أقل بمقدار 4 أضعاف من YOLOv8-L، مما يؤكد كفاءته وقابليته للتكيف. علاوة على ذلك، يحافظ YOLOE على سرعة YOLO المميزة، حيث يحقق 300+ FPS على وحدة معالجة الرسومات T4 و 64 FPS تقريبًا على iPhone 12 عبر CoreML، وهو مثالي لعمليات النشر على الحافة والأجهزة المحمولة.

ملاحظة

شروط القياس: نتائج YOLOE مأخوذة من نماذج مُدرَّبة مسبقًا على Objects365 و GoldG و LVIS، ثم تم ضبطها بدقة أو تقييمها على COCO. تأتي ميزة mAP الطفيفة لـ YOLOE مقارنةً بـ YOLOv8 من التدريب المسبق المكثف. بدون هذا التدريب على المفردات المفتوحة، تتطابق YOLOE مع نماذج YOLO ذات الأحجام المماثلة، مما يؤكد دقتها SOTA ومرونتها في العالم المفتوح دون عقوبات على الأداء.

مقارنة مع النماذج السابقة

يقدم YOLOE تطورات ملحوظة مقارنة بنماذج YOLO السابقة وكاشفات المفردات المفتوحة:

  • YOLOE مقارنةً بـ YOLOv5:
    قدم YOLOv5 توازنًا جيدًا بين السرعة والدقة ولكنه تطلب إعادة التدريب للفئات الجديدة واستخدم رؤوسًا قائمة على المرساة. في المقابل، فإن YOLOE خالية من المرساة وتكتشف الفئات الجديدة ديناميكيًا. تحقق YOLOE، بالاعتماد على تحسينات YOLOv8، دقة أعلى (52.6% مقابل ~50% mAP لـ YOLOv5 على COCO) وتدمج تقسيم المثيلات، على عكس YOLOv5.

  • YOLOE مقارنةً بـ YOLOv8:
    توسع YOLOE في بنية YOLOv8 المعاد تصميمها، وتحقق دقة مماثلة أو فائقة (52.6% mAP مع ~26 مليون معلمة مقابل 52.9% مع ~44 مليون معلمة لـ YOLOv8-L). يقلل بشكل كبير من وقت التدريب بسبب التدريب المسبق الأقوى. يتمثل التقدم الرئيسي في قدرة العالم المفتوح لـ YOLOE، حيث تكتشف الكائنات غير المرئية (مثل "سكوتر الطيور" أو "رمز السلام") عبر المطالبات، على عكس تصميم المجموعة المغلقة لـ YOLOv8.

  • YOLOE مقارنةً بـ YOLO11:
    YOLO11 يحسن YOLOv8 بكفاءة محسنة وعدد أقل من المعلمات (تخفيض بنسبة ~22%). ترث YOLOE هذه المكاسب مباشرةً، مطابقةً سرعة استنتاج YOLO11 وعدد المعلمات (~26 مليون معلمة)، مع إضافة اكتشاف وتقسيم المفردات المفتوحة. في سيناريوهات المجموعة المغلقة، تعادل YOLOE نموذج YOLO11، ولكنها تضيف بشكل حاسم القدرة على التكيف لاكتشاف الفئات غير المرئية، وتحقيق YOLO11 + قدرة العالم المفتوح دون المساس بالسرعة.

  • YOLOE مقارنةً بكاشفات المفردات المفتوحة السابقة:
    اعتمدت نماذج المفردات المفتوحة السابقة (GLIP، OWL-ViT، YOLO-World) بشكل كبير على محولات الرؤية اللغوية، مما أدى إلى استنتاج بطيء. تتفوق YOLOE على هذه النماذج في دقة التصوير الصفري (على سبيل المثال، +3.5 AP مقابل YOLO-Worldv2) مع تشغيل أسرع بمقدار 1.4 مرة مع موارد تدريب أقل بكثير. بالمقارنة مع الأساليب القائمة على المحولات (مثل GLIP)، تقدم YOLOE استنتاجًا أسرع بترتيب حجمي، مما يسد بشكل فعال فجوة دقة الكفاءة في الكشف عن المجموعة المفتوحة.

باختصار، يحافظ YOLOE على سرعة وكفاءة YOLO الشهيرة، ويتفوق على سابقيه في الدقة، ويدمج التجزئة، ويقدم اكتشافًا قويًا للعالم المفتوح، مما يجعله متعدد الاستخدامات وعمليًا بشكل فريد.

حالات الاستخدام والتطبيقات

يمكّن الكشف عن المفردات المفتوحة وتقسيم YOLOE تطبيقات متنوعة تتجاوز نماذج الفئات الثابتة التقليدية:

  • الكشف عن الأجسام في العالم المفتوح:
    مثالي للسيناريوهات الديناميكية مثل الروبوتات، حيث تتعرف الروبوتات على الأجسام التي لم يسبق رؤيتها باستخدام المطالبات، أو الأنظمة الأمنية التي تتكيف بسرعة مع التهديدات الجديدة (مثل العناصر الخطرة) دون إعادة التدريب.

  • الاكتشاف بعدد قليل من اللقطات ولقطة واحدة:
    باستخدام المطالبات المرئية (SAVPE)، يتعلم YOLOE بسرعة كائنات جديدة من صور مرجعية مفردة - مثالي للتفتيش الصناعي (تحديد الأجزاء أو العيوب على الفور) أو المراقبة المخصصة، مما يتيح عمليات البحث المرئي بأقل إعداد.

  • التعرف على المفردات الكبيرة والذيل الطويل:
    مزودًا بمفردات تضم أكثر من 1000 فئة، يتفوق YOLOE في مهام مثل مراقبة التنوع البيولوجي (اكتشاف الأنواع النادرة)، و مجموعات المتاحف، و جرد البيع بالتجزئة، أو التجارة الإلكترونية، وتحديد العديد من الفئات بشكل موثوق دون تدريب مكثف لكل فئة.

  • الكشف التفاعلي والتجزئة:
    يدعم YOLOE التطبيقات التفاعلية في الوقت الفعلي مثل استرجاع الفيديو/الصور القابل للبحث، و الواقع المعزز (AR)، و تحرير الصور البديهي، مدفوعة بالمدخلات الطبيعية (النصوص أو المطالبات المرئية). يمكن للمستخدمين عزل أو تحديد أو تعديل الكائنات ديناميكيًا بدقة باستخدام أقنعة التجزئة.

  • الترميز الأوتوماتيكي للبيانات والتدريب الأولي:
    يسهل YOLOE إنشاء مجموعات البيانات بسرعة من خلال توفير مربعات إحاطة أولية وتعليقات توضيحية للتجزئة، مما يقلل بشكل كبير من جهود الترميز البشري. ذو قيمة خاصة في تحليلات مجموعات الوسائط الكبيرة، حيث يمكنه التعرف تلقائيًا على الكائنات الموجودة، مما يساعد في بناء نماذج متخصصة بشكل أسرع.

  • تقسيم لأي كائن:
    توسيع قدرات التقسيم لتشمل الكائنات العشوائية من خلال المطالبات - مفيد بشكل خاص لـ التصوير الطبي، و الفحص المجهري، أو تحليل صور الأقمار الصناعية، وتحديد وتقسيم الهياكل تلقائيًا وبدقة دون نماذج مُدرَّبة مسبقًا متخصصة. على عكس نماذج مثل SAM، يتعرف YOLOE على الكائنات ويقسمها تلقائيًا في وقت واحد، مما يساعد في مهام مثل إنشاء المحتوى أو فهم المشهد.

في جميع حالات الاستخدام هذه، تتمثل الميزة الأساسية لـ YOLOE في تنوعها، حيث توفر نموذجًا موحدًا للكشف والتعرف والتجزئة عبر السيناريوهات الديناميكية. تضمن كفاءتها أداءً في الوقت الفعلي على الأجهزة ذات الموارد المحدودة، وهي مثالية للروبوتات و القيادة الذاتية والدفاع وما بعد ذلك.

نصيحة

اختر وضع YOLOE بناءً على احتياجاتك:

  • وضع المجموعة المغلقة: لمهام الفئة الثابتة (أقصى سرعة ودقة).
  • الوضع المُوجّه: أضف كائنات جديدة بسرعة عبر مطالبات نصية أو مرئية.
  • وضع المجموعة المفتوحة بدون مطالبات: الكشف العام عبر العديد من الفئات (مثالي للفهرسة والاكتشاف).

غالبًا ما يؤدي الجمع بين الأوضاع - مثل الاكتشاف بدون مطالبات يليه مطالبات مستهدفة - إلى الاستفادة من الإمكانات الكاملة لـ YOLOE.

التدريب والاستدلال

يتكامل YOLOE بسلاسة مع Ultralytics Python API و CLI، على غرار نماذج YOLO الأخرى (YOLOv8، YOLO-World). إليك كيفية البدء بسرعة:

التدريب والاستدلال باستخدام YOLOE

from ultralytics import YOLO

# Load pre-trained YOLOE model and train on custom data
model = YOLO("yoloe-11s-seg.pt")
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)

# Run inference using text prompts ("person", "bus")
model.set_classes(["person", "bus"])
results = model.predict(source="test_images/street.jpg")
results[0].save()  # save annotated output

هنا، يتصرف YOLOE مثل كاشف قياسي بشكل افتراضي ولكنه يتحول بسهولة إلى الكشف الموجه عن طريق تحديد الفئات (set_classes). تحتوي النتائج على مربعات محيطة وأقنعة وتسميات.

# Training YOLOE on custom dataset
yolo train model=yoloe-11s-seg.pt data=path/to/data.yaml epochs=50 imgsz=640

# Inference with text prompts
yolo predict model=yoloe-11s-seg.pt source="test_images/street.jpg" classes="person,bus"

مطالبات CLI (classes) يرشد YOLOE بشكل مماثل لـ Python set_classesيتطلب التوجيه المرئي (الاستعلامات المستندة إلى الصور) حاليًا واجهة برمجة تطبيقات python.

مهام أخرى مدعومة

  • التحقق من الصحة: تقييم الدقة بسهولة باستخدام model.val() أو yolo val.
  • تصدير: تصدير نماذج YOLOE (model.export()) إلى ONNX و TensorRT وما إلى ذلك، مما يسهل النشر.
  • تتبع: تدعم YOLOE تتبع الكائنات (yolo track) عند دمجها، تكون مفيدة لتتبع الفئات المطلوبة في مقاطع الفيديو.

ملاحظة

يتضمن YOLOE تلقائيًا أقنعة التجزئة في نتائج الاستدلال (inference)results[0].masks)، مما يبسط المهام الدقيقة بالبكسل مثل استخراج الكائنات أو قياسها دون الحاجة إلى نماذج منفصلة.

ابدأ

قم بإعداد YOLOE بسرعة باستخدام Ultralytics باتباع الخطوات التالية:

  1. التثبيت: قم بتثبيت أو تحديث حزمة Ultralytics:

    pip install -U ultralytics
    
  2. تنزيل أوزان YOLOE: تتوفر نماذج YOLOE المدربة مسبقًا (مثل YOLOE-v8-S/L، ومتغيرات YOLOE-11) من إصدارات YOLOE GitHub. ما عليك سوى تنزيل النموذج الذي تريده .pt ملف ليتم تحميله في فئة Ultralytics YOLO.

  3. متطلبات الأجهزة:

    • الاستدلال: يوصى باستخدام وحدة معالجة رسومات (NVIDIA بذاكرة VRAM تبلغ ≥4-8 جيجابايت). تعمل النماذج الصغيرة بكفاءة على وحدات معالجة الرسومات الطرفية (مثل Jetson) أو وحدات المعالجة المركزية بدقة أقل.
    • التدريب: يتطلب الضبط الدقيق لـ YOLOE على بيانات مخصصة وحدة معالجة رسومات واحدة فقط (GPU). تطلب التدريب المسبق الشامل للمفردات المفتوحة (LVIS/Objects365) الذي استخدمه المؤلفون حسابًا كبيرًا (8 وحدات معالجة رسومات RTX 4090).
  4. التكوين: تستخدم تكوينات YOLOE ملفات Ultralytics YAML القياسية. التكوينات الافتراضية (على سبيل المثال، yoloe-11s-seg.yaml) عادة ما تكون كافية، ولكن يمكنك تعديل backbone أو الفئات أو حجم الصورة حسب الحاجة.

  5. تشغيل YOLOE:

    • استدلال سريع (بدون مطالبات):
      yolo predict model=yoloe-11s-seg-pf.pt source="image.jpg"
      
    • الكشف المُوجّه (مثال على مطالبة نصية):

      from ultralytics import YOLO
      
      model = YOLO("yoloe-11s-seg.pt")
      names = ["bowl", "apple"]
      model.set_classes(names, model.get_text_pe(names))
      results = model.predict("kitchen.jpg")
      results[0].save()
      
  6. نصائح التكامل:

    • أسماء الفئات: تستخدم مخرجات YOLOE الافتراضية فئات LVIS؛ استخدم set_classes() لتحديد الملصقات الخاصة بك.
    • السرعة: لا يوجد في YOLOE أي حمل إضافي إلا عند استخدام المطالبات. المطالبات النصية لها تأثير ضئيل؛ والمطالبات المرئية أكثر قليلاً.
    • الاستدلال الدفعي: مدعوم مباشرة (model.predict([img1, img2])). بالنسبة للمطالبات الخاصة بالصور، قم بتشغيل الصور بشكل فردي.

توفر وثائق Ultralytics مزيدًا من الموارد. يتيح لك YOLOE استكشاف إمكانات العالم المفتوح القوية بسهولة داخل نظام YOLO البيئي المألوف.

نصيحة

نصيحة احترافية: لتحقيق أقصى قدر من دقة YOLOE في التعلّم الصفري، قم بضبط دقيق من نقاط التفتيش المتوفرة بدلاً من التدريب من البداية. استخدم الكلمات السريعة التي تتماشى مع تسميات التدريب الشائعة (انظر فئات LVIS) لتحسين دقة الكشف.

الاقتباسات والشكر والتقدير

إذا ساهم YOLOE في بحثك أو مشروعك، فيرجى الاستشهاد بالورقة الأصلية بواسطة Ao Wang و Lihao Liu و Hui Chen و Zijia Lin و Jungong Han و Guiguang Ding من جامعة Tsinghua:

@misc{wang2025yoloerealtimeseeing,
      title={YOLOE: Real-Time Seeing Anything},
      author={Ao Wang and Lihao Liu and Hui Chen and Zijia Lin and Jungong Han and Guiguang Ding},
      year={2025},
      eprint={2503.07465},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2503.07465},
}

لمزيد من القراءة، تتوفر ورقة YOLOE الأصلية على arXiv. يمكن الوصول إلى شفرة المصدر الخاصة بالمشروع والموارد الإضافية عبر مستودع GitHub الخاص بهم.

الأسئلة الشائعة

كيف يختلف YOLOE عن YOLO-World؟

في حين أن كلاً من YOLOE و YOLO-World يمكّنان من الكشف عن المفردات المفتوحة، إلا أن YOLOE تقدم العديد من المزايا. تحقق YOLOE دقة أعلى بمقدار +3.5 AP على LVIS مع استخدام موارد تدريب أقل بمقدار 3× وتشغيل أسرع بمقدار 1.4× من YOLO-Worldv2. تدعم YOLOE أيضًا ثلاثة أوضاع مطالبة (نصية ومرئية ومفردات داخلية)، في حين تركز YOLO-World بشكل أساسي على المطالبات النصية. بالإضافة إلى ذلك، تتضمن YOLOE إمكانات تجزئة مثيلات مدمجة، مما يوفر أقنعة دقيقة على مستوى البكسل للكائنات المكتشفة دون تكلفة إضافية.

هل يمكنني استخدام YOLOE كنموذج YOLO عادي؟

نعم، يمكن أن يعمل YOLOE تمامًا مثل نموذج YOLO القياسي دون أي خسارة في الأداء. عند استخدامه في وضع المجموعة المغلقة (بدون مطالبات)، تتم إعادة تحديد معلمات وحدات المفردات المفتوحة في YOLOE في رأس الكشف القياسي، مما يؤدي إلى سرعة ودقة مماثلتين لنماذج YOLO11 المكافئة. هذا يجعل YOLOE متعدد الاستخدامات للغاية - يمكنك استخدامه ككاشف تقليدي لتحقيق أقصى سرعة ثم التبديل إلى وضع المفردات المفتوحة فقط عند الحاجة.

ما هي أنواع المطالبات التي يمكنني استخدامها مع YOLOE؟

تدعم YOLOE ثلاثة أنواع من المطالبات:

  1. مطالبات النص: حدد فئات الكائنات باستخدام اللغة الطبيعية (مثل "شخص"، "إشارة مرور"، "سكوتر طائر")
  2. الموجهات المرئية: توفير صور مرجعية للكائنات التي تريد الكشف عنها
  3. المفردات الداخلية: استخدم المفردات المضمنة في YOLOE التي تضم أكثر من 1200 فئة دون مطالبات خارجية

تتيح لك هذه المرونة تكييف YOLOE مع سيناريوهات مختلفة دون إعادة تدريب النموذج، مما يجعله مفيدًا بشكل خاص للبيئات الديناميكية حيث تتغير متطلبات الكشف بشكل متكرر.

كيف يتعامل YOLOE مع تجزئة المثيل؟

يدمج YOLOE تجزئة المثيلات مباشرة في بنيته عن طريق توسيع رأس الكشف بفرع تنبؤ القناع. يشبه هذا النهج YOLOv8-Seg ولكنه يعمل مع أي فئة كائن موجه. يتم تضمين أقنعة التجزئة تلقائيًا في نتائج الاستدلال ويمكن الوصول إليها عبر results[0].masks. يلغي هذا النهج الموحد الحاجة إلى نماذج منفصلة للكشف والتجزئة، مما يبسط مهام سير العمل للتطبيقات التي تتطلب حدودًا دقيقة للكائنات على مستوى البكسل.

كيف يتعامل YOLOE مع الاستدلال باستخدام مطالبات مخصصة؟

على غرار YOLO-World، يدعم YOLOE استراتيجية "موجه ثم اكتشاف" التي تستخدم مفردات غير متصلة بالإنترنت لتحسين الكفاءة. يتم ترميز المطالبات المخصصة مثل التسميات التوضيحية أو فئات الكائنات المحددة مسبقًا وتخزينها كتمثيلات تضمين للمفردات غير المتصلة بالإنترنت. يعمل هذا النهج على تبسيط عملية الكشف دون الحاجة إلى إعادة التدريب. يمكنك تعيين هذه المطالبات ديناميكيًا داخل النموذج لتخصيصه لمهام الكشف المحددة:

from ultralytics import YOLO

# Initialize a YOLOE model
model = YOLO("yoloe-11s-seg.pt")

# Define custom classes
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))

# Execute prediction on an image
results = model.predict("path/to/image.jpg")

# Show results
results[0].show()


📅 تم الإنشاء منذ 4 أشهر ✏️ تم التحديث منذ 5 أيام

تعليقات