Theo dõi đa đố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 tác vụ quan trọng, không chỉ giúp xác định vị trí và lớp của các đối tượng trong khung hình mà còn duy trì một ID duy nhất cho mỗi đối tượng được phát hiện khi video tiếp diễn. Các ứng dụng của nó là vô hạn—từ giám sát và an ninh đến phân tích thể thao thời gian thực.
Tại sao chọn Ultralytics YOLO để theo dõi đối tượng?
Đầu ra từ các bộ theo dõi của Ultralytics nhất quán với phát hiện đối tượng tiêu chuẩn nhưng có thêm giá trị từ các ID đối tượng. Điều này giúp dễ dàng theo dõi các đối tượng trong các luồng video và thực hiện các 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 các nhu cầu theo dõi đối tượng của mình:
- Hiệu quả: Xử lý các luồng video theo thời gian thực mà không làm giảm độ chính xác.
- Linh hoạt: Hỗ trợ nhiều thuật toán và cấu hình theo dõi khác nhau.
- Dễ sử dụng: Các tùy chọn API và CLI Python đơn giản giúp 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 các model YOLO được huấn luyện tùy chỉnh, cho phép tích hợp vào các ứng dụng chuyên biệt theo miền.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Các ứng dụng thực tế
| Giao thông | Bán lẻ | Nuôi trồng thủy sản |
|---|---|---|
| Theo dõi phương tiện | Theo dõi người | Theo dõi cá |
Tổng quan các tính năng
Ultralytics YOLO mở rộng các tính năng phát hiện đối tượng của mình để 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 các đối tượng một cách mượt mà trong các video có tốc độ khung hình cao.
- Hỗ trợ đa trình theo dõi: Lựa chọn từ nhiều thuật toán theo dõi đã được thiết lập sẵn.
- Cấu hình trình theo dõi tùy chỉnh: Điều chỉnh thuật toán theo dõi để đáp ứng các yêu cầu cụ thể bằng cách thay đổi các tham số khác nhau.
Các trình theo dõi khả dụng
Ultralytics YOLO hỗ trợ các thuật toán theo dõi sau. Bạn có thể kích hoạt chúng bằng cách truyền file cấu hình YAML liên quan, ví dụ 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.
Trình theo dõi mặc định là BoT-SORT.
Theo dõi
Để chạy trình theo dõi trên các luồng video, hãy sử dụng một model Detect, Segment hoặc Pose đã được huấn luyện như YOLO26n, YOLO26n-seg hoặc YOLO26n-pose. Bạn có thể huấn luyện các model tùy chỉnh cục bộ hoặc trên GPU đám mây thông qua 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 ByteTrackNhư có thể thấy trong cách sử dụng ở trên, tính năng theo dõi khả dụng cho tất cả các model Detect, Segment và Pose khi chạy trên video hoặc các nguồn phát trực tuyến.
Cấu hình
Các đối số theo dõi
Cấu hình theo dõi có chung các thuộc tính với chế độ Predict, chẳng hạn như conf, iou và show. Để biết thêm cấu hình, hãy tham khảo trang model 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)Lựa chọn trình theo dõi
Ultralytics cũng cho phép bạn sử dụng một file cấu hình trình theo dõi đã được sửa đổi. Để làm điều này, chỉ cần sao chép một file cấu hình trình theo dõi (ví dụ: custom_tracker.yaml) từ ultralytics/cfg/trackers và sửa đổi bất kỳ cấu hình nào (ngoại trừ tracker_type) theo nhu cầu của bạn.
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")Tham khảo phần Tracker Arguments để có mô tả chi tiết về từng tham số.
Các đối số của trình theo dõi
Một số hành vi theo dõi có thể được tinh chỉnh bằng cách chỉnh sửa các file cấu hình YAML dành riêng cho từng thuật toán theo dõi. Các file này xác định các tham số như ngưỡng (thresholds), bộ đệm (buffers) và logic khớp (matching logic):
Bảng dưới đây cung cấp mô tả về từng tham số:
Nếu điểm tin cậy của một phát hiện thấp hơn track_high_thresh, trình theo dõi sẽ không cập nhật đối tượng đó, dẫn đến không có track nào được kích hoạt.
| Tham số | Giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
tracker_type | botsort, bytetrack | Chỉ định loại trình theo dõi. Các tùy chọn là botsort hoặc bytetrack. |
track_high_thresh | 0.0-1.0 | Ngưỡng được sử dụng cho sự liên kết đầu tiên trong quá trình theo dõi. Ảnh hưởng đến độ tin cậy khi một phát hiện được khớp với một track hiện có. |
track_low_thresh | 0.0-1.0 | Ngưỡng cho sự liên kết thứ hai trong quá trình theo dõi. Được sử dụng khi sự liên kết đầu tiên thất bại, với các tiêu chí nới lỏng hơn. |
new_track_thresh | 0.0-1.0 | Ngưỡng để khởi tạo một track mới nếu phát hiện không khớp với bất kỳ track hiện có nào. Kiểm soát khi nào một đối tượng mới được xem là xuất hiện. |
track_buffer | >=0 | Bộ đệm được sử dụng để chỉ định số lượng khung hình mà các track bị mất nên được giữ lại trước khi bị xóa. Giá trị càng cao đồng nghĩa với việc chấp nhận sự che khuất tốt hơn. |
match_thresh | 0.0-1.0 | Ngưỡng để khớp các track. Giá trị cao hơn làm cho việc khớp trở nên nới lỏng hơn. |
fuse_score | True, False | Xác định xem có nên hợp nhất điểm tin cậy với khoảng cách IoU trước khi khớp hay không. Giúp cân bằng thông tin không gian và tin cậy khi liên kết. |
gmc_method | orb, sift, ecc, sparseOptFlow, None | Phương pháp được sử dụng cho bù chuyển động toàn cục (Global Motion Compensation). Giúp tính toán chuyển động của camera để cải thiện quá trình theo dõi. |
proximity_thresh | 0.0-1.0 | IoU tối thiểu cần thiết để có sự khớp hợp lệ với ReID (tái nhận dạng). Đảm bảo sự gần gũi về không gian trước khi sử dụng các dấu hiệu về hình ảnh. |
appearance_thresh | 0.0-1.0 | Độ tương đồng về hình ảnh tối thiểu cần thiết cho ReID. Thiết lập mức độ giống nhau về thị giác của hai phát hiện để được liên kết với nhau. |
with_reid | True, False | Cho biết liệu có sử dụng ReID hay không. Kích hoạt tính năng khớp dựa trên hình ảnh để theo dõi tốt hơn trong các trường hợp bị che khuất. Chỉ được hỗ trợ bởi BoTSORT. |
model | auto, yolo26[nsmlx]-cls.pt | Chỉ định model để sử dụng. Mặc định là auto, sử dụng các tính năng gốc nếu bộ phát hiện là YOLO, nếu không thì sử dụng yolo26n-cls.pt. |
Kích hoạt tái nhận dạng (ReID)
Theo mặc định, ReID được tắt để giảm thiểu chi phí hiệu năng. Việc kích hoạt rất đơn giản—chỉ cần đặt with_reid: True trong cấu hình trình theo dõi. Bạn cũng có thể tùy chỉnh model được sử dụng cho ReID, cho phép bạn đánh đổi giữa độ chính xác và tốc độ tùy theo trường hợp sử dụng của mình:
- Các tính năng gốc (
model: auto): Tận dụng các tính năng trực tiếp từ bộ phát hiện YOLO cho ReID, thêm chi phí tối thiểu. Đây là lựa chọn lý tưởng khi bạn cần một mức độ ReID mà không ảnh hưởng đáng kể đến hiệu năng. Nếu bộ phát hiện không hỗ trợ các tính năng gốc, nó sẽ tự động quay lại sử dụngyolo26n-cls.pt. - Các model phân loại YOLO: Bạn có thể chỉ định rõ một model phân loại (ví dụ:
yolo26n-cls.pt) để trích xuất tính năng ReID. Điều này cung cấp các embedding phân biệt tốt hơn, nhưng tạo ra độ trễ bổ sung do bước suy luận thêm.
Để có hiệu năng tốt hơn, đặc biệt khi sử dụng một model phân loại riêng biệt cho ReID, bạn có thể xuất nó sang một backend nhanh hơn như 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)Sau khi xuất, bạn có thể trỏ đến đường dẫn model TensorRT trong cấu hình trình theo dõi của mình, và nó sẽ được sử dụng cho ReID trong quá trình theo dõi.
Các ví dụ Python
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Vòng lặp duy trì track
Dưới đây là tập lệnh Python sử dụng OpenCV (cv2) và YOLO26 để chạy theo dõi đối tượng trên các khung hình video. Tập lệnh này giả định rằng các gói cần thiết (opencv-python và ultralytics) đã được cài đặt. Đối số persist=True cho trình theo dõi biết rằng hình ảnh hoặc khung hình hiện tại là phần tiếp theo trong một chuỗi và mong đợi các track từ hình ảnh trước đó trong hình ảnh hiện tại.
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()Vui lòng lưu ý sự thay đổi từ model(frame) sang model.track(frame), cho phép theo dõi đối tượng thay vì chỉ phát hiện đơn thuần. Tập lệnh đã sửa đổi này sẽ chạy trình theo dõi trên mỗi 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ổ. Vòng lặp có thể được thoát bằng cách nhấn phím 'q'.
Vẽ biểu đồ các track theo thời gian
Việc trực quan hóa các track đối tượng qua các khung hình liên tiếp có thể cung cấp những thông tin chi tiết có giá trị về các mẫu chuyển động và hành vi của các đối tượng được phát hiện trong video. Với Ultralytics YOLO26, việc vẽ biểu đồ các track này là một quy trình mượt mà và hiệu quả.
Trong ví dụ sau, chúng tôi trình bày cách tận dụng khả năng theo dõi của YOLO26 để vẽ biểu đồ chuyển động của các đối tượng được phát hiện qua nhiều khung hình video. Tập lệnh này bao gồm việc mở một file video, đọc từng khung hình, và sử dụng model YOLO để 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 bao (bounding boxes) đã phát hiện và kết nối chúng, chúng ta có thể vẽ các đường thể hiện các đường dẫn mà các đối tượng được theo dõi đã đi qua.
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()Theo dõi đa luồng (Multithreaded)
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 một 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ể tăng cường hiệu quả và hiệu năng đáng kể.
Trong tập lệnh Python được cung cấp, chúng tôi sử dụng mô-đun threading của Python để chạy nhiều phiên bản 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 file video, và tất cả các luồng chạy đồng thời ở chế độ nền.
Để đảm bảo mỗi luồng nhận được các tham số chính xác (file video, model cần sử dụng và chỉ mục file), chúng tôi định nghĩa một hàm run_tracker_in_thread 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 video theo từng khung hình, chạy trình theo dõi và hiển thị kết quả.
Hai model khác nhau được sử dụng trong ví dụ này: yolo26n.pt và yolo26n-seg.pt, mỗi model theo dõi đối tượng trong một file video khác nhau. Các file video được chỉ định trong SOURCES.
Tham số daemon=True trong threading.Thread có nghĩa là các luồng này sẽ bị đóng ngay khi chương trình chính kết thúc. Sau đó, chúng tôi khởi động các luồng bằng start() và sử dụng join() để làm cho luồng chính chờ đợi cho đến khi cả hai luồng theo dõi đã hoàn thành.
Cuối cùng, sau khi tất cả các luồng đã hoàn thành nhiệm vụ, các cửa sổ hiển thị kết quả sẽ được đóng bằng 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()Ví dụ này có thể dễ dàng mở rộng để xử lý thêm nhiều file video và model bằng cách tạo thêm nhiều luồng và áp dụng cùng một phương pháp.
Đóng góp trình theo dõi mới
Bạn có thành thạo về theo dõi đa đố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 không? Chúng tôi mời bạn đóng góp vào phần Trackers trong ultralytics/cfg/trackers! Các ứng dụng và giải pháp thực tế của bạn có thể mang lại giá trị vô giá cho những người dùng đang làm việc với các tác 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 framework Ultralytics YOLO, bổ sung thêm một tầng chức năng và tiện ích cho cộng đồng.
Để bắt đầu đóng góp, vui lòng tham khảo Hướng dẫn Đóng góp của chúng tôi để biết các hướng dẫn toàn diện về cách gửi một Pull Request (PR) 🛠️. Chúng tôi rất hào hứng được xem những gì bạn đóng góp!
Hãy cùng nhau nâng cao khả năng theo dõi của hệ sinh thái Ultralytics YOLO 🙏!
Câu hỏi thường gặp (FAQ)
Theo dõi đa đối tượng là gì và Ultralytics YOLO hỗ trợ điều đó như thế nào?
Theo dõi đa đối tượng trong phân tích video bao gồm cả việc xác định đối tượng và duy trì một ID duy nhất cho mỗi đối tượng được phát hiện qua các khung hình video. Ultralytics YOLO hỗ trợ điều này bằng cách cung cấp tính năng theo dõi thời gian thực cùng với ID đối tượng, tạo điều kiện thuận lợi 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 bộ 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 để tôi cấu hình một bộ theo dõi tùy chỉnh cho Ultralytics YOLO?
Bạn có thể cấu hình một bộ theo dõi tùy chỉnh bằng cách sao chép tệp cấu hình bộ theo dõi hiện có (ví dụ: custom_tracker.yaml) từ thư mục cấu hình bộ theo dõi của Ultralytics và sửa đổi các tham số nếu cần, ngoại trừ tracker_type. Sử dụng tệp này trong model theo dõi của bạn như sau:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Làm cách nào để tôi có thể thực hiện 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 module threading của Python. Mỗi thread sẽ xử lý một luồng video riêng biệt. Dưới đây là ví dụ về cách bạn có thể thiết lập điều này:
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()Các ứng dụng thực tế của việc theo dõi đa đối tượng với Ultralytics YOLO là gì?
Theo dõi đa đối tượng với Ultralytics YOLO có rất 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 người để phân tích trong cửa hàng và đảm bảo an ninh.
- Nuôi trồng thủy sản: Theo dõi cá để giám sát môi trường nước.
- Phân tích thể thao: Theo dõi vận động viên và thiết bị để phân tích hiệu suất.
- Hệ thống an ninh: Giám sát các hoạt động nghi vấn và tạo báo động an ninh.
Các ứng dụng này được hưởng lợi từ khả năng xử lý video tốc độ khung hình cao trong thời gian thực với độ chính xác vượt trội của Ultralytics YOLO.
Làm thế nào để tôi có thể hình ảnh hóa các quỹ đạo đối tượng qua nhiều khung hình video với Ultralytics YOLO?
Để hình ảnh hóa các quỹ đạo đối tượng qua nhiều khung hình video, bạn có thể sử dụng các tính năng theo dõi của model YOLO cùng với OpenCV để vẽ đường đi của các đối tượng được phát hiện. Dưới đây là một ví dụ script minh họa điều này:
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()Script này sẽ vẽ các đường theo dõi cho thấy lộ trình di chuyển của các đối tượng được theo dõi theo thời gian, cung cấp thông tin chi tiết có giá trị về hành vi và mô hình của đối tượng.