رؤية YOLO 2026:

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

YOLO multi-object tracking with trajectory paths

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

🚀 أدوات تتبع جديدة: OC-SORT، Deep OC-SORT، FastTracker، و TrackTrack

بدءاً من إصدار Ultralytics YOLO v8.4.63، أصبحت OC-SORT وDeep OC-SORT وFastTracker وTrackTrack متوفرة إلى جانب BoT-SORT و ByteTrack.

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

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

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


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

تطبيقات العالم الحقيقي#

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

بدء التشغيل السريع#

قم بت تشغيل التتبع على فيديو باستخدام متتبع TrackTrack الافتراضي. انتقل إلى متتبع آخر عن طريق تغيير معامل tracker.

مثال
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Default tracker (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)

# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")

لتشغيل المتتبع على دفقات الفيديو، استخدم نموذج كشف أو تجزئة أو وضع أو OBB مدرباً مثل YOLO26n أو YOLO26n-seg أو YOLO26n-pose أو YOLO26n-obb. يمكنك تدريب نماذج مخصصة محلياً أو باستخدام التدريب السحابي على منصة 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

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

يأتي Ultralytics YOLO مزوداً بستة متتبعات مدمجة. قم بتنشيط أحدها عن طريق تمرير ملف تكوين YAML الخاص به إلى معامل tracker.

المتتبعملف الإعدادنموذج الحركةالمظهر / ReIDتعويض حركة الكاميرامعالجة الإخفاء
BoT-SORTbotsort.yamlكالمان خطياختياري (with_reid)قابل للتكوين (gmc_method)مخزن تتبع + إعادة ربط ReID
ByteTrackbytetrack.yamlكالمان خطيلا يوجدلاإنقاذ منخفض الثقة على مرحلتين
OC-SORTocsort.yamlكالمان متمحور حول الملاحظةلا يوجدلاإعادة تحديث ORU, OCM, OCR من آخر ملاحظة
Deep OC-SORTdeepocsort.yamlكالمان متمحور حول الملاحظةاختياري (with_reid)قابل للتكوين (gmc_method)OC-SORT + ميزة مطابقة المظهر التكيفية الاختيارية EMA
FastTrackerfasttrack.yamlكالمان خطي + تراجعلا يوجدلاتراجع كالمان + تكبير bbox عند الإخفاء
TrackTracktracktrack.yamlكالمان خطي (NSA)اختياري (with_reid)قابل للتكوين (gmc_method)ربط تكراري متعدد الإشارات + TAI

أي متتبع يجب أن أستخدم؟#

استخدم هذا التدفق لاختيار نقطة بداية؛ يتم استخدام tracktrack.yaml عندما لا تمرر أي tracker:

  1. هل تحتاج إلى أسرع وأبسط خط أساس؟ByteTrack (لا يوجد ReID، لا يوجد تعويض حركة كاميرا، حد أدنى من النفقات العامة).
  2. لقطات محمولة باليد أو بطائرة بدون طيار أو بكاميرا متحركة؟BoT-SORT (يضيف تعويض حركة الكاميرا وإعادة التعرّف ReID الاختياري).
  3. حركة غير خطية (رياضة، رقص، انعطافات مفاجئة) ولا يوجد ReID؟OC-SORT (تصحيحات متمحورة حول الملاحظة بدون تكلفة مظهر).
  4. مشاهد مزدحمة بكاميرات متحركة حيث تبديلات الهوية هي المشكلة الأساسية؟Deep OC-SORT أو TrackTrack (كلاهما يدعم مطابقة المظهر الاختيارية؛ ويضيف TrackTrack أيضاً ربطاً متعدد الإشارات وقمع الهويات المكررة).
  5. تداخل جزئي متكرر في الوقت الفعلي، لا توجد ميزانية لـ ReID؟FastTracker (متغير ByteTrack واعي بالإخفاء مع تراجع كالمان).

تبديل المتتبعات#

مرّر اسم ملف تكوين المتتبع إلى tracker=. يظل باقي الكود كما هو.

