Ultralytics YOLO27:
Get Started

تتبّع أجسام متعددة باستخدام Ultralytics YOLO#

YOLO multi-object tracking with trajectory paths

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

اطّلع على معاينة YOLO27 غير المُصدرة لمعرفة دعم التتبّع المخطط له.

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

بدءًا من 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-SORTbotsort.yamlكالمان خطياختياري (with_reid)قابل للتهيئة (gmc_method)مخزن مؤقت للتتبّع + إعادة ربط ReID
ByteTrackbytetrack.yamlكالمان خطيلا يوجدلااستعادة ثنائية المرحلة للكشف منخفض الثقة
OC-SORTocsort.yamlكالمان مرتكز على الرصدلا يوجدلاإعادة تحديث ORU وOCM وOCR انطلاقًا من آخر رصد
Deep OC-SORTdeepocsort.yamlكالمان مرتكز على الرصداختياري (with_reid)قابل للتهيئة (gmc_method)OC-SORT + متوسط أسي متكيف اختياري للمظهر (EMA)
FastTrackerfasttrack.yamlكالمان خطي + التراجعلا يوجدلاالتراجع في كالمان + تكبير bbox عند الحجب
TrackTracktracktrack.yamlكالمان خطي (NSA)اختياري (with_reid)قابل للتهيئة (gmc_method)إقران تكراري متعدد الإشارات + TAI

أي متتبّع ينبغي أن أستخدم؟#

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

  1. هل تحتاج إلى أسرع خط أساس وأبسطه؟ → ByteTrack (من دون ReID أو تعويض لحركة الكاميرا، وبأقل حمل إضافي).
  2. هل تتعامل مع لقطات بكاميرا محمولة أو طائرة مسيّرة أو كاميرا متحركة؟ → BoT-SORT (يضيف تعويض حركة الكاميرا وخيار ReID).
  3. هل توجد حركة غير خطية (رياضة أو رقص أو انعطافات مفاجئة) ولا تحتاج إلى ReID؟ → OC-SORT (تصحيحات مرتكزة على الرصد من دون كلفة المظهر).
  4. هل تعمل على مشاهد مزدحمة بكاميرا متحركة، حيث تكون تبديلات المعرّفات المشكلة الرئيسية؟ → Deep OC-SORT أو TrackTrack (يدعم كلاهما المطابقة الاختيارية للمظهر؛ ويضيف TrackTrack أيضًا الإقران متعدد الإشارات وكبح المعرّفات المكررة).
  5. هل يحدث تداخل جزئي متكرر في الزمن الفعلي، من دون ميزانية لـ 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_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackيحدّد نوع المتتبّع.
track_high_thresh0.0-1.0عتبة المطابقة الأولى. تؤثر في مدى الثقة بمطابقة اكتشاف مع مسار موجود.
track_low_thresh0.0-1.0الحد الأدنى لاكتشافات الاسترداد منخفضة الثقة. لا يستخدمها OC-SORT وDeep OC-SORT إلا عند use_byte: True؛ أما TrackTrack فيضمّها إلى مجموعة المطابقة الخاضعة للعقوبة.
new_track_thresh0.0-1.0العتبة اللازمة لبدء مسار جديد إذا لم يتطابق الاكتشاف مع أي مسار موجود.
track_buffer>=0عدد الإطارات التي تبقى فيها المسارات المفقودة نشطة قبل إزالتها. تعني القيمة الأعلى تسامحًا أكبر مع الاحتجاب.
match_thresh0.0-1.0عتبة مطابقة المسارات. تجعل القيم الأعلى المطابقة أكثر تساهلًا.
fuse_scoreTrue, Falseما إذا كان ينبغي دمج درجات الثقة مع مسافات IoU قبل المطابقة.
gmc_methodsparseOptFlow, orb, sift, ecc, noneطريقة تعويض الحركة العامة. تساعد على مراعاة حركة الكاميرا.
proximity_thresh0.0-1.0الحد الأدنى لقيمة IoU المطلوبة لمطابقة ReID صالحة. يضمن التقارب المكاني قبل استخدام مؤشرات المظهر.
appearance_thresh0.0-1.0الحد الأدنى للتشابه المظهري المُطبَّع المطلوب لـ ReID.
with_reidTrue, Falseتفعيل المطابقة المستندة إلى المظهر لتحسين التتبع عبر حالات الاحتجاب. يدعمها BoT-SORT وDeep OC-SORT وTrackTrack.
modelauto أو مسار نموذج ReID متوافقنموذج 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.onnx4482.82.0
YOLO26s-reid.onnx4487.56.6
YOLO26m-reid.onnx44812.420.1
YOLO26l-reid.onnx44815.325.2
YOLO26x-reid.onnx44832.755.9
يقتصر ReID على التتبع

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

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

