Ultralytics YOLO27:
Get Started

Theo dõi nhiều đối tượng bằng Ultralytics YOLO#

YOLO multi-object tracking with trajectory paths

Theo dõi đối tượng trong lĩnh vực phân tích video là một tác vụ thiết yếu, 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ì ID duy nhất cho từng đối tượng được phát hiện khi video tiếp diễn. Ứng dụng của tác vụ này rất đa dạng, từ giám sát và an ninh đến phân tích thể thao theo thời gian thực.

Xem bản xem trước YOLO27 chưa phát hành để biết về hỗ trợ theo dõi dự kiến.

🚀 Tracker mới: OC-SORT, Deep OC-SORT, FastTracker, TrackTrack

Bắt đầu từ ultralytics 8.4.63, OC-SORT, Deep OC-SORT, FastTracker và TrackTrack được cung cấp cùng với BoT-SORT và ByteTrack.

Tại sao nên chọn Ultralytics YOLO để theo dõi đối tượng?#

Đầu ra từ các tracker của Ultralytics nhất quán với phát hiện đối tượng tiêu chuẩn nhưng được bổ sung ID đối tượng. Nhờ đó, việc theo dõi đối tượng trong luồng video và thực hiện phân tích tiếp theo trở nên dễ dàng. Sau đây là những lý do bạn nên cân nhắc sử dụng Ultralytics YOLO cho nhu cầu theo dõi đối tượng:

  • Hiệu quả: Xử lý 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 giúp 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 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 lĩnh vực.


Xem: Cách theo dõi nhiều đối tượng bằng Ultralytics YOLO26 | BoT-SORT và ByteTrack | VisionAI 🚀

Ứng dụng thực tế#

Giao thông vận tảiBán lẻNuôi trồng thủy sản
Theo dõi phương tiệnTheo dõi ngườiTheo dõi cá

Bắt đầu nhanh#

Chạy theo dõi trên video bằng tracker TrackTrack mặc định. Chuyển sang tracker khác bằng cách thay đổi đối số tracker.

Ví dụ
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Tracker mặc định (TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)

# Chuyển sang ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")

Để chạy tracker trên luồng video, hãy dùng model Detect, Segment, Pose hoặc OBB đã huấn luyện, chẳng hạn YOLO26n, YOLO26n-seg, YOLO26n-pose hoặc YOLO26n-obb. Bạn có thể huấn luyện model tùy chỉnh cục bộ hoặc bằng dịch vụ huấn luyện đám mây Ultralytics Platform.

Ví dụ
from ultralytics import YOLO

# Nạp model chính thức hoặc model tùy chỉnh
model = YOLO("yolo26n.pt")  # Nạp model Detect chính thức
model = YOLO("yolo26n-seg.pt")  # Nạp model Segment chính thức
model = YOLO("yolo26n-pose.pt")  # Nạp model Pose chính thức
model = YOLO("path/to/best.pt")  # Nạp model được huấn luyện tùy chỉnh

# Thực hiện theo dõi bằng model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True)  # Theo dõi bằng tracker mặc định
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # bằng ByteTrack

Các tracker được hỗ trợ#

Ultralytics YOLO đi kèm sáu tracker tích hợp sẵn. Bật một tracker bằng cách truyền tệp cấu hình YAML của tracker đó vào đối số tracker.

TrackerTệp cấu hìnhModel chuyển độngNgoại hình / ReIDBù chuyển động cameraXử lý che khuất
BoT-SORTbotsort.yamlKalman tuyến tínhTù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
ByteTrackbytetrack.yamlKalman tuyến tínhKhông cóKhôngCứu vãn hai giai đoạn cho đối tượng có độ tin cậy thấp
OC-SORTocsort.yamlKalman lấy quan sát làm trung tâmKhông cóKhôngORU, OCM, OCR cập nhật lại từ quan sát gần nhất
Deep OC-SORTdeepocsort.yamlKalman lấy quan sát làm trung tâmTù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
FastTrackerfasttrack.yamlKalman tuyến tính + quay luiKhông cóKhôngQuay lui Kalman + mở rộng bbox khi bị che khuất
TrackTracktracktrack.yamlKalman tuyến tính (NSA)Tùy chọn (with_reid)Có thể cấu hình (gmc_method)Liên kết đa tín hiệu lặp lại + TAI

Nên dùng tracker nào?#

