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 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ì một 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 nên chọn Ultralytics YOLO để theo dõi đối tượng?
Đầu ra từ các trình theo dõi 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ị là ID đối tượng. Điều này giúp bạn 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. Dưới đâ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 mình:
- Hiệu quả: Xử lý các luồng video theo thời gian thực mà không ảnh hưởng đến độ chính xác.
- Linh hoạt: Hỗ trợ nhiều thuật toán và cấu hình theo dõi.
- Dễ sử dụng: API Python và các tùy chọn CLI đơn giản để tích hợp và triển khai nhanh chóng.
- Khả năng tùy biến: Dễ dàng sử dụng với các mô hình YOLO được huấn luyện tùy chỉnh, cho phép tích hợp vào các ứng dụng cụ thể theo miền.
Xem: Phát hiện và theo dõi đối tượng với Ultralytics YOLO.
Các ứng dụng thực tế
Giao thông vận tải | 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á |
Các tính năng nổi bật
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 theo 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 đã được thiết lập.
- 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 điều chỉnh các tham số khác nhau.
Các trình theo dõi hiện có
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, chẳng hạn 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 luồng video, hãy sử dụng mô hình Detect, Segment hoặc Pose đã được huấn luyện, chẳng hạn 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 khả dụng 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 tiếp.
Cấu hình
Các đối số theo dõi
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ô hình.
Ví dụ
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True)
# Configure tracking parameters and run the tracker using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show
Lựa chọn trình 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/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.
Ví dụ
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
# Load the model and run the tracker with a custom configuration file using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'
Tham khảo phần Đối số của Tracker để biết 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 tệp cấu hình YAML dành riêng cho từng thuật toán theo dõi. Các tệp này xác định các tham số như ngưỡng, bộ đệm và logic phù hợp:
Bảng sau cung cấp mô tả về từng tham số:
Thông tin Ngưỡng của Trình theo dõi
Nếu điểm tin cậy của đối tượng thấp, tức là thấp hơn track_high_thresh
, thì sẽ không có трек nào được trả về và cập nhật thành công.
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 cho sự kết hợp đầu tiên trong quá trình theo dõi được sử dụng. Ảnh hưởng đến mức độ chắc chắn 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ự kết hợp thứ hai trong quá trình theo dõi. Được sử dụng khi sự kết hợp đầu tiên thất bại, với các tiêu chí dễ dãi 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 coi là xuất hiện. |
track_buffer |
>=0 |
Bộ đệm được sử dụng để chỉ ra số lượng khung hình mất dấu vến nên được duy trì trước khi bị xóa. Giá trị càng cao có nghĩa là dung sai đối với sự che khuất càng lớn. |
match_thresh |
0.0-1.0 |
Ngưỡng để khớp các track. Giá trị càng cao làm cho việc khớp càng dễ dãi hơn. |
fuse_score |
True , False |
Xác định xem có hợp nhất điểm tin cậy với khoảng cách IoU trước khi so 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. Giúp tính đến chuyển động của camera để cải thiện khả năng theo dõi. |
proximity_thresh |
0.0-1.0 |
Độ IoU tối thiểu cần thiết cho một khớp nối hợp lệ với ReID (Tái định danh). Đảm bảo sự gần gũi về không gian trước khi sử dụng các tín hiệu ngoại hình. |
appearance_thresh |
0.0-1.0 |
Độ tương đồng ngoại hình tối thiểu cần thiết cho ReID. Thiết lập mức độ tương đồng trực quan giữa hai lần phát hiện để liên kết chúng. |
with_reid |
True , False |
Cho biết có sử dụng ReID hay không. Cho phép đối sánh dựa trên hình thức để theo dõi tốt hơn khi bị che khuất. Chỉ được hỗ trợ bởi BoTSORT. |
model |
auto , yolo11[nsmlx]-cls.pt |
Chỉ định mô hình để sử dụng. Mặc định là auto , sử dụng các tính năng gốc nếu detector là YOLO, nếu không thì sử dụng yolo11n-cls.pt . |
Bật Nhận dạng lại (ReID)
Theo mặc định, ReID tạm ngừng hoạt động để giảm thiểu chi phí hiệu suất. Việc bật nó 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ó thể tùy chỉnh model
được sử dụng cho ReID, cho phép bạn đánh đổi độ chính xác và tốc độ tùy thuộc vào trường hợp sử dụng của bạn:
- Các tính năng gốc (
model: auto
): Tính năng này tận dụng trực tiếp các đặc trưng từ YOLO detector cho ReID, giảm thiểu chi phí phát sinh. Nó lý tưởng khi bạn cần một mức độ ReID nào đó mà không ảnh hưởng đáng kể đến hiệu suất. Nếu detector không hỗ trợ các đặc trưng gốc, nó sẽ tự động quay lại sử dụngyolo11n-cls.pt
. - Các mô hình phân loại YOLO: Bạn có thể thiết lập rõ ràng một mô hình phân loại (ví dụ:
yolo11n-cls.pt
) cho việc tr〼ích xuất đặc trưng ReID. Điều này cung cấp các embedding phân biệt hơn, nhưng gây ra độ trễ bổ sung do bước suy luận thêm.
Để có hiệu suất tốt hơn, đặc biệt khi sử dụng mô hình phân loại riêng cho ReID, bạn có thể xuất nó sang một backend nhanh hơn như TensorRT:
Xuất mô hình ReID sang TensorRT
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo11n-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ể chỉ định đường dẫn đến mô hình TensorRT trong cấu hình trình theo dõi của bạn và nó sẽ được sử dụng cho ReID trong quá trình theo dõi.
Ví dụ Python
Vòng lặp duy trì các đối tượng theo dõi
Dưới đây là một script Python sử dụng OpenCV (cv2
) và YOLO11 để chạy theo dõi đối tượng trên các khung hình video. Script 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
). Đố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à hình ảnh hoặc khung hình tiếp theo trong một chuỗi và mong đợi các трек từ hình ảnh trước đó trong hình ảnh hiện tại.
Vòng lặp phát trực tuyến với tính năng 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ì 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 'q'.
Vẽ đồ thị các đối tượng theo dõi theo thời gian
Trực quan hóa các đường theo dõi đối tượng trên các khung hình liên tiếp có thể cung cấp những hiểu biết giá trị về các kiểu chuyển động và hành vi của các đối tượng được phát hiện trong một video. Với Ultralytics YOLO11, việc vẽ các đường theo dõi này là một quy trình liền mạch và hiệu quả.
Trong ví dụ sau, chúng tôi sẽ trình bày cách sử dụng khả năng theo dõi của YOLO11 để vẽ 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ở một tệp video, đọc từng khung hình và sử dụng mô hình 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 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 thị đường đi của các đối tượng được theo dõi.
Vẽ các đường theo dõi 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
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("YOLO11 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
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 đồng thời. Đ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, trong đó xử lý đồng thời có thể nâng cao đáng kể hiệu quả và hiệu suất.
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 đồng thời nhiều phiên bản của trình theo dõ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 ở chế độ 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 video theo từng khung hình, chạy trình theo dõi và hiển thị kết quả.
Hai mô hình khác nhau được sử dụng trong ví dụ này: yolo11n.pt
và yolo11n-seg.pt
, mỗi mô hình theo dõi các đối tượng trong một tệp video khác nhau. Các tệp video được chỉ định trong tham số SOURCES
.
Hàm daemon=True
trong threading.Thread
có nghĩa là các luồng này sẽ bị đóng ngay sau khi chương trình chính kết thúc. Sau đó, chúng ta bắt đầu các luồng bằng start()
và sử dụng join()
để làm cho luồng chính đợ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ủa mình, các cửa sổ hiển thị kết quả sẽ bị đóng bằng cv2.destroyAllWindows()
.
Triển khai 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()
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 các 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 trong việc theo dõi đa đối tượng và đã triển khai hoặc điều chỉnh thành công một 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 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ô giá đối với những người dùng đang thực hiện 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ủa các giải pháp theo dõi có sẵn trong khuôn khổ Ultralytics YOLO, 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, 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 vui khi thấy những gì bạn mang đến!
Cùng nhau, chúng ta hãy tăng cường khả năng theo dõi của hệ sinh thái Ultralytics YOLO 🙏!
Câu hỏi thường gặp
Theo dõi đa đối tượng là gì và Ultralytics YOLO hỗ trợ nó 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ì ID duy nhất cho từng đố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 khả 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 tracker như BoT-SORT và ByteTrack, có thể được cấu hình thông qua các tệp YAML.
Làm cách nào để định cấu hình trình theo dõi tùy chỉnh cho Ultralytics YOLO?
Bạn có thể định cấu hình một 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ừ Thư mục cấu hình trình theo dõi Ultralytics và sửa đổi các tham 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ụ
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'
Làm cách nào để chạy theo dõi đối tượng trên nhiều luồng video đồng thời?
Để chạy theo dõi đối tượng trên nhiều luồng video đồng thời, bạn có thể sử dụng threading
module của Python. Mỗi luồng sẽ xử lý một luồng video riêng biệt. Dưới đây là một 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 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ó nhiều ứng dụng, bao gồm:
- Giao thông vận tải: 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 và bảo mật tại cửa hàng.
- Nuôi trồng thủy sản: Theo dõi cá để giám sát môi trường thủy sinh.
- Phân tích thể thao: Theo dõi người chơi 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 đáng ngờ và tạo báo động an ninh.
Các ứng dụng này được hưởng lợi từ khả năng của Ultralytics YOLO trong việc xử lý video có tốc độ khung hình cao trong thời gian thực với độ chính xác vượt trội.
Làm cách nào để trực quan hóa các đối tượng theo dõi trên nhiều khung hình video với Ultralytics YOLO?
Để trực quan hóa các đường đi của đối tượng trên nhiều khung hình video, bạn có thể sử dụng các tính năng theo dõi của mô hình 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 đoạn script minh họa điều này:
Vẽ các đường theo dõi 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 đi 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à kiểu mẫu của đối tượng.