Ultralytics YOLO27:

التتبع متعدد الكائنات باستخدام يولو أولتراليتكس#

YOLO multi-object tracking with trajectory paths

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

راجع معاينة YOLO27 غير الإصدار للحصول على دعم التتبع المخطط له.

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

بدءًا من الإصدار 8.4.63 من ultralytics، تتوفر أنظمة OC-SORT وDeep OC-SORT وFastTracker وTrackTrack إلى جانب BoT-SORT وByteTrack.

لماذا تختار يولو أولتراليتكس لتتبع الكائنات؟#

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

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


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")

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

مثال
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

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

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

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

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

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

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

التهيئة#

معاملات التتبع#

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

مثال
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)

تكوين أداة تتبع مخصصة#

تتيح لك أولتراليتكس أيضًا استخدام ملف تكوين أداة تتبع معدل. للقيام بذلك، قم ببساطة بعمل نسخة من ملف تكوين أداة التتبع (على سبيل المثال، 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ما إذا كان سيتم دمج درجات الثقة مع مسافات تقاطع الاتحاد قبل المطابقة.
gmc_methodsparseOptFlow، orb، sift، ecc، noneطريقة التموضع العالمي للحركة. تساعد في حساب حركة الكاميرا.
proximity_thresh0.0-1.0الحد الأدنى لتقاطع الاتحاد المطلوب لمطابقة إعادة تعريف صالحة. يضمن التقارب المكاني قبل استخدام إشارات المظهر.
appearance_thresh0.0-1.0الحد الأدنى لتشابه المظهر الموحد المطلوب لإعادة التعريف.
with_reidTrue، Falseتمكين المطابقة المستندة إلى المظهر لتحسين التتبع عبر حالات الإخفاء. مدعوم بواسطة BoT-SORT و Deep OC-SORT و TrackTrack.
modelauto أو مسار نموذج إعادة تعريف متوافقنموذج إعادة التعريف. يستخدم auto ميزات الهيكل الأساسي الأصلي ليولو عندما تكون متوفرة؛ وإلا فسيلجأ إلى yolo26n-cls.pt. يمكن أن يكون المُرمِّز المخصص نقطة تحقق .pt أو نموذجًا مُصدَّرًا مثل .torchscript أو .onnx أو .engine أو دليل نموذج OpenVINO.

معاملات خاصة بأداة التتبع#

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

تمكين إعادة التعريف#

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

خيارات نموذج إعادة التعريف:

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

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

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

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

لتحسين الأداء باستخدام نموذج تصنيف منفصل، قم بتصديره إلى بيئة خلفية أسرع مثل TensorRT:

تصدير نموذج إعادة تعريف إلى 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 في تكوين أداة التتبع الخاص بك.

تفاصيل أدوات التتبع#

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



Watch: Which Object Tracker Performs Better? | Speed, FPS & ID Stability | Ultralytics YOLO26 📊

BoT-SORT#

تُوسع BoT-SORT (Aharon et al., 2022) أداة ByteTrack بتعويض حركة الكاميرا وإعادة التعريف الاختيارية:

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

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

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

المعلمةالقيم أو النطاقات الصالحةالوصف
gmc_methodsparseOptFlow، orb، sift، ecc، noneخلفية تعويض حركة الكاميرا. sparseOptFlow هو الوضع الافتراضي. none يعطل تعويض حركة الكاميرا (CMC).
with_reidTrue، Falseتمكين المطابقة القائمة على المظهر. معطل افتراضياً.
modelauto أو مسار نموذج إعادة تعريف متوافق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): يعيد تشغيل مسار افتراضي بين اخر ملاحظة والاكتشاف الحالي، مع إعادة تشغيل تحديث كالفمان لإصلاح السرعة المنجرفة.
  • الزخم الممركز على الملاحظة (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 المربع الموجه المتنبأ به بواسطة كالفمان لأنه لا يتم الاحتفاظ بسجل اخر ملاحظة موجه.

Deep OC-SORT#

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

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

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

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

المعلمةالقيم أو النطاقات الصالحةالوصف
with_reidTrue، Falseتمكين المطابقة القائمة على المظهر. معطل افتراضياً.
modelauto أو مسار نموذج إعادة تعريف متوافقauto يستخدم ميزات YOLO الأصلية عند توفرها؛ النماذج المخصصة يمكن أن تكون نقاط تحقق .pt أو عمليات تصدير متوافقة.
proximity_thresh0.0-1.0الحد الأدنى لتقاطع الاتحاد (IoU) قبل النظر في ميزات المظهر.
appearance_thresh0.0-1.0الحد الأدنى لتشابه المظهر الموحد المطلوب لمطابقة ReID.
alpha_fixed_emb0.0-1.0عامل المتوسط المتحرك الأسي الأساسي لتحديثات تضمين المسار. القيم الأعلى تحافظ على التضمين الأقدم لفترة أطول.
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 (الافتراضي) للحركة + تعويض حركة الكاميرا فقط؛ قم بتمكين ReID فقط عندما تهيمن تبديل المعرفات على الأخطاء.

FastTracker#

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

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

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

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

المعلمةالقيم أو النطاقات الصالحةالوصف
reset_velocity_offset_occ>=0إطارات السجل الخلفية لاستعادة سرعة كالفمان عند بدء الاحتجاب.
reset_pos_offset_occ>=0إطارات السجل الخلفية لاستعادة موضع كالفمان عند بدء الاحتجاب.
enlarge_bbox_occ>=1.0تحجيم الارتفاع المطبق على المربع المحيط المتنبأ به أثناء الاحتجاب (يتغير العرض عبر نسبة عرض إلى ارتفاع 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 الأصلية). معطل افتراضياً.
modelauto أو مسار نموذج إعادة تعريف متوافقauto يستخدم ميزات YOLO الأصلية عند توفرها؛ النماذج المخصصة يمكن أن تكون نقاط تحقق .pt أو عمليات تصدير متوافقة.
gmc_methodsparseOptFlow، orb، sift، ecc، noneطريقة تعويض الحركة العالمية.

نصائح الضبط:

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

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

أمثلة بايثون#



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

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

إليك برنامج بايثون نصي باستخدام 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 لتشغيل مثيلات متعددة من المُتتِب بالتزامن. تتولى كل خيوط تشغيل المُتتِب على ملف فيديو واحد، وتعمل جميع الخيوط في نفس الوقت في الخلفية.

لضمان حصول كل خيط على المعلمات الصحيحة (ملف الفيديو، والنموذج المراد استخدامه، ومؤشر الملف)، نُعرّف دالة 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 البيئي 🙏!

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

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

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

    للنشر، قم بتجميع الكاشف والمُتتِب معاً في تطبيقك واستدعِ 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:
            result = model.track(frame, persist=True)[0]
            annotated_frame = result.plot()
            if result.boxes and result.boxes.is_track:
                boxes = result.boxes.xywh.cpu()
                track_ids = result.boxes.id.int().cpu().tolist()
                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()

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

التعليقات