Dùng sơ đồ này để chọn điểm bắt đầu; tracktrack.yaml được sử dụng khi bạn không truyền tracker:

  1. Cần baseline nhanh nhất, đơn giản nhất? → ByteTrack (không ReID, không bù chuyển động camera, chi phí xử lý tối thiểu).
  2. Video quay bằng tay, drone hoặc camera chuyển động? → BoT-SORT (bổ sung bù chuyển động camera và ReID tùy chọn).
  3. Chuyển động phi tuyến (thể thao, khiêu vũ, đổi hướng đột ngột) và không dùng ReID? → OC-SORT (hiệu chỉnh lấy quan sát làm trung tâm mà không tốn chi phí xử lý ngoại hình).
  4. Cảnh đông người, camera chuyển động, trong đó nhầm lẫn ID là vấn đề chính? → Deep OC-SORT hoặc TrackTrack (cả hai đều hỗ trợ so khớp ngoại hình tùy chọn; TrackTrack còn bổ sung liên kết đa tín hiệu và loại bỏ ID trùng lặp).
  5. 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, có khả năng quay lui Kalman).

Chuyển đổi tracker#

Truyền tên tệp cấu hình tracker vào tracker=. Các phần code khác giữ nguyên.

Ví dụ
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#

Các đối số theo dõi#

Cấu hình theo dõi dùng chung một số thuộc tính với chế độ Predict, chẳng hạn conf, iou và show. Để xem thêm cấu hình, hãy tham khảo trang model Predict.

Ví dụ
from ultralytics import YOLO

# Cấu hình các tham số theo dõi và chạy 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 tracker tùy chỉnh#

Ultralytics cũng cho phép bạn sử dụng tệp cấu hình tracker đã chỉnh sửa. Để thực hiện, chỉ cần sao chép tệp cấu hình tracker (ví dụ: custom_tracker.yaml) từ ultralytics/cfg/trackers rồi sửa đổi các cấu hình (ngoại trừ tracker_type) theo nhu cầu.

Ví dụ
from ultralytics import YOLO

# Nạp model và chạy tracker bằng tệp cấu hình tùy chỉnh
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")

Các đối số dùng chung của tracker#

Các tham số sau đây phổ biến trong hầu hết tệp YAML của tracker; không phải tham số nào cũng có trong mọi cấu hình:

Thông tin về ngưỡng của tracker

Các kết quả phát hiện có giá trị bằng hoặc cao hơn track_high_thresh sẽ đi vào giai đoạn liên kết đầu tiên. Các kết quả phát hiện nằm giữa track_low_thresh và track_high_thresh có thể khôi phục track hiện có khi tracker được chọn bật liên kết độ tin cậy thấp, nhưng không khởi tạo track mới. Các kết quả phát hiện có giá trị bằng hoặc thấp hơn track_low_thresh sẽ bị bỏ qua.

Tham sốGiá trị hoặc phạm vi hợp lệMô tả
tracker_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackChỉ định loại tracker.
track_high_thresh0.0-1.0Ngưỡng cho lần liên kết đầu tiên. Ảnh hưởng đến mức độ chắc chắn khi ghép một detection với track hiện có.
track_low_thresh0.0-1.0Giới hạn dưới cho các detection khôi phục có độ tin cậy thấp. OC-SORT và Deep OC-SORT chỉ sử dụng các detection này khi use_byte: True; TrackTrack đưa chúng vào nhóm liên kết bị phạt.
new_track_thresh0.0-1.0Ngưỡng để khởi tạo track mới nếu detection không khớp với bất kỳ track hiện có nào.
track_buffer>=0Số frame giữ các track bị mất trước khi xóa. Giá trị cao hơn giúp chịu được hiện tượng che khuất tốt hơn.
match_thresh0.0-1.0Ngưỡng để ghép track. Giá trị cao hơn giúp việc ghép dễ dãi hơn.
fuse_scoreTrue, FalseCó kết hợp điểm confidence với khoảng cách IoU trước khi ghép hay không.
gmc_methodsparseOptFlow, orb, sift, ecc, nonePhương pháp bù chuyển động toàn cục. Giúp xử lý chuyển động của camera.
proximity_thresh0.0-1.0IoU tối thiểu cần có để một kết quả ghép ReID được xem là hợp lệ. Đảm bảo độ gần về không gian trước khi sử dụng đặc trưng ngoại hình.
appearance_thresh0.0-1.0Độ tương đồng ngoại hình chuẩn hóa tối thiểu cần có cho ReID.
with_reidTrue, FalseBật ghép dựa trên ngoại hình để theo dõi tốt hơn qua các lần che khuất. Được BoT-SORT, Deep OC-SORT và TrackTrack hỗ trợ.
modelĐường dẫn đến model auto hoặc model ReID tương thíchModel ReID. auto sử dụng đặc trưng backbone YOLO gốc khi có; nếu không, sẽ chuyển sang yolo26n-cls.pt. Encoder tùy chỉnh có thể là checkpoint .pt hoặc model đã export như .torchscript, .onnx, .engine hoặc thư mục model OpenVINO.

