Theo dõi nhiều đối tượng với Ultralytics YOLO
Theo dõi đối tượng trong lĩnh vực phân tích video là một nhiệm vụ quan trọng không chỉ xác định vị trí và loại đối tượng trong khung hình mà còn duy trì ID duy nhất cho mỗi đối tượng được phát hiện khi video tiến triển. Các ứng dụng là vô hạn—từ giám sát và an ninh đến phân tích thể thao theo thời gian thực.
Tại sao chọn Ultralytics YOLO để theo dõi đối tượng?
Đầu ra từ Ultralytics trackers phù hợp với phát hiện đối tượng tiêu chuẩn nhưng có thêm giá trị của ID đối tượng. Điều này giúp dễ dàng theo dõi các đối tượng trong luồng video và thực hiện phân tích tiếp theo. Đây là lý do tại sao bạn nên cân nhắc sử dụng Ultralytics YOLO cho nhu cầu theo dõi đối tượng của bạn:
- Hiệu quả: Xử lý luồng video theo thời gian thực mà không làm giảm độ chính xác .
- Tính linh hoạt: Hỗ trợ nhiều thuật toán và cấu hình theo dõi.
- Dễ sử dụng: Đơn giản Python API và CLI tùy chọn tích hợp và triển khai nhanh chóng.
- Khả năng tùy chỉnh: Dễ dàng sử dụng với đào tạo tùy chỉnh YOLO mô hình, cho phép tích hợp vào các ứng dụng cụ thể theo miền.
Đồng hồ: Phát hiện và theo dõi đối tượng với Ultralytics YOLO .
Ứng dụng thực tế
Vận tải | Bán lẻ | Nuôi trồng thủy sản |
---|---|---|
Theo dõi xe | Theo dõi mọi người | Theo dõi cá |
Tính năng tổng quan
Ultralytics YOLO mở rộng các tính năng phát hiện đối tượng để cung cấp khả năng theo dõi đối tượng mạnh mẽ và linh hoạt:
- Theo dõi thời gian thực: Theo dõi liền mạch các đối tượng trong video có tốc độ khung hình cao.
- Hỗ trợ nhiều trình theo dõi: Chọn từ nhiều thuật toán theo dõi đã thiết lập.
- Cấu hình theo dõi có thể tùy chỉnh: Tùy chỉnh thuật toán theo dõi để đáp ứng các yêu cầu cụ thể bằng cách điều chỉnh nhiều thông số khác nhau.
Bộ theo dõi có sẵn
Ultralytics YOLO hỗ trợ các thuật toán theo dõi sau. Chúng có thể được kích hoạt bằng cách truyền tệp cấu hình YAML có liên quan như tracker=tracker_type.yaml
:
- BoT-SORT - Sử dụng
botsort.yaml
để kích hoạt trình theo dõi này. - ByteTrack - Sử dụng
bytetrack.yaml
để kích hoạt trình theo dõi này.
Công cụ theo dõi mặc định là BoT-SORT.
Theo dõi
Thông tin ngưỡng theo dõi
Nếu điểm tin cậy của đối tượng sẽ thấp, tức là thấp hơn track_high_thresh
, khi đó sẽ không có bản nhạc nào được trả về và cập nhật thành công.
Để chạy trình theo dõi trên các luồng video, hãy sử dụng mô hình Phát hiện, Phân đoạn hoặc Tư thế đã được đào tạo như YOLO11n, YOLO11n-seg và YOLO11n-pose.
Ví dụ
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo11n.pt") # Load an official Detect model
model = YOLO("yolo11n-seg.pt") # Load an official Segment model
model = YOLO("yolo11n-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=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" # Official Detect model
yolo track model=yolo11n-seg.pt source="https://youtu.be/LNwODJXcvt4" # Official Segment model
yolo track model=yolo11n-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"
Như có thể thấy trong cách sử dụng ở trên, tính năng theo dõi có sẵn cho tất cả các mô hình Detect, Segment và Pose chạy trên video hoặc nguồn phát trực tuyến.
Cấu hình
Thông tin ngưỡng theo dõi
Nếu điểm tin cậy của đối tượng sẽ thấp, tức là thấp hơn track_high_thresh
, khi đó sẽ không có bản nhạc nào được trả về và cập nhật thành công.
Theo dõi các đối số
Cấu hình theo dõi chia sẻ các thuộc tính với chế độ Dự đoán, chẳng hạn như conf
, iou
, Và show
. Để biết thêm cấu hình, hãy tham khảo Dự đoán trang mẫu.
Ví dụ
Lựa chọn theo dõi
Ultralytics cũng cho phép bạn sử dụng tệp cấu hình trình theo dõi đã sửa đổi. Để thực hiện việc này, chỉ cần tạo một bản sao của tệp cấu hình trình theo dõi (ví dụ: custom_tracker.yaml
) từ ultralytics /cfg/người theo dõi và sửa đổi bất kỳ cấu hình nào (trừ tracker_type
) theo nhu cầu của bạn.
Ví dụ
Để biết danh sách đầy đủ các đối số theo dõi, hãy tham khảo trang ultralytics /cfg/trackers .
Python Ví dụ
Vòng lặp theo dõi liên tục
Đây là một Python kịch bản sử dụng MởCV (cv2
) Và YOLO11 để chạy theo dõi đối tượng trên khung video. Tập lệnh này vẫn giả định rằng bạn đã cài đặt các gói cần thiết (opencv-python
Và ultralytics
). Các persist=True
đối số cho trình theo dõi biết rằng hình ảnh hoặc khung hình hiện tại là hình ảnh hoặc khung hình tiếp theo trong chuỗi và mong đợi các dấu vết từ hình ảnh trước đó trong hình ảnh hiện tại.
Phát trực tuyến vòng lặp for với theo dõi
import cv2
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.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 YOLO11 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("YOLO11 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()
Xin lưu ý sự thay đổi từ model(frame)
ĐẾN model.track(frame)
, cho phép theo dõi đối tượng thay vì phát hiện đơn giản. Tập lệnh đã sửa đổi này sẽ chạy trình theo dõi trên từng khung hình của video, trực quan hóa kết quả và hiển thị chúng trong một cửa sổ. Có thể thoát khỏi vòng lặp bằng cách nhấn 'q'.
Vẽ đường đi theo thời gian
Việc trực quan hóa các dấu vết của vật thể trên các khung hình liên tiếp có thể cung cấp những hiểu biết có giá trị về các mẫu chuyển động và hành vi của các vật thể được phát hiện trong video. Với Ultralytics YOLO11 , việc vạch ra những đường đi này là một quá trình liền mạch và hiệu quả.
Trong ví dụ sau, chúng tôi trình bày cách sử dụng YOLO11 khả năng theo dõi của để vẽ biểu đồ chuyển động của các đối tượng được phát hiện trên nhiều khung hình video. Tập lệnh này bao gồm việc mở tệp video, đọc từng khung hình và sử dụng YOLO mô hình để xác định và theo dõi các đối tượng khác nhau. Bằng cách giữ lại các điểm trung tâm của các hộp giới hạn được phát hiện và kết nối chúng, chúng ta có thể vẽ các đường biểu diễn các đường đi mà các đối tượng được theo dõi đi theo.
Vẽ các đường dẫn trên nhiều khung hình video
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.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 YOLO11 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("YOLO11 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()
Theo dõi đa luồng
Theo dõi đa luồng cung cấp khả năng chạy theo dõi đối tượng trên nhiều luồng video cùng lúc. Điều này đặc biệt hữu ích khi xử lý nhiều đầu vào video, chẳng hạn như từ nhiều camera giám sát, nơi xử lý đồng thời có thể nâng cao đáng kể hiệu quả và hiệu suất.
Trong cung cấp Python kịch bản, chúng tôi sử dụng Python 'S threading
mô-đun để chạy nhiều phiên bản của trình theo dõi đồng thời. Mỗi luồng chịu trách nhiệm chạy trình theo dõi trên một tệp video và tất cả các luồng chạy đồng thời trong nền.
Để đảm bảo rằng mỗi luồng nhận được các tham số chính xác (tệp video, mô hình sử dụng và chỉ mục tệp), chúng tôi xác định một hàm run_tracker_in_thread
chấp nhận các tham số này và chứa vòng lặp theo dõi chính. Hàm này đọc từng khung hình video, chạy trình theo dõi và hiển thị kết quả.
Có hai mô hình khác nhau được sử dụng trong ví dụ này: yolo11n.pt
Và yolo11n-seg.pt
, mỗi đối tượng theo dõi trong một tệp video khác nhau. Các tệp video được chỉ định trong video_file1
Và video_file2
.
Các daemon=True
tham số trong threading.Thread
có nghĩa là các luồng này sẽ được đóng ngay khi chương trình chính kết thúc. Sau đó, chúng tôi bắt đầu các luồng bằng start()
và sử dụng join()
để luồng chính chờ cho đến khi cả hai luồng theo dõi hoàn tất.
Cuối cùng, sau khi tất cả các luồng đã hoàn thành nhiệm vụ của chúng, các cửa sổ hiển thị kết quả sẽ được đóng lại bằng cách sử dụng cv2.destroyAllWindows()
.
Phát trực tuyến vòng lặp for với theo dõi
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-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 YOLO11 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()
Ví dụ này có thể dễ dàng được mở rộng để xử lý nhiều tệp video và mô hình hơn bằng cách tạo thêm luồng và áp dụng cùng một phương pháp.
Đóng góp các công cụ theo dõi mới
Bạn có thành thạo trong việc theo dõi nhiều đối tượng và đã triển khai hoặc điều chỉnh thành công thuật toán theo dõi với Ultralytics YOLO ? Chúng tôi mời bạn đóng góp vào mục Theo dõi của chúng tôi trong ultralytics /cfg/trackers ! Các ứng dụng và giải pháp thực tế của bạn có thể vô cùng hữu ích đối với người dùng làm nhiệm vụ theo dõi.
Bằng cách đóng góp vào phần này, bạn giúp mở rộng phạm vi các giải pháp theo dõi có sẵn trong Ultralytics YOLO khung, bổ sung thêm một lớp chức năng và tiện ích cho cộng đồng.
Để bắt đầu đóng góp của bạn, vui lòng tham khảo Hướng dẫn đóng góp của chúng tôi để biết hướng dẫn toàn diện về cách gửi Yêu cầu kéo (PR) 🛠️. Chúng tôi rất mong chờ những gì bạn mang lại!
Cùng nhau, chúng ta hãy nâng cao khả năng theo dõi của Ultralytics YOLO hệ sinh thái 🙏!
CÂU HỎI THƯỜNG GẶP
Theo dõi nhiều đối tượng là gì và hoạt động như thế nào Ultralytics YOLO ủng hộ nó?
Theo dõi nhiều đối tượng trong phân tích video bao gồm cả việc xác định đối tượng và duy trì ID duy nhất cho mỗi đối tượng được phát hiện trên các khung hình video. Ultralytics YOLO hỗ trợ điều này bằng cách cung cấp theo dõi thời gian thực cùng với ID đối tượng, tạo điều kiện cho các tác vụ như giám sát an ninh và phân tích thể thao. Hệ thống sử dụng các trình theo dõi như BoT-SORT và ByteTrack, có thể được cấu hình thông qua các tệp YAML.
Làm thế nào để cấu hình một trình theo dõi tùy chỉnh cho Ultralytics YOLO ?
Bạn có thể cấu hình trình theo dõi tùy chỉnh bằng cách sao chép tệp cấu hình trình theo dõi hiện có (ví dụ: custom_tracker.yaml
) từ Ultralytics thư mục cấu hình theo dõi và sửa đổi các thông số khi cần thiết, ngoại trừ tracker_type
. Sử dụng tệp này trong mô hình theo dõi của bạn như sau:
Ví dụ
Làm thế nào tôi có thể chạy theo dõi đối tượng trên nhiều luồng video cùng lúc?
Để chạy theo dõi đối tượng trên nhiều luồng video cùng lúc, bạn có thể sử dụng Python 'S threading
module. Mỗi luồng sẽ xử lý một luồng video riêng biệt. Sau đây là ví dụ về cách bạn có thể thiết lập điều này:
Theo dõi đa luồng
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-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 YOLO11 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()
Các ứng dụng thực tế của việc theo dõi nhiều đối tượng là gì? Ultralytics YOLO ?
Theo dõi nhiều đối tượng với Ultralytics YOLO có nhiều ứng dụng, bao gồm:
- Giao thông: Theo dõi phương tiện để quản lý giao thông và lái xe tự động.
- Bán lẻ: Theo dõi mọi người để phân tích và bảo mật trong cửa hàng.
- Nuôi trồng thủy sản: Theo dõi cá để giám sát môi trường nước.
Những ứng dụng này được hưởng lợi từ Ultralytics YOLO khả năng xử lý video có tốc độ khung hình cao theo thời gian thực.
Làm thế nào tôi có thể hình dung các đường đi của đối tượng trên nhiều khung hình video với Ultralytics YOLO ?
Để hình dung các đường đi của đối tượng trên nhiều khung hình video, bạn có thể sử dụng YOLO các tính năng theo dõi của mô hình cùng với OpenCV để vẽ đường đi của các đối tượng được phát hiện. Sau đây là một ví dụ về tập lệnh chứng minh điều này:
Vẽ các đường dẫn trên nhiều khung hình video
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo11n.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("YOLO11 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
Tập lệnh này sẽ vẽ các đường theo dõi hiển thị đường di chuyển của các đối tượng được theo dõi theo thời gian.