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 tác vụ quan trọng không chỉ xác định vị trí và lớp của đố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 thời gian thực.
Xem bản xem trước YOLO27 chưa phát hành để biết hỗ trợ theo dõi dự kiến.
Bắt đầu từ ultralytics 8.4.63, OC-SORT, Deep OC-SORT, FastTracker và TrackTrack có sẵn bên cạnh BoT-SORT và ByteTrack.
Tại sao nên chọn Ultralytics YOLO để theo dõi đối tượng?#
Kết quả đầu ra từ các bộ 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à các ID đối tượng. Điều này giúp dễ dàng theo dõi đối tượng trong các 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 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 trong 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: Các tùy chọn Python API và CLI đơn giản để tích hợp và triển khai nhanh chóng.
- Khả năng tùy chỉnh: Dễ sử dụng với các mô hình YOLO được đào tạo tùy chỉnh, cho phép tích hợp vào các ứng dụng cụ thể theo miền.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Ứng dụng trong 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 con người | Theo dõi cá |
Bắt đầu nhanh#
Chạy theo dõi trên video bằng trình theo dõi TrackTrack mặc định. Chuyển sang trình theo dõi khác bằng cách thay đổi đối số tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")Để chạy trình theo dõi trên các luồng video, hãy sử dụng mô hình Detect, Segment, Pose hoặc OBB đã được huấn luyện như YOLO26n, YOLO26n-seg, YOLO26n-pose hoặc YOLO26n-obb. Bạn có thể huấn luyện các mô hình tùy chỉnh cục bộ hoặc với đào tạo đám mây 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 ByteTrackTrình theo dõi được hỗ trợ#
Ultralytics YOLO đi kèm với sáu trình theo dõi tích hợp sẵn. Kích hoạt một trình theo dõi bằng cách chuyển tệp cấu hình YAML của nó tới đối số tracker.
| Trình theo dõi | Tệp cấu hình | Mô hình chuyển động | Ngoại hình / ReID | Bù chuyển động của máy quay | Xử lý che khuất |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Kalman tuyến tính | Tùy chọn (with_reid) | Có thể cấu hình (gmc_method) | Bộ đệm theo dõi + liên kết lại ReID |
| ByteTrack | bytetrack.yaml | Kalman tuyến tính | Không có | Không | Cứu độ tin cậy thấp hai giai đoạn |
| OC-SORT | ocsort.yaml | Kalman hướng tâm quan sát | Không có | Không | Cập nhật lại ORU, OCM, OCR từ quan sát cuối cùng |
| Deep OC-SORT | deepocsort.yaml | Kalman hướng tâm quan sát | Tùy chọn (with_reid) | Có thể cấu hình (gmc_method) | OC-SORT + EMA ngoại hình thích ứng tùy chọn |
| FastTracker | fasttrack.yaml | Kalman tuyến tính + quay lại | Không có | Không | Quay lại Kalman + phóng to bbox khi bị che khuất |
| TrackTrack | tracktrack.yaml | Kalman tuyến tính (NSA) | Tùy chọn (with_reid) | Có thể cấu hình (gmc_method) | Kết hợp nhiều dấu hiệu lặp đi lặp lại + TAI |
Nên sử dụng trình theo dõi nào?#
Sử dụng quy trình này để chọn điểm bắt đầu; tracktrack.yaml được sử dụng khi bạn không truyền tracker:
- Cần đường cơ sở nhanh nhất, đơn giản nhất? → ByteTrack (không có ReID, không bù chuyển động của máy quay, chi phí tối thiểu).
- Cảnh quay cầm tay, máy bay không người lái hoặc máy quay di chuyển? → BoT-SORT (thêm tính năng bù chuyển động của máy quay và ReID tùy chọn).
- Chuyển động phi tuyến tính (thể thao, khiêu vũ, rẽ gấp) và không có ReID? → OC-SORT (các hiệu chỉnh hướng tâm quan sát mà không mất chi phí ngoại hình).
- Cảnh quay di chuyển đông đúc nơi việc hoán đổi ID là vấn đề chính? → Deep OC-SORT hoặc TrackTrack (cả hai đều hỗ trợ khớp ngoại hình tùy chọn; TrackTrack cũng bổ sung kết hợp nhiều dấu hiệu và ngăn chặn trùng lặp ID).
- Chồng chéo một phần thường xuyên trong thời gian thực, không có ngân sách ReID? → FastTracker (biến thể ByteTrack nhận thức sự che khuất với tính năng quay lại Kalman).
Chuyển đổi trình theo dõi#
Truyền tên tệp cấu hình trình theo dõi tới tracker=. Tất cả mã khác giữ nguyên.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")Cấu hình#
Đố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 mô hình 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)Cấu hình trình theo dõi tùy chỉnh#
Ultralytics cũng cho phép bạn sử dụng một tệp cấu hình trình theo dõi đã chỉnh sửa. Để làm điều 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 (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")Đối số trình theo dõi được chia sẻ#
Các tham số sau đây là phổ biến đối với hầu hết các tệp YAML của trình theo dõi; không phải mọi tham số đều xuất hiện trong mọi cấu hình:
Các phát hiện ở hoặc trên track_high_thresh bước vào giai đoạn kết hợp đầu tiên. Các phát hiện nằm giữa track_low_thresh và track_high_thresh có thể khôi phục các đường đi hiện có khi trình theo dõi được chọn bật liên kết độ tin cậy thấp, nhưng chúng không khởi động các đường đi mới. Các phát hiện ở hoặc dưới track_low_thresh sẽ bị bỏ qua.
| Parameter | Giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Chỉ định loại trình theo dõi. |
track_high_thresh | 0.0-1.0 | Ngưỡng cho sự kết hợp đầu tiên. Ảnh hưởng đến mức độ tự tin của một phát hiện được khớp với một đường đi hiện có. |
track_low_thresh | 0.0-1.0 | Giới hạn dưới cho các phát hiện khôi phục độ tin cậy thấp. OC-SORT và Deep OC-SORT chỉ sử dụng các giới hạn này khi use_byte: True; TrackTrack bao gồm chúng trong nhóm liên kết bị phạt của mình. |
new_track_thresh | 0.0-1.0 | Ngưỡng để khởiitao một đường đi mới nếu phát hiện không khớp với bất kỳ đường đi hiện có nào. |
track_buffer | >=0 | Các khung đường đi bị mất được giữ sống trước khi xóa. Giá trị cao hơn có nghĩa là dung sai cao hơn cho việc che khuất. |
match_thresh | 0.0-1.0 | Ngưỡng để khớp các đường đi. Giá trị cao hơn làm cho việc khớp linh hoạt hơn. |
fuse_score | True, False | Có hợp nhất điểm số độ tin cậy với khoảng cách IoU trước khi khớp hay không. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Phương pháp bù chuyển động toàn cục. Giúp tính toán chuyển động của máy quay. |
proximity_thresh | 0.0-1.0 | IoU tối thiểu cần thiết cho một trận đấu ReID hợp lệ. Đảm bảo độ gần về không gian trước khi sử dụng các dấu hiệu ngoại hình. |
appearance_thresh | 0.0-1.0 | Độ tương đồng ngoại hình chuẩn hóa tối thiểu cần thiết cho ReID. |
with_reid | True, False | Bật tính năng khớp dựa trên ngoại hình để theo dõi tốt hơn qua các vùng bị che khuất. Được hỗ trợ bởi BoT-SORT, Deep OC-SORT và TrackTrack. |
model | auto hoặc đường dẫn mô hình ReID tương thích | Mô hình ReID. auto sử dụng các tính năng xương sống YOLO nguyên bản khi có sẵn; nếu không sẽ quay lại yolo26n-cls.pt. Bộ mã hóa tùy chỉnh có thể là một điểm kiểm tra .pt hoặc một mô hình đã xuất như .torchscript, .onnx, .engine hoặc một thư mục mô hình OpenVINO. |
Đối số dành riêng cho trình theo dõi#
Mỗi thuật toán cung cấp các núm bổ sung ngoài các tham số được chia sẻ. Xem các phần dành riêng cho từng trình theo dõi bên dưới để biết mô tả và lời khuyên điều chỉnh, hoặc tham khảo trực tiếp các tệp cấu hình:
Bật Nhận dạng lại (ReID)#
ReID bị vô hiệu hóa theo mặc định để giảm thiểu chi phí. Bật tính năng này bằng cách thiết lập with_reid: True trong tệp cấu hình trình theo dõi.
Tùy chọn mô hình ReID:
model: auto— Sử dụng các tính năng bộ phát hiện YOLO nguyên bản, thêm chi phí tối thiểu. Lý tưởng khi bạn cần một số ReID mà không bị sụt giảm hiệu suất lớn. Quay lạiyolo26n-cls.ptnếu bộ phát hiện không hiển thị các tính năng tương thích.- Mô hình ReID tùy chỉnh — Trỏ
model:tới một điểm kiểm tra.pthoặc một mô hình embedding đã xuất tương thích, chẳng hạn như.torchscript,.onnx,.enginehoặc một thư mục mô hình OpenVINO. Các mô hình đã xuất được tải thông quaAutoBackendvà phải xuất trực tiếp một tensor embedding.
Các bộ mã hóa ONNX sẵn sàng sử dụng được phát hành cho mọi kích thước mô hình. Đặt model: thành một trong các tên này và tệp sẽ được tải xuống tự động lần đầu tiên trình theo dõi chạy (cách thức tương tự như cách lấy trọng số YOLO) — không cần bước xuất hoặc tải xuống thủ công:
# In your tracker config (e.g. tracktrack.yaml)
with_reid: True
model: yolo26n-reid.onnx # downloaded on first use; swap n→s/m/l/x for a larger encoder| Model | kích thước (pixel) | tham số (M) | FLOPs (B) |
|---|---|---|---|
| YOLO26n-reid.onnx | 448 | 2.8 | 2.0 |
| YOLO26s-reid.onnx | 448 | 7.5 | 6.6 |
| YOLO26m-reid.onnx | 448 | 12.4 | 20.1 |
| YOLO26l-reid.onnx | 448 | 15.3 | 25.2 |
| YOLO26x-reid.onnx | 448 | 32.7 | 55.9 |
Hiện tại chỉ có sẵn các bộ mã hóa ONNX ReID cho nhánh ngoại hình của trình theo dõi. Các chế độ ReID train, val và predict, cũng như các công thức xuất ReID chuyên dụng, vẫn đang được phát triển.
Để có hiệu suất tốt hơn với một mô hình phân loại riêng biệt, hãy 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", quantize=16, dynamic=True, batch=32)Sau khi xuất, hãy trỏ đến đường dẫn mô hình TensorRT trong cấu hình trình theo dõi của bạn.
Chi tiết trình theo dõi#
Các phần bên dưới mô tả thiết kế, tham số cụ thể và mẹo tinh chỉnh của từng tracker.
Watch: Which Object Tracker Performs Better? | Speed, FPS & ID Stability | Ultralytics YOLO26 📊
BoT-SORT#
BoT-SORT (Aharon et al., 2022) mở rộng ByteTrack với tính năng bù chuyển động của máy quay và ReID tùy chọn:
- Bù chuyển động của máy quay (CMC): một biến dạng affine được ước tính mỗi khung hình (luồng quang học thưa thớt theo mặc định; ORB / ECC cũng khả dụng) được áp dụng cho các trạng thái Kalman trước khi khớp IoU.
- ReID tùy chọn: các embedding ngoại hình có thể được hợp nhất vào ma trận chi phí. Tắt theo mặc định; bật bằng
with_reid: True.
Tốt nhất cho: theo dõi đa mục đích, đặc biệt là với camera di động. Thêm tính năng ReID chỉ khi các đám đông có ngoại hình giống nhau gây ra hiện tượng hoán đổi ID.
Các tham số dành riêng cho BoT-SORT:
| Parameter | Giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Phần phụ trợ bù trừ chuyển động của camera. sparseOptFlow là mặc định. none vô hiệu hóa tính năng CMC. |
with_reid | True, False | Bật tính năng khớp dựa trên diện mạo. Tắt theo mặc định. |
model | auto hoặc đường dẫn mô hình ReID tương thích | auto sử dụng các tính năng YOLO nguyên bản khi khả dụng; các model tùy chỉnh có thể là điểm kiểm tra .pt hoặc các định dạng xuất tương thích. |
proximity_thresh | 0.0-1.0 | IoU tối thiểu trước khi các đặc trưng diện mạo được xem xét. |
appearance_thresh | 0.0-1.0 | Độ tương đồng diện mạo chuẩn hóa tối thiểu cần thiết cho một kết quả khớp ReID. Tăng lên để làm cho việc khớp nghiêm ngặt hơn. |
Mẹo tinh chỉnh:
- Camera tĩnh: đặt
gmc_method: noneđể tiết kiệm một vài ms/khung hình. - Camera chuyển động nhiều: giữ nguyên
sparseOptFlow;eccchính xác hơn nhưng chậm hơn. - Đám đông có ngoại hình giống nhau: bật
with_reid: Truevà tăngappearance_thresh(ví dụ:0.85+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022) là mô hình cơ sở trọng lượng nhẹ. Nó sử dụng kết hợp bộ lọc Kalman tuyến tính và IoU với quy trình liên kết hai giai đoạn:
- Giai đoạn 1: khớp các phát hiện có điểm số cao với các luồng theo dõi đang hoạt động.
- Giai đoạn 2: thử lại các luồng theo dõi chưa khớp với các phát hiện có điểm số thấp để khôi phục qua các khoảng che khuất một phần ngắn.
Không có model diện mạo và không có tính năng bù trừ chuyển động của camera.
Tốt nhất cho: camera tĩnh hoặc gần như tĩnh nơi chi phí của bộ phát hiện chiếm ưu thế và bạn muốn chi phí chung của trình theo dõi ở mức tối thiểu.
Các tham số dành riêng cho ByteTrack: Không có ngoại trừ các tham số trình theo dõi được chia sẻ.
Mẹo tinh chỉnh:
- Bộ phát hiện có nhiễu: giảm
track_low_threshđể giai đoạn thứ hai có nhiều ứng cử viên hơn. - Bộ phát hiện thu hồi cao: tăng
track_high_threshđể giảm số lượng ID bị phân mảnh. - ID nhấp nháy thường xuyên: tăng
track_bufferđể các luồng theo dõi bị bỏ lỡ trong thời gian ngắn vẫn có thể tồn tại.
OC-SORT#
OC-SORT (Cao et al., CVPR 2023) là phần mở rộng tập trung vào quan sát của SORT. Nó giữ nguyên thiết kế trọng lượng nhẹ của SORT (không có đặc trưng diện mạo) và bổ sung ba hiệu chỉnh:
- Cập nhật lại tập trung vào quan sát (ORU): phát lại một quỹ đạo ảo giữa quan sát cuối cùng và phát hiện hiện tại, chạy lại quá trình cập nhật Kalman để sửa chữa vận tốc bị lệch.
- Động lượng tập trung vào quan sát (OCM): phạt các phát hiện di chuyển theo hướng sai thông qua một số hạn định về tính nhất quán của vận tốc.
- Khôi phục tập trung vào quan sát (OCR): kiểm tra lại các phát hiện chưa khớp với các luồng theo dõi vừa bị mất bằng cách sử dụng quan sát cuối cùng của chúng thay vì trạng thái được dự đoán.
Tốt nhất cho: chuyển động phi tuyến tính mà không tốn chi phí của model ReID.
Các tham số dành riêng cho OC-SORT:
| Parameter | Giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
delta_t | >=1 | Cửa sổ thời gian (khung hình) để tính toán hướng vận tốc trong OCM. Các giá trị lớn hơn sẽ làm mượt nhiều hơn. |
inertia | 0.0-1.0 | Trọng số của chi phí tính nhất quán vận tốc. Các giá trị cao hơn sẽ phạt các thay đổi hướng đột ngột. |
use_byte | True, False | Bật lượt liên kết thứ hai theo phong cách ByteTrack qua các phát hiện có độ tin cậy thấp. |
Mẹo tinh chỉnh:
- Chuyển động phi tuyến tính: tăng
inertia(ví dụ:0.3-0.4). - Phát hiện thưa thớt: bật
use_byte: True. - Che khuất kéo dài: tăng
track_bufferđể OCR có nhiều luồng theo dõi bị mất hơn để liên kết lại.
Với các model OBB, OCR sử dụng hộp có định hướng do Kalman dự đoán vì lịch sử quan sát cuối cùng có định hướng không được lưu giữ.
Deep OC-SORT#
Deep OC-SORT bổ sung cho OC-SORT thông tin diện mạo và tính năng bù trừ chuyển động của camera:
- Khớp diện mạo: khoảng cách nhúng cosine được giới hạn bởi độ chồng lấp và kết hợp với chi phí chuyển động.
- EMA diện mạo động: các phần nhúng của luồng theo dõi được cập nhật với EMA có hệ số làm mượt thích ứng với độ tin cậy của phát hiện.
- Bù trừ chuyển động của camera: Các trạng thái Kalman được biến đổi từ khung hình này sang khung hình khác thông qua quang lưu thưa thớt, ORB hoặc ECC.
Tốt nhất cho: các cảnh đông đúc hoặc có camera di động, nơi hiện tượng hoán đổi ID giữa các đối tượng có hình ảnh khác nhau nhưng ở gần nhau về mặt không gian là phổ biến.
Các tham số dành riêng cho Deep OC-SORT:
| Parameter | Giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
with_reid | True, False | Bật tính năng khớp dựa trên diện mạo. Tắt theo mặc định. |
model | auto hoặc đường dẫn mô hình ReID tương thích | auto sử dụng các tính năng YOLO nguyên bản khi khả dụng; các model tùy chỉnh có thể là điểm kiểm tra .pt hoặc các định dạng xuất tương thích. |
proximity_thresh | 0.0-1.0 | IoU tối thiểu trước khi các đặc trưng diện mạo được xem xét. |
appearance_thresh | 0.0-1.0 | Độ tương đồng diện mạo chuẩn hóa tối thiểu cần thiết cho một kết quả khớp ReID. |
alpha_fixed_emb | 0.0-1.0 | Hệ số EMA cơ sở cho các bản cập nhật nhúng luồng theo dõi. Các giá trị cao hơn sẽ giữ lại bản nhúng cũ lâu hơn. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Phương pháp bù trừ chuyển động toàn cục. |
delta_t | >=1 | Cửa sổ thời gian (khung hình) để tính toán hướng vận tốc trong OCM (được kế thừa từ OC-SORT). |
inertia | 0.0-1.0 | Trọng số của chi phí tính nhất quán vận tốc (được kế thừa từ OC-SORT). |
use_byte | True, False | Bật liên kết thứ hai theo phong cách ByteTrack qua các phát hiện có độ tin cậy thấp (được kế thừa từ OC-SORT). |
Mẹo tinh chỉnh:
- Hoán đổi danh tính trong đám đông: tăng
appearance_thresh(ví dụ:0.92-0.95) và tăngalpha_fixed_embđể các phần nhúng thích ứng chậm hơn. - Camera di động: đặt
gmc_method: sparseOptFlow(Deep OC-SORT mặc định lànone). - Độ trễ thấp hơn: giữ nguyên
with_reid: False(mặc định) chỉ cho chuyển động + CMC; chỉ bật ReID khi hiện tượng hoán đổi ID chi phối các lỗi.
FastTracker#
FastTracker là một biến thể của ByteTrack nhận biết hiện tượng che khuất và không có model diện mạo:
- Phát hiện che khuất: đánh dấu các luồng theo dõi bị che khuất khi mức độ che phủ bởi các luồng theo dõi hoạt động khác vượt quá
occ_cover_thresh. - Khôi phục Kalman khi bị che khuất: cuộn trạng thái Kalman quay lại khung hình trước khi bị che khuất bằng lịch sử đệm vòng.
- Làm giảm chuyển động và mở rộng tìm kiếm: vận tốc bị làm giảm và hộp giới hạn dự đoán được phóng to trong khi bị che khuất.
- Loại bỏ Init-IoU: ngăn chặn các luồng theo dõi mới xuất hiện chồng lên các luồng theo dõi đang hoạt động.
Tốt nhất cho: các đường ống chỉ phát hiện thời gian thực với hiện tượng chồng lấp mục tiêu trên mục tiêu thường xuyên (đám đông, hàng đợi, thể thao).
Các tham số dành riêng cho FastTracker:
| Parameter | Giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
reset_velocity_offset_occ | >=0 | Số khung hình lịch sử quay lại để khôi phục vận tốc Kalman khi bắt đầu bị che khuất. |
reset_pos_offset_occ | >=0 | Số khung hình lịch sử quay lại để khôi phục vị trí Kalman khi bắt đầu bị che khuất. |
enlarge_bbox_occ | >=1.0 | Tỷ lệ chiều cao áp dụng cho hộp giới hạn được dự đoán trong khi bị che khuất (chiều rộng thay đổi theo tỷ lệ khung hình XYAH). |
dampen_motion_occ | 0.0-1.0 | Hệ số nhân vận tốc trong khi bị che khuất. Các giá trị thấp hơn làm cho luồng theo dõi "chậm lại" khi đi qua vùng bị che khuất. |
active_occ_to_lost_thresh | >=1 | Số khung hình bị che khuất liên tiếp tối đa trước khi một luồng theo dõi đang hoạt động được chuyển thành bị mất. |
occ_cover_thresh | 0.0-1.0 | Phân số diện tích của một luồng theo dõi bị che phủ bởi một luồng theo dõi hoạt động khác để tuyên bố là bị che khuất. |
occ_reappear_window | >=0 | Số khung hình mà một luồng theo dõi bị mất do che khuất gần đây vẫn có thể được tìm thấy lại một cách ưu tiên. |
init_iou_suppress | 0.0-1.0 | Ngăn chặn khởi tạo luồng theo dõi mới nếu IoU của nó với bất kỳ luồng theo dõi hoạt động nào vượt quá mức này. Đặt thành 1.0 để vô hiệu hóa. |
Mẹo tinh chỉnh:
- Che khuất một phần thường xuyên: giảm
occ_cover_thresh(ví dụ:0.5-0.6). - ID trùng lặp xung quanh vùng chồng lấp: giảm
init_iou_suppress(ví dụ:0.5). - Che khuất kéo dài: tăng đồng thời
occ_reappear_windowvàtrack_buffer. - Mục tiêu di chuyển nhanh: tăng
dampen_motion_occ(gần với1.0); chỉ tăngenlarge_bbox_occkhi vùng tìm kiếm rộng hơn cải thiện khả năng khôi phục.
TrackTrack#
TrackTrack (Shim et al., CVPR 2025) là trình theo dõi mặc định. Nó suy luận từ góc nhìn của từng luồng theo dõi bằng liên kết lặp lại đa tín hiệu:
- Liên kết dựa trên góc nhìn luồng theo dõi (TPA): kết hợp HMIoU, khoảng cách ReID cosine tùy chọn, khoảng cách chiếu độ tin cậy và khoảng cách góc góc. Việc gán được giải quyết lặp đi lặp lại với ngưỡng nới lỏng.
- Khởi tạo nhận biết luồng theo dõi (TAI): ngăn chặn các bản sao xuất hiện trước khi một ID mới được tạo.
Tốt nhất cho: các cảnh đông đúc có hiện tượng che khuất thường xuyên, nơi các ID trùng lặp là một vấn đề.
Các tham số dành riêng cho TrackTrack:
| Parameter | Giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
iou_weight | 0.0-1.0 | Trọng số của khoảng cách HMIoU khi bật ReID; nếu không, HMIoU được sử dụng trực tiếp. |
reid_weight | 0.0-1.0 | Trọng số của khoảng cách ReID cosine khi bật ReID; nếu không, nó sẽ bị bỏ qua. |
conf_weight | 0.0-1.0 | Trọng số của khoảng cách chiếu độ tin cậy. |
angle_weight | 0.0-1.0 | Trọng số của khoảng cách góc góc. |
penalty_p | 0.0-1.0 | Hình phạt chi phí cho các phát hiện có độ tin cậy thấp. |
penalty_q | 0.0-1.0 | Hình phạt chi phí cho các phát hiện được khôi phục bởi NMS phụ. |
reduce_step | 0.0-1.0 | Độ nới lỏng ngưỡng khớp cho mỗi lần lặp. |
tai_thr | 0.0-1.0 | Ngưỡng IoU cho NMS Khởi tạo Nhận biết Luồng theo dõi. |
min_track_len | >=0 | Độ dài lịch sử tối thiểu trước khi một luồng theo dõi mới được xác nhận. |
lost_match_thr | 0.0-1.0 | Giới hạn chi phí lỏng lẻo hơn cho lượt liên kết lại luồng theo dõi bị mất đã được nới lỏng; 0 vô hiệu hóa tính năng này. |
with_reid | True, False | Bật tính năng khớp diện mạo ReID cosine (sử dụng các tính năng YOLO nguyên bản). Tắt theo mặc định. |
model | auto hoặc đường dẫn mô hình ReID tương thích | auto sử dụng các tính năng YOLO nguyên bản khi khả dụng; các model tùy chỉnh có thể là điểm kiểm tra .pt hoặc các định dạng xuất tương thích. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | Phương pháp bù trừ chuyển động toàn cục. |
Mẹo tinh chỉnh:
- Người đi bộ đông đúc: giảm
tai_thr(ví dụ:0.45) để ngăn chặn thêm các bản sao xuất hiện; tăngtrack_buffercho thời gian che khuất lâu hơn. - Camera chuyển động nhanh: giữ nguyên
gmc_method: sparseOptFlowđược bật. - Đối tượng nhỏ/nhanh: tăng nhẹ
angle_weightvà giảmmin_track_len. - Chỉ bật ReID khi cần thiết: nó làm tăng chi phí suy luận; đối với các khoảng che khuất ngắn, chi phí đa tín hiệu mặc định thường là đủ.
Với các model Segment và Pose, TrackTrack bỏ qua việc khôi phục phát hiện NMS lỏng để các mặt nạ và điểm đặc trưng vẫn giữ được sự căn chỉnh với các phát hiện của chúng.
Ví dụ bằng Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Vòng lặp duy trì các luồng theo dõi#
Dưới đây là một 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. Tham số persist=True thông báo cho trình theo dõi rằng hình ảnh hoặc khung hình hiện tại là tiếp theo trong một chuỗi và mong đợi các luồng theo dõi từ hình ảnh trước đó trong hình ảnh hiện tại.
Chỉ sử dụng persist=True khi chuyển các khung hình liên tiếp từ cùng một luồng video sang model.track(). Điều này cho phép trình theo dõi tái sử dụng trạng thái từ các khung hình trước đó và duy trì các ID luồng theo dõi nhất quán theo thời gian. Không sử dụng persist=True trên các hình ảnh không liên quan hoặc một luồng khác, vì trạng thái luồng theo dõi trước đó có thể bị mang theo.
Bạn cũng có thể chọn một phần phụ trợ trình theo dõi bằng cách chuyển một tệp cấu hình trình theo dõi, chẳng hạn như tracker="botsort.yaml", tracker="bytetrack.yaml" hoặc tracker="tracktrack.yaml".
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
# and using the BoT-SORT tracker backend
results = model.track(frame, persist=True, tracker="botsort.yaml")
# 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()Xin lưu ý sự thay đổi từ model(frame) thành 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 đã chỉnh sửa này sẽ chạy bộ 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#
Trực quan hóa các đường đi của đố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ề mô hình 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ẽ các đường đ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 minh họa cách tận dụng các tính năng theo dõi của YOLO26 để vẽ đường đi 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 liên quan đến việc mở một tệp video, đọc tệp theo 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 giới hạn được phát hiện và nối chúng lại, chúng ta có thể vẽ các đường biểu thị các đường đi 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(list)
# 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#
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. Tính năng 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 quá trình 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 bộ theo dõi. Mỗi luồng chịu trách nhiệm chạy bộ 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 mỗi luồng nhận được các tham số chính xác (tệp video, model cần 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 bộ 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 các đối tượng trong một tệp video khác nhau. Các tệp 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ờ cho đến khi cả hai luồng bộ theo dõi hoàn tất.
Cuối cùng, sau khi tất cả các luồng đã hoàn thành tác vụ của mình, các cửa sổ hiển thị kết quả sẽ được đóng lại 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): Model checkpoint name or path loaded inside the thread.
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ý nhiều tệp video và model 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 Bộ theo dõi Mới#
Bạn 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 một thuật toán theo dõi với Ultralytics YOLO? Chúng tôi mời bạn đóng góp vào phần Bộ 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 quý giá đối với 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ủa các giải pháp theo dõi có sẵn trong framework Ultralytics YOLO, bổ sung thêm một lớp tính 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 các hướng dẫn toàn diện về cách gửi Pull Request (PR) 🛠️. Chúng tôi rất hào hứng muốn xem những gì bạn mang lại!
Cùng nhau, hãy nâng cao khả năng theo dõi của hệ sinh thái Ultralytics YOLO 🙏!
FAQ#
Theo dõi đa đối tượng trong phân tích video bao gồm cả việc xác định các đố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, hỗ trợ 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, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker và TrackTrack, có thể được định cấu hình qua các tệp YAML.
Không. Các tệp
.ptchuẩn của Ultralytics lưu trữ trọng số của model YOLO, trong khi bộ theo dõi được tạo ra tại thời điểm suy luận bởimodel.track(). ID theo dõi phụ thuộc vào trạng thái của bộ theo dõi qua các khung hình liên tiếp, vì vậy một hình ảnh đơn lẻ độc lập có thể trả về các kết quả phát hiện như các hộp, lớp và độ tin cậy, nhưng bản thân nó không thể tạo ra các ID theo dõi bền vững có ý nghĩa.Để triển khai, hãy đóng gói bộ phát hiện và bộ theo dõi lại với nhau trong ứng dụng của bạn và gọi
model.track()theo từng khung hình vớipersist=Truekhi các khung hình đến từ cùng một luồng video. Sử dụng các phiên bản model hoặc bộ theo dõi riêng biệt cho các luồng không liên quan để trạng thái không bị truyền giữa các video.Bạn có thể định cấu hình một bộ theo dõi tùy chỉnh bằng cách sao chép một 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 Ultralytics và sửa đổi các tham số theo ý muốn, ngoại trừtracker_type. Sử dụng tệp này trong model theo dõi của bạn như sau:Ví dụfrom ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")Để chạy theo dõi đối tượng trên nhiều luồng video cùng một lúc, bạn có thể sử dụng mô-đun
threadingcủa Python. Mỗi luồng 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:Theo dõi đa luồngimport 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): Model checkpoint name or path loaded inside the thread. 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()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 con người để phân tích trong cửa hàng và an ninh.
- 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 cảnh báo an ninh.
Các ứng dụng này được hưởng lợi từ khả năng xử lý các video có tốc độ khung hình cao trong thời gian thực với độ chính xác đặc biệt của Ultralytics YOLO.
Để trực quan hóa các đường đi của đố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 kết hợp với OpenCV để vẽ các đường đi của các đối tượng được phát hiện. Dưới đây là một tập lệnh ví dụ minh họa điều này:
Vẽ đường đi qua nhiều khung hình videofrom 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(list) while cap.isOpened(): success, frame = cap.read() if success: result = model.track(frame, persist=True)[0] annotated_frame = result.plot() if result.boxes and result.boxes.is_track: boxes = result.boxes.xywh.cpu() track_ids = result.boxes.id.int().cpu().tolist() 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()Tập lệnh này sẽ vẽ các đường theo dõi cho biết các đường đi chuyển động của các đối tượng được theo dõi theo thời gian, cung cấp những thông tin chi tiết có giá trị về hành vi và mô hình của đối tượng.