Các tham số riêng của tracker#

Mỗi thuật toán cung cấp thêm các tùy chọn bên cạnh những tham số dùng chung. Xem phần riêng của từng tracker bên dưới để biết mô tả và hướng dẫn tinh chỉnh, hoặc tham khảo trực tiếp các file cấu hình:

Bật Re-Identification (ReID)#

ReID mặc định bị tắt để giảm thiểu overhead. Bật bằng cách đặt with_reid: True trong file cấu hình tracker.

Các tùy chọn model ReID:

  • model: auto — Sử dụng đặc trưng detector YOLO gốc, chỉ thêm overhead tối thiểu. Phù hợp khi cần một mức ReID nhất định mà không ảnh hưởng nhiều đến hiệu năng. Chuyển sang yolo26n-cls.pt nếu detector không cung cấp các đặc trưng tương thích.
  • Model ReID tùy chỉnh — Trỏ model: đến checkpoint .pt hoặc model embedding đã export tương thích, chẳng hạn .torchscript, .onnx, .engine hoặc thư mục model OpenVINO. Model đã export được tải thông qua AutoBackend và phải xuất trực tiếp tensor embedding.

Encoder ONNX sẵn sàng sử dụng được phát hành cho mọi kích thước model. Đặt model: thành một trong các tên này để file tự động được tải xuống khi tracker chạy lần đầu (tương tự cách tải trọng số YOLO) — không cần export 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
Modelkích thước
(pixel)
tham số
(M)
FLOPs
(B)
YOLO26n-reid.onnx4482.82.0
YOLO26s-reid.onnx4487.56.6
YOLO26m-reid.onnx44812.420.1
YOLO26l-reid.onnx44815.325.2
YOLO26x-reid.onnx44832.755.9
ReID chỉ dùng cho tracking

Hiện chỉ có các encoder ReID ONNX cho nhánh ngoại hình của tracker. Các chế độ ReID train, val và predict, cùng với các quy trình export ReID chuyên biệt, vẫn đang được phát triển.

Để tăng hiệu năng khi dùng model phân loại riêng, hãy export model sang backend nhanh hơn như TensorRT:

Export model ReID sang TensorRT
from torch import nn

from ultralytics import YOLO

# Tải model phân loại
model = YOLO("yolo26n-cls.pt")

# Thêm lớp average pooling
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 sang TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)

Sau khi export, trỏ đến đường dẫn model TensorRT trong cấu hình tracker.

Chi tiết về tracker#

Các phần bên dưới mô tả thiết kế, tham số cụ thể và mẹo tinh chỉnh cho từng tracker.



Xem: Bộ theo dõi đối tượng nào hoạt động tốt hơn? | Tốc độ, FPS và độ ổn định ID | Ultralytics YOLO26 📊

BoT-SORT#

BoT-SORT (Aharon và cộng sự, 2022) mở rộng ByteTrack bằng cách bổ sung bù chuyển động camera và ReID tùy chọn:

  • Bù chuyển động camera (CMC): áp dụng phép biến đổi affine ước lượng ở mỗi frame (mặc định dùng sparse optical flow; cũng có ORB / ECC) cho các trạng thái Kalman trước khi ghép IoU.
  • ReID tùy chọn: có thể kết hợp embedding ngoại hình vào ma trận chi phí. Mặc định bị tắt; bật bằng with_reid: True.

Phù hợp nhất với: tracking đa dụng, đặc biệt là khi camera di chuyển. Chỉ thêm ReID khi đám đông có ngoại hình tương tự gây ra hiện tượng đổi ID.

Các tham số riêng của BoT-SORT:

Tham sốGiá trị hoặc phạm vi hợp lệMô tả
gmc_methodsparseOptFlow, orb, sift, ecc, noneBackend bù chuyển động camera. sparseOptFlow là mặc định. none tắt CMC.
with_reidTrue, FalseBật ghép dựa trên ngoại hình. Mặc định tắt.
modelĐường dẫn đến model auto hoặc model ReID tương thíchauto sử dụng đặc trưng YOLO gốc khi có; model tùy chỉnh có thể là checkpoint .pt hoặc bản export tương thích.
proximity_thresh0.0-1.0IoU tối thiểu trước khi xét đến đặc trưng ngoại hình.
appearance_thresh0.0-1.0Độ tương đồng ngoại hình chuẩn hóa tối thiểu cần có để ghép ReID. Tăng giá trị này để ghép chặt chẽ hơn.

Mẹo tinh chỉnh:

  • Camera tĩnh: đặt gmc_method: none để tiết kiệm vài ms/frame.
  • Camera chuyển động mạnh: giữ sparseOptFlow; ecc chính xác hơn nhưng chậm hơn.
  • Đám đông có ngoại hình tương tự: bật with_reid: True và tăng appearance_thresh (ví dụ: 0.85+).

