تتبع الكائنات المتعددة مع Ultralytics YOLO
يعد تتبع الكائنات في مجال تحليلات الفيديو مهمة مهمة لا تحدد موقع وفئة الكائنات داخل الإطار فحسب ، بل تحافظ أيضا على معرف فريد لكل كائن تم اكتشافه مع تقدم الفيديو. التطبيقات لا حدود لها - بدءا من المراقبة والأمن إلى التحليلات الرياضية في الوقت الفعلي.
لماذا تختار Ultralytics YOLO لتتبع الكائن؟
الناتج من Ultralytics يتوافق المتعقبون مع اكتشاف الكائنات القياسي ولكنه يحتوي على القيمة المضافة لمعرفات الكائنات. هذا يجعل من السهل تتبع الكائنات في تدفقات الفيديو وإجراء التحليلات اللاحقة. إليك لماذا يجب أن تفكر في استخدام Ultralytics YOLO لاحتياجات تتبع الكائن الخاص بك:
- كفاءة: قم بمعالجة تدفقات الفيديو في الوقت الفعلي دون المساس بالدقة.
- المرونه: يدعم خوارزميات وتكوينات تتبع متعددة.
- سهولة الاستخدام: بسيط Python واجهة برمجة التطبيقات و CLI خيارات للتكامل والنشر السريع.
- التخصيص: سهل الاستخدام مع تدريب مخصص YOLO النماذج ، مما يسمح بالتكامل في التطبيقات الخاصة بالمجال.
شاهد: الكشف عن الكائنات وتتبعها باستخدام Ultralytics YOLOv8.
تطبيقات العالم الحقيقي
النقل | التجزئه | تربيه الاحياء المائيه |
---|---|---|
تتبع المركبات | تتبع الأشخاص | تتبع الأسماك |
الميزات في لمحة
Ultralytics YOLO يوسع ميزات اكتشاف الكائنات الخاصة به لتوفير تتبع قوي ومتعدد الاستخدامات للكائنات:
- التتبع في الوقت الحقيقي: تتبع الكائنات بسلاسة في مقاطع الفيديو ذات معدل الإطارات العالي.
- دعم تعقب متعددة: اختر من بين مجموعة متنوعة من خوارزميات التتبع المعمول بها.
- تكوينات تعقب قابلة للتخصيص: قم بتخصيص خوارزمية التتبع لتلبية متطلبات محددة عن طريق ضبط المعلمات المختلفة.
أجهزة التتبع المتاحة
Ultralytics YOLO يدعم خوارزميات التتبع التالية. يمكن تمكينها عن طريق تمرير ملف تكوين YAML ذي الصلة مثل tracker=tracker_type.yaml
:
- بوت سورت -استخدام
botsort.yaml
لتمكين هذا المتتبع. - بايت تراك -استخدام
bytetrack.yaml
لتمكين هذا المتتبع.
المتعقب الافتراضي هو BoT-SORT.
تتبع
معلومات عتبة المتعقب
إذا كانت درجة ثقة الكائن منخفضة، أي أقل من track_high_thresh
، فلن يتم إرجاع أي مسارات وتحديثها بنجاح.
لتشغيل المتعقب على تدفقات الفيديو ، استخدم نموذجا مدربا للكشف أو المقطع أو الوضع مثل YOLOv8n, YOLOv8n-سيج و YOLOv8n-تشكل.
مثل
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolov8n.pt") # Load an official Detect model
model = YOLO("yolov8n-seg.pt") # Load an official Segment model
model = YOLO("yolov8n-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
# Perform tracking with various models using the command line interface
yolo track model=yolov8n.pt source="https://youtu.be/LNwODJXcvt4" # Official Detect model
yolo track model=yolov8n-seg.pt source="https://youtu.be/LNwODJXcvt4" # Official Segment model
yolo track model=yolov8n-pose.pt source="https://youtu.be/LNwODJXcvt4" # Official Pose model
yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4" # Custom trained model
# Track using ByteTrack tracker
yolo track model=path/to/best.pt tracker="bytetrack.yaml"
كما يتضح من الاستخدام أعلاه ، يتوفر التتبع لجميع طرز Detect و Segment و Pose التي تعمل على مقاطع الفيديو أو مصادر البث.
تكوين
معلومات عتبة المتعقب
إذا كانت درجة ثقة الكائن منخفضة، أي أقل من track_high_thresh
، فلن يتم إرجاع أي مسارات وتحديثها بنجاح.
تتبع الحجج
يشارك تكوين التعقب الخصائص مع وضع التنبؤ، مثل conf
, iou
و show
. لمزيد من التكوينات، راجع تنبأ صفحة النموذج.
مثل
اختيار المقتفي
Ultralytics يسمح لك أيضا باستخدام ملف تكوين تعقب معدل. للقيام بذلك ، ما عليك سوى إنشاء نسخة من ملف تكوين تعقب (على سبيل المثال ، custom_tracker.yaml
) من ultralytics/ cfg / بتتبع وتعديل أي تكوينات (باستثناء tracker_type
) حسب احتياجاتك.
مثل
للحصول على قائمة شاملة بوسيطات التعقب، ارجع إلى ultralytics/ cfg / صفحة التتبع .
Python امثله
حلقة المسارات المستمرة
هنا Python البرنامج النصي باستخدام OpenCV (cv2
) و YOLOv8 لتشغيل تتبع الكائن على إطارات الفيديو. لا يزال هذا البرنامج النصي يفترض أنك قمت بالفعل بتثبيت الحزم الضرورية (opencv-python
و ultralytics
). ال persist=True
تخبر الوسيطة المتعقب أن الصورة أو الإطار الحالي هو التالي في تسلسل وتوقع مسارات من الصورة السابقة في الصورة الحالية.
البث للحلقة مع التتبع
import cv2
from ultralytics import YOLO
# Load the YOLOv8 model
model = YOLO("yolov8n.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 YOLOv8 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("YOLOv8 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
يرجى ملاحظة التغيير من model(frame)
ل model.track(frame)
، مما يتيح تتبع الكائنات بدلا من الاكتشاف البسيط. سيقوم هذا البرنامج النصي المعدل بتشغيل المتعقب على كل إطار من الفيديو ، وتصور النتائج ، وعرضها في نافذة. يمكن الخروج من الحلقة بالضغط على "q".
رسم المسارات بمرور الوقت
يمكن أن يوفر تصور مسارات الكائنات عبر إطارات متتالية رؤى قيمة حول أنماط الحركة وسلوك الكائنات المكتشفة داخل الفيديو. مع Ultralytics YOLOv8، فإن رسم هذه المسارات عملية سلسة وفعالة.
في المثال التالي ، نوضح كيفية استخدام YOLOv8لرسم حركة الكائنات المكتشفة عبر إطارات فيديو متعددة. يتضمن هذا البرنامج النصي فتح ملف فيديو ، وقراءته إطارا تلو الآخر ، واستخدام ملف YOLO نموذج لتحديد وتتبع الكائنات المختلفة. من خلال الاحتفاظ بالنقاط المركزية للمربعات المحيطة المكتشفة وتوصيلها ، يمكننا رسم خطوط تمثل المسارات التي تتبعها الكائنات المتعقبة.
رسم المسارات على إطارات فيديو متعددة
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLOv8 model
model = YOLO("yolov8n.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 YOLOv8 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Get the boxes and track IDs
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
# Visualize the results on the frame
annotated_frame = results[0].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 90 tracks for 90 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLOv8 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()
تتبع متعدد مؤشرات الترابط
يوفر التتبع متعدد مؤشرات الترابط القدرة على تشغيل تتبع الكائنات على تدفقات فيديو متعددة في وقت واحد. هذا مفيد بشكل خاص عند التعامل مع مدخلات فيديو متعددة ، مثل كاميرات المراقبة المتعددة ، حيث يمكن للمعالجة المتزامنة أن تعزز الكفاءة والأداء بشكل كبير.
في المقدمة Python البرنامج النصي ، ونحن الاستفادة من Python's threading
وحدة لتشغيل مثيلات متعددة من المتعقب في وقت واحد. كل مؤشر ترابط مسؤول عن تشغيل المتعقب على ملف فيديو واحد ، ويتم تشغيل جميع سلاسل الرسائل في وقت واحد في الخلفية.
للتأكد من أن كل مؤشر ترابط يتلقى المعلمات الصحيحة (ملف الفيديو والنموذج المراد استخدامه وفهرس الملف) ، نحدد وظيفة run_tracker_in_thread
يقبل هذه المعلمات ويحتوي على حلقة التتبع الرئيسية. تقرأ هذه الوظيفة إطار الفيديو بإطار ، وتدير المتعقب ، وتعرض النتائج.
يتم استخدام نموذجين مختلفين في هذا المثال: yolov8n.pt
و yolov8n-seg.pt
، كل كائنات تتبع في ملف فيديو مختلف. يتم تحديد ملفات الفيديو في video_file1
و video_file2
.
ال daemon=True
المعلمة في threading.Thread
يعني أنه سيتم إغلاق هذه المواضيع بمجرد انتهاء البرنامج الرئيسي. ثم نبدأ المواضيع مع start()
والاستخدام join()
لجعل مؤشر الترابط الرئيسي ينتظر حتى ينتهي كل من مؤشرات التعقب.
أخيرا ، بعد إكمال جميع مؤشرات الترابط مهمتها ، يتم إغلاق النوافذ التي تعرض النتائج باستخدام cv2.destroyAllWindows()
.
البث للحلقة مع التتبع
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolov8n.pt", "yolov8n-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 YOLOv8 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()
يمكن توسيع هذا المثال بسهولة للتعامل مع المزيد من ملفات الفيديو والنماذج عن طريق إنشاء المزيد من سلاسل الرسائل وتطبيق نفس المنهجية.
ساهم بأجهزة تتبع جديدة
هل أنت بارع في تتبع الكائنات المتعددة وقمت بتنفيذ أو تكييف خوارزمية تتبع بنجاح مع Ultralytics YOLO? ندعوك للمساهمة في قسم التتبع الخاص بنا في ultralytics/ cfg / تتبع! يمكن أن تكون تطبيقاتك وحلولك الواقعية لا تقدر بثمن للمستخدمين الذين يعملون على تتبع المهام.
من خلال المساهمة في هذا القسم ، فإنك تساعد في توسيع نطاق حلول التتبع المتاحة داخل Ultralytics YOLO الإطار ، إضافة طبقة أخرى من الوظائف والمرافق للمجتمع.
لبدء مساهمتك ، يرجى الرجوع إلى دليل المساهمة الخاص بنا للحصول على إرشادات شاملة حول تقديم طلب السحب (PR). 🛠️ نحن متحمسون لرؤية ما تجلبه إلى الطاولة!
معا ، دعونا نعزز قدرات التتبع الخاصة ب Ultralytics YOLO 🙏 النظام البيئي !
الأسئلة المتداولة
ما هو التتبع متعدد الكائنات وكيف يدعمه Ultralytics YOLO ؟
يتضمن التتبع متعدد الكائنات في تحليلات الفيديو كلاً من تحديد الكائنات والحفاظ على معرّف فريد لكل كائن تم اكتشافه عبر إطارات الفيديو. Ultralytics YOLO يدعم هذا الأمر من خلال توفير التتبع في الوقت الفعلي إلى جانب معرّفات الكائنات، مما يسهل مهام مثل المراقبة الأمنية والتحليلات الرياضية. يستخدم النظام أدوات تعقب مثل BoT-SORT و ByteTrack، والتي يمكن تهيئتها عبر ملفات YAML.
كيف يمكنني تكوين متعقب مخصص لـ Ultralytics YOLO ؟
يمكنك تكوين متتبع مخصص عن طريق نسخ ملف تكوين متتبع موجود (على سبيل المثال, custom_tracker.yaml
) من Ultralytics دليل تكوين المتعقب وتعديل المعلمات حسب الحاجة، باستثناء tracker_type
. استخدم هذا الملف في نموذج التتبع الخاص بك هكذا:
مثل
كيف يمكنني تشغيل تتبع الكائنات على تدفقات فيديو متعددة في وقت واحد؟
لتشغيل تتبع الأجسام على تدفقات فيديو متعددة في وقت واحد، يمكنك استخدام Python threading
الوحدة النمطية. سيتعامل كل مؤشر ترابط مع دفق فيديو منفصل. إليك مثال على كيفية إعداد ذلك:
تتبع متعدد مؤشرات الترابط
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolov8n.pt", "yolov8n-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 YOLOv8 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()
ما هي التطبيقات الواقعية للتتبع متعدد الأجسام باستخدام Ultralytics YOLO ؟
التتبع متعدد الأجسام باستخدام Ultralytics YOLO له العديد من التطبيقات، بما في ذلك:
- وسائل النقل: تتبع المركبات لإدارة حركة المرور والقيادة الذاتية.
- البيع بالتجزئة: تتبع الأشخاص للتحليلات والأمان داخل المتجر.
- تربية الأحياء المائية: تتبع الأسماك لرصد البيئات المائية.
تستفيد هذه التطبيقات من قدرة Ultralytics YOLO على معالجة مقاطع الفيديو ذات معدل الإطارات العالي في الوقت الفعلي.
كيف يمكنني تصور مسارات الكائنات عبر إطارات فيديو متعددة باستخدام Ultralytics YOLO ؟
لتصور مسارات الأجسام عبر إطارات فيديو متعددة، يمكنك استخدام ميزات التتبع في نموذج YOLO مع OpenCV لرسم مسارات الأجسام المكتشفة. إليك مثال نصي يوضح ذلك:
رسم المسارات على إطارات فيديو متعددة
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolov8n.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("YOLOv8 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
سيقوم هذا النص البرمجي برسم خطوط التتبع التي توضح مسارات حركة الأجسام المتعقبة مع مرور الوقت.