تصدير نموذج 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_methodsparseOptFlow, orb, sift, ecc, noneالواجهة الخلفية لتعويض حركة الكاميرا. sparseOptFlow هي القيمة الافتراضية. يعطّل none ميزة CMC.
with_reidTrue, Falseتفعيل المطابقة المستندة إلى المظهر. وهي معطّلة افتراضيًا.
modelauto أو مسار نموذج ReID متوافقيستخدم auto ميزات YOLO الأصلية عند توفرها؛ ويمكن أن تكون النماذج المخصصة نقاط تحقق .pt أو صادرات متوافقة.
proximity_thresh0.0-1.0الحد الأدنى لقيمة IoU قبل أخذ ميزات المظهر في الحسبان.
appearance_thresh0.0-1.0الحد الأدنى للتشابه المظهري المُطبَّع المطلوب لمطابقة ReID. ارفع القيمة لجعل المطابقة أكثر صرامة.

نصائح الضبط:

  • كاميرا ثابتة: عيّن gmc_method: none لتوفير بضعة مللي ثانية لكل إطار.
  • حركة كاميرا كبيرة: أبقِ sparseOptFlow؛ فـecc أدق لكنه أبطأ.
  • حشود متشابهة المظهر: فعّل with_reid: True وارفع appearance_thresh (مثلًا إلى 0.85+).

ByteTrack#

تُعدّ ByteTrack (Zhang وآخرون، 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. تؤدي القيم الأكبر إلى مزيد من التنعيم.
inertia0.0-1.0وزن كلفة توافق السرعة. تفرض القيم الأعلى عقوبة أكبر على التغيّرات المفاجئة في الاتجاه.
use_byteTrue, 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_reidTrue, Falseتفعيل المطابقة المستندة إلى المظهر. وهي معطّلة افتراضيًا.
modelauto أو مسار نموذج ReID متوافقيستخدم auto ميزات YOLO الأصلية عند توفرها؛ ويمكن أن تكون النماذج المخصصة نقاط تحقق .pt أو صادرات متوافقة.
proximity_thresh0.0-1.0الحد الأدنى لقيمة IoU قبل أخذ ميزات المظهر في الحسبان.
appearance_thresh0.0-1.0الحد الأدنى للتشابه المظهري المُطبَّع المطلوب لمطابقة ReID.
alpha_fixed_emb0.0-1.0عامل EMA الأساسي لتحديث تضمينات المسارات. تحافظ القيم الأعلى على التضمين الأقدم مدة أطول.
gmc_methodsparseOptFlow, orb, sift, ecc, noneطريقة تعويض الحركة العامة.
delta_t>=1النافذة الزمنية (بالإطارات) لحساب اتجاه السرعة في OCM (موروثة من OC-SORT).
inertia0.0-1.0وزن كلفة توافق السرعة (موروث من OC-SORT).
use_byteTrue, Falseتفعيل مطابقة ثانية على نمط ByteTrack للاكتشافات منخفضة الثقة (موروثة من OC-SORT).

نصائح الضبط:

  • تبديل المعرّفات في الحشود: ارفع appearance_thresh (مثلًا إلى 0.92-0.95) وارفع alpha_fixed_emb كي تتكيف التضمينات ببطء أكبر.
  • كاميرا متحركة: عيّن gmc_method: sparseOptFlow (يستخدم Deep OC-SORT افتراضيًا none).
  • زمن استجابة أقل: أبقِ with_reid: False (القيمة الافتراضية) للحركة وCMC فقط؛ وفعّل ReID فقط عندما تكون أخطاء تبديل المعرّفات هي السائدة.

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_occ0.0-1.0مضاعف السرعة أثناء الاحتجاب. تجعل القيم الأقل المسار «يتباطأ» خلال الاحتجاب.
active_occ_to_lost_thresh>=1الحد الأقصى لعدد إطارات الاحتجاب المتتالية قبل نقل مسار نشط إلى قائمة المسارات المفقودة.
occ_cover_thresh0.0-1.0النسبة من مساحة المسار التي يغطيها مسار نشط آخر للإعلان عن حدوث احتجاب.
occ_reappear_window>=0عدد الإطارات التي يظل خلالها المسار المفقود الذي احتُجب مؤخرًا أسهل في إعادة العثور عليه.
init_iou_suppress0.0-1.0منع بدء مسار جديد إذا تجاوزت قيمة IoU له مع أي مسار نشط هذا الحد. عيّن القيمة إلى 1.0 لتعطيل ذلك.

نصائح الضبط:

  • حالات الاحتجاب الجزئي المتكررة: خفّض occ_cover_thresh (مثلًا، إلى 0.5-0.6).
  • معرّفات مكررة قرب مناطق التداخل: خفّض init_iou_suppress (مثلًا، إلى 0.5).
  • حالات الاحتجاب الطويلة: ارفع occ_reappear_window وtrack_buffer معًا.
  • الأهداف سريعة الحركة: ارفع dampen_motion_occ (ليقترب من 1.0)؛ ولا ترفع enlarge_bbox_occ إلا عندما يؤدي توسيع نطاق البحث إلى تحسين الاستعادة.

TrackTrack#

TrackTrack (Shim et al., CVPR 2025) هو أداة التتبّع الافتراضية. ويحلل كل مسار من منظوره، مستخدمًا الإسناد التكراري متعدد الإشارات:

  • الإسناد القائم على منظور المسار (TPA): يجمع بين HMIoU ومسافة ReID الجيبية الاختيارية ومسافة إسقاط الثقة ومسافة زاوية الزاوية. ويُحل الإسناد تكراريًا باستخدام عتبة مرنة.
  • التهيئة الواعية بالمسار (TAI): تمنع إنشاء مسارات مكررة قبل إنشاء معرّف جديد.

الأنسب لـ: المشاهد المكتظة التي يتكرر فيها الاحتجاب وتشكّل فيها المعرّفات المكررة مشكلة.

وسيطات خاصة بـ TrackTrack:

المعلمةالقيم أو النطاقات الصالحةالوصف
iou_weight0.0-1.0وزن مسافة HMIoU عند تفعيل ReID؛ وإلا فتُستخدم HMIoU مباشرةً.
reid_weight0.0-1.0وزن مسافة ReID الجيبية عند تفعيل ReID؛ وإلا فتُهمل.
conf_weight0.0-1.0وزن مسافة إسقاط الثقة.
angle_weight0.0-1.0وزن مسافة زاوية الزاوية.
penalty_p0.0-1.0عقوبة التكلفة للكشوف منخفضة الثقة.
penalty_q0.0-1.0عقوبة التكلفة للكشوف المستعادة بواسطة NMS ثانوي.
reduce_step0.0-1.0مقدار إرخاء عتبة المطابقة في كل تكرار.
tai_thr0.0-1.0عتبة IoU لـ NMS الخاص بالتهيئة الواعية بالمسار.
min_track_len>=0الحد الأدنى لطول السجل قبل تأكيد مسار جديد.
lost_match_thr0.0-1.0بوابة تكلفة أكثر تساهلًا لمرحلة إعادة الإسناد المرنة للمسارات المفقودة؛ وتعطّلها القيمة 0.
with_reidTrue, Falseتفعيل مطابقة المظهر باستخدام ReID الجيبية (تستخدم ميزات YOLO الأصلية). وهي معطّلة افتراضيًا.
modelauto أو مسار نموذج ReID متوافقيستخدم auto ميزات YOLO الأصلية عند توفرها؛ ويمكن أن تكون النماذج المخصصة نقاط تحقق .pt أو صادرات متوافقة.
gmc_methodsparseOptFlow, 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".

حلقة for للتدفّق مع التتبّع
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()

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

التعليقات