ByteTrack#

ByteTrack (Zhang và cộng sự, ECCV 2022) là baseline gọn nhẹ. Thuật toán sử dụng Kalman tuyến tính + IoU với quy trình liên kết hai giai đoạn:

  • Giai đoạn 1: ghép các detection có điểm số cao với các track đang hoạt động.
  • Giai đoạn 2: thử ghép lại các track chưa được ghép với detection có điểm số thấp để khôi phục qua những lần che khuất một phần trong thời gian ngắn.

Không có model ngoại hình và không có chức năng bù chuyển động camera.

Phù hợp nhất với: camera tĩnh hoặc gần như tĩnh, nơi chi phí detector chiếm phần lớn và bạn muốn giảm overhead của tracker xuống mức tối thiểu.

Các tham số riêng của ByteTrack: Không có tham số nào ngoài các tham số tracker dùng chung.

Mẹo tinh chỉnh:

  • Detector nhiễu: giảm track_low_thresh để giai đoạn hai có thêm ứng viên.
  • Detector có recall cao: tăng track_high_thresh để giảm ID bị phân mảnh.
  • ID thường xuyên chập chờn: tăng track_buffer để các track bị bỏ lỡ trong thời gian ngắn vẫn được giữ lại.

OC-SORT#

OC-SORT (Cao và cộng sự, CVPR 2023) là phiên bản mở rộng của SORT lấy quan sát làm trung tâm. Thuật toán giữ nguyên thiết kế gọn nhẹ của SORT (không dùng đặc trưng ngoại hình) và bổ sung ba hiệu chỉnh:

  • Cập nhật lại lấy quan sát làm trung tâm (ORU): phát lại quỹ đạo ảo giữa quan sát cuối cùng và detection hiện tại, chạy lại bước cập nhật Kalman để hiệu chỉnh vận tốc bị lệch.
  • Động lượng lấy quan sát làm trung tâm (OCM): phạt các detection di chuyển sai hướng thông qua thành phần chi phí nhất quán vận tốc.
  • Khôi phục lấy quan sát làm trung tâm (OCR): kiểm tra lại các detection chưa được ghép với các track vừa bị mất, sử dụng quan sát cuối cùng thay vì trạng thái dự đoán.

Phù hợp nhất với: chuyển động phi tuyến mà không phải chịu chi phí của model ReID.

Các tham số riêng của OC-SORT:

Tham sốGiá trị hoặc phạm vi hợp lệMô tả
delta_t>=1Cửa sổ thời gian (frame) dùng để tính hướng vận tốc trong OCM. Giá trị lớn hơn giúp làm mượt nhiều hơn.
inertia0.0-1.0Trọng số của chi phí nhất quán vận tốc. Giá trị cao hơn phạt các thay đổi hướng đột ngột nặng hơn.
use_byteTrue, FalseBật lượt liên kết thứ hai kiểu ByteTrack trên các detection có độ tin cậy thấp.

Mẹo tinh chỉnh:

  • Chuyển động phi tuyến: tăng inertia (ví dụ: 0.3-0.4).
  • Detection thưa: bật use_byte: True.
  • Che khuất kéo dài: tăng track_buffer để OCR có thêm track bị mất để liên kết lại.

Với model OBB, OCR sử dụng BBox có hướng do Kalman dự đoán vì lịch sử quan sát cuối cùng có hướng không được lưu giữ.

Deep OC-SORT#

Deep OC-SORT bổ sung thông tin ngoại hình và bù chuyển động camera cho OC-SORT:

  • Ghép ngoại hình: khoảng cách embedding cosine được giới hạn theo độ chồng lấp và kết hợp với chi phí chuyển động.
  • EMA ngoại hình động: embedding của track được cập nhật bằng EMA với hệ số làm mượt thích ứng theo độ tin cậy của detection.
  • Bù chuyển động camera: các trạng thái Kalman được biến đổi giữa các frame thông qua sparse optical flow, ORB hoặc ECC.

Phù hợp nhất với: cảnh đông người hoặc camera di chuyển, nơi thường xảy ra đổi ID giữa các đối tượng có ngoại hình khác nhau nhưng ở gần nhau về mặt không gian.

Các tham số riêng của Deep OC-SORT:

