تتبع متعدد الكائنات باستخدام Ultralytics YOLO

YOLO multi-object tracking with trajectory paths

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

لماذا تختار Ultralytics YOLO لتتبع الكائنات؟

تتسق مخرجات متتبعات Ultralytics مع اكتشاف الكائنات القياسي ولكنها تتميز بالقيمة المضافة المتمثلة في معرفات الكائنات. وهذا يجعل من السهل تتبع الكائنات في دفقات الفيديو وإجراء تحليلات لاحقة. إليك سبب تفكيرك في استخدام Ultralytics YOLO لاحتياجات تتبع الكائنات الخاصة بك:

  • الكفاءة: معالجة دفقات الفيديو في الوقت الفعلي دون المساس بـ الدقة.
  • المرونة: يدعم خوارزميات وإعدادات تتبع متعددة.
  • سهولة الاستخدام: خيارات Python API و CLI بسيطة للتكامل والنشر السريع.
  • قابلية التخصيص: سهل الاستخدام مع نماذج YOLO المدربة مخصصاً، مما يسمح بالتكامل في تطبيقات خاصة بالمجال.


Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀

التطبيقات الواقعية

النقلتجزئة التجزئةالاستزراع المائي
تتبع المركباتتتبع الأشخاصتتبع الأسماك
تتبع المركباتتتبع الأشخاصتتبع الأسماك

نظرة عامة على الميزات

يوسع Ultralytics YOLO ميزات اكتشاف الكائنات الخاصة به لتوفير تتبع قوي ومتعدد الاستخدامات للكائنات:

  • التتبع في الوقت الفعلي: تتبع الكائنات بسلاسة في الفيديوهات ذات معدل الإطارات العالي.
  • دعم متتبع متعدد: اختر من بين مجموعة متنوعة من خوارزميات التتبع الراسخة.
  • تكوينات متتبع قابلة للتخصيص: صمم خوارزمية التتبع لتلبية متطلبات محددة عن طريق ضبط معلمات مختلفة.

المتتبعات المتاحة

يدعم Ultralytics YOLO خوارزميات التتبع التالية. يمكن تفعيلها عن طريق تمرير ملف تكوين YAML ذي الصلة مثل tracker=tracker_type.yaml:

  • BoT-SORT - استخدم botsort.yaml لتفعيل هذا المتتبع.
  • ByteTrack - استخدم bytetrack.yaml لتفعيل هذا المتتبع.

المتتبع الافتراضي هو BoT-SORT.

التتبع

لتشغيل المتتبع على دفقات الفيديو، استخدم نموذج Detect أو Segment أو Pose مدرب مثل YOLO26n أو YOLO26n-seg أو YOLO26n-pose. يمكنك تدريب نماذج مخصصة محلياً أو على وحدات معالجة الرسوميات السحابية من خلال منصة Ultralytics.

مثال
from ultralytics import YOLO

# Load an official or custom model
model = YOLO("yolo26n.pt")  # Load an official Detect model
model = YOLO("yolo26n-seg.pt")  # Load an official Segment model
model = YOLO("yolo26n-pose.pt")  # Load an official Pose model
model = YOLO("path/to/best.pt")  # Load a custom-trained model

# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True)  # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # with ByteTrack

كما يمكن ملاحظته في الاستخدام أعلاه، التتبع متاح لجميع نماذج Detect و Segment و Pose التي يتم تشغيلها على الفيديوهات أو مصادر الدفق.

الإعدادات

وسائط التتبع

يتشارك تكوين التتبع الخصائص مع وضع Predict، مثل conf و iou و show. لمزيد من التكوينات، راجع صفحة نموذج Predict.

مثال
from ultralytics import YOLO

# Configure the tracking parameters and run the tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)

اختيار المتتبع

يسمح لك Ultralytics أيضاً باستخدام ملف تكوين متتبع معدل. للقيام بذلك، ما عليك سوى إنشاء نسخة من ملف تكوين المتتبع (على سبيل المثال، custom_tracker.yaml) من ultralytics/cfg/trackers وتعديل أي تكوينات (باستثناء tracker_type) حسب احتياجاتك.

مثال
from ultralytics import YOLO

# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")

راجع قسم وسائط المتتبع للحصول على وصف مفصل لكل معلمة.

وسائط المتتبع

يمكن ضبط بعض سلوكيات التتبع بدقة عن طريق تحرير ملفات تكوين YAML الخاصة بكل خوارزمية تتبع. تحدد هذه الملفات معلمات مثل العتبات، والمخازن المؤقتة، ومنطق المطابقة:

