Link to this sectionتتبع الكائنات المتعددة باستخدام Ultralytics YOLO#
يعد تتبع الكائنات في مجال تحليل الفيديو مهمة بالغة الأهمية لا تكتفي بتحديد موقع وفئة الكائنات داخل الإطار فحسب، بل تحافظ أيضاً على معرف فريد (ID) لكل كائن مكتشف مع تقدم الفيديو. التطبيقات لا حصر لها، بدءاً من المراقبة والأمن وصولاً إلى تحليلات الرياضة في الوقت الفعلي.
Link to this sectionلماذا تختار Ultralytics YOLO لتتبع الكائنات؟#
تتوافق مخرجات متتبعات Ultralytics مع اكتشاف الكائنات القياسي ولكن مع القيمة المضافة لمعرفات الكائنات. هذا يجعل من السهل تتبع الكائنات في تدفقات الفيديو وإجراء تحليلات لاحقة. إليك سبب وجوب التفكير في استخدام Ultralytics YOLO لاحتياجات تتبع الكائنات الخاصة بك:
- الكفاءة: معالجة تدفقات الفيديو في الوقت الفعلي دون المساومة على الدقة.
- المرونة: يدعم خوارزميات وتكوينات تتبع متعددة.
- سهولة الاستخدام: خيارات بسيطة لـ Python API و CLI للتكامل والنشر السريع.
- إمكانية التخصيص: سهولة الاستخدام مع نماذج YOLO المدربة مخصصة، مما يسمح بالتكامل في التطبيقات الخاصة بالمجالات.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Link to this sectionتطبيقات العالم الحقيقي#
| النقل | التجزئة | الاستزراع المائي |
|---|---|---|
| تتبع المركبات | تتبع الأشخاص | تتبع الأسماك |
Link to this sectionلمحة عن الميزات#
يوسع Ultralytics YOLO ميزات اكتشاف الكائنات الخاصة به لتوفير تتبع قوي ومتعدد الاستخدامات للكائنات:
- التتبع في الوقت الفعلي: تتبع الكائنات بسلاسة في الفيديوهات ذات معدل الإطارات العالي.
- دعم متتبعات متعددة: اختر من بين مجموعة متنوعة من خوارزميات التتبع المعتمدة.
- تكوينات متتبع قابلة للتخصيص: قم بتعديل خوارزمية التتبع لتلبية متطلبات محددة عن طريق ضبط معلمات مختلفة.
Link to this sectionالمتتبعات المتاحة#
يدعم Ultralytics YOLO خوارزميات التتبع التالية. يمكن تفعيلها عن طريق تمرير ملف تكوين YAML المناسب مثل tracker=tracker_type.yaml:
- BoT-SORT - استخدم
botsort.yamlلتفعيل هذا المتتبع. - ByteTrack - استخدم
bytetrack.yamlلتفعيل هذا المتتبع.
المتتبع الافتراضي هو BoT-SORT.
Link to this sectionالتتبع#
لتشغيل المتتبع على تدفقات الفيديو، استخدم نموذج Detect أو Segment أو Pose مدرب مثل YOLO26n أو YOLO26n-seg أو YOLO26n-pose. يمكنك تدريب نماذج مخصصة محلياً أو على وحدات معالجة الرسومات السحابية من خلال منصة Ultralytics.
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo26n.pt") # Load an official Detect model
model = YOLO("yolo26n-seg.pt") # Load an official Segment model
model = YOLO("yolo26n-pose.pt") # Load an official Pose model
model = YOLO("path/to/best.pt") # Load a custom-trained model
# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # with ByteTrackكما يمكن ملاحظته في الاستخدام أعلاه، التتبع متاح لجميع نماذج Detect و Segment و Pose التي يتم تشغيلها على الفيديوهات أو مصادر البث.
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 | يحدد نوع المتتبع. الخيارات هي botsort أو bytetrack. |
track_high_thresh | 0.0-1.0 | العتبة المستخدمة للمطابقة الأولى أثناء التتبع. تؤثر على مدى الثقة في مطابقة الاكتشاف مع مسار موجود. |
track_low_thresh | 0.0-1.0 | العتبة للمطابقة الثانية أثناء التتبع. تُستخدم عندما تفشل المطابقة الأولى، بمعايير أكثر تساهلاً. |
new_track_thresh | 0.0-1.0 | العتبة لتهيئة مسار جديد إذا لم يتطابق الاكتشاف مع أي مسارات موجودة. تتحكم في متى يُعتبر الكائن جديداً ظهر في المشهد. |
track_buffer | >=0 | المخزن المؤقت المستخدم للإشارة إلى عدد الإطارات التي يجب أن تبقى فيها المسارات المفقودة حية قبل إزالتها. القيمة الأعلى تعني تحملاً أكبر للحجب. |
match_thresh | 0.0-1.0 | عتبة مطابقة المسارات. القيم الأعلى تجعل المطابقة أكثر تساهلاً. |
fuse_score | True, False | تحدد ما إذا كان سيتم دمج درجات الثقة مع مسافات IoU قبل المطابقة. تساعد في موازنة المعلومات المكانية ومعلومات الثقة عند الربط. |
gmc_method | orb, sift, ecc, sparseOptFlow, None | الطريقة المستخدمة لتعويض الحركة العالمية. تساعد في مراعاة حركة الكاميرا لتحسين التتبع. |
proximity_thresh | 0.0-1.0 | أدنى IoU مطلوب لمطابقة صالحة مع ReID (إعادة التعريف). يضمن القرب المكاني قبل استخدام إشارات المظهر. |
appearance_thresh | 0.0-1.0 | أدنى تشابه في المظهر مطلوب لـ ReID. يحدد مدى التشابه البصري الذي يجب أن يكون عليه اكتشافان ليتم ربطهما. |
with_reid | True, False | يشير إلى ما إذا كان سيتم استخدام ReID. يتيح المطابقة القائمة على المظهر لتتبع أفضل عبر الحجب. مدعوم فقط بواسطة BoTSORT. |
model | auto, yolo26[nsmlx]-cls.pt | يحدد النموذج المراد استخدامه. الافتراضي هو auto، الذي يستخدم الميزات الأصلية إذا كان الكاشف هو YOLO، وإلا يستخدم yolo26n-cls.pt. |
Link to this sectionتفعيل إعادة التعريف (ReID)#
افتراضياً، يتم إيقاف ReID لتقليل حمل الأداء. تفعيله بسيط - فقط قم بضبط with_reid: True في تكوين المتتبع. يمكنك أيضاً تخصيص model المستخدم لـ ReID، مما يسمح لك بالموازنة بين الدقة والسرعة اعتماداً على حالة الاستخدام الخاصة بك:
- الميزات الأصلية (
model: auto): تستفيد هذه الميزات مباشرة من كاشف YOLO لـ ReID، مع إضافة حد أدنى من الحمل. إنه مثالي عندما تحتاج إلى مستوى معين من ReID دون التأثير بشكل كبير على الأداء. إذا كان الكاشف لا يدعم الميزات الأصلية، فإنه يعود تلقائياً لاستخدامyolo26n-cls.pt. - نماذج تصنيف YOLO: يمكنك تعيين نموذج تصنيف صراحة (مثل
yolo26n-cls.pt) لاستخراج ميزات ReID. هذا يوفر تضمينات أكثر تمييزاً، لكنه يقدم زمن انتقال إضافي بسبب خطوة الاستدلال الإضافية.
للحصول على أداء أفضل، خاصة عند استخدام نموذج تصنيف منفصل لـ ReID، يمكنك تصديره إلى خلفية أسرع مثل 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", half=True, dynamic=True, batch=32)بمجرد التصدير، يمكنك الإشارة إلى مسار نموذج TensorRT في تكوين المتتبع الخاص بك، وسيتم استخدامه لـ 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 المتتبع أن الصورة أو الإطار الحالي هو التالي في تسلسل وأن يتوقع مسارات من الصورة السابقة في الصورة الحالية.
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
results = model.track(frame, persist=True)
# 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التتبع متعدد الخيوط (Multithreaded)#
يوفر التتبع متعدد الخيوط القدرة على تشغيل تتبع الكائنات على تدفقات فيديو متعددة في وقت واحد. هذا مفيد بشكل خاص عند التعامل مع مدخلات فيديو متعددة، مثل تلك القادمة من كاميرات مراقبة متعددة، حيث يمكن للمعالجة المتزامنة أن تعزز الكفاءة والأداء بشكل كبير.
في نص 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؟#
يتضمن تتبع الكائنات المتعددة في تحليلات الفيديو تحديد الكائنات والحفاظ على معرف فريد (ID) لكل كائن مكتشف عبر إطارات الفيديو. يدعم Ultralytics YOLO ذلك من خلال توفير تتبع في الوقت الفعلي جنبًا إلى جنب مع معرفات الكائنات، مما يسهل مهام مثل المراقبة الأمنية وتحليلات الرياضة. يستخدم النظام متتبعات مثل BoT-SORT و ByteTrack، والتي يمكن تهيئتها عبر ملفات 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. سيتولى كل خيط (thread) التعامل مع بث فيديو منفصل. إليك مثال على كيفية إعداد ذلك:
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()سيقوم هذا النص البرمجي برسم خطوط التتبع التي توضح مسارات حركة الكائنات المتعقبة بمرور الوقت، مما يوفر رؤى قيمة حول سلوك الكائنات وأنماطها.