تتبّع أجسام متعددة باستخدام Ultralytics YOLO#
يُعد تتبّع الأجسام في مجال تحليلات الفيديو مهمة أساسية، لا تقتصر على تحديد مواقع الأجسام وفئاتها داخل الإطار، بل تشمل أيضًا الاحتفاظ بمعرّف فريد لكل جسم مكتشف مع تقدّم الفيديو. وتتنوع تطبيقاته بلا حدود، من المراقبة والأمن إلى تحليلات الرياضة في الزمن الفعلي.
اطّلع على معاينة YOLO27 غير المُصدرة لمعرفة دعم التتبّع المخطط له.
بدءًا من ultralytics 8.4.63، تتوفر OC-SORT وDeep OC-SORT وFastTracker وTrackTrack، إلى جانب BoT-SORT وByteTrack.
لماذا تختار Ultralytics YOLO لتتبّع الأجسام؟#
تتوافق مخرجات متتبّعات Ultralytics مع كشف الأجسام القياسي، مع إضافة معرّفات الأجسام. وهذا يسهّل تتبّع الأجسام في تدفقات الفيديو وإجراء التحليلات اللاحقة. إليك أسبابًا تدعوك إلى استخدام Ultralytics YOLO لتلبية احتياجاتك في تتبّع الأجسام:
- الكفاءة: معالجة تدفقات الفيديو في الزمن الفعلي دون المساس بـالدقة.
- المرونة: يدعم خوارزميات تتبّع وإعدادات متعددة.
- سهولة الاستخدام: واجهة API بسيطة بلغة Python وخيارات CLI تتيح التكامل والنشر بسرعة.
- قابلية التخصيص: سهولة الاستخدام مع نماذج YOLO المدرّبة تدريبًا مخصصًا، ما يتيح دمجها في التطبيقات المتخصصة.
شاهد: كيفية تنفيذ تتبع كائنات متعددة باستخدام Ultralytics YOLO26 | BoT-SORT وByteTrack | VisionAI 🚀
تطبيقات واقعية#
| النقل والمواصلات | البيع بالتجزئة | الاستزراع المائي |
|---|---|---|
| تتبّع المركبات | تتبّع الأشخاص | تتبّع الأسماك |
البدء السريع#
شغّل التتبّع على فيديو باستخدام المتتبّع TrackTrack الافتراضي. للتبديل إلى متتبّع آخر، غيّر وسيطة tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# المتتبّع الافتراضي (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# التبديل إلى ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")لتشغيل المتتبّع على تدفقات الفيديو، استخدم نموذجًا مدرّبًا من نوع Detect أو Segment أو Pose أو OBB، مثل YOLO26n أو YOLO26n-seg أو YOLO26n-pose أو YOLO26n-obb. يمكنك تدريب نماذج مخصصة محليًا أو باستخدام التدريب السحابي على منصة Ultralytics.
from ultralytics import YOLO
# تحميل نموذج رسمي أو مخصص
model = YOLO("yolo26n.pt") # تحميل نموذج Detect رسمي
model = YOLO("yolo26n-seg.pt") # تحميل نموذج Segment رسمي
model = YOLO("yolo26n-pose.pt") # تحميل نموذج Pose رسمي
model = YOLO("path/to/best.pt") # تحميل نموذج مدرّب تدريبًا مخصصًا
# تنفيذ التتبّع باستخدام النموذج
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # التتبّع باستخدام المتتبّع الافتراضي
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # باستخدام 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
# تهيئة معلمات التتبّع وتشغيل المتتبّع
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
# تحميل النموذج وتشغيل المتتبّع باستخدام ملف إعداد مخصص
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 | auto أو مسار نموذج ReID متوافق | نموذج ReID. يستخدم auto ميزات العمود الفقري الأصلي لـ YOLO عند توفرها؛ وإلا فيلجأ إلى yolo26n-cls.pt. يمكن أن يكون المُرمِّز المخصص نقطة تحقق .pt أو نموذجًا مُصدّرًا مثل .torchscript أو .onnx أو .engine، أو دليل نموذج OpenVINO. |
وسيطات خاصة بأداة التتبع#
توفّر كل خوارزمية عناصر تحكم إضافية إلى جانب المعلمات المشتركة. راجع الأقسام الخاصة بكل أداة تتبع أدناه للاطلاع على الأوصاف ونصائح الضبط، أو ارجع مباشرةً إلى ملفات الإعداد:
تفعيل إعادة التعرّف (ReID)#
يكون ReID معطّلًا افتراضيًا لتقليل العبء الإضافي. فعّله بتعيين with_reid: True في ملف إعداد أداة التتبع.
خيارات نموذج ReID:
model: auto— يستخدم ميزات كاشف YOLO الأصلي، مع عبء إضافي ضئيل. وهو مثالي عندما تحتاج إلى قدر من ReID دون تأثير كبير في الأداء. ويلجأ إلىyolo26n-cls.ptإذا لم يوفّر الكاشف ميزات متوافقة.- نموذج ReID مخصص — وجّه
model:إلى نقطة تحقق.ptأو نموذج تضمين مُصدّر متوافق، مثل.torchscriptأو.onnxأو.engine، أو دليل نموذج OpenVINO. تُحمّل النماذج المُصدّرة عبرAutoBackend، ويجب أن تُخرج موتر تضمين مباشرةً.
تتوفر مُرمِّزات 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 |
تتوفر حاليًا مُرمِّزات ONNX الخاصة بفرع المظهر في أداة التتبع فقط. ولا تزال أوضاع ReID train وval وpredict، إلى جانب وصفات تصدير ReID المخصصة، قيد التطوير.
لتحقيق أداء أفضل باستخدام نموذج تصنيف منفصل، صدّره إلى واجهة خلفية أسرع مثل TensorRT:
from torch import nn
from ultralytics import YOLO
# تحميل نموذج التصنيف
model = YOLO("yolo26n-cls.pt")
# إضافة طبقة تجميع متوسط
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
# التصدير إلى TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)بعد التصدير، حدّد مسار نموذج TensorRT في إعداد أداة التتبع.
تفاصيل أدوات التتبع#
تصف الأقسام أدناه تصميم كل أداة تتبع ومعلماتها الخاصة ونصائح ضبطها.
شاهد: أي متعقّب للكائنات يحقق أداءً أفضل؟ | السرعة وFPS واستقرار المعرّفات | Ultralytics YOLO26 📊
BoT-SORT#
توسّع BoT-SORT (Aharon وآخرون، 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 | auto أو مسار نموذج ReID متوافق | يستخدم 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 وآخرون، ECCV 2022) خوارزميةً أساسية خفيفة الوزن. وهي تستخدم Kalman خطيًا مع IoU، وتعتمد مطابقةً من مرحلتين:
- المرحلة الأولى: مطابقة الاكتشافات ذات الدرجات العالية بالمسارات النشطة.
- المرحلة الثانية: إعادة محاولة مطابقة المسارات غير المطابقة بالاكتشافات ذات الدرجات المنخفضة لاستعادتها بعد احتجاب جزئي قصير.
لا يوجد نموذج للمظهر ولا تعويض لحركة الكاميرا.
الأنسب لـ: الكاميرات الثابتة أو شبه الثابتة، عندما تهيمن كلفة الكاشف على الأداء وتريد تقليل العبء الإضافي لأداة التتبع إلى أدنى حد.
وسيطات خاصة بـ ByteTrack: لا شيء سوى وسيطات أداة التتبع المشتركة.
نصائح الضبط:
- كاشف كثير الضوضاء: خفّض
track_low_threshلزيادة عدد المرشحين في المرحلة الثانية. - كاشف عالي الاستدعاء: ارفع
track_high_threshلتقليل تفتت المعرّفات. - وميض متكرر للمعرّفات: ارفع
track_bufferكي تبقى المسارات التي فات رصدها لفترة وجيزة نشطة.
OC-SORT#
تُعدّ OC-SORT (Cao وآخرون، 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:
- مطابقة المظهر: تُقيَّد مسافة جيب التمام بين التضمينات بالتداخل، وتُدمج مع كلفة الحركة.
- متوسط أسي متحرك ديناميكي للمظهر (EMA): تُحدَّث تضمينات المسارات باستخدام EMA، ويتكيف عامل التنعيم مع ثقة الاكتشاف.
- تعويض حركة الكاميرا: تُحوَّل حالات Kalman بين الإطارات باستخدام التدفق البصري المتفرق أو ORB أو ECC.
الأنسب لـ: المشاهد المزدحمة أو المصوّرة بكاميرات متحركة، حيث يشيع تبديل المعرّفات بين أجسام مختلفة بصريًا لكنها متقاربة مكانيًا.
وسيطات خاصة بـ Deep OC-SORT:
| المعلمة | القيم أو النطاقات الصالحة | الوصف |
|---|---|---|
with_reid | True, False | تفعيل المطابقة المستندة إلى المظهر. وهي معطّلة افتراضيًا. |
model | auto أو مسار نموذج ReID متوافق | يستخدم 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 | منع بدء مسار جديد إذا تجاوزت قيمة IoU له مع أي مسار نشط هذا الحد. عيّن القيمة إلى 1.0 لتعطيل ذلك. |
نصائح الضبط:
- حالات الاحتجاب الجزئي المتكررة: خفّض
occ_cover_thresh(مثلًا، إلى0.5-0.6). - معرّفات مكررة قرب مناطق التداخل: خفّض
init_iou_suppress(مثلًا، إلى0.5). - حالات الاحتجاب الطويلة: ارفع
occ_reappear_windowوtrack_bufferمعًا. - الأهداف سريعة الحركة: ارفع
dampen_motion_occ(ليقترب من1.0)؛ ولا ترفعenlarge_bbox_occإلا عندما يؤدي توسيع نطاق البحث إلى تحسين الاستعادة.
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 أو مسار نموذج ReID متوافق | يستخدم 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#
شاهد: كيفية إنشاء تتبع تفاعلي للكائنات باستخدام Ultralytics YOLO | انقر لاقتصاص الكائن وعرضه ⚡
حلقة تتبّع مستمرة#
فيما يلي برنامج 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
# تحميل نموذج YOLO26
model = YOLO("yolo26n.pt")
# افتح ملف الفيديو
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# تكرار إطارات الفيديو
while cap.isOpened():
# قراءة إطار من الفيديو
success, frame = cap.read()
if success:
# تشغيل تتبّع YOLO26 على الإطار، مع الاحتفاظ بالمسارات بين الإطارات
# واستخدام الواجهة الخلفية لأداة التتبّع BoT-SORT
results = model.track(frame, persist=True, tracker="botsort.yaml")
# تصور النتائج على الإطار
annotated_frame = results[0].plot()
# عرض الإطار المشروح
cv2.imshow("YOLO26 Tracking", annotated_frame)
# إنهاء الحلقة إذا ضُغط على 'q'
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# إنهاء الحلقة عند الوصول إلى نهاية الفيديو
break
# تحرير كائن التقاط الفيديو وإغلاق نافذة العرض
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
# تحميل نموذج YOLO26
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:
# تشغيل تتبّع YOLO26 على الإطار، مع الاحتفاظ بالمسارات بين الإطارات
result = model.track(frame, persist=True)[0]
# الحصول على الصناديق ومعرّفات المسارات
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# عرض النتيجة مرئيًا على الإطار
frame = result.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))) # نقطة المركز x وy
if len(track) > 30: # الاحتفاظ بـ 30 مسارًا لمدة 30 إطارًا
track.pop(0)
# رسم خطوط التتبّع
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# عرض الإطار المشروح
cv2.imshow("YOLO26 Tracking", frame)
# إنهاء الحلقة إذا ضُغط على 'q'
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# إنهاء الحلقة عند الوصول إلى نهاية الفيديو
break
# تحرير كائن التقاط الفيديو وإغلاق نافذة العرض
cap.release()
cv2.destroyAllWindows()التتبّع متعدد الخيوط#
يتيح التتبّع متعدد الخيوط تشغيل تتبّع الأجسام على تدفقات فيديو متعددة في الوقت نفسه. وهذا مفيد خصوصًا عند التعامل مع عدة مدخلات فيديو، مثل تلك الواردة من كاميرات مراقبة متعددة، إذ يمكن للمعالجة المتزامنة أن تحسّن الكفاءة والأداء بدرجة كبيرة.
يستخدم برنامج Python النصي المقدّم وحدة Python threading لتشغيل عدة مثيلات من أداة التتبّع بالتزامن. ويتولى كل خيط تشغيل أداة التتبّع على ملف فيديو واحد، بينما تعمل جميع الخيوط في الخلفية في الوقت نفسه.
لضمان تلقّي كل خيط للوسيطات الصحيحة (ملف الفيديو والنموذج المطلوب استخدامه وفهرس الملف)، نعرّف دالة 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
# تعريف أسماء النماذج ومصادر الفيديو
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # فيديو محلي، و0 لكاميرا الويب
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
# إنشاء خيوط أداة التتبّع وبدؤها باستخدام حلقة for
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()
# انتظار انتهاء جميع خيوط أداة التتبّع
for thread in tracker_threads:
thread.join()
# تنظيف الموارد وإغلاق النوافذ
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.
لا. تخزّن ملفات Ultralytics القياسية
.ptأوزان نموذج 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")لتشغيل تتبّع الأجسام على تدفقات فيديو متعددة في الوقت نفسه، يمكنك استخدام وحدة Python
threading. وسيتولى كل خيط معالجة تدفق فيديو منفصل. إليك مثالًا يوضّح كيفية إعداد ذلك:التتبّع متعدد الخيوطimport threading import cv2 from ultralytics import YOLO # تعريف أسماء النماذج ومصادر الفيديو MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"] SOURCES = ["path/to/video.mp4", "0"] # فيديو محلي، و0 لكاميرا الويب 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 # إنشاء خيوط أداة التتبّع وبدؤها باستخدام حلقة for 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() # انتظار انتهاء جميع خيوط أداة التتبّع for thread in tracker_threads: thread.join() # تنظيف الموارد وإغلاق النوافذ 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()يرسم هذا البرنامج خطوط التتبّع التي تُظهر مسارات حركة الأجسام المتتبَّعة بمرور الوقت، ما يوفّر رؤى قيّمة حول سلوك الأجسام وأنماطها.