Meet YOLO26: next-gen vision AI.

Link to this sectionTheo dõi đa đối tượng với 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 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ôngBán lẻNuôi trồng thủy sản
Vehicle TrackingPeople TrackingFish Tracking
Theo dõi phương tiệnTheo dõi ngườiTheo 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.

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

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

Như 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õiTệp cấu hìnhMô hình chuyển độngDiện mạo / ReIDBù chuyển động cameraXử lý che khuất
BoT-SORTbotsort.yamlLinear KalmanTùy chọn (with_reid)Có (sparseOptFlow / ECC)Track buffer + ReID rebinding
ByteTrackbytetrack.yamlLinear KalmanKhôngKhôngTwo-stage low-conf rescue
OC-SORTocsort.yamlObservation-centric KalmanKhôngKhôngORU, OCM, OCR re-update from last observation
Deep OC-SORTdeepocsort.yamlObservation-centric KalmanTùy chọn (with_reid)Tùy chọn (gmc_method)OC-SORT + adaptive appearance EMA
FastTrackerfasttrack.yamlLinear Kalman + rollbackKhôngKhôngKalman rollback + bbox enlargement on occlusion
TrackTracktracktrack.yamlLinear 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:

  1. 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).
  2. 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).
  3. 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).
  4. 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).
  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 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.

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")

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.

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

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

Thông tin ngưỡng bộ theo dõi

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_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackChỉ định loại bộ theo dõi.
track_high_thresh0.0-1.0Ngưỡ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_thresh0.0-1.0Ngưỡ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_thresh0.0-1.0Ngưỡ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>=0Số 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_thresh0.0-1.0Ngưỡ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_scoreTrue, FalseCó 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_methodsparseOptFlow, orb, sift, ecc, nonePhương pháp bù chuyển động toàn cục. Giúp tính đến chuyển động của camera.
proximity_thresh0.0-1.0IoU 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_thresh0.0-1.0Độ tương đồng diện mạo tối thiểu cần thiết cho ReID.
with_reidTrue, FalseKí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.
modelauto hoặc đường dẫn đến tệp đã xuấtMô 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.pt nế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 qua AutoBackend, 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:

Xuất mô hình ReID sang 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_methodsparseOptFlow, orb, sift, ecc, noneBackend bù trừ chuyển động camera. sparseOptFlow là mặc định. none sẽ tắt CMC.
with_reidTrue, FalseBật khớp dựa trên ngoại hình. Mặc định bị tắt.
modelauto hoặc đường dẫn đến mô hình ReIDMô 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_thresh0.0-1.0IoU tối thiểu trước khi các tính năng ngoại hình được xem xét.
appearance_thresh0.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; ecc chí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: True và tăng appearance_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>=1Cử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.
inertia0.0-1.0Trọ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_byteTrue, FalseBậ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_reidTrue, FalseBật khớp dựa trên ngoại hình. Mặc định bị tắt.
modelauto, tệp mô hình ReID đã xuấtMô 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_thresh0.0-1.0IoU tối thiểu trước khi các tính năng ngoại hình được xem xét.
appearance_thresh0.0-1.0Độ tương đồng cosine tối thiểu cần thiết cho một khớp ReID.
alpha_fixed_emb0.0-1.0Hệ 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_methodsparseOptFlow, orb, sift, ecc, nonePhương pháp bù trừ chuyển động toàn cục.
delta_t>=1Cử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).
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 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ảm alpha_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>=0Cá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>=0Cá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.0Tỷ 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_occ0.0-1.0Hệ 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>=1Số 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_thresh0.0-1.0Tỷ 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>=0Số 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_suppress0.0-1.0Ngă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_windowtrack_buffer.
  • Đối tượng di chuyển nhanh: tăng dampen_motion_occ (gần với 1.0) và giảm enlarge_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_weight0.0-1.0Trọng số của khoảng cách HMIoU trong ma trận chi phí đa tín hiệu.
reid_weight0.0-1.0Trọng số của khoảng cách ReID cosine. Chuyển sang HMIoU nếu ReID bị vô hiệu hóa.
conf_weight0.0-1.0Trọng số của khoảng cách dự báo độ tin cậy.
angle_weight0.0-1.0Trọng số của khoảng cách góc góc khung hình.
penalty_p0.0-1.0Phạt chi phí cho các phát hiện có độ tin cậy thấp.
penalty_q0.0-1.0Phạt chi phí cho các phát hiện được khôi phục bởi NMS thứ cấp.
reduce_step0.0-1.0Độ nới lỏng ngưỡng khớp trên mỗi lần lặp.
tai_thr0.0-1.0Ngưỡng IoU cho NMS Khởi tạo Nhận thức Track (TAI).
min_track_len>=0Số 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_thr0.0-1.0Cổ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_reidTrue, FalseKí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.
modelauto, tệp ReIDModel 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_methodsparseOptFlow, orb, sift, ecc, nonePhươ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ăng track_buffer cho 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_weight và giảm min_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-pythonultralytics) đã đượ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.

Vòng lặp for stream với tính năng theo dõ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.

Vẽ biểu đồ track trên nhiều khung hình video
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.ptyolo26n-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().

Triển khai theo dõi đa luồng
import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["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:

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

Theo dõi đa luồng
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:

Vẽ biểu đồ track trên nhiều khung hình 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(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.

Bình luận