رؤية 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. تعمل هذه المتتبعات على تحسين أداء تتبع الأجسام المتعددة واتساق المعرّفات (IDs).

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

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

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


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

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

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

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

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

مثال
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Default tracker (BoT-SORT)
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)نعم (sparseOptFlow / ECC)مخزن تتبع + إعادة ربط 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)اختياري (HMIoU fallback)نعم (sparseOptFlow / ECC)ربط تكراري متعدد الإشارات + TAI

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

استخدم هذا المسار لاختيار نقطة البداية:

  1. هل تحتاج إلى أسرع وأبسط خط أساس؟ByteTrack (لا يوجد ReID، لا يوجد تعويض حركة كاميرا، حد أدنى من النفقات العامة).
  2. لقطات محمولة باليد أو طائرات بدون طيار أو كاميرا متحركة؟BoT-SORT (افتراضي؛ يضيف تعويض حركة الكاميرا و ReID اختياري).
  3. حركة غير خطية (رياضة، رقص، انعطافات مفاجئة) ولا يوجد ReID؟OC-SORT (تصحيحات متمحورة حول الملاحظة بدون تكلفة مظهر).
  4. مشاهد مزدحمة بكاميرا متحركة حيث تكون مبادلات المعرفات (ID swaps) هي المشكلة الرئيسية؟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، فلن يقوم المتتبع بتحديث هذا الكسام، مما يؤدي إلى عدم وجود مسارات نشطة.

المعاملالقيم أو النطاقات الصالحةالوصف
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.
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.
modelauto أو مسار إلى ملف مُصدرنموذج ReID. يستخدم auto ميزات الهيكل الأساسي الأصلي لـ YOLO عندما تكون متاحة؛ وإلا فسيعود إلى yolo26n-cls.pt. مرّر ملف .torchscript، .onnx، .engine، .openvino، … لمشفر مخصص.

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

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

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

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

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

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

تم نشر مشفرات 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تمكين المطابقة القائمة على المظهر. متوقف افتراضياً.
modelauto أو مسار إلى نموذج ReIDنموذج ReID. يستخدم auto ميزات YOLO الأصلية عند توفرها؛ وإلا قم بتمرير مسار .torchscript / .onnx / .engine.
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 المزيد من المسارات المفقودة لإعادة ربطها.

Deep OC-SORT#

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

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

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

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

المعاملالقيم أو النطاقات الصالحةالوصف
with_reidTrue، Falseتمكين المطابقة القائمة على المظهر. متوقف افتراضياً.
modelauto، ملف نموذج ReID المُصدَّرنموذج ReID. يعيد auto استخدام ميزات YOLO الأصلية؛ وإلا مرّر ملفاً مُصدَّراً (.torchscript، .onnx، .engine، …).
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_weight0.0-1.0وزن مسافة ReID بجيب التمام. يعود إلى HMIoU إذا تم تعطيل 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 الأصلية). متوقف افتراضياً.
modelauto، ملف ReIDنموذج ReID؛ يستخدم auto ميزات YOLO الأصلية، وإلا فملف ReID مُصدَّر.
gmc_methodsparseOptFlow, orb, sift, ecc, noneطريقة تعويض الحركة العالمية.

نصائح الضبط:

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

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

استخدم 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): 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/cfg/trackers! يمكن أن تكون تطبيقاتك وحلولك الواقعية لا تقدر بثمن للمستخدمين الذين يعملون على مهام التتبع.

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

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

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

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

ما هو التتبع متعدد الأجسام وكيف يدعمه Ultralytics YOLO؟#

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

هل يمكنني تخزين المتعقب (tracker) داخل ملف نموذج YOLO؟#

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

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

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

التتبع متعدد الخيوط
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(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()

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

التعليقات