يوفر الجدول التالي وصفاً لكل معلمة:

معلومات عتبة المتتبع

إذا انخفضت درجة ثقة الاكتشاف عن track_high_thresh، فلن يقوم المتتبع بتحديث ذلك الكائن، مما يؤدي إلى عدم وجود مسارات نشطة.

المعلمةالقيم أو النطاقات الصالحةالوصف
tracker_typebotsort, bytetrackيحدد نوع المتتبع. الخيارات هي botsort أو bytetrack.
track_high_thresh0.0-1.0العتبة المستخدمة للارتباط الأول أثناء التتبع. تؤثر على مدى ثقة مطابقة الاكتشاف بمسار موجود.
track_low_thresh0.0-1.0عتبة للارتباط الثاني أثناء التتبع. تُستخدم عندما يفشل الارتباط الأول، مع معايير أكثر تساهلاً.
new_track_thresh0.0-1.0عتبة لتهيئة مسار جديد إذا لم يتطابق الاكتشاف مع أي مسارات موجودة. تتحكم في وقت اعتبار كائن جديد أنه ظهر.
track_buffer>=0مخزن مؤقت يُستخدم للإشارة إلى عدد الإطارات التي يجب أن تظل المسارات المفقودة فيها حية قبل إزالتها. قيمة أعلى تعني تحملاً أكبر للانسداد.
match_thresh0.0-1.0عتبة لمطابقة المسارات. القيم الأعلى تجعل المطابقة أكثر تساهلاً.
fuse_scoreTrue, Falseيحدد ما إذا كان يجب دمج درجات الثقة مع مسافات IoU قبل المطابقة. يساعد في موازنة المعلومات المكانية ومعلومات الثقة عند الارتباط.
gmc_methodorb, sift, ecc, sparseOptFlow, Noneالطريقة المستخدمة لتعويض الحركة العالمية. تساعد في حساب حركة الكاميرا لتحسين التتبع.
proximity_thresh0.0-1.0الحد الأدنى لـ IoU المطلوب لمطابقة صالحة مع ReID (إعادة التحديد). يضمن القرب المكاني قبل استخدام إشارات المظهر.
appearance_thresh0.0-1.0الحد الأدنى لتشابه المظهر المطلوب لـ ReID. يحدد مدى التشابه البصري الذي يجب أن يكون عليه اكتشافان ليتم ربطهما.
with_reidTrue, Falseيشير إلى ما إذا كان سيتم استخدام ReID. يتيح المطابقة القائمة على المظهر لتتبع أفضل عبر الانسدادات. مدعوم فقط بواسطة BoTSORT.
modelauto, yolo26[nsmlx]-cls.ptيحدد النموذج المراد استخدامه. الافتراضي هو auto، الذي يستخدم الميزات الأصلية إذا كان المكتشف هو YOLO، وإلا يستخدم yolo26n-cls.pt.

تمكين إعادة التحديد (ReID)

بشكل افتراضي، يتم إيقاف ReID لتقليل حمل الأداء. تمكينه بسيط - فقط اضبط with_reid: True في تكوين المتتبع. يمكنك أيضاً تخصيص model المستخدم لـ ReID، مما يسمح لك بالموازنة بين الدقة والسرعة اعتماداً على حالة الاستخدام الخاصة بك:

  • الميزات الأصلية (model: auto): يستفيد هذا من الميزات مباشرة من مكتشف YOLO لـ ReID، مما يضيف حداً أدنى من الحمل. إنه مثالي عندما تحتاج إلى مستوى معين من ReID دون التأثير بشكل كبير على الأداء. إذا كان المكتشف لا يدعم الميزات الأصلية، فإنه يعود تلقائياً لاستخدام yolo26n-cls.pt.
  • نماذج تصنيف YOLO: يمكنك تعيين نموذج تصنيف بشكل صريح (مثل yolo26n-cls.pt) لاستخراج ميزات ReID. يوفر هذا تضمينات أكثر تمييزاً، ولكنه يقدم تأخيراً إضافياً بسبب خطوة الاستدلال الإضافية.

للحصول على أداء أفضل، خاصة عند استخدام نموذج تصنيف منفصل لـ ReID، يمكنك تصديره إلى خلفية أسرع مثل TensorRT:

تصدير نموذج ReID إلى TensorRT
from torch import nn

from ultralytics import YOLO

# Load the classification model
model = YOLO("yolo26n-cls.pt")

