Link to this sectionTheo 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à 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ếp diễn. Các ứng dụng của nó là vô hạn—từ giám sát và an ninh cho đến phân tích thể thao theo thời gian thực.
Link to this sectionTại sao nên chọn Ultralytics YOLO để theo dõi đối tượng?#
Đầu ra từ các bộ theo dõi (tracker) 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ị là các ID đối tượng. Điều này giúp việc theo dõi các đối tượng trong luồng video và thực hiện các phân tích tiếp theo trở nên dễ dàng. Đâ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 suất: 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: Cung cấp 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 chuyên biệt theo miền.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
Link to this sectionCá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á |
Link to this sectionBắt đầu nhanh#
Chạy theo dõi trên video với bộ theo dõi BoT-SORT mặc định. Chuyển đổi sang bộ theo dõi khác bằng cách thay đổi đối số tracker.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (BoT-SORT)
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 bộ theo dõi trên luồng video, hãy sử dụng một mô hình 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 mô hình tùy chỉnh cục bộ hoặc trên cloud GPU 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 có sẵn cho tất cả các mô hình Detect, Segment, và Pose chạy trên video hoặc các nguồn phát trực tuyến.
Link to this sectionCác bộ theo dõi được hỗ trợ#
Ultralytics YOLO đi kèm với sáu bộ theo dõi tích hợp. Kích hoạt một trong số đó bằng cách chuyển tệp cấu hình YAML tương ứng vào đối số tracker.
| Bộ theo dõi | Tệp cấu hình | Mô hình chuyển động | Diện mạo / ReID | Bù chuyển động camera | Xử lý che khuất |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | Linear Kalman | Tùy chọn (with_reid) | Có (sparseOptFlow / ECC) | Track buffer + ReID rebinding |
| ByteTrack | bytetrack.yaml | Linear Kalman | Không | Không | Two-stage low-conf rescue |
| OC-SORT | ocsort.yaml | Observation-centric Kalman | Không | Không | ORU, OCM, OCR re-update from last observation |
| Deep OC-SORT | deepocsort.yaml | Observation-centric Kalman | Tùy chọn (with_reid) | Tùy chọn (gmc_method) | OC-SORT + adaptive appearance EMA |
| FastTracker | fasttrack.yaml | Linear Kalman + rollback | Không | Không | Kalman rollback + bbox enlargement on occlusion |
| TrackTrack | tracktrack.yaml | Linear Kalman (NSA) | Tùy chọn (HMIoU fallback) | Có (sparseOptFlow / ECC) | Iterative multi-cue association + TAI |
Link to this sectionTôi nên sử dụng bộ theo dõi nào?#
Sử dụng quy trình này để chọn điểm bắt đầu:
- Cần baseline nhanh nhất, đơn giản nhất? → ByteTrack (không ReID, không bù chuyển động camera, overhead tối thiểu).
- Cảnh quay cầm tay, drone, hoặc camera di động? → BoT-SORT (mặc định; thêm bù chuyển động camera và ReID tùy chọn).
- Chuyển động phi tuyến tính (thể thao, khiêu vũ, rẽ đột ngột) và không cần ReID? → OC-SORT (hiệu chỉnh theo quan sát mà không mất chi phí về diện mạo).
- Các cảnh quay camera di động đông đúc nơi hoán đổi ID là vấn đề chính? → Deep OC-SORT hoặc TrackTrack (cả hai đều thêm hợp nhất diện mạo thích ứng; TrackTrack cũng thêm liên kết đa tín hiệu và triệt tiêu trùng lặp ID).
- Thường xuyên chồng lấp một phần trong thời gian thực, không có ngân sách cho ReID? → FastTracker (biến thể ByteTrack nhận biết che khuất với Kalman rollback).
Link to this sectionChuyển đổi bộ theo dõi#
Chuyển tên tệp cấu hình bộ theo dõi vào tracker=. Tất cả các mã khác vẫn 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")Link to this sectionCấu hình#
Link to this sectionCác đối số theo dõi#
Cấu hình theo dõi chia sẻ các thuộc tính với chế độ Predict, như conf, iou, và show. Để biết thêm các 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)Link to this sectionCấu hình bộ theo dõi tùy chỉnh#
Ultralytics cũng cho phép bạn sử dụng tệp cấu hình bộ 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 bộ 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")Link to this sectionCác đối số bộ theo dõi được chia sẻ#
Các tham số sau đây là chung cho hầu hết các tệp YAML của bộ theo dõi; không phải mọi tham số đều xuất hiện trong mọi cấu hình:
Nếu điểm tin cậy (confidence score) của một phát hiện thấp hơn track_high_thresh, bộ theo dõi sẽ không cập nhật đối tượng đó, dẫn đến không có track nào hoạt động.
| Tham số | Các giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | Chỉ định loại bộ theo dõi. |
track_high_thresh | 0.0-1.0 | Ngưỡng cho liên kết đầu tiên. Ả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 liên kết thứ hai trên các phát hiện có độ tin cậy thấp. Đối với OC-SORT và Deep OC-SORT, điều này chỉ áp dụng khi use_byte: True. |
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 nào hiện có. |
track_buffer | >=0 | Số khung hình mà các track bị mất vẫn được giữ lại trước khi xóa. Giá trị cao hơn nghĩa là khả năng chịu đựng che khuất tốt hơn. |
match_thresh | 0.0-1.0 | Ngưỡng khớp track. Giá trị cao hơn làm cho việc khớp trở nên dễ dàng hơn. |
fuse_score | True, False | Có nên kết hợp các điểm 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 đến chuyển động của camera. |
proximity_thresh | 0.0-1.0 | IoU tối thiểu cần thiết cho một khớp ReID hợp lệ. Đảm bảo sự gần gũi về không gian trước khi sử dụng các tín hiệu diện mạo. |
appearance_thresh | 0.0-1.0 | Độ tương đồng diện mạo tối thiểu cần thiết cho ReID. |
with_reid | True, False | Kích hoạt khớp dựa trên diện mạo để theo dõi tốt hơn khi bị che khuất. Được hỗ trợ bởi BoT-SORT, Deep OC-SORT, và TrackTrack. |
model | auto hoặc đường dẫn đến tệp đã xuất | Mô hình ReID. auto sử dụng các đặc trưng backbone YOLO gốc khi có sẵn; nếu không, sẽ sử dụng yolo26n-cls.pt. Chuyển tệp .torchscript, .onnx, .engine, .openvino, ... cho một bộ mã hóa tùy chỉnh. |
Link to this sectionCác tham số dành riêng cho trình theo dõi (tracker)#
Mỗi thuật toán cung cấp thêm các tùy chọn bổ sung ngoài các tham số dùng chung. 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 tinh chỉnh, hoặc tham khảo trực tiếp các tệp cấu hình:
Link to this sectionBật tính năng Tái nhận dạng (ReID)#
ReID bị tắt theo mặc định để giảm thiểu chi phí xử lý. Hãy bật tính năng này bằng cách đặt with_reid: True trong tệp cấu hình trình theo dõi.
Các tùy chọn mô hình ReID:
model: auto— Sử dụng các tính năng từ bộ dò YOLO gốc, bổ sung mức chi phí xử lý tối thiểu. Lý tưởng khi bạn cần ReID mà không muốn làm ảnh hưởng đáng kể đến hiệu suất. Hệ thống sẽ tự động chuyển vềyolo26n-cls.ptnếu bộ dò không hỗ trợ các tính năng tương thích.- Mô hình ReID đã xuất — Trỏ
model:đến một tệp đã xuất (.torchscript,.onnx,.engine,.openvino, v.v.) để có các embedding phân biệt tốt hơn với chi phí là một lần chuyển tiếp (forward pass) bổ sung cho mỗi vùng cắt. Bộ mã hóa được tải thông quaAutoBackend, vì vậy bất kỳ định dạng xuất nào mà Ultralytics hỗ trợ đều hoạt động mà không cần thay đổi mã nguồ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", half=True, dynamic=True, batch=32)Sau khi xuất xong, 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.
Link to this sectionChi tiết về trình theo dõi#
Mở rộng các phần bên dưới để xem thiết kế, các tham số cụ thể và mẹo tinh chỉnh cho từng trình theo dõi.
Link to this sectionBoT-SORT#
BoT-SORT (Aharon và cộng sự, 2022) là trình theo dõi mặc định. Nó mở rộng ByteTrack bằng tính năng bù trừ chuyển động camera (camera-motion compensation) và ReID tùy chọn:
- Bù trừ chuyển động camera (CMC): một phép biến đổi affine được ước tính cho mỗi khung hình (mặc định là luồng quang học thưa; 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í. Mặc định bị tắt; bật với
with_reid: True.
Tốt nhất cho: theo dõi đa mục đích, đặc biệt là với camera di động. Chỉ thêm ReID khi các nhóm đối tượng trông giống nhau gây ra tình trạng hoán đổi ID.
Các tham số dành riêng cho BoT-SORT:
| Tham số | Các giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | Backend bù trừ chuyển động camera. sparseOptFlow là mặc định. none sẽ tắt CMC. |
with_reid | True, False | Bật khớp dựa trên ngoại hình. Mặc định bị tắt. |
model | auto hoặc đường dẫn đến mô hình ReID | Mô hình ReID. auto sử dụng các tính năng YOLO gốc khi có sẵn; nếu không, hãy truyền đường dẫn .torchscript / .onnx / .engine. |
proximity_thresh | 0.0-1.0 | IoU tối thiểu trước khi các tính năng ngoại hình được xem xét. |
appearance_thresh | 0.0-1.0 | Độ tương đồng cosine tối thiểu cần thiết cho một khớp ReID. Tăng giá trị này để giảm tình trạng hoán đổi định danh. |
Mẹo tinh chỉnh:
- Camera tĩnh: đặt
gmc_method: noneđể tiết kiệm vài ms/khung hình. - Chuyển động camera mạnh: giữ nguyên
sparseOptFlow;eccchính xác hơn nhưng chậm hơn. - Nhóm đối tượng trông giống nhau: bật
with_reid: Truevà tăngappearance_thresh(ví dụ:0.85+).
Link to this sectionByteTrack#
ByteTrack (Zhang và cộng sự, ECCV 2022) là giải pháp cơ sở nhẹ. Nó sử dụng Kalman tuyến tính + IoU với liên kết hai giai đoạn:
- Giai đoạn 1: khớp các phát hiện có điểm tin cậy cao với các dấu vết (track) đang hoạt động.
- Giai đoạn 2: thử lại các dấu vết chưa khớp với các phát hiện có điểm tin cậy thấp để phục hồi thông qua việc bị che khuất một phần trong thời gian ngắn.
Không có mô hình ngoại hình và không có bù trừ chuyển động camera.
Tốt nhất cho: camera tĩnh hoặc gần như tĩnh, nơi chi phí của bộ dò là chủ đạo và bạn muốn chi phí xử lý 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 các tham số trình theo dõi dùng chung.
Mẹo tinh chỉnh:
- Bộ dò nhiễu: giảm
track_low_threshđể giai đoạn thứ hai có nhiều ứng viên hơn. - Bộ dò có độ thu hồi cao: tăng
track_high_threshđể giảm tình trạng phân mảnh ID. - ID chập chờn thường xuyên: tăng
track_bufferđể các dấu vết bị bỏ lỡ trong thời gian ngắn có thể tồn tại lâu hơn.
Link to this sectionOC-SORT#
OC-SORT (Cao và cộng sự, CVPR 2023) là phần mở rộng lấy quan sát làm trung tâm của SORT. Nó giữ thiết kế nhẹ của SORT (không có tính năng ngoại hình) và thêm ba hiệu chỉnh:
- Cập nhật lại dựa trên 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 cập nhật Kalman để sửa lỗi vận tốc bị trôi.
- Động lượng dựa trên quan sát (OCM): phạt các phát hiện di chuyển sai hướng thông qua một thành phần nhất quán vận tốc.
- Phục hồi dựa trên quan sát (OCR): kiểm tra lại các phát hiện chưa khớp so với các dấu vết bị mất gần đây bằng cách sử dụng quan sát cuối cùng thay vì trạng thái dự đoán.
Tốt nhất cho: chuyển động phi tuyến tính mà không cần chi phí của mô hình ReID.
Các tham số dành riêng cho OC-SORT:
| Tham số | Các 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 hơn. |
inertia | 0.0-1.0 | Trọng số của chi phí 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 kiểu ByteTrack đối với 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). - Các phát hiện thưa thớt: bật
use_byte: True. - Bị che khuất lâu: tăng
track_bufferđể OCR có nhiều dấu vết bị mất hơn để liên kết lại.
Link to this sectionDeep OC-SORT#
Deep OC-SORT tăng cường OC-SORT bằng thông tin ngoại hình và bù trừ chuyển động camera:
- Hợp nhất ngoại hình thích ứng: các embedding phát hiện được hợp nhất vào ma trận chi phí với trọng số được điều chỉnh theo độ tin cậy của phát hiện và sự chồng lấp.
- EMA ngoại hình động: các embedding của dấu vết cập nhật với một 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 camera: các trạng thái Kalman được biến đổi giữa các khung hình thông qua luồng quang học thưa, ORB hoặc ECC.
Tốt nhất cho: các cảnh đông đúc hoặc cảnh quay bằng camera di chuyển, nơi việc hoán đổi ID giữa các đối tượng khác biệt về mặt thị giác nhưng gần nhau về không gian là phổ biến.
Các tham số dành riêng cho Deep OC-SORT:
| Tham số | Các giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
with_reid | True, False | Bật khớp dựa trên ngoại hình. Mặc định bị tắt. |
model | auto, tệp mô hình ReID đã xuất | Mô hình ReID. auto sử dụng lại các tính năng YOLO gốc; nếu không, hãy truyền tệp đã xuất (.torchscript, .onnx, .engine, …). |
proximity_thresh | 0.0-1.0 | IoU tối thiểu trước khi các tính năng ngoại hình được xem xét. |
appearance_thresh | 0.0-1.0 | Độ tương đồng cosine tối thiểu cần thiết cho một khớp ReID. |
alpha_fixed_emb | 0.0-1.0 | Hệ số EMA cơ sở cho cập nhật embedding của dấu vết. Các giá trị cao hơn giữ lại embedding 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í nhất quán vận tốc (được kế thừa từ OC-SORT). |
use_byte | True, False | Bật lượt liên kết thứ hai theo kiểu ByteTrack đối với 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 định danh trong đám đông: tăng
appearance_thresh(ví dụ:0.92-0.95) và giảmalpha_fixed_embđể các embedding thích nghi chậm hơn. - Camera di chuyển: đặt
gmc_method: sparseOptFlow(Deep OC-SORT mặc định lànone). - Độ trễ thấp hơn: giữ
with_reid: False(mặc định) chỉ cho chuyển động + CMC; chỉ bật ReID khi tình trạng hoán đổi ID chiếm ưu thế trong các lỗi xảy ra.
Link to this sectionFastTracker#
FastTracker là một biến thể ByteTrack nhận biết sự che khuất không có mô hình ngoại hình:
- Phát hiện che khuất: đánh dấu các dấu vết bị che khuất khi độ bao phủ bởi các dấu vết đang hoạt động khác vượt quá
occ_cover_thresh. - Cuộn ngược Kalman khi bị che khuất: cuộn trạng thái Kalman ngược lại về khung hình trước khi bị che khuất bằng cách sử dụng lịch sử vùng đệm vòng.
- Giảm chuyển động và mở rộng tìm kiếm: vận tốc bị giảm và bbox dự đoán được mở rộng trong khi bị che khuất.
- Triệt tiêu Init-IoU: ngăn chặn các dấu vết mới sinh ra trên đầu các dấu vết đang hoạt động.
Tốt nhất cho: các pipeline chỉ phát hiện thời gian thực với sự chồng lấp 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:
| Tham số | Các giá trị hoặc phạm vi hợp lệ | Mô tả |
|---|---|---|
reset_velocity_offset_occ | >=0 | Các 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 | Các 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 bbox dự đoán trong khi bị che khuất (chiều rộng tỷ lệ 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 dấu vết "chậm lại" khi xuyên qua vùng 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 dấu vết đang hoạt động được chuyển sang trạng thái mất. |
occ_cover_thresh | 0.0-1.0 | Tỷ lệ diện tích của một track bị che khuất bởi một track đang hoạt động khác để xác định trạng thái bị che khuất. |
occ_reappear_window | >=0 | Số khung hình mà một track bị mất do che khuất gần đây sẽ được ưu tiên giữ lại để tìm kiếm lại. |
init_iou_suppress | 0.0-1.0 | Ngăn chặn khởi tạo track mới nếu IoU của nó với bất kỳ track đang hoạt động nào vượt quá giá trị này. Đặt là 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). - Trùng lặp ID xung quanh khu vực chồng lấn: giảm
init_iou_suppress(ví dụ:0.5). - Che khuất dài hạn: tăng đồng thời
occ_reappear_windowvàtrack_buffer. - Đối tượng di chuyển nhanh: tăng
dampen_motion_occ(gần với1.0) và giảmenlarge_bbox_occ.
Link to this sectionTrackTrack#
TrackTrack (Shim et al., CVPR 2025) suy luận từ góc độ của từng track với cơ chế kết hợp lặp lại đa tín hiệu:
- Association dựa trên góc nhìn Track (TPA): kết hợp HMIoU, khoảng cách ReID cosine, khoảng cách dự báo độ tin cậy và khoảng cách góc góc khung hình. Việc gán được giải quyết lặp lại với ngưỡng nới lỏng.
- Khởi tạo nhận thức Track (TAI): ngăn chặn việc sinh ra track trùng lặp trước khi một ID mới được tạo.
Tốt nhất cho: các cảnh đông đúc có sự che khuất thường xuyên, nơi ID trùng lặp là một vấn đề.
Các tham số cụ thể của TrackTrack:
| Tham số | Các 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 trong ma trận chi phí đa tín hiệu. |
reid_weight | 0.0-1.0 | Trọng số của khoảng cách ReID cosine. Chuyển sang HMIoU nếu ReID bị vô hiệu hóa. |
conf_weight | 0.0-1.0 | Trọng số của khoảng cách dự báo độ tin cậy. |
angle_weight | 0.0-1.0 | Trọng số của khoảng cách góc góc khung hình. |
penalty_p | 0.0-1.0 | Phạt chi phí cho các phát hiện có độ tin cậy thấp. |
penalty_q | 0.0-1.0 | Phạt chi phí cho các phát hiện được khôi phục bởi NMS thứ cấp. |
reduce_step | 0.0-1.0 | Độ nới lỏng ngưỡng khớp trên mỗi lần lặp. |
tai_thr | 0.0-1.0 | Ngưỡng IoU cho NMS Khởi tạo Nhận thức Track (TAI). |
min_track_len | >=0 | Số lần cập nhật thành công tối thiểu trước khi một track mới được xác nhận. |
lost_match_thr | 0.0-1.0 | Cổng chi phí lỏng hơn cho lượt kết nối lại track bị mất; 0 để vô hiệu hóa. |
with_reid | True, False | Kích hoạt khớp đặc điểm ngoại hình cosine-ReID (sử dụng các tính năng gốc của YOLO). Mặc định là Tắt. |
model | auto, tệp ReID | Model ReID; auto sử dụng các tính năng gốc của YOLO, nếu không thì dùng tệp ReID đã xuất. |
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 track trùng lặp; tăngtrack_buffercho các trường hợp che khuất dài hơn. - Chuyển động camera nhanh: giữ
gmc_method: sparseOptFlowđược bật. - Đối tượng nhỏ/nhanh: tăng nhẹ
angle_weightvà giảmmin_track_len. - Chỉ kích hoạt ReID khi cần: nó làm tăng chi phí inference; đối với các trường hợp che khuất ngắn, chi phí đa tín hiệu mặc định thường là đủ.
Link to this sectionVí dụ với Python#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
Link to this sectionVòng lặp duy trì các Track#
Đây là một tập lệnh Python sử dụng OpenCV (cv2) và YOLO26 để thực hiện 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 cho trình theo dõi biết rằng hình ảnh hoặc khung hình hiện tại là tiếp theo trong 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ì 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ổ. Có thể thoát vòng lặp bằng cách nhấn 'q'.
Link to this sectionVẽ 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 thông tin chi tiết có giá trị về các mô hình di chuyển 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 track này là một quá trình liền mạch và hiệu quả.
Trong ví dụ sau, chúng tôi minh họa cách sử dụng khả năng theo dõi của YOLO26 để vẽ biểu đồ di chuyển 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 tệp 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 (bbox) được phát hiện và nối chúng lại, chúng ta có thể vẽ các đường đại diện cho các đường đi của các đối tượng được theo dõi.
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()Link to this sectionTheo 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. Đ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 việc xử lý đồng thời có thể tăng hiệu quả và hiệu suất đá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 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, model cần sử dụng và chỉ số 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 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ờ đợi 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ác cửa sổ hiển thị kết quả sẽ bị đóng bằng cách sử dụ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ý nhiều tệp video và model hơn bằng cách tạo thêm nhiều luồng và áp dụng cùng một phương pháp luận.
Link to this sectionĐóng góp các 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? 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 hệ sinh thái Ultralytics YOLO, thêm một lớp chức năng và tiện ích mới 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 Contributing Guide để 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 đến!
Cùng nhau, hãy nâng cao khả năng theo dõi của hệ sinh thái Ultralytics YOLO 🙏!
Link to this sectionCâu hỏi thường gặp#
Link to this sectionTheo dõi đa đối tượng (Multi-Object Tracking) 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 nhận dạng đố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 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, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker và TrackTrack, có thể được cấu hình qua các tệp YAML.
Link to this sectionLàm thế nào để tôi 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 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 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")Link to this sectionLà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 mô-đun threading của Python. Mỗi luồng sẽ xử lý một luồng video riêng biệt. Đâ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()Link to this sectionCá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ó vô số ứ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à bảo mật.
- 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.
Những ứ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 vượt trội của Ultralytics YOLO.
Link to this sectionLàm cách nào để tôi trực quan hóa các track đối tượng qua nhiều khung hình video với Ultralytics YOLO?#
Để trực quan hóa các track đố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. Đây là một tập lệnh ví dụ 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()Tập lệnh 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.