تتبع متعدد الكائنات باستخدام Ultralytics YOLO#
يعد تتبع الكائنات في مجال تحليلات الفيديو مهمة بالغة الأهمية، فهي لا تكتفي بتحديد موقع الكائنات وفئتها داخل الإطار فحسب، بل تحافظ أيضاً على معرف فريد (ID) لكل كائن مكتشف مع تقدم الفيديو. التطبيقات لا حصر لها، بدءاً من المراقبة والأمن وصولاً إلى تحليلات الرياضة في الوقت الفعلي.
بدءاً من إصدار Ultralytics YOLO v8.4.63، أصبحت OC-SORT وDeep OC-SORT وFastTracker وTrackTrack متوفرة إلى جانب BoT-SORT و ByteTrack.
لماذا تختار Ultralytics YOLO لتتبع الكائنات؟#
مخرجات متتبعات Ultralytics متسقة مع اكتشاف الأجسام القياسي ولكنها تتميز بالقيمة المضافة المتمثلة في معرّفات الأجسام. هذا يجعل من السهل تتبع الأجسام في دفقات الفيديو وإجراء التحليلات اللاحقة. إليك سبب وجوب التفكير في استخدام Ultralytics YOLO لتلبية احتياجاتك في تتبع الأجسام:
- الكفاءة: معالجة دفقات الفيديو في الوقت الفعلي دون المساس بـ الدقة.
- المرونة: يدعم خوارزميات وتكوينات تتبع متعددة.
- سهولة الاستخدام: واجهة برمجة تطبيقات (API) بسيطة لـ Python وخيارات CLI للتكامل والنشر السريع.
- قابلية التخصيص: سهولة الاستخدام مع نماذج YOLO المدربة مخصصة، مما يسمح بالتكامل في تطبيقات خاصة بمجال معين.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
تطبيقات العالم الحقيقي#
| النقل | التجزئة | تربية الأحياء المائية |
|---|---|---|
| تتبع المركبات | تتبع الأشخاص | تتبع الأسماك |
بدء التشغيل السريع#
قم بت تشغيل التتبع على فيديو باستخدام متتبع TrackTrack الافتراضي. انتقل إلى متتبع آخر عن طريق تغيير معامل tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")لتشغيل المتتبع على دفقات الفيديو، استخدم نموذج كشف أو تجزئة أو وضع أو OBB مدرباً مثل YOLO26n أو YOLO26n-seg أو YOLO26n-pose أو YOLO26n-obb. يمكنك تدريب نماذج مخصصة محلياً أو باستخدام التدريب السحابي على منصة Ultralytics.
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo26n.pt") # Load an official Detect model
model = YOLO("yolo26n-seg.pt") # Load an official Segment model
model = YOLO("yolo26n-pose.pt") # Load an official Pose model
model = YOLO("path/to/best.pt") # Load a custom-trained model
# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # with ByteTrackالمتتبعات المدعومة#
يأتي Ultralytics YOLO مزوداً بستة متتبعات مدمجة. قم بتنشيط أحدها عن طريق تمرير ملف تكوين YAML الخاص به إلى معامل tracker.
| المتتبع | ملف الإعداد | نموذج الحركة | المظهر / ReID | تعويض حركة الكاميرا | معالجة الإخفاء |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | كالمان خطي | اختياري (with_reid) | قابل للتكوين (gmc_method) | مخزن تتبع + إعادة ربط ReID |
| ByteTrack | bytetrack.yaml | كالمان خطي | لا يوجد | لا | إنقاذ منخفض الثقة على مرحلتين |
| OC-SORT | ocsort.yaml | كالمان متمحور حول الملاحظة | لا يوجد | لا | إعادة تحديث ORU, OCM, OCR من آخر ملاحظة |
| Deep OC-SORT | deepocsort.yaml | كالمان متمحور حول الملاحظة | اختياري (with_reid) | قابل للتكوين (gmc_method) | OC-SORT + ميزة مطابقة المظهر التكيفية الاختيارية EMA |
| FastTracker | fasttrack.yaml | كالمان خطي + تراجع | لا يوجد | لا | تراجع كالمان + تكبير bbox عند الإخفاء |
| TrackTrack | tracktrack.yaml | كالمان خطي (NSA) | اختياري (with_reid) | قابل للتكوين (gmc_method) | ربط تكراري متعدد الإشارات + TAI |
أي متتبع يجب أن أستخدم؟#
استخدم هذا التدفق لاختيار نقطة بداية؛ يتم استخدام tracktrack.yaml عندما لا تمرر أي tracker:
- هل تحتاج إلى أسرع وأبسط خط أساس؟ ← ByteTrack (لا يوجد ReID، لا يوجد تعويض حركة كاميرا، حد أدنى من النفقات العامة).
- لقطات محمولة باليد أو بطائرة بدون طيار أو بكاميرا متحركة؟ → BoT-SORT (يضيف تعويض حركة الكاميرا وإعادة التعرّف ReID الاختياري).
- حركة غير خطية (رياضة، رقص، انعطافات مفاجئة) ولا يوجد ReID؟ ← OC-SORT (تصحيحات متمحورة حول الملاحظة بدون تكلفة مظهر).
- مشاهد مزدحمة بكاميرات متحركة حيث تبديلات الهوية هي المشكلة الأساسية؟ ← Deep OC-SORT أو TrackTrack (كلاهما يدعم مطابقة المظهر الاختيارية؛ ويضيف TrackTrack أيضاً ربطاً متعدد الإشارات وقمع الهويات المكررة).
- تداخل جزئي متكرر في الوقت الفعلي، لا توجد ميزانية لـ ReID؟ ← FastTracker (متغير ByteTrack واعي بالإخفاء مع تراجع كالمان).
تبديل المتتبعات#
مرّر اسم ملف تكوين المتتبع إلى tracker=. يظل باقي الكود كما هو.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")الإعدادات#
وسائط التتبع#
يتشارك تكوين التتبع خصائص مع وضع التنبؤ (Predict)، مثل conf وiou وshow. لمزيد من التكوينات، راجع صفحة نموذج التنبؤ (Predict).
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)إعداد متتبع مخصص#
يتيح لك Ultralytics أيضاً استخدام ملف تكوين متتبع معدل. للقيام بذلك، ما عليك سوى إنشاء نسخة من ملف تكوين المتتبع (على سبيل المثال، custom_tracker.yaml) من ultralytics/cfg/trackers وتعديل أي تكوينات (باستثناء tracker_type) حسب احتياجاتك.
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")وسائط المتتبع المشتركة#
المعلمات التالية مشتركة بين معظم ملفات YAML الخاصة بالمتتبع؛ لا تظهر كل معلمة في كل إعداد:
تدخل الاكتشافات عند أو فوق track_high_thresh مرحلة الربط الأولى. يمكن للاكتشافات الواقعة بين track_low_thresh و track_high_thresh استعادة المسارات الحالية عندما يُمكّن المتتبع المحدد ربط الثقة المنخفضة، لكنها لا تبدأ مسارات جديدة. يتم تجاهل الاكتشافات عند أو تحت track_low_thresh.
| المعامل | القيم أو النطاقات الصالحة | الوصف |
|---|---|---|
tracker_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 | ما إذا كان يجب دمج درجات الثقة مع مسافات IoU قبل المطابقة. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | طريقة تعويض الحركة العالمية. تساعد في حساب حركة الكاميرا. |
proximity_thresh | 0.0-1.0 | الحد الأدنى لـ IoU المطلوب لمطابقة ReID صالحة. يضمن القرب المكاني قبل استخدام إشارات المظهر. |
appearance_thresh | 0.0-1.0 | الحد الأدنى لتشابه المظهر المُطَبَّع المطلوب لإعادة تحديد الهوية (ReID). |
with_reid | True، False | تفعيل المطابقة القائمة على المظهر لتحسين التتبع عبر حالات الإخفاء. مدعوم بواسطة BoT-SORT و Deep OC-SORT و TrackTrack. |
model | مسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق auto | نموذج إعادة تحديد الهوية (ReID). يستخدم auto ميزات الهيكل الأساسي (backbone) الأصلية لـ YOLO عند توفرها؛ وإلا فإنه يعود إلى yolo26n-cls.pt. يمكن أن يكون المُشَفِّر المخصص نقاط تفتيش .pt أو نموذجاً مُصَدَّراً مثل .torchscript أو .onnx أو .engine أو مجلد نموذج OpenVINO. |
وسائط التتبع الخاصة#
تتيح كل خوارزمية عناصر تحكم إضافية علاوة على المعلمات المشتركة. راجع الأقسام الخاصة بكل متتبع أدناه للحصول على الأوصاف ونصائح الضبط، أو ارجع مباشرة إلى ملفات التكوين:
تمكين إعادة التحديد (ReID)#
تم تعطيل ReID افتراضياً تقليلاً للنِفق العبئي (overhead). قم تمكينه عن طريق تعيين with_reid: True في ملف تكوين المتتبع.
خيارات نموذج ReID:
model: auto— يستخدم ميزات كاشف YOLO الأصلي، مما يضيف حداً أدنى من الحمل الزائد. مثالي عندما تحتاج إلى بعض ميزات ReID دون تأثير كبير على الأداء. يعود إلىyolo26n-cls.ptإذا كان الكاشف لا يكشف عن ميزات متوافقة.- نموذج إعادة تحديد الهوية (ReID) مخصص — قم بتوجيه
model:إلى نقطة تفتيش.ptأو نموذج تضمين مُصَدَّر متوافق، مثل.torchscriptأو.onnxأو.engineأو مجلد نموذج OpenVINO. يتم تحميل النماذج المُصَدَّرة عبرAutoBackendويجب أن تُخرج موتر تضمين (embedding tensor) مباشرة.
تم نشر مشفرات ONNX الجاهزة للاستخدام لكل حجم نموذج. اضبط model: على أحد هذه الأسماء وسيتم تنزيل الملف تلقائياً في المرة الأولى التي يعمل فيها المتتبع (بنفس الطريقة التي يتم بها جلب أوزان YOLO) — دون الحاجة إلى تصدير يدوي أو خطوة تنزيل:
# In your tracker config (e.g. tracktrack.yaml)
with_reid: True
model: yolo26n-reid.onnx # downloaded on first use; swap n→s/m/l/x for a larger encoder| النموذج | الحجم (بكسل) | المعاملات (مليون) | عمليات الفاصلة العائمة (FLOPs) (مليار) |
|---|---|---|---|
| YOLO26n-reid.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 |
مشفرات ReID بتقنية ONNX لفرع مظهر المتتبع هي وحدها المتاحة حالياً. أوضاع ReID train وval وpredict، بالإضافة إلى وصفات تصدير ReID المخصصة، لا تزال قيد التطوير.
للحصول على أداء أفضل مع نموذج تصنيف منفصل، قم بتصديره إلى backend أسرع مثل TensorRT:
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo26n-cls.pt")
# Add average pooling layer
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool
# Export to TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)بمجرد التصدير، أشر إلى مسار نموذج TensorRT في تكوين المتتبع الخاص بك.
تفاصيل المتتبع#
قم بتوسيع الأقسام أدناه للاطلاع على تصميم كل متتبع، والمعلمات المحددة، ونصائح الضبط.
BoT-SORT#
BoT-SORT (Aharon et al., 2022) يوسع نطاق ByteTrack ليشمل تعويض حركة الكاميرا وإعادة التعرّف ReID الاختياري:
- تعويض حركة الكاميرا (CMC): يتم تطبيق التواء تقاربي مقدر لكل إطار (تدفق بصري متناثر افتراضياً؛ تتوفر أيضاً ORB / ECC) على حالات Kalman قبل مطابقة IoU.
- ReID اختياري: يمكن دمج تضمينات المظهر في مصفوفة التكلفة. معطل افتراضياً؛ يمكّن باستخدام
with_reid: True.
الأفضل لـ: التتبع للأغراض العامة، خاصة الكاميرات المتحركة. أضف ReID فقط عندما تتسبب الحشود المتشابهة في تبديلات الهوية.
وسائط خاصة بـ BoT-SORT:
| المعامل | القيم أو النطاقات الصالحة | الوصف |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | الخلفية المسؤولة عن تعويض حركة الكاميرا. sparseOptFlow هو الافتراضي. تعطِّل none ميزة CMC. |
with_reid | True، False | تمكين المطابقة القائمة على المظهر. متوقف افتراضياً. |
model | مسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق 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): يعيد تشغيل مسار افتراضي بين آخر ملاحظة والاكتشاف الحالي، مع إعادة تشغيل تحديث Kalman لإصلاح السرعة المنجرفة.
- الزخم المتمحور حول الملاحظة (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 الصندوق المُوجَّه المتوقع بواسطة Kalman نظراً لعدم الاحتفاظ بسجل الملاحظة الأخيرة المُوجَّه.
Deep OC-SORT#
Deep OC-SORT يعزز OC-SORT بمعلومات المظهر وتعويض حركة الكاميرا:
- مطابقة المظهر: تتم موازنة مسافة تضمين جيب تمام التمام (cosine embedding) عن طريق التداخل ويتم دمجها مع تكلفة الحركة.
- EMA المظهر الديناميكي: يتم تحديث تضمينات المسار باستخدام EMA الذي يتكيف عامل تنعيمه مع ثقة الاكتشاف.
- تعويض حركة الكاميرا: يتم التواء حالات Kalman من إطار إلى إطار عبر التدفق البصري المتناثر أو ORB أو ECC.
الأفضل لـ: المشاهد المزدحمة أو ذات الكاميرات المتحركة حيث تكون تبديلات الهوية بين الكائنات المتشابهة بصرياً والمتقاربة مكانياً شائعة.
وسائط خاصة بـ Deep OC-SORT:
| المعامل | القيم أو النطاقات الصالحة | الوصف |
|---|---|---|
with_reid | True، False | تمكين المطابقة القائمة على المظهر. متوقف افتراضياً. |
model | مسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق 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 | عامل EMA الأساسي لتحديثات تضمين المسار. القيم الأعلى تحافظ على التضمين الأقدم لفترة أطول. |
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(الافتراضي) للحركة + CMC فقط؛ وقم بتمكين ReID فقط عندما تسيطر تبديلات المعرّفات على الأخطاء.
FastTracker#
FastTracker هو متغير ByteTrack مدرك للحجب ولا يحتوي على نموذج مظهر:
- اكتشاف الحجب: يشير إلى المسارات المحجوبة عندما يتجاوز تغطية المسارات النشطة الأخرى
occ_cover_thresh. - تراجع Kalman عند الانسداد: يعيد حالة Kalman إلى إطار ما قبل الانسداد باستخدام سجل المخزن المؤقت الحلقي.
- تخميد الحركة وتوسيع البحث: يتم تخميد السرعة وتوسيع bbox المتوقع أثناء الانسداد.
- كبت Init-IoU: يمنع المسارات الجديدة من الظهور فوق المسارات النشطة.
الأفضل لـ: خطوط أنابيب الاكتشاف فقط في الوقت الفعلي مع تداخل متكرر بين الأهداف (حشود، طوابير، رياضات).
وسائط خاصة بـ FastTracker:
| المعامل | القيم أو النطاقات الصالحة | الوصف |
|---|---|---|
reset_velocity_offset_occ | >=0 | إطارات السجل التي يتم الرجوع إليها لاستعادة سرعة Kalman عند بدء الانسداد. |
reset_pos_offset_occ | >=0 | إطارات السجل التي يتم الرجوع إليها لاستعادة موضع Kalman عند بدء الانسداد. |
enlarge_bbox_occ | >=1.0 | تحجيم الارتفاع المطبق على bbox المتوقع أثناء الانسداد (يتم تغيير العرض عبر نسبة العرض إلى الارتفاع XYAH). |
dampen_motion_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 | مسار نموذج إعادة تحديد الهوية (ReID) أو نموذج متوافق 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 فقط عند الحاجة: يضيف تكلفة استنتاج؛ بالنسبة للحجب القصير، عادة ما تكون التكلفة متعددة الإشارات الافتراضية كافية.
مع نماذج التقسيم (Segment) وتحديد الوضعيات (Pose)، يتخلى TrackTrack عن استعادة اكتشاف NMS الفضفاض بحيث تظل الأقنعة والنقاط الرئيسية محاذاة لاكتشافاتها.
أمثلة Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
حلقة تتبع المسارات المستمرة#
إليك نص Python باستخدام OpenCV (cv2) وYOLO26 لتشغيل تتبع الأجسام على إطارات الفيديو. يفترض هذا النص البرمجي أن الحزم الضرورية (opencv-python وultralytics) مثبتة بالفعل. يخبر معامل persist=True المتتبع بأن الصورة أو الإطار الحالي هو التالي في تسلسل ويتوقع مسارات من الصورة السابقة في الصورة الحالية.
استخدم persist=True فقط عند تمرير إطارات متتالية من نفس دفق الفيديو إلى model.track(). يتيح هذا للمتتبع إعادة استخدام الحالة من الإطارات السابقة والحفاظ على معرّفات مسار متسقة بمرور الوقت. لا تستخدم persist=True عبر صور غير ذات صلة أو دفق مختلف، نظراً لأن حالة المسار السابقة يمكن أن تُرحّل.
يمكنك أيضاً اختيار خلفية متتبع عن طريق تمرير ملف تكوين متتبع، مثل tracker="botsort.yaml" أو tracker="bytetrack.yaml" أو tracker="tracktrack.yaml".
import cv2
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
# and using the BoT-SORT tracker backend
results = model.track(frame, persist=True, tracker="botsort.yaml")
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()يُرجى ملاحظة التغيير من model(frame) إلى model.track(frame)، والذي يتيح تتبع الأجسام بدلاً من الاكتشاف البسيط. سيقوم هذا النص البرمجي المعدل بتشغيل المتتبع على كل إطار من الفيديو، وتصور النتائج، وعرضها في نافذة. يمكن الخروج من الحلقة بالضغط على 'q'.
رسم المسارات بمرور الوقت#
يمكن أن يوفر تصور مسارات الأجسام عبر إطارات متتالية رؤى قيمة حول أنماط حركة وسلوك الأجسام المكتشفة داخل الفيديو. مع Ultralytics YOLO26، يعد رسم هذه المسارات عملية سلسة وفعالة.
في المثال التالي، نوضح كيفية الاستفادة من قدرات التتبع في YOLO26 لرسم حركة الأجسام المكتشفة عبر إطارات فيديو متعددة. يتضمن هذا النص فتح ملف فيديو، وقراءته إطاراً تلو الآخر، واستخدام نموذج YOLO لتحديد وتتبع أجسام مختلفة. من خلال الاحتفاظ بالنقاط المركزية لصناديق الإحاطة المكتشفة وربطها، يمكننا رسم خطوط تمثل المسارات التي تتبعها الأجسام المتعقبة.
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(list)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
result = model.track(frame, persist=True)[0]
# Get the boxes and track IDs
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualize the result on the frame
frame = result.plot()
# Plot the tracks
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y))) # x, y center point
if len(track) > 30: # retain 30 tracks for 30 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()التتبع متعدد الخيوط#
يوفر التتبع متعدد الخيوط القدرة على تشغيل تتبع الأجسام على تدفقات فيديو متعددة في وقت واحد. وهذا مفيد بشكل خاص عند التعامل مع مدخلات فيديو متعددة، مثل كاميرات المراقبة المتعددة، حيث يمكن للمعالجة المتزامنة أن تعزز الكفاءة والأداء بشكل كبير.
في نص Python المقدم، نستخدم وحدة threading في Python لتشغيل عدة مثيلات للمتتبع في وقت واحد. كل خيط (thread) مسؤول عن تشغيل المتتبع على ملف فيديو واحد، وتعمل جميع الخيوط في وقت واحد في الخلفية.
لضمان حصول كل خيط على المعاملات الصحيحة (ملف الفيديو، النموذج المراد استخدامه، ومؤشر الملف)، نقوم بتعريف دالة run_tracker_in_thread تقبل هذه المعاملات وتحتوي على حلقة التتبع الرئيسية. تقرأ هذه الدالة الفيديو إطاراً بإطار، وتشغيل المتتبع، وتعرض النتائج.
يتم استخدام نموذجين مختلفين في هذا المثال: yolo26n.pt وyolo26n-seg.pt، حيث يتتبع كل منهما الأجسام في ملف فيديو مختلف. يتم تحديد ملفات الفيديو في SOURCES.
المعامل daemon=True في threading.Thread يعني أنه سيتم إغلاق هذه الخيوط بمجرد انتهاء البرنامج الرئيسي. بعد ذلك، نبدأ الخيوط بـ start() ونستخدم join() لجعل الخيط الرئيسي ينتظر حتى ينتهي كلا خيطي المتتبع.
أخيراً، بعد أن تكمل جميع الخيوط مهمتها، يتم إغلاق النوافذ التي تعرض النتائج باستخدام cv2.destroyAllWindows().
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): Model checkpoint name or path loaded inside the thread.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()يمكن توسيع هذا المثال بسهولة للتعامل مع المزيد من ملفات الفيديو والنماذج عن طريق إنشاء المزيد من الخيوط وتطبيق نفس المنهجية.
ساهم بمتعقبات جديدة#
هل أنت بارع في تتبع الأجسام المتعددة وقمت بنجاح بتنفيذ أو تكييف خوارزمية تتبع باستخدام Ultralytics YOLO؟ ندعوك للمساهمة في قسم المتتبعات لدينا في ultralytics/cfg/trackers! يمكن أن تكون تطبيقاتك وحلولك الواقعية لا تقدر بثمن للمستخدمين الذين يعملون على مهام التتبع.
من خلال المساهمة في هذا القسم، فإنك تساعد في توسيع نطاق حلول التتبع المتاحة ضمن إطار عمل Ultralytics YOLO، مما يضيف طبقة أخرى من الوظائف والفائدة للمجتمع.
لبدء مساهمتك، يُرجى الرجوع إلى دليل المساهمة الخاص بنا للحصول على إرشادات شاملة حول تقديم طلب سحب (PR) 🛠️. نحن متحمسون لرؤية ما ستجلبه إلى الطاولة!
معاً، لنعزز قدرات التتبع في نظام Ultralytics YOLO البيئي 🙏!
الأسئلة الشائعة#
يتضمن تتبع الأجسام المتعددة في تحليلات الفيديو كلاً من تحديد الأجسام والحفاظ على معرّف فريد لكل جسم مكتشف عبر إطارات الفيديو. يدعم Ultralytics YOLO ذلك من خلال توفير التتبع في الوقت الفعلي جنباً إلى جنب مع معرّفات الأجسام، مما يسهل مهام مثل المراقبة الأمنية وتحليلات الرياضة. يستخدم النظام متتبعات مثل BoT-SORT وByteTrack وOC-SORT وDeep OC-SORT وFastTracker وTrackTrack، والتي يمكن تكوينها عبر ملفات YAML.
لا. تخزن ملفات
.ptالقياسية الخاصة بـ Ultralytics أوزان نموذج YOLO، بينما يتم إنشاء المتتبع وقت الاستدلال بواسطةmodel.track(). تعتمد معرّفات المسار على حالة المتتبع عبر الإطارات المتتالية، لذا يمكن لصورة واحدة قائمة بذاتها إرجاع اكتشافات مثل الصناديق، والفئات، ومستويات الثقة، ولكنها لا تستطيع إنتاج معرّفات تتبع مستمرة ذات مغزى بمفردها.للنشر، قم بتجميع الكاشف والمتتبع معاً في تطبيقك وقم باستدعاء
model.track()إطاراً بإطار باستخدامpersist=Trueعندما تأتي الإطارات من نفس دفق الفيديو. استخدم نماذج أو مثيلات متتبعات منفصلة للدفقات غير المرتبطة حتى لا تُرحّل الحالة بين مقاطع الفيديو.يمكنك تكوين متتبع مخصص عن طريق نسخ ملف تكوين متتبع موجود (على سبيل المثال،
custom_tracker.yaml) من دليل تكوين متتبع Ultralytics وتعديل المعاملات حسب الحاجة، باستثناءtracker_type. استخدم هذا الملف في نموذج التتبع الخاص بك هكذا:مثالfrom ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")لتشغيل تتبع الأجسام على دفقات فيديو متعددة في نفس الوقت، يمكنك استخدام وحدة
threadingفي Python. سيقوم كل خيط بمعالجة دفق فيديو منفصل. إليك مثالاً لكيفية إعداد ذلك:التتبع متعدد الخيوطimport threading import cv2 from ultralytics import YOLO # Define model names and video sources MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"] SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam def run_tracker_in_thread(model_name, filename): """Run YOLO tracker in its own thread for concurrent processing. Args: model_name (str): Model checkpoint name or path loaded inside the thread. filename (str): The path to the video file or the identifier for the webcam/external camera source. """ model = YOLO(model_name) results = model.track(filename, save=True, stream=True) for r in results: pass # Create and start tracker threads using a for loop tracker_threads = [] for video_file, model_name in zip(SOURCES, MODEL_NAMES): thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True) tracker_threads.append(thread) thread.start() # Wait for all tracker threads to finish for thread in tracker_threads: thread.join() # Clean up and close windows cv2.destroyAllWindows()يحتوي التتبع متعدد الأجسام باستخدام Ultralytics YOLO على العديد من التطبيقات، بما في ذلك:
- النقل: تتبع المركبات لإدارة المرور والقيادة الذاتية.
- البيع بالتجزئة: تتبع الأشخاص للتحليلات داخل المتجر والأمن.
- تربية الأحياء المائية: تتبع الأسماك لمراقبة البيئات المائية.
- تحليل الرياضة: تتبع اللاعبين والمعدات لتحليل الأداء.
- الأنظمة الأمنية: مراقبة الأنشطة المشبوهة وإنشاء إنذارات أمنية.
تستفيد هذه التطبيقات من قدرة Ultralytics YOLO على معالجة فيديوهات عالية الإطارات في الوقت الفعلي بدقة استثنائية.
لتصور مسارات الأجسام عبر إطارات فيديو متعددة، يمكنك استخدام ميزات التتبع الخاصة بنموذج YOLO جنباً إلى جنب مع OpenCV لرسم مسارات الأجسام المكتشفة. إليك نص برمجي مثال يوضح ذلك:
رسم المسارات عبر إطارات فيديو متعددةfrom collections import defaultdict import cv2 import numpy as np from ultralytics import YOLO model = YOLO("yolo26n.pt") video_path = "path/to/video.mp4" cap = cv2.VideoCapture(video_path) track_history = defaultdict(list) while cap.isOpened(): success, frame = cap.read() if success: results = model.track(frame, persist=True) boxes = results[0].boxes.xywh.cpu() track_ids = results[0].boxes.id.int().cpu().tolist() annotated_frame = results[0].plot() for box, track_id in zip(boxes, track_ids): x, y, w, h = box track = track_history[track_id] track.append((float(x), float(y))) if len(track) > 30: track.pop(0) points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2)) cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10) cv2.imshow("YOLO26 Tracking", annotated_frame) if cv2.waitKey(1) & 0xFF == ord("q"): break else: break cap.release() cv2.destroyAllWindows()سيقوم هذا النص برسم خطوط التتبع التي تظهر مسارات حركة الأجسام المتعقبة بمرور الوقت، مما يوفر رؤى قيمة حول سلوك الأجسام والأنماط.