Tham sốGiá trị hoặc phạm vi hợp lệMô tả
with_reidTrue, FalseBật ghép dựa trên ngoại hình. Mặc định tắt.
modelĐường dẫn đến model auto hoặc model ReID tương thíchauto sử dụng đặc trưng YOLO gốc khi có; model tùy chỉnh có thể là checkpoint .pt hoặc bản export tương thích.
proximity_thresh0.0-1.0IoU tối thiểu trước khi xét đến đặc trưng ngoại hình.
appearance_thresh0.0-1.0Độ tương đồng ngoại hình chuẩn hóa tối thiểu cần có để ghép ReID.
alpha_fixed_emb0.0-1.0Hệ số EMA cơ sở cho các bản cập nhật embedding của track. Giá trị cao hơn giúp giữ embedding cũ lâu hơn.
gmc_methodsparseOptFlow, orb, sift, ecc, nonePhương pháp bù chuyển động toàn cục.
delta_t>=1Cửa sổ thời gian (frame) dùng để tính hướng vận tốc trong OCM (được kế thừa từ OC-SORT).
inertia0.0-1.0Trọng số của chi phí nhất quán vận tốc (được kế thừa từ OC-SORT).
use_byteTrue, FalseBật lượt liên kết thứ hai kiểu ByteTrack trên các detection có độ tin cậy thấp (được kế thừa từ OC-SORT).

Mẹo tinh chỉnh:

  • Đổi ID trong đám đông: tăng appearance_thresh (ví dụ: 0.92-0.95) và tăng alpha_fixed_emb để embedding thích ứng chậm hơn.
  • Camera di chuyển: đặt gmc_method: sparseOptFlow (Deep OC-SORT mặc định dùng none).
  • Giảm độ trễ: giữ with_reid: False (mặc định) để chỉ dùng chuyển động + CMC; chỉ bật ReID khi lỗi chủ yếu do đổi ID.

FastTracker#

FastTracker là biến thể ByteTrack có nhận biết che khuất, không dùng model ngoại hình:

  • Phát hiện che khuất: đánh dấu track bị che khuất khi tỷ lệ bị các track đang hoạt động khác che phủ vượt quá occ_cover_thresh.
  • Khôi phục Kalman khi bị che khuất: khôi phục trạng thái Kalman về một frame trước khi bị che khuất bằng lịch sử được lưu trong ring buffer.
  • Giảm chấn chuyển động và mở rộng vùng tìm kiếm: vận tốc được giảm chấn và bbox dự đoán được phóng to khi bị che khuất.
  • Chặn khởi tạo theo IoU: ngăn track mới được tạo chồng lên các track đang hoạt động.

Phù hợp nhất với: pipeline detection thời gian thực có các mục tiêu thường xuyên chồng lấp nhau (đám đông, hàng chờ, thể thao).

Các tham số dành riêng cho FastTracker:

Tham sốGiá trị hoặc phạm vi hợp lệMô tả
reset_velocity_offset_occ>=0Số frame lịch sử lùi lại để khôi phục vận tốc Kalman khi bắt đầu bị che khuất.
reset_pos_offset_occ>=0Số frame lịch sử lùi lại để khôi phục vị trí Kalman khi bắt đầu bị che khuất.
enlarge_bbox_occ>=1.0Hệ số tỷ lệ chiều cao được áp dụng cho bbox dự đoán trong thời gian bị che khuất (chiều rộng được điều chỉnh theo tỷ lệ khung hình XYAH).
dampen_motion_occ0.0-1.0Hệ số nhân vận tốc trong thời gian bị che khuất. Giá trị thấp hơn khiến track "chậm lại" khi đi qua vùng bị che khuất.
active_occ_to_lost_thresh>=1Số frame liên tiếp tối đa bị che khuất trước khi chuyển một track đang hoạt động sang trạng thái mất.
occ_cover_thresh0.0-1.0Tỷ lệ diện tích của một track bị track đang hoạt động khác che phủ để xác định trạng thái che khuất.
occ_reappear_window>=0Số frame mà một track bị mất do vừa bị che khuất vẫn được ưu tiên tìm lại.
init_iou_suppress0.0-1.0Ngăn khởi tạo track mới nếu IoU của track đó với bất kỳ track đang hoạt động nào vượt quá giá trị này. Đặt thành 1.0 để tắt.

Mẹo tinh chỉnh:

  • Thường xuyên bị che khuất một phần: giảm occ_cover_thresh (ví dụ: 0.5-0.6).
  • ID trùng lặp quanh vùng chồng lấp: giảm init_iou_suppress (ví dụ: 0.5).
  • Bị che khuất lâu: tăng đồng thời occ_reappear_window và track_buffer.
  • Đối tượng di chuyển nhanh: tăng dampen_motion_occ (tiến gần hơn đến 1.0); chỉ tăng enlarge_bbox_occ khi vùng tìm kiếm rộng hơn giúp cải thiện khả năng khôi phục.

TrackTrack#