مثال
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")

الإعدادات#

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

يتشارك تكوين التتبع خصائص مع وضع التنبؤ (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 مرحلة الربط الأولى. يمكن للاكتشافات الواقعة بين track_low_thresh و track_high_thresh استعادة المسارات الحالية عندما يُمكّن المتتبع المحدد ربط الثقة المنخفضة، لكنها لا تبدأ مسارات جديدة. يتم تجاهل الاكتشافات عند أو تحت track_low_thresh.

المعاملالقيم أو النطاقات الصالحةالوصف
tracker_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackيحدد نوع المتتبع.
track_high_thresh0.0-1.0حد الربط الأول. يؤثر على مدى ثقة مطابقة اكتشاف بمسار موجود.
track_low_thresh0.0-1.0الحد الأدنى لاكتشافات استعادة الثقة المنخفضة. تستخدمها OC-SORT و Deep OC-SORT فقط عندما تكون use_byte: True؛ بينما يدرجها TrackTrack في مجموعة الربط المعاقبة الخاصة به.
new_track_thresh0.0-1.0حد بدء مسار جديد إذا لم يتطابق الاكتشاف مع أي مسارات موجودة.
track_buffer>=0عدد الإطارات التي يتم فيها الاحتفاظ بالمسارات المفقودة قبل الإزالة. قيمة أعلى تعني تحملاً أكبر للإخفاء.
match_thresh0.0-1.0حد مطابقة المسارات. القيم الأعلى تجعل المطابقة أكثر تساهلاً.
fuse_scoreTrue، Falseما إذا كان يجب دمج درجات الثقة مع مسافات IoU قبل المطابقة.
gmc_methodsparseOptFlow, orb, sift, ecc, noneطريقة تعويض الحركة العالمية. تساعد في حساب حركة الكاميرا.
proximity_thresh0.0-1.0الحد الأدنى لـ IoU المطلوب لمطابقة ReID صالحة. يضمن القرب المكاني قبل استخدام إشارات المظهر.
appearance_thresh0.0-1.0الحد الأدنى لتشابه المظهر المُطَبَّع المطلوب لإعادة تحديد الهوية (ReID).
with_reidTrue، Falseتفعيل المطابقة القائمة على المظهر لتحسين التتبع عبر حالات الإخفاء. مدعوم بواسطة BoT-SORT و Deep OC-SORT و TrackTrack.
modelمسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق autoنموذج إعادة تحديد الهوية (ReID). يستخدم auto ميزات الهيكل الأساسي (backbone) الأصلية لـ YOLO عند توفرها؛ وإلا فإنه يعود إلى yolo26n-cls.pt. يمكن أن يكون المُشَفِّر المخصص نقاط تفتيش .pt أو نموذجاً مُصَدَّراً مثل .torchscript أو .onnx أو .engine أو مجلد نموذج OpenVINO.

وسائط التتبع الخاصة#

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

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

تم تعطيل ReID افتراضياً تقليلاً للنِفق العبئي (overhead). قم تمكينه عن طريق تعيين with_reid: True في ملف تكوين المتتبع.

خيارات نموذج ReID:

  • model: auto — يستخدم ميزات كاشف YOLO الأصلي، مما يضيف حداً أدنى من الحمل الزائد. مثالي عندما تحتاج إلى بعض ميزات ReID دون تأثير كبير على الأداء. يعود إلى yolo26n-cls.pt إذا كان الكاشف لا يكشف عن ميزات متوافقة.
  • نموذج إعادة تحديد الهوية (ReID) مخصص — قم بتوجيه model: إلى نقطة تفتيش .pt أو نموذج تضمين مُصَدَّر متوافق، مثل .torchscript أو .onnx أو .engine أو مجلد نموذج OpenVINO. يتم تحميل النماذج المُصَدَّرة عبر AutoBackend ويجب أن تُخرج موتر تضمين (embedding tensor) مباشرة.

تم نشر مشفرات ONNX الجاهزة للاستخدام لكل حجم نموذج. اضبط model: على أحد هذه الأسماء وسيتم تنزيل الملف تلقائياً في المرة الأولى التي يعمل فيها المتتبع (بنفس الطريقة التي يتم بها جلب أوزان YOLO) — دون الحاجة إلى تصدير يدوي أو خطوة تنزيل:

# In your tracker config (e.g. tracktrack.yaml)
with_reid: True
model: yolo26n-reid.onnx # downloaded on first use; swap n→s/m/l/x for a larger encoder
النموذجالحجم
(بكسل)
المعاملات
(مليون)
عمليات الفاصلة العائمة (FLOPs)
(مليار)
YOLO26n-reid.onnx4482.82.0
YOLO26s-reid.onnx4487.56.6
YOLO26m-reid.onnx44812.420.1
YOLO26l-reid.onnx44815.325.2
YOLO26x-reid.onnx44832.755.9
ReID مخصص للتتبع فقط

مشفرات ReID بتقنية ONNX لفرع مظهر المتتبع هي وحدها المتاحة حالياً. أوضاع ReID train وval وpredict، بالإضافة إلى وصفات تصدير ReID المخصصة، لا تزال قيد التطوير.

للحصول على أداء أفضل مع نموذج تصنيف منفصل، قم بتصديره إلى backend أسرع مثل 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", quantize=16, dynamic=True, batch=32)

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

تفاصيل المتتبع#

قم بتوسيع الأقسام أدناه للاطلاع على تصميم كل متتبع، والمعلمات المحددة، ونصائح الضبط.

BoT-SORT#

BoT-SORT (Aharon et al., 2022) يوسع نطاق ByteTrack ليشمل تعويض حركة الكاميرا وإعادة التعرّف ReID الاختياري:

  • تعويض حركة الكاميرا (CMC): يتم تطبيق التواء تقاربي مقدر لكل إطار (تدفق بصري متناثر افتراضياً؛ تتوفر أيضاً ORB / ECC) على حالات Kalman قبل مطابقة IoU.
  • ReID اختياري: يمكن دمج تضمينات المظهر في مصفوفة التكلفة. معطل افتراضياً؛ يمكّن باستخدام with_reid: True.

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

وسائط خاصة بـ BoT-SORT:

المعاملالقيم أو النطاقات الصالحةالوصف
gmc_methodsparseOptFlow, orb, sift, ecc, noneالخلفية المسؤولة عن تعويض حركة الكاميرا. sparseOptFlow هو الافتراضي. تعطِّل none ميزة CMC.
with_reidTrue، Falseتمكين المطابقة القائمة على المظهر. متوقف افتراضياً.
modelمسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق autoيستخدم auto ميزات YOLO الأصلية عند توفرها؛ ويمكن أن تكون النماذج المخصصة نقاط تفتيش .pt أو صادرات متوافقة.
proximity_thresh0.0-1.0الحد الأدنى لـ IoU قبل اعتبار ميزات المظهر.
appearance_thresh0.0-1.0الحد الأدنى لتشابه المظهر المُطَبَّع المطلوب لمطابقة إعادة تحديد الهوية (ReID). ارفع القيمة لجعل المطابقة أكثر صارمة.

نصائح الضبط:

  • كاميرا ثابتة: اضبط gmc_method: none لتوفير بضع ملي ثانية لكل إطار.
  • حركة كاميرا كثيفة: احتفظ بـ sparseOptFlow؛ حيث تكون ecc أكثر دقة ولكنها أبطأ.
  • حشود متشابهة: قم بتشغيل with_reid: True ورفع قيمة appearance_thresh (على سبيل المثال، 0.85+).

ByteTrack#

ByteTrack (Zhang et al., ECCV 2022) هو الخط الأساسي خفيف الوزن. وهو يغذي خوارزمية كالمان الخطية + IoU مع ربط من مرحلتين:

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

لا يوجد نموذج مظهر ولا تعويض لحركة الكاميرا.

الأفضل لـ: الكاميرات الثابتة أو شبه الثابتة حيث تهيمن تكلفة الكاشف وتريد الحد الأدنى من عبء المتتبع.

المعاملات الخاصة بـ ByteTrack: لا توجد معاملات تتجاوز معاملات المتتبع المشتركة.

نصائح الضبط:

  • كاشف مزعج: قم بخفض track_low_thresh بحيث تحتوي المرحلة الثانية على مرشحين أكثر.
  • كاشف عالي الاسترجاع: ارفع track_high_thresh لتقليل المعرّفات المجزأة.
  • ومضات المعرّفات المتكررة: ارفع track_buffer حتى تتمكن المسارات المفقودة لفترة وجيزة من البقاء.

OC-SORT#

OC-SORT (Cao et al., CVPR 2023) هو امتداد لـ SORT محور حول المراقبة. إنه يحتفظ بتصميم SORT خفيف الوزن (بدون ميزات المظهر) ويضيف ثلاثة تصحيحات:

  • إعادة التحديث المتمحور حول الملاحظة (ORU): يعيد تشغيل مسار افتراضي بين آخر ملاحظة والاكتشاف الحالي، مع إعادة تشغيل تحديث Kalman لإصلاح السرعة المنجرفة.
  • الزخم المتمحور حول الملاحظة (OCM): يعاقب الاكتشافات التي تتحرك في الاتجاه الخاطئ عبر مصطلح اتساق السرعة.
  • الاسترداد المتمحور حول الملاحظة (OCR): يعيد فحص الاكتشافات غير المطابقة مقابل المسارات المفقودة مؤخراً باستخدام آخر ملاحظة لها بدلاً من الحالة المتوقعة.

الأفضل لـ: الحركة غير الخطية بدون تكلفة نموذج ReID.

وسائط خاصة بـ OC-SORT:

المعاملالقيم أو النطاقات الصالحةالوصف
delta_t>=1نافذة زمنية (إطارات) لحساب اتجاه السرعة في OCM. القيم الأكبر تزيد من التنعيم.
inertia0.0-1.0وزن تكلفة اتساق السرعة. القيم الأعلى تعاقب تغييرات الاتجاه المفاجئة.
use_byteTrue، Falseتمكين تمريرة ربط ثانية بنمط ByteTrack عبر اكتشافات منخفضة الثقة.

نصائح الضبط:

  • حركة غير خطية: ارفع inertia (على سبيل المثال، 0.3-0.4).
  • اكتشافات متفرقة: قم بتمكين use_byte: True.
  • حجب طويل: ارفع track_buffer ليكون لدى OCR المزيد من المسارات المفقودة لإعادة ربطها.

مع نماذج OBB، يستخدم OCR الصندوق المُوجَّه المتوقع بواسطة Kalman نظراً لعدم الاحتفاظ بسجل الملاحظة الأخيرة المُوجَّه.

Deep OC-SORT#

Deep OC-SORT يعزز OC-SORT بمعلومات المظهر وتعويض حركة الكاميرا:

  • مطابقة المظهر: تتم موازنة مسافة تضمين جيب تمام التمام (cosine embedding) عن طريق التداخل ويتم دمجها مع تكلفة الحركة.
  • EMA المظهر الديناميكي: يتم تحديث تضمينات المسار باستخدام EMA الذي يتكيف عامل تنعيمه مع ثقة الاكتشاف.
  • تعويض حركة الكاميرا: يتم التواء حالات Kalman من إطار إلى إطار عبر التدفق البصري المتناثر أو ORB أو ECC.

الأفضل لـ: المشاهد المزدحمة أو ذات الكاميرات المتحركة حيث تكون تبديلات الهوية بين الكائنات المتشابهة بصرياً والمتقاربة مكانياً شائعة.

وسائط خاصة بـ Deep OC-SORT:

المعاملالقيم أو النطاقات الصالحةالوصف
with_reidTrue، Falseتمكين المطابقة القائمة على المظهر. متوقف افتراضياً.
modelمسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق autoيستخدم auto ميزات YOLO الأصلية عند توفرها؛ ويمكن أن تكون النماذج المخصصة نقاط تفتيش .pt أو صادرات متوافقة.
proximity_thresh0.0-1.0الحد الأدنى لـ IoU قبل اعتبار ميزات المظهر.
appearance_thresh0.0-1.0الحد الأدنى لتشابه المظهر المُطَبَّع المطلوب لمطابقة إعادة تحديد الهوية (ReID).
alpha_fixed_emb0.0-1.0عامل EMA الأساسي لتحديثات تضمين المسار. القيم الأعلى تحافظ على التضمين الأقدم لفترة أطول.
gmc_methodsparseOptFlow, orb, sift, ecc, noneطريقة تعويض الحركة العالمية.
delta_t>=1نافذة زمنية (إطارات) لحساب اتجاه السرعة في OCM (موروثة من OC-SORT).
inertia0.0-1.0وزن تكلفة اتساق السرعة (موروثة من OC-SORT).
use_byteTrue، Falseتمكين ربط ثانٍ بنمط ByteTrack عبر الاكتشافات منخفضة الثقة (موروث من OC-SORT).

نصائح الضبط:

  • تبديلات الهوية في الحشود: ارفع appearance_thresh (على سبيل المثال 0.92-0.95) وارفع alpha_fixed_emb لكي تتكيف التضمينات بشكل أبطأ.
  • كاميرا متحركة: اضبط gmc_method: sparseOptFlow (الوضع الافتراضي لـ Deep OC-SORT هو none).
  • كمون أقل: احتفظ بـ with_reid: False (الافتراضي) للحركة + CMC فقط؛ وقم بتمكين ReID فقط عندما تسيطر تبديلات المعرّفات على الأخطاء.

FastTracker#

FastTracker هو متغير ByteTrack مدرك للحجب ولا يحتوي على نموذج مظهر:

  • اكتشاف الحجب: يشير إلى المسارات المحجوبة عندما يتجاوز تغطية المسارات النشطة الأخرى occ_cover_thresh.
  • تراجع Kalman عند الانسداد: يعيد حالة Kalman إلى إطار ما قبل الانسداد باستخدام سجل المخزن المؤقت الحلقي.
  • تخميد الحركة وتوسيع البحث: يتم تخميد السرعة وتوسيع bbox المتوقع أثناء الانسداد.
  • كبت Init-IoU: يمنع المسارات الجديدة من الظهور فوق المسارات النشطة.

الأفضل لـ: خطوط أنابيب الاكتشاف فقط في الوقت الفعلي مع تداخل متكرر بين الأهداف (حشود، طوابير، رياضات).

وسائط خاصة بـ FastTracker:

المعاملالقيم أو النطاقات الصالحةالوصف
reset_velocity_offset_occ>=0إطارات السجل التي يتم الرجوع إليها لاستعادة سرعة Kalman عند بدء الانسداد.
reset_pos_offset_occ>=0إطارات السجل التي يتم الرجوع إليها لاستعادة موضع Kalman عند بدء الانسداد.
enlarge_bbox_occ>=1.0تحجيم الارتفاع المطبق على bbox المتوقع أثناء الانسداد (يتم تغيير العرض عبر نسبة العرض إلى الارتفاع XYAH).
dampen_motion_occ0.0-1.0مضاعف السرعة أثناء الانسداد. القيم الأقل تجعل المسار "يتباطأ" خلال الانسداد.
active_occ_to_lost_thresh>=1أقصى عدد من الإطارات المحجوبة المتتالية قبل نقل مسار نشط إلى مفقود.
occ_cover_thresh0.0-1.0جزء من مساحة المسار المغطاة بمسار نشط آخر للإعلان عن الحجب.
occ_reappear_window>=0الإطارات التي يظل فيها المسار المفقود المحجوب مؤخرًا قابلاً لإعادة العثور عليه بشكل تفضيلي.
init_iou_suppress0.0-1.0قم بقمع تهيئة المسار الجديد إذا تجاوز تقاطعها مع أي مسار نشط هذه القيمة. اضبط على 1.0 للتعطيل.

نصائح الضبط:

  • الحجب الجزئي المتكرر: قم بخفض occ_cover_thresh (على سبيل المثال، 0.5-0.6).
  • معرّفات مكررة حول التداخل: قم بخفض init_iou_suppress (على سبيل المثال، 0.5).
  • الحجب الطويل: ارفع occ_reappear_window وtrack_buffer معاً.
  • الأهداف سريعة الحركة: ارفع dampen_motion_occ (أقرب إلى 1.0)؛ وارفع enlarge_bbox_occ فقط عندما تحسن منطقة البحث الأوسع الاستعادة.

TrackTrack#

TrackTrack (Shim et al., CVPR 2025) هو المتتبع الافتراضي. وهو يستنتج من منظور كل مسار باستخدام الارتباط التكراري متعدد الإشارات:

  • الربط القائم على منظور المسار (TPA): يجمع بين HMIoU، ومسافة ReID لجيب تمام التمام الاختيارية، ومسافة إسقاط الثقة، ومسافة زاوية الركن. يتم حل التعيين بشكل تكراري باستخدام عتبة مرنة.
  • التهيئة الواعية بالمسار (TAI): تقمع التوليدات المكررة قبل إنشاء معرف جديد.

الأفضل لـ: المشاهد المزدحمة ذات الحجب المتكرر حيث تكون المعرفات المكررة مشكلة.

وسائط خاصة بـ TrackTrack:

المعاملالقيم أو النطاقات الصالحةالوصف
iou_weight0.0-1.0وزن مسافة HMIoU عند تفعيل ReID؛ وإلا يتم استخدام HMIoU مباشرة.
reid_weight0.0-1.0وزن مسافة ReID لجيب تمام التمام عند تفعيل ReID؛ وإلا يتم تجاهلها.
conf_weight0.0-1.0وزن مسافة إسقاط الثقة.
angle_weight0.0-1.0وزن مسافة زاوية الركن.
penalty_p0.0-1.0عقوبة التكلفة للاكتشافات ذات الثقة المنخفضة.
penalty_q0.0-1.0عقوبة التكلفة للاكتشافات التي تم استردادها بواسطة NMS الثانوية.
reduce_step0.0-1.0تخفيف عتبة المطابقة لكل تكرار.
tai_thr0.0-1.0عتبة IoU لـ NMS الخاصة بالتهيئة الواعية بالمسار.
min_track_len>=0الحد الأدنى لطول السجل قبل تأكيد مسار جديد.
lost_match_thr0.0-1.0بوابة تكلفة أكثر مرونة لمرور إعادة ربط المفقودات؛ تعطله 0.
with_reidTrue، Falseتمكين مطابقة المظهر ReID بجيب التمام (يستخدم ميزات YOLO الأصلية). متوقف افتراضياً.
modelمسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق autoيستخدم auto ميزات YOLO الأصلية عند توفرها؛ ويمكن أن تكون النماذج المخصصة نقاط تفتيش .pt أو صادرات متوافقة.
gmc_methodsparseOptFlow, orb, sift, ecc, noneطريقة تعويض الحركة العالمية.

نصائح الضبط:

  • مشاة مزدحمون: قم بخفض tai_thr (على سبيل المثال، 0.45) لقمع المزيد من النسخ المكررة المنبثقة؛ واعرف track_buffer للحجب الأطول.
  • حركة كاميرا سريعة: احتفظ بـ gmc_method: sparseOptFlow ممكناً.
  • أجسام صغيرة/سريعة: ارفع angle_weight قليلاً واخفض min_track_len.
  • تمكين ReID فقط عند الحاجة: يضيف تكلفة استنتاج؛ بالنسبة للحجب القصير، عادة ما تكون التكلفة متعددة الإشارات الافتراضية كافية.

مع نماذج التقسيم (Segment) وتحديد الوضعيات (Pose)، يتخلى TrackTrack عن استعادة اكتشاف NMS الفضفاض بحيث تظل الأقنعة والنقاط الرئيسية محاذاة لاكتشافاتها.

أمثلة Python#



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

حلقة تتبع المسارات المستمرة#

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

استمرار المسارات واختيار المتعقب

استخدم persist=True فقط عند تمرير إطارات متتالية من نفس دفق الفيديو إلى model.track(). يتيح هذا للمتتبع إعادة استخدام الحالة من الإطارات السابقة والحفاظ على معرّفات مسار متسقة بمرور الوقت. لا تستخدم persist=True عبر صور غير ذات صلة أو دفق مختلف، نظراً لأن حالة المسار السابقة يمكن أن تُرحّل.

يمكنك أيضاً اختيار خلفية متتبع عن طريق تمرير ملف تكوين متتبع، مثل tracker="botsort.yaml" أو tracker="bytetrack.yaml" أو tracker="tracktrack.yaml".

حلقة 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
        # and using the BoT-SORT tracker backend
        results = model.track(frame, persist=True, tracker="botsort.yaml")

        # 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(list)

# 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 لتشغيل عدة مثيلات للمتتبع في وقت واحد. كل خيط (thread) مسؤول عن تشغيل المتتبع على ملف فيديو واحد، وتعمل جميع الخيوط في وقت واحد في الخلفية.

لضمان حصول كل خيط على المعاملات الصحيحة (ملف الفيديو، النموذج المراد استخدامه، ومؤشر الملف)، نقوم بتعريف دالة 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): Model checkpoint name or path loaded inside the thread.
        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/cfg/trackers! يمكن أن تكون تطبيقاتك وحلولك الواقعية لا تقدر بثمن للمستخدمين الذين يعملون على مهام التتبع.

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

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

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

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

  • يتضمن تتبع الأجسام المتعددة في تحليلات الفيديو كلاً من تحديد الأجسام والحفاظ على معرّف فريد لكل جسم مكتشف عبر إطارات الفيديو. يدعم Ultralytics YOLO ذلك من خلال توفير التتبع في الوقت الفعلي جنباً إلى جنب مع معرّفات الأجسام، مما يسهل مهام مثل المراقبة الأمنية وتحليلات الرياضة. يستخدم النظام متتبعات مثل BoT-SORT وByteTrack وOC-SORT وDeep OC-SORT وFastTracker وTrackTrack، والتي يمكن تكوينها عبر ملفات YAML.

  • لا. تخزن ملفات .pt القياسية الخاصة بـ Ultralytics أوزان نموذج YOLO، بينما يتم إنشاء المتتبع وقت الاستدلال بواسطة model.track(). تعتمد معرّفات المسار على حالة المتتبع عبر الإطارات المتتالية، لذا يمكن لصورة واحدة قائمة بذاتها إرجاع اكتشافات مثل الصناديق، والفئات، ومستويات الثقة، ولكنها لا تستطيع إنتاج معرّفات تتبع مستمرة ذات مغزى بمفردها.

    للنشر، قم بتجميع الكاشف والمتتبع معاً في تطبيقك وقم باستدعاء model.track() إطاراً بإطار باستخدام persist=True عندما تأتي الإطارات من نفس دفق الفيديو. استخدم نماذج أو مثيلات متتبعات منفصلة للدفقات غير المرتبطة حتى لا تُرحّل الحالة بين مقاطع الفيديو.

  • يمكنك تكوين متتبع مخصص عن طريق نسخ ملف تكوين متتبع موجود (على سبيل المثال، 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. سيقوم كل خيط بمعالجة دفق فيديو منفصل. إليك مثالاً لكيفية إعداد ذلك:

    التتبع متعدد الخيوط
    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): Model checkpoint name or path loaded inside the thread.
            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 على معالجة فيديوهات عالية الإطارات في الوقت الفعلي بدقة استثنائية.

  • لتصور مسارات الأجسام عبر إطارات فيديو متعددة، يمكنك استخدام ميزات التتبع الخاصة بنموذج 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(list)
    
    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()

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

التعليقات