Meet YOLO26: next-gen vision AI.

Link to this sectionتتبع متعدد الكائنات باستخدام 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. تعمل هذه المتتبعات على تحسين أداء تتبع الأجسام المتعددة واتساق المعرف (ID consistency).

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

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

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


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

Link to this sectionتطبيقات العالم الحقيقي#

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

Link to this sectionبدء التشغيل السريع#

قم بتشغيل التتبع على مقطع فيديو باستخدام المتتبع الافتراضي 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")

لتشغيل أداة التتبع على بث الفيديو، استخدم نموذجاً مُدرباً من نماذج الكشف (Detect) أو التجزئة (Segment) أو تقدير الوضعية (Pose) أو الصناديق الموجهة (OBB) مثل YOLO26n أو YOLO26n-seg أو YOLO26n-pose أو YOLO26n-obb. يمكنك تدريب نماذج مخصصة محلياً أو على وحدات معالجة الرسوميات (GPUs) السحابية من خلال Ultralytics Platform.

مثال
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 التي يتم تشغيلها على مقاطع الفيديو أو مصادر البث.

Link to this sectionالمتتبعات المدعومة#

يأتي 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

Link to this sectionأي متتبع يجب أن أستخدم؟#

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

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

Link to this sectionتبديل المتتبعات#

قم بتمرير اسم ملف إعداد المتتبع إلى 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")

Link to this sectionالإعدادات#

Link to this sectionوسائط التتبع#

تتشارك إعدادات التتبع في الخصائص مع وضع التنبؤ (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)

Link to this sectionإعداد متتبع مخصص#

يسمح لك 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")

Link to this sectionوسائط المتتبع المشتركة#

المعلمات التالية مشتركة بين معظم ملفات 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 أو غيرها من الملفات لمشفر مخصص.

Link to this sectionوسائط التتبع الخاصة#

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

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

يتم تعطيل ReID افتراضياً لتقليل العبء الإضافي. قم بتمكينه عن طريق ضبط with_reid: True في ملف تكوين المتتبع.

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

  • model: auto — يستخدم ميزات كاشف YOLO الأصلية، مما يضيف حداً أدنى من العبء. مثالي عندما تحتاج إلى بعض وظائف ReID دون تأثير كبير على الأداء. يتم التراجع إلى yolo26n-cls.pt إذا كان الكاشف لا يوفر ميزات متوافقة.
  • نموذج ReID مُصدّر — قم بتوجيه model: إلى ملف مُصدّر (.torchscript، .onnx، .engine، .openvino، إلخ) للحصول على تضمينات أكثر دقة على حساب تمريرة أمامية إضافية لكل قص. يتم تحميل المُشفّر عبر 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 مخصص للتتبع فقط

تتوفر حالياً فقط مشفرات ONNX ReID لفرع مظهر المتتبع. لا تزال أنماط 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 في تكوين المتتبع الخاص بك.

Link to this sectionتفاصيل المتتبع#

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

Link to this sectionBoT-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, nonebackend تعويض حركة الكاميرا. 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+).

Link to this sectionByteTrack#

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

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

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

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

وسائط خاصة بـ ByteTrack: لا شيء بخلاف وسائط المتتبع المشتركة.

نصائح الضبط:

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

Link to this sectionOC-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 المزيد من المسارات المفقودة لإعادة ربطها.

Link to this sectionDeep 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 فقط عندما تهيمن تبديلات الهوية على الأخطاء.

Link to this sectionFastTracker#

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إيقاف تهيئة المسار الجديد إذا تجاوز تقاطع الاتحاد (IoU) الخاص به مع أي مسار نشط هذه القيمة. اضبط على 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.

Link to this sectionTrackTrack#

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 فقط عند الحاجة: يضيف تكلفة استنتاج؛ بالنسبة للحجب القصير، عادة ما تكون التكلفة متعددة الإشارات الافتراضية كافية.

Link to this sectionأمثلة Python#



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

Link to this sectionحلقة تتبع المسارات المستمرة#

فيما يلي نص برمجي بلغة 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'.

Link to this sectionرسم المسارات بمرور الوقت#

يمكن أن يوفر تصور مسارات الأجسام عبر إطارات متتالية رؤى قيمة حول أنماط حركة وسلوك الأجسام المكتشفة داخل الفيديو. مع 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()

Link to this sectionالتتبع متعدد الخيوط#

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

في نص 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()

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

Link to this sectionساهم بمتعقبات جديدة#

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

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

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

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

Link to this sectionالأسئلة الشائعة#

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

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

Link to this sectionكيف يمكنني تكوين متعقب مخصص لـ 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")

Link to this sectionكيف يمكنني تشغيل تتبع الأجسام على تدفقات فيديو متعددة في وقت واحد؟#

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

Link to this sectionما هي التطبيقات الواقعية للتتبع متعدد الأجسام باستخدام Ultralytics YOLO؟#

يحتوي التتبع متعدد الأجسام باستخدام Ultralytics YOLO على العديد من التطبيقات، بما في ذلك:

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

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

Link to this sectionكيف يمكنني تصور مسارات الأجسام عبر إطارات فيديو متعددة باستخدام 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()

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

التعليقات