TrackTrack (Shim et al., CVPR 2025) là tracker mặc định. TrackTrack suy luận từ góc nhìn của từng track bằng phương pháp liên kết lặp đa tín hiệu:

  • Liên kết dựa trên góc nhìn của track (TPA): kết hợp HMIoU, khoảng cách cosine ReID tùy chọn, khoảng cách chiếu độ tin cậy và khoảng cách góc ở các góc hộp. Việc gán được giải bằng cách lặp lại với ngưỡng nới lỏng dần.
  • Khởi tạo nhận biết track (TAI): loại bỏ các track mới được tạo trùng lặp trước khi tạo ID mới.

Phù hợp nhất với: cảnh đông người thường xuyên bị che khuất, nơi ID trùng lặp là vấn đề.

Các tham số dành riêng cho TrackTrack:

Tham sốGiá trị hoặc phạm vi hợp lệMô tả
iou_weight0.0-1.0Trọ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_weight0.0-1.0Trọng số của khoảng cách cosine ReID khi bật ReID; nếu không, tham số này bị bỏ qua.
conf_weight0.0-1.0Trọng số của khoảng cách chiếu độ tin cậy.
angle_weight0.0-1.0Trọng số của khoảng cách góc ở các góc hộp.
penalty_p0.0-1.0Mức phạt chi phí đối với các detection có độ tin cậy thấp.
penalty_q0.0-1.0Mức phạt chi phí đối với các detection được khôi phục bằng NMS phụ.
reduce_step0.0-1.0Mức nới lỏng ngưỡng khớp ở mỗi vòng lặp.
tai_thr0.0-1.0Ngưỡng IoU cho NMS của Khởi tạo nhận biết track.
min_track_len>=0Độ dài lịch sử tối thiểu trước khi xác nhận một track mới.
lost_match_thr0.0-1.0Ngưỡng chi phí nới lỏng hơn cho lượt liên kết lại các track mất; 0 sẽ tắt tính năng này.
with_reidTrue, FalseBật khớp ngoại hình bằng cosine-ReID (sử dụng các feature YOLO gốc). Mặc định tắt.
modelĐường dẫn đến model auto hoặc model ReID tương thíchauto sử dụng đặc trưng YOLO gốc khi có; model tùy chỉnh có thể là checkpoint .pt hoặc bản export tương thích.
gmc_methodsparseOptFlow, orb, sift, ecc, nonePhương pháp bù chuyển động toàn cục.

Mẹo tinh chỉnh:

  • Người đi bộ trong cảnh đông đúc: giảm tai_thr (ví dụ: 0.45) để loại bỏ thêm các track mới trùng lặp; tăng track_buffer để xử lý tình trạng che khuất lâu hơn.
  • Chuyển động camera nhanh: giữ gmc_method: sparseOptFlow ở trạng thái bật.
  • Đối tượng nhỏ/nhanh: tăng nhẹ angle_weight và giảm min_track_len.
  • Chỉ bật ReID khi cần: ReID làm tăng chi phí suy luận; với các trường hợp bị che khuất trong thời gian 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 bước khôi phục detection bằng loose-NMS để đảm bảo mask và keypoint vẫn khớp với detection tương ứng.

Ví dụ Python#



Xem: Cách xây dựng tính năng theo dõi đối tượng tương tác bằng Ultralytics YOLO | Nhấp để cắt và hiển thị ⚡

Vòng lặp duy trì track#

Sau đây là một script Python sử dụng OpenCV (cv2) và YOLO26 để theo dõi đối tượng trên các frame video. Script này giả định các package cần thiết (opencv-python và ultralytics) đã được cài đặt. Tham số persist=True cho tracker biết ảnh hoặc frame hiện tại là frame tiếp theo trong một chuỗi và cần tìm các track từ ảnh trước đó trong ảnh hiện tại.

Duy trì track và chọn tracker

Chỉ sử dụng persist=True khi truyền các frame liên tiếp từ cùng một luồng video vào model.track(). Cách này cho phép tracker tái sử dụng trạng thái từ các frame trước đó và duy trì ID track nhất quán theo thời gian. Không sử dụng persist=True cho các ảnh không liên quan hoặc luồng khác, vì trạng thái track trước đó có thể được giữ lại.

Bạn cũng có thể chọn backend tracker bằng cách truyền tệp cấu hình tracker, chẳng hạn như tracker="botsort.yaml", tracker="bytetrack.yaml" hoặc tracker="tracktrack.yaml".

Vòng lặp for dạng streaming với tracking
import cv2

from ultralytics import YOLO

# Tải model YOLO26
model = YOLO("yolo26n.pt")