# Add average pooling layer
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool

# Export to TensorRT
model.export(format="engine", half=True, dynamic=True, batch=32)

بمجرد التصدير، يمكنك الإشارة إلى مسار نموذج TensorRT في تكوين المتتبع الخاص بك، وسيتم استخدامه لـ ReID أثناء التتبع.

أمثلة Python



Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡

حلقة استمرار المسارات

إليك نص برمجي بلغة Python يستخدم OpenCV (cv2) و YOLO26 لتشغيل تتبع الكائنات على إطارات الفيديو. يفترض هذا النص البرمجي أن الحزم الضرورية (opencv-python و ultralytics) مثبتة بالفعل. تخبر وسيطة persist=True المتتبع أن الصورة أو الإطار الحالي هو التالي في تسلسل وأن عليه توقع مسارات من الصورة السابقة في الصورة الحالية.

حلقة for للدفق مع التتبع
import cv2

from ultralytics import YOLO

# Load the YOLO26 model
model = YOLO("yolo26n.pt")

# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLO26 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True)

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Display the annotated frame
        cv2.imshow("YOLO26 Tracking", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

يرجى ملاحظة التغيير من model(frame) إلى model.track(frame)، الذي يتيح تتبع الكائنات بدلاً من الاكتشاف البسيط. سيقوم هذا النص البرمجي المعدل بتشغيل المتتبع على كل إطار من الفيديو، وتصور النتائج، وعرضها في نافذة. يمكن الخروج من الحلقة بالضغط على 'q'.

رسم المسارات بمرور الوقت

يمكن أن يوفر تصور مسارات الكائنات عبر إطارات متتالية رؤى قيمة حول أنماط الحركة وسلوك الكائنات المكتشفة داخل الفيديو. مع Ultralytics YOLO26، يعد رسم هذه المسارات عملية سلسة وفعالة.

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

رسم المسارات عبر إطارات فيديو متعددة
from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Load the YOLO26 model
model = YOLO("yolo26n.pt")

# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Store the track history
track_history = defaultdict(lambda: [])

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLO26 tracking on the frame, persisting tracks between frames
        result = model.track(frame, persist=True)[0]

        # Get the boxes and track IDs
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # Visualize the result on the frame
            frame = result.plot()

            # Plot the tracks
            for box, track_id in zip(boxes, track_ids):
                x, y, w, h = box
                track = track_history[track_id]
                track.append((float(x), float(y)))  # x, y center point
                if len(track) > 30:  # retain 30 tracks for 30 frames
                    track.pop(0)

                # Draw the tracking lines
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Display the annotated frame
        cv2.imshow("YOLO26 Tracking", frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

التتبع متعدد الخيوط

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

في نص Python البرمجي المقدم، نستخدم وحدة threading في Python لتشغيل مثيلات متعددة من المتتبع في وقت واحد. كل خيط مسؤول عن تشغيل المتتبع على ملف فيديو واحد، وتعمل جميع الخيوط في وقت واحد في الخلفية.

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

يتم استخدام نموذجين مختلفين في هذا المثال: yolo26n.pt و yolo26n-seg.pt، حيث يتتبع كل منهما الكائنات في ملف فيديو مختلف. يتم تحديد ملفات الفيديو في SOURCES.

تعني معلمة daemon=True في threading.Thread أن هذه الخيوط سيتم إغلاقها بمجرد انتهاء البرنامج الرئيسي. ثم نبدأ الخيوط باستخدام start() ونستخدم join() لجعل الخيط الرئيسي ينتظر حتى تنتهي كلتا خيوط المتتبع.

أخيراً، بعد أن تكمل جميع الخيوط مهمتها، يتم إغلاق النوافذ التي تعرض النتائج باستخدام cv2.destroyAllWindows().

تنفيذ التتبع متعدد الخيوط
import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # local video, 0 for webcam

def run_tracker_in_thread(model_name, filename):
    """Run YOLO tracker in its own thread for concurrent processing.

    Args:
        model_name (str): The YOLO26 model object.
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
    """
    model = YOLO(model_name)
    results = model.track(filename, save=True, stream=True)
    for r in results:
        pass

# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
    thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
    tracker_threads.append(thread)
    thread.start()

# Wait for all tracker threads to finish
for thread in tracker_threads:
    thread.join()

# Clean up and close windows
cv2.destroyAllWindows()

يمكن توسيع هذا المثال بسهولة للتعامل مع المزيد من ملفات الفيديو والنماذج عن طريق إنشاء المزيد من الخيوط وتطبيق نفس المنهجية.

المساهمة بمتتبعات جديدة

هل أنت بارع في تتبع الكائنات المتعددة وهل قمت بنجاح بتنفيذ أو تكييف خوارزمية تتبع باستخدام Ultralytics YOLO؟ ندعوك للمساهمة في قسم المتعقبات (Trackers) لدينا في ultralytics/cfg/trackers! يمكن أن تكون تطبيقاتك وحلولك الواقعية ذات قيمة لا تقدر بثمن للمستخدمين الذين يعملون على مهام التتبع.

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

لبدء مساهمتك، يرجى الرجوع إلى دليل المساهمة الخاص بنا للحصول على تعليمات شاملة حول إرسال طلب سحب (PR) 🛠️. نحن متحمسون لرؤية ما ستقدمه!

معًا، دعونا نعزز قدرات التتبع في نظام Ultralytics YOLO البيئي 🙏!

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

ما هو تتبع الكائنات المتعددة وكيف يدعمه Ultralytics YOLO؟

يتضمن تتبع الكائنات المتعددة في تحليلات الفيديو تحديد الكائنات والحفاظ على معرف فريد (ID) لكل كائن تم اكتشافه عبر إطارات الفيديو. يدعم Ultralytics YOLO ذلك من خلال توفير تتبع في الوقت الفعلي جنبًا إلى جنب مع معرفات الكائنات، مما يسهل مهام مثل المراقبة الأمنية وتحليلات الرياضة. يستخدم النظام متعقبات مثل BoT-SORT و ByteTrack، والتي يمكن تهيئتها عبر ملفات YAML.

كيف يمكنني تهيئة متعقب مخصص لـ Ultralytics YOLO؟

يمكنك تهيئة متعقب مخصص عن طريق نسخ ملف تهيئة متعقب موجود (على سبيل المثال، custom_tracker.yaml) من دليل تهيئة متعقب Ultralytics وتعديل المعلمات حسب الحاجة، باستثناء tracker_type. استخدم هذا الملف في نموذج التتبع الخاص بك كما يلي:

مثال
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")

كيف يمكنني تشغيل تتبع الكائنات على بث فيديو متعدد في وقت واحد؟

لتشغيل تتبع الكائنات على بث فيديو متعدد في وقت واحد، يمكنك استخدام وحدة threading في Python. سيتولى كل خيط (thread) التعامل مع بث فيديو منفصل. إليك مثال على كيفية إعداد ذلك:

التتبع متعدد الخيوط
import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # local video, 0 for webcam

def run_tracker_in_thread(model_name, filename):
    """Run YOLO tracker in its own thread for concurrent processing.

    Args:
        model_name (str): The YOLO26 model object.
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
    """
    model = YOLO(model_name)
    results = model.track(filename, save=True, stream=True)
    for r in results:
        pass

# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
    thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
    tracker_threads.append(thread)
    thread.start()

# Wait for all tracker threads to finish
for thread in tracker_threads:
    thread.join()

# Clean up and close windows
cv2.destroyAllWindows()

ما هي التطبيقات الواقعية لتتبع الكائنات المتعددة باستخدام Ultralytics YOLO؟

لتتبع الكائنات المتعددة باستخدام Ultralytics YOLO تطبيقات عديدة، بما في ذلك:

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

تستفيد هذه التطبيقات من قدرة Ultralytics YOLO على معالجة مقاطع الفيديو ذات معدل الإطارات العالي في الوقت الفعلي وبدقة استثنائية.

كيف يمكنني تصور مسارات الكائنات عبر إطارات فيديو متعددة باستخدام Ultralytics YOLO؟

لتصور مسارات الكائنات عبر إطارات فيديو متعددة، يمكنك استخدام ميزات التتبع الخاصة بنموذج YOLO جنبًا إلى جنب مع OpenCV لرسم مسارات الكائنات المكتشفة. إليك نموذج نص برمجي يوضح ذلك:

رسم المسارات عبر إطارات فيديو متعددة
from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        boxes = results[0].boxes.xywh.cpu()
        track_ids = results[0].boxes.id.int().cpu().tolist()
        annotated_frame = results[0].plot()
        for box, track_id in zip(boxes, track_ids):
            x, y, w, h = box
            track = track_history[track_id]
            track.append((float(x), float(y)))
            if len(track) > 30:
                track.pop(0)
            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
        cv2.imshow("YOLO26 Tracking", annotated_frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

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

التعليقات