التتبع متعدد الكائنات باستخدام يولو أولتراليتكس#
يُعد تتبع الكائنات في مجال تحليل الفيديو مهمة بالغة الأهمية لا تقصر على تحديد موقع الكائنات وفئتها داخل الإطار فحسب، بل تحافظ أيضاً على معرف فريد لكل كائن مكتشف مع تقدم الفيديو. التطبيقات بلا حدود—بدءاً من المراقبة والأمن وصولاً إلى تحليلات الرياضة في الوقت الفعلي.
راجع معاينة YOLO27 غير الإصدار للحصول على دعم التتبع المخطط له.
بدءًا من الإصدار 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-SORT | botsort.yaml | كالمان الخطي | اختياري (with_reid) | قابل للتكوين (gmc_method) | مخزن مؤقت للتتبع + إعادة ربط الهوية |
| ByteTrack | bytetrack.yaml | كالمان الخطي | لا شيء | لا | إنقاذ الثقة المنخفضة على مرحلتين |
| OC-SORT | ocsort.yaml | كالمان المتمحور حول الملاحظة | لا شيء | لا | إعادة تحديث ORU، OCM، OCR من آخر ملاحظة |
| Deep OC-SORT | deepocsort.yaml | كالمان المتمحور حول الملاحظة | اختياري (with_reid) | قابل للتكوين (gmc_method) | OC-SORT + المتوسط المتحرك الأسي للمظهر التكيفي الاختياري |
| FastTracker | fasttrack.yaml | كالمان الخطي + التراجع | لا شيء | لا | تراجع كالمان + تكبير المربع المحيط عند الإخفاء |
| TrackTrack | tracktrack.yaml | كالمان الخطي (NSA) | اختياري (with_reid) | قابل للتكوين (gmc_method) | الربط التكراري المتعدد الإشارات + TAI |
أي أداة تتبع يجب أن أستخدِم؟#
استخدم هذا المسار لاختيار نقطة بداية؛ يُستخدم tracktrack.yaml عند عدم تمرير أي tracker:
- هل تحتاج إلى أسرع وأبسط أساس؟ → ByteTrack (بدون إعادة تعريف، بدون تعويض حركة الكاميرا، الحد الأدنى من النفقات العامة).
- لقطات محمولة باليد أو طائرة بدون طيار أو كاميرا متحركة؟ → BoT-SORT (يضيف تعويض حركة الكاميرا وإعادة تعريف اختيارية).
- حركة غير خطية (رياضات، رقص، انعطافات مفاجئة) وبدون إعادة تعريف؟ → OC-SORT (تصحيحات مركزة على الملاحظة بدون تكلفة المظهر).
- مشاهد مزدحمة بكاميرا متحركة حيث تبديل المعرفات هو المشكلة الرئيسية؟ → Deep OC-SORT أو TrackTrack (كلاهما يدعم مطابقة المظهر الاختيارية؛ يضيف TrackTrack أيضًا ربطًا متعدد الإشارات وقمع معرفات مكررة).
- تداخل جزئي متكرر في الوقت الفعلي، بدون ميزانية إعادة تعريف؟ → 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_type | botsort، bytetrack، ocsort، deepocsort، fasttrack، tracktrack | يحدد نوع أداة التتبع. |
track_high_thresh | 0.0-1.0 | العتبة للربط الأول. تؤثر على مدى ثقة مطابقة الاكتشاف بمسار موجود. |
track_low_thresh | 0.0-1.0 | الحد الأدنى لاكتشافات استعادة الثقة المنخفضة. تستخدم OC-SORT و Deep OC-SORT هذه فقط عندما use_byte: True؛ ويتضمنها TrackTrack في تجمع الربط الخاضع للعقوبة. |
new_track_thresh | 0.0-1.0 | العتبة لبدء مسار جديد إذا لم يتطابق الاكتشاف مع أي مسارات موجودة. |
track_buffer | >=0 | الإطارات التي تبقى فيها المسارات المفقودة نشطة قبل الإزالة. قيمة أعلى تعني تحملًا أكبر للإخفاء. |
match_thresh | 0.0-1.0 | عتبة مطابقة المسارات. القيم الأعلى تجعل المطابقة أكثر تساهلاً. |
fuse_score | True، False | ما إذا كان سيتم دمج درجات الثقة مع مسافات تقاطع الاتحاد قبل المطابقة. |
gmc_method | sparseOptFlow، orb، sift، ecc، none | طريقة التموضع العالمي للحركة. تساعد في حساب حركة الكاميرا. |
proximity_thresh | 0.0-1.0 | الحد الأدنى لتقاطع الاتحاد المطلوب لمطابقة إعادة تعريف صالحة. يضمن التقارب المكاني قبل استخدام إشارات المظهر. |
appearance_thresh | 0.0-1.0 | الحد الأدنى لتشابه المظهر الموحد المطلوب لإعادة التعريف. |
with_reid | True، False | تمكين المطابقة المستندة إلى المظهر لتحسين التتبع عبر حالات الإخفاء. مدعوم بواسطة BoT-SORT و Deep OC-SORT و TrackTrack. |
model | auto أو مسار نموذج إعادة تعريف متوافق | نموذج إعادة التعريف. يستخدم 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.onnx | 448 | 2.8 | 2.0 |
| YOLO26s-reid.onnx | 448 | 7.5 | 6.6 |
| YOLO26m-reid.onnx | 448 | 12.4 | 20.1 |
| YOLO26l-reid.onnx | 448 | 15.3 | 25.2 |
| YOLO26x-reid.onnx | 448 | 32.7 | 55.9 |
تتوفر حالياً فقط مُرمِّزات إعادة التعريف ONNX لفرع مظهر أداة التتبع. أوضاع إعادة التعريف train و val و predict، بالإضافة إلى وصفات تصدير إعادة التعريف المخصصة، لا تزال قيد التطوير.
لتحسين الأداء باستخدام نموذج تصنيف منفصل، قم بتصديره إلى بيئة خلفية أسرع مثل 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_method | sparseOptFlow، orb، sift، ecc، none | خلفية تعويض حركة الكاميرا. sparseOptFlow هو الوضع الافتراضي. none يعطل تعويض حركة الكاميرا (CMC). |
with_reid | True، False | تمكين المطابقة القائمة على المظهر. معطل افتراضياً. |
model | auto أو مسار نموذج إعادة تعريف متوافق | auto يستخدم ميزات YOLO الأصلية عند توفرها؛ النماذج المخصصة يمكن أن تكون نقاط تحقق .pt أو عمليات تصدير متوافقة. |
proximity_thresh | 0.0-1.0 | الحد الأدنى لتقاطع الاتحاد (IoU) قبل النظر في ميزات المظهر. |
appearance_thresh | 0.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. القيم الأكبر تنعم بشكل أكبر. |
inertia | 0.0-1.0 | وزن تكلفة اتساق السرعة. القيم الأعلى تعاقب تغييرات الاتجاه المفاجئة. |
use_byte | True، 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_reid | True، False | تمكين المطابقة القائمة على المظهر. معطل افتراضياً. |
model | auto أو مسار نموذج إعادة تعريف متوافق | auto يستخدم ميزات YOLO الأصلية عند توفرها؛ النماذج المخصصة يمكن أن تكون نقاط تحقق .pt أو عمليات تصدير متوافقة. |
proximity_thresh | 0.0-1.0 | الحد الأدنى لتقاطع الاتحاد (IoU) قبل النظر في ميزات المظهر. |
appearance_thresh | 0.0-1.0 | الحد الأدنى لتشابه المظهر الموحد المطلوب لمطابقة ReID. |
alpha_fixed_emb | 0.0-1.0 | عامل المتوسط المتحرك الأسي الأساسي لتحديثات تضمين المسار. القيم الأعلى تحافظ على التضمين الأقدم لفترة أطول. |
gmc_method | sparseOptFlow، orb، sift، ecc، none | طريقة تعويض الحركة العالمية. |
delta_t | >=1 | النافذة الزمنية (بالإطارات) لحساب اتجاه السرعة في OCM (موروثة من OC-SORT). |
inertia | 0.0-1.0 | وزن تكلفة اتساق السرعة (مورث من OC-SORT). |
use_byte | True، 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_occ | 0.0-1.0 | مضاعف السرعة أثناء الاحتجاب. القيم الأقل تجعل المسار "يبطئ" خلال الاحتجاب. |
active_occ_to_lost_thresh | >=1 | الحد الأقصى للإطارات المحتجبة المتتالية قبل نقل المسار النشط إلى مفقود. |
occ_cover_thresh | 0.0-1.0 | جزء من مساحة المسار المغطاة بواسطة مسار نشط آخر للإعلان عن الاحتجاب. |
occ_reappear_window | >=0 | الإطارات التي يظل فيها المسار المفقود والمحتجب مؤخراً قابلاً للاسترجاع تفضيلياً. |
init_iou_suppress | 0.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_weight | 0.0-1.0 | وزن مسافة HMIoU عند تمكين ReID؛ وإلا يتم استخدام HMIoU مباشرة. |
reid_weight | 0.0-1.0 | وزن مسافة ReID لجيب التمام عند تمكين ReID؛ وإلا يتم تجاهله. |
conf_weight | 0.0-1.0 | وزن مسافة إسقاط الثقة. |
angle_weight | 0.0-1.0 | وزن مسافة زاوية الزاوية. |
penalty_p | 0.0-1.0 | عقوبة التكلفة للاكتشافات منخفضة الثقة. |
penalty_q | 0.0-1.0 | عقوبة التكلفة للاكتشافات المستعادة بواسطة الكبح الثانوي غير الأقصى (NMS). |
reduce_step | 0.0-1.0 | استرخاء عتبة المطابقة لكل تكرار. |
tai_thr | 0.0-1.0 | عتبة تقاطع الاتحاد (IoU) لكبح NMS للتهيئة الواعية للمسار. |
min_track_len | >=0 | الحد الأدنى لطول السجل قبل تأكيد مسار جديد. |
lost_match_thr | 0.0-1.0 | بوابة تكلفة أكثر مرونة لتمرير إعادة ربط المفقودين المسترخين؛ 0 يعطلها. |
with_reid | True، False | تمكين مطابقة مظهر ReID لجيب التمام (يستخدم ميزات YOLO الأصلية). معطل افتراضياً. |
model | auto أو مسار نموذج إعادة تعريف متوافق | auto يستخدم ميزات YOLO الأصلية عند توفرها؛ النماذج المخصصة يمكن أن تكون نقاط تحقق .pt أو عمليات تصدير متوافقة. |
gmc_method | sparseOptFlow، 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".
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()سيرسم هذا النص البرمجِي خطوط التتبع التي توضح مسارات حركة الكائنات المُتتَبَعة بمرور الوقت، مما يوفر رؤى قيمة حول سلوك الكائنات وأنماطها.