# # Mở tệp video
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# # Lặp qua các frame video
while cap.isOpened():
    # # Đọc một frame từ video
    success, frame = cap.read()

    if success:
        # Chạy tracking YOLO26 trên frame, duy trì track giữa các frame
        # và sử dụng backend tracker BoT-SORT
        results = model.track(frame, persist=True, tracker="botsort.yaml")

        # # Trực quan hóa kết quả trên frame
        annotated_frame = results[0].plot()

        # # Hiển thị frame đã chú thích
        cv2.imshow("YOLO26 Tracking", annotated_frame)

        # # Thoát vòng lặp nếu nhấn 'q'
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # # Thoát vòng lặp nếu đã đến cuối video
        break

# # Giải phóng đối tượng capture video và đóng cửa sổ hiển thị
cap.release()
cv2.destroyAllWindows()

Lưu ý thay đổi từ model(frame) sang model.track(frame), giúp bật tracking đối tượng thay vì chỉ detection. Script đã sửa đổi này sẽ chạy tracker trên từng frame video, trực quan hóa kết quả và hiển thị kết quả trong một cửa sổ. Có thể thoát vòng lặp bằng cách nhấn 'q'.

Vẽ track theo thời gian#

Trực quan hóa track của đối tượng qua các frame liên tiếp có thể cung cấp thông tin hữu ích về kiể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ẽ các track này diễn ra liền mạch và hiệu quả.

Trong ví dụ sau, chúng tôi trình bày cách sử dụng khả năng tracking của YOLO26 để vẽ chuyển động của các đối tượng được phát hiện qua nhiều frame video. Script này mở một tệp video, đọc từng frame và sử dụng model YOLO để nhận diện cũng như theo dõi nhiều đối tượng. Bằng cách lưu lại tâm của các bounding box được phát hiện rồi nối các tâm đó, chúng ta có thể vẽ các đường biểu thị quỹ đạo của những đối tượng được theo dõi.

Vẽ track qua nhiều frame video
from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Tải model YOLO26
model = YOLO("yolo26n.pt")

# # Mở tệp video
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Lưu lịch sử track
track_history = defaultdict(list)

# # Lặp qua các frame video
while cap.isOpened():
    # # Đọc một frame từ video
    success, frame = cap.read()

    if success:
        # Chạy tracking YOLO26 trên frame, duy trì track giữa các frame
        result = model.track(frame, persist=True)[0]

        # Lấy các box và ID track
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # Trực quan hóa kết quả trên frame
            frame = result.plot()

            # Vẽ các track
            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)))  # tọa độ tâm x, y
                if len(track) > 30:  # giữ lại 30 track trong 30 frame
                    track.pop(0)

                # Vẽ các đường tracking
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # # Hiển thị frame đã chú thích
        cv2.imshow("YOLO26 Tracking", frame)

        # # Thoát vòng lặp nếu nhấn 'q'
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # # Thoát vòng lặp nếu đã đến cuối video
        break

# # Giải phóng đối tượng capture video và đóng cửa sổ hiển thị
cap.release()
cv2.destroyAllWindows()

Tracking đa luồng#

Tracking đa luồng cho phép chạy theo dõi đối tượng đồng thời trên nhiều luồng video. Tính năng này đặc biệt hữu ích khi xử lý nhiều nguồn video, chẳng hạn như từ nhiều camera giám sát, vì xử lý đồng thời có thể cải thiện đáng kể hiệu quả và hiệu năng.

Trong script Python dưới đây, chúng tôi sử dụng module threading của Python để chạy đồng thời nhiều instance của tracker. Mỗi thread chịu trách nhiệm chạy tracker trên một tệp video, và tất cả thread chạy đồng thời ở chế độ nền.

Để đảm bảo mỗi thread nhận đúng tham số (tệp video, model cần dùng và chỉ mục tệp), chúng tôi định nghĩa hàm run_tracker_in_thread nhận các tham số này và chứa vòng lặp tracking chính. Hàm này đọc video theo từng frame, chạy tracker và lưu kết quả đã được chú thích.

Ví dụ này sử dụng hai model khác nhau: yolo26n.pt và yolo26n-seg.pt, mỗi model theo dõi đối tượng trong một tệp video riêng. Các tệp video được chỉ định trong SOURCES.

Tham số daemon=True trong threading.Thread có nghĩa là các thread này sẽ được đóng ngay khi chương trình chính kết thúc. Sau đó, chúng tôi khởi chạy các thread bằng start() và dùng join() để khiến thread chính chờ cho đến khi cả hai thread tracker hoàn tất.

Cuối cùng, sau khi tất cả thread hoàn thành tác vụ, các cửa sổ hiển thị kết quả sẽ được đóng bằng cv2.destroyAllWindows().

Triển khai tracking đa luồng
import threading

import cv2

from ultralytics import YOLO

# Định nghĩa tên model và nguồn video
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # video cục bộ, 0 là 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

# Tạo và khởi chạy các thread tracker bằng vòng lặp for
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()

# Chờ tất cả thread tracker hoàn tất
for thread in tracker_threads:
    thread.join()

# Dọn dẹp và đóng các cửa sổ
cv2.destroyAllWindows()

Có thể dễ dàng mở rộng ví dụ này để xử lý thêm tệp video và model bằng cách tạo thêm thread và áp dụng cùng phương pháp.

Đóng góp tracker mới#

Bạn có chuyên môn về tracking nhiều đối tượng và đã triển khai hoặc điều chỉnh thành công một thuật toán tracking với Ultralytics YOLO? Chúng tôi mời bạn đóng góp cho mục Trackers tại ultralytics/cfg/trackers! Các ứng dụng và giải pháp thực tế của bạn có thể vô cùng hữu ích cho người dùng thực hiện các tác vụ tracking.

Bằng cách đóng góp cho mục này, bạn giúp mở rộng phạm vi các giải pháp tracking hiện có trong framework Ultralytics YOLO, bổ sung thêm 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 để xem hướng dẫn chi tiết về cách gửi Pull Request (PR) 🛠️. Chúng tôi rất mong chờ những đóng góp của bạn!

Cùng nhau nâng cao khả năng tracking của hệ sinh thái Ultralytics YOLO 🙏!

Câu hỏi thường gặp#

  • Tracking nhiều đối tượng trong phân tích video bao gồm cả việc nhận diện đố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 frame video. Ultralytics YOLO hỗ trợ việc này bằng cách cung cấp khả năng tracking thời gian thực cùng ID đối tượng, phục vụ 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, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker và TrackTrack; các tracker này có thể được cấu hình thông qua tệp YAML.

  • Không. Các tệp .pt tiêu chuẩn của Ultralytics lưu trọng số model YOLO, còn tracker được tạo tại thời điểm suy luận bởi model.track(). ID track phụ thuộc vào trạng thái tracker qua các frame liên tiếp, vì vậy một ảnh đơn lẻ có thể trả về các detection như box, lớp và độ tin cậy, nhưng bản thân ảnh đó không thể tạo ra ID tracking liên tục có ý nghĩa.

    Để triển khai, hãy đóng gói detector và tracker cùng nhau trong ứng dụng, rồi gọi model.track() theo từng frame với persist=True khi các frame đến từ cùng một luồng video. Sử dụng các instance model hoặc tracker riêng cho những luồng không liên quan để tránh trạng thái được giữ lại giữa các video.

  • Bạn có thể cấu hình tracker tùy chỉnh bằng cách sao chép một tệp cấu hình tracker hiện có (ví dụ: custom_tracker.yaml) từ thư mục cấu hình tracker của Ultralytics rồi sửa đổi các tham số theo nhu cầu, ngoại trừ tracker_type. Sử dụng tệp này trong model tracking 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 tracking đối tượng đồng thời trên nhiều luồng video, 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. Sau đây là ví dụ về cách thiết lập:

    Tracking đa luồng
    import threading
    
    import cv2
    
    from ultralytics import YOLO
    
    # Định nghĩa tên model và nguồn video
    MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
    SOURCES = ["path/to/video.mp4", "0"]  # video cục bộ, 0 là 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
    
    # Tạo và khởi chạy các thread tracker bằng vòng lặp for
    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()
    
    # Chờ tất cả thread tracker hoàn tất
    for thread in tracker_threads:
        thread.join()
    
    # Dọn dẹp và đóng các cửa sổ
    cv2.destroyAllWindows()
  • Tracking nhiều đối tượng với Ultralytics YOLO có nhiều ứng dụng, bao gồm:

    • Giao thông: Theo dõi phương tiện để quản lý giao thông và lái xe tự hành.
    • Bán lẻ: Theo dõi người để phân tích hoạt động và đảm bảo an ninh trong cửa hàng.
    • Nuôi trồng thủy sản: Theo dõi cá để giám sát môi trường thủy sinh.
    • 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 hoạt động đáng ngờ và tạo cảnh báo an ninh.

    Các ứng dụng này tận dụng khả năng xử lý video tốc độ khung hình cao theo thời gian thực với độ chính xác vượt trội của Ultralytics YOLO.

  • Để trực quan hóa track của đối tượng qua nhiều frame video, bạn có thể sử dụng các tính năng tracking của model YOLO kết hợp với OpenCV để vẽ quỹ đạo của các đối tượng được phát hiện. Sau đây là script ví dụ minh họa cách thực hiện:

    Vẽ track qua nhiều frame video
    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(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()

    Script này sẽ vẽ các đường tracking biểu thị quỹ đạo chuyển động của các đối tượng được theo dõi theo thời gian, cung cấp thông tin hữu ích về hành vi và kiểu chuyển động của đối tượng.

Bình luận