Link to this sectionتتبع متعدد الكائنات باستخدام Ultralytics YOLO#
يعد تتبع الكائنات في مجال تحليلات الفيديو مهمة بالغة الأهمية، فهي لا تكتفي بتحديد موقع الكائنات وفئتها داخل الإطار فحسب، بل تحافظ أيضاً على معرف فريد (ID) لكل كائن مكتشف مع تقدم الفيديو. التطبيقات لا حصر لها، بدءاً من المراقبة والأمن وصولاً إلى تحليلات الرياضة في الوقت الفعلي.
بدءاً من إصدار Ultralytics YOLO v8.4.63، أصبحت خوارزميات التتبع الجديدة متاحة: OC-SORT، و Deep OC-SORT، و FastTracker، و TrackTrack. تعمل هذه المتتبعات على تحسين أداء تتبع الأجسام المتعددة واتساق المعرف (ID consistency).
Link to this sectionلماذا تختار Ultralytics YOLO لتتبع الكائنات؟#
المخرجات من متتبعات Ultralytics متوافقة مع اكتشاف الكائنات القياسي ولكنها تتميز بالقيمة المضافة المتمثلة في معرفات الكائنات (Object IDs). هذا يجعل من السهل تتبع الكائنات في تدفقات الفيديو وإجراء تحليلات لاحقة. إليك لماذا يجب عليك التفكير في استخدام Ultralytics YOLO لاحتياجات تتبع الكائنات الخاصة بك:
- الكفاءة: معالجة تدفقات الفيديو في الوقت الفعلي دون المساومة على الدقة.
- المرونة: يدعم خوارزميات وتكوينات تتبع متعددة.
- سهولة الاستخدام: واجهة برمجة تطبيقات (API) بسيطة لـ Python وخيارات CLI للتكامل والنشر السريع.
- قابلية التخصيص: سهولة الاستخدام مع نماذج YOLO المدربة مخصصة، مما يسمح بالتكامل في تطبيقات خاصة بمجال معين.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Link to this sectionتطبيقات العالم الحقيقي#
| النقل | التجزئة | تربية الأحياء المائية |
|---|---|---|
| تتبع المركبات | تتبع الأشخاص | تتبع الأسماك |
Link to this sectionبدء التشغيل السريع#
قم بتشغيل التتبع على مقطع فيديو باستخدام المتتبع الافتراضي BoT-SORT. يمكنك التبديل إلى متتبع آخر عن طريق تغيير الوسيطة tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (BoT-SORT)
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")لتشغيل أداة التتبع على بث الفيديو، استخدم نموذجاً مُدرباً من نماذج الكشف (Detect) أو التجزئة (Segment) أو تقدير الوضعية (Pose) أو الصناديق الموجهة (OBB) مثل YOLO26n أو YOLO26n-seg أو YOLO26n-pose أو YOLO26n-obb. يمكنك تدريب نماذج مخصصة محلياً أو على وحدات معالجة الرسوميات (GPUs) السحابية من خلال Ultralytics Platform.
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كما يمكن ملاحظته في الاستخدام أعلاه، فإن التتبع متاح لجميع نماذج Detect و Segment و Pose التي يتم تشغيلها على مقاطع الفيديو أو مصادر البث.
Link to this sectionالمتتبعات المدعومة#
يأتي Ultralytics YOLO مزوداً بستة متتبعات مدمجة. يمكنك تفعيل أحدها عن طريق تمرير ملف إعداد YAML الخاص به إلى الوسيطة tracker.
| المتتبع | ملف الإعداد | نموذج الحركة | المظهر / ReID | تعويض حركة الكاميرا | معالجة الإخفاء |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | كالمان خطي | اختياري (with_reid) | نعم (sparseOptFlow / ECC) | مخزن تتبع + إعادة ربط 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) | اختياري (HMIoU fallback) | نعم (sparseOptFlow / ECC) | ربط تكراري متعدد الإشارات + TAI |
Link to this sectionأي متتبع يجب أن أستخدم؟#
استخدم هذا المسار لاختيار نقطة البداية:
- هل تحتاج إلى أسرع وأبسط خط أساس؟ ← ByteTrack (لا يوجد ReID، لا يوجد تعويض حركة كاميرا، حد أدنى من النفقات العامة).
- لقطات محمولة باليد أو طائرات بدون طيار أو كاميرا متحركة؟ ← BoT-SORT (افتراضي؛ يضيف تعويض حركة الكاميرا و ReID اختياري).
- حركة غير خطية (رياضة، رقص، انعطافات مفاجئة) ولا يوجد ReID؟ ← OC-SORT (تصحيحات متمحورة حول الملاحظة بدون تكلفة مظهر).
- مشاهد مزدحمة بكاميرا متحركة حيث تكون مبادلات المعرفات (ID swaps) هي المشكلة الرئيسية؟ ← Deep OC-SORT أو TrackTrack (كلاهما يضيف دمج مظهر تكيفي؛ يضيف TrackTrack أيضاً ربطاً متعدد الإشارات وقمع معرفات مكررة).
- تداخل جزئي متكرر في الوقت الفعلي، لا توجد ميزانية لـ ReID؟ ← FastTracker (متغير ByteTrack واعي بالإخفاء مع تراجع كالمان).
Link to this sectionتبديل المتتبعات#
قم بتمرير اسم ملف إعداد المتتبع إلى 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")Link to this sectionالإعدادات#
Link to this sectionوسائط التتبع#
تتشارك إعدادات التتبع في الخصائص مع وضع التنبؤ (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)Link to this sectionإعداد متتبع مخصص#
يسمح لك 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")Link to this sectionوسائط المتتبع المشتركة#
المعلمات التالية مشتركة بين معظم ملفات YAML الخاصة بالمتتبع؛ لا تظهر كل معلمة في كل إعداد:
إذا انخفضت درجة ثقة الاكتشاف عن track_high_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. |
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. تستخدم auto ميزات الهيكل الأساسي لـ YOLO الأصلية عند توفرها؛ وإلا يتم العودة إلى yolo26n-cls.pt. قم بتمرير ملف .torchscript أو .onnx أو .engine أو .openvino أو غيرها من الملفات لمشفر مخصص. |
Link to this sectionوسائط التتبع الخاصة#
تتيح كل خوارزمية عناصر تحكم إضافية علاوة على المعلمات المشتركة. راجع الأقسام الخاصة بكل متتبع أدناه للحصول على الأوصاف ونصائح الضبط، أو ارجع مباشرة إلى ملفات التكوين:
Link to this sectionتمكين إعادة التحديد (ReID)#
يتم تعطيل ReID افتراضياً لتقليل العبء الإضافي. قم بتمكينه عن طريق ضبط with_reid: True في ملف تكوين المتتبع.
خيارات نموذج ReID:
model: auto— يستخدم ميزات كاشف YOLO الأصلية، مما يضيف حداً أدنى من العبء. مثالي عندما تحتاج إلى بعض وظائف ReID دون تأثير كبير على الأداء. يتم التراجع إلىyolo26n-cls.ptإذا كان الكاشف لا يوفر ميزات متوافقة.- نموذج ReID مُصدّر — قم بتوجيه
model:إلى ملف مُصدّر (.torchscript،.onnx،.engine،.openvino، إلخ) للحصول على تضمينات أكثر دقة على حساب تمريرة أمامية إضافية لكل قص. يتم تحميل المُشفّر عبرAutoBackend، لذا يعمل أي تنسيق تصدير يدعمه Ultralytics دون تغييرات في الكود.
يتم نشر مشفرات 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 لفرع مظهر المتتبع. لا تزال أنماط 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 في تكوين المتتبع الخاص بك.
Link to this sectionتفاصيل المتتبع#
قم بتوسيع الأقسام أدناه للاطلاع على تصميم كل متتبع، والمعلمات المحددة، ونصائح الضبط.
Link to this sectionBoT-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 | backend تعويض حركة الكاميرا. sparseOptFlow هو الافتراضي. none يعطل CMC. |
with_reid | True, False | تمكين المطابقة القائمة على المظهر. متوقف افتراضياً. |
model | auto أو مسار لنموذج ReID | نموذج ReID. يستخدم auto ميزات YOLO الأصلية عند توفرها؛ وإلا مرر مسار .torchscript / .onnx / .engine. |
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+).
Link to this sectionByteTrack#
ByteTrack (Zhang et al., ECCV 2022) هو الأساس خفيف الوزن. يستخدم Kalman خطي + IoU مع ربط من مرحلتين:
- المرحلة 1: مطابقة الاكتشافات ذات النتيجة العالية مقابل المسارات النشطة.
- المرحلة 2: إعادة محاولة المسارات غير المطابقة مقابل الاكتشافات ذات النتيجة المنخفضة للتعافي خلال الانسداد الجزئي الوجيز.
لا يوجد نموذج مظهر ولا تعويض لحركة الكاميرا.
الأفضل لـ: الكاميرات الثابتة أو شبه الثابتة حيث تهيمن تكلفة الكاشف وتريد الحد الأدنى من عبء المتتبع.
وسائط خاصة بـ ByteTrack: لا شيء بخلاف وسائط المتتبع المشتركة.
نصائح الضبط:
- كاشف مشوش: اخفض
track_low_threshليكون لدى المرحلة الثانية المزيد من المرشحين. - كاشف عالي الاسترجاع: ارفع
track_high_threshلتقليل المعرفات المفتتة. - وميض المعرف المتكرر: ارفع
track_bufferلتبقى المسارات المفقودة لفترة وجيزة على قيد الحياة.
Link to this sectionOC-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 المزيد من المسارات المفقودة لإعادة ربطها.
Link to this sectionDeep OC-SORT#
Deep OC-SORT يعزز OC-SORT بمعلومات المظهر وتعويض حركة الكاميرا:
- دمج المظهر التكيفي: يتم دمج تضمينات الاكتشاف في مصفوفة التكلفة مع وزن يتم تعديله بواسطة ثقة الاكتشاف والتداخل.
- EMA المظهر الديناميكي: يتم تحديث تضمينات المسار باستخدام EMA الذي يتكيف عامل تنعيمه مع ثقة الاكتشاف.
- تعويض حركة الكاميرا: يتم التواء حالات Kalman من إطار إلى إطار عبر التدفق البصري المتناثر أو ORB أو ECC.
الأفضل لـ: المشاهد المزدحمة أو ذات الكاميرات المتحركة حيث تكون تبديلات الهوية بين الكائنات المتشابهة بصرياً والمتقاربة مكانياً شائعة.
وسائط خاصة بـ Deep OC-SORT:
| المعامل | القيم أو النطاقات الصالحة | الوصف |
|---|---|---|
with_reid | True, False | تمكين المطابقة القائمة على المظهر. متوقف افتراضياً. |
model | auto، ملف نموذج ReID مُصدّر | نموذج ReID. يعيد auto استخدام ميزات YOLO الأصلية؛ وإلا مرر ملفاً مُصدراً (.torchscript، .onnx، .engine، …). |
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 فقط عندما تهيمن تبديلات الهوية على الأخطاء.
Link to this sectionFastTracker#
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.
Link to this sectionTrackTrack#
TrackTrack (Shim et al., CVPR 2025) يستنتج من منظور كل مسار مع ارتباط تكراري متعدد الإشارات:
- الارتباط القائم على منظور المسار (TPA): يجمع بين HMIoU، ومسافة ReID بجيب التمام، ومسافة إسقاط الثقة، ومسافة زاوية الركن. يتم حل التعيين بشكل تكراري مع عتبة تخفيفية.
- التهيئة الواعية بالمسار (TAI): تقمع التوليدات المكررة قبل إنشاء معرف جديد.
الأفضل لـ: المشاهد المزدحمة ذات الحجب المتكرر حيث تكون المعرفات المكررة مشكلة.
وسائط خاصة بـ TrackTrack:
| المعامل | القيم أو النطاقات الصالحة | الوصف |
|---|---|---|
iou_weight | 0.0-1.0 | وزن مسافة HMIoU في مصفوفة التكلفة متعددة الإشارات. |
reid_weight | 0.0-1.0 | وزن مسافة ReID بجيب التمام. يعود إلى HMIoU إذا تم تعطيل 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 | نموذج ReID؛ auto يستخدم ميزات YOLO الأصلية، وإلا يستخدم ملف ReID مُصدّر. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | طريقة تعويض الحركة العالمية. |
نصائح الضبط:
- المشاة في المناطق المزدحمة: قلل
tai_thr(مثلاً0.45) لقمع المزيد من التوليدات المكررة؛ ارفعtrack_bufferللحجب الأطول. - حركة الكاميرا السريعة: ابقِ
gmc_method: sparseOptFlowمفعلاً. - الأجسام الصغيرة/السريعة: ارفع
angle_weightقليلاً وقللmin_track_len. - تمكين ReID فقط عند الحاجة: يضيف تكلفة استنتاج؛ بالنسبة للحجب القصير، عادة ما تكون التكلفة متعددة الإشارات الافتراضية كافية.
Link to this sectionأمثلة Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Link to this sectionحلقة تتبع المسارات المستمرة#
فيما يلي نص برمجي بلغة 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'.
Link to this sectionرسم المسارات بمرور الوقت#
يمكن أن يوفر تصور مسارات الأجسام عبر إطارات متتالية رؤى قيمة حول أنماط حركة وسلوك الأجسام المكتشفة داخل الفيديو. مع 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(lambda: [])
# 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()Link to this sectionالتتبع متعدد الخيوط#
يوفر التتبع متعدد الخيوط القدرة على تشغيل تتبع الأجسام على تدفقات فيديو متعددة في وقت واحد. وهذا مفيد بشكل خاص عند التعامل مع مدخلات فيديو متعددة، مثل كاميرات المراقبة المتعددة، حيث يمكن للمعالجة المتزامنة أن تعزز الكفاءة والأداء بشكل كبير.
في نص Python المقدم، نستخدم وحدة threading في Python لتشغيل نسخ متعددة من المتعقب في وقت واحد. كل خيط مسؤول عن تشغيل المتعقب على ملف فيديو واحد، وتعمل جميع الخيوط في وقت واحد في الخلفية.
لضمان تلقي كل خيط للمعلمات الصحيحة (ملف الفيديو، النموذج المستخدم، وفهرس الملف)، نحدد دالة run_tracker_in_thread التي تقبل هذه المعلمات وتحتوي على حلقة التتبع الرئيسية. تقرأ هذه الدالة الفيديو إطاراً تلو الآخر، وتشغل المتعقب، وتعرض النتائج.
يتم استخدام نموذجين مختلفين في هذا المثال: yolo26n.pt و yolo26n-seg.pt، حيث يتتبع كل منهما الأجسام في ملف فيديو مختلف. يتم تحديد ملفات الفيديو في SOURCES.
تعني المعلمة daemon=True في threading.Thread أن هذه الخيوط سيتم إغلاقها بمجرد انتهاء البرنامج الرئيسي. ثم نبدأ الخيوط باستخدام start() ونستخدم join() لجعل الخيط الرئيسي ينتظر حتى ينتهي كلا خيطي المتعقب.
أخيراً، بعد اكتمال مهمة جميع الخيوط، يتم إغلاق النوافذ التي تعرض النتائج باستخدام cv2.destroyAllWindows().
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO26 model object.
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()يمكن توسيع هذا المثال بسهولة للتعامل مع المزيد من ملفات الفيديو والنماذج عن طريق إنشاء المزيد من الخيوط وتطبيق نفس المنهجية.
Link to this sectionساهم بمتعقبات جديدة#
هل أنت بارع في التتبع متعدد الأجسام وقمت بنجاح بتنفيذ أو تكييف خوارزمية تتبع مع Ultralytics YOLO؟ ندعوك للمساهمة في قسم المتعقبات الخاص بنا في ultralytics/cfg/trackers! يمكن أن تكون تطبيقاتك وحلولك الواقعية لا تقدر بثمن للمستخدمين الذين يعملون على مهام التتبع.
من خلال المساهمة في هذا القسم، فإنك تساعد في توسيع نطاق حلول التتبع المتاحة ضمن إطار عمل Ultralytics YOLO، مما يضيف طبقة أخرى من الوظائف والفائدة للمجتمع.
لبدء مساهمتك، يرجى الرجوع إلى دليل المساهمة للحصول على تعليمات شاملة حول تقديم طلب سحب (PR) 🛠️. نحن متحمسون لرؤية ما ستقدمه!
معاً، لنعزز قدرات التتبع في نظام Ultralytics YOLO البيئي 🙏!
Link to this sectionالأسئلة الشائعة#
Link to this sectionما هو التتبع متعدد الأجسام وكيف يدعمه Ultralytics YOLO؟#
يتضمن التتبع متعدد الأجسام في تحليل الفيديو كلاً من تحديد الأجسام والحفاظ على معرف فريد لكل جسم مكتشف عبر إطارات الفيديو. يدعم Ultralytics YOLO هذا من خلال توفير تتبع في الوقت الفعلي جنباً إلى جنب مع معرفات الأجسام، مما يسهل مهاماً مثل المراقبة الأمنية وتحليل الرياضة. يستخدم النظام متعقبات مثل BoT-SORT، و ByteTrack، و OC-SORT، و Deep OC-SORT، و FastTracker، و TrackTrack، والتي يمكن تكوينها عبر ملفات YAML.
Link to this sectionكيف يمكنني تكوين متعقب مخصص لـ Ultralytics YOLO؟#
يمكنك تكوين متعقب مخصص عن طريق نسخ ملف تكوين متعقب موجود (مثلاً 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")Link to this sectionكيف يمكنني تشغيل تتبع الأجسام على تدفقات فيديو متعددة في وقت واحد؟#
لتشغيل تتبع الأجسام على تدفقات فيديو متعددة في وقت واحد، يمكنك استخدام وحدة 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): The YOLO26 model object.
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()Link to this sectionما هي التطبيقات الواقعية للتتبع متعدد الأجسام باستخدام Ultralytics YOLO؟#
يحتوي التتبع متعدد الأجسام باستخدام Ultralytics YOLO على العديد من التطبيقات، بما في ذلك:
- النقل: تتبع المركبات لإدارة المرور و القيادة الذاتية.
- البيع بالتجزئة: تتبع الأشخاص للتحليلات داخل المتجر والأمن.
- تربية الأحياء المائية: تتبع الأسماك لمراقبة البيئات المائية.
- تحليل الرياضة: تتبع اللاعبين والمعدات لتحليل الأداء.
- أنظمة الأمان: مراقبة الأنشطة المشبوهة وإنشاء إنذارات أمنية.
تستفيد هذه التطبيقات من قدرة Ultralytics YOLO على معالجة فيديوهات عالية الإطارات في الوقت الفعلي بدقة استثنائية.
Link to this sectionكيف يمكنني تصور مسارات الأجسام عبر إطارات فيديو متعددة باستخدام 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(lambda: [])
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()سيقوم هذا النص برسم خطوط التتبع التي تظهر مسارات حركة الأجسام المتعقبة بمرور الوقت، مما يوفر رؤى قيمة حول سلوك الأجسام والأنماط.