Theo dõi đối tượng

Theo dõi gán định danh ổn định cho từng kết quả phát hiện qua các frame video. LibreYOLO không biểu diễn đây là tác vụ có trọng số riêng: đó là chế độ dự đoán model.track(), chạy tracker đã chọn trên đầu ra theo từng frame của mô hình phát hiện, phân đoạn hoặc tư thế.

Định nghĩa

Theo dõi không phải một trong các key tác vụ của LibreYOLO và không có checkpoint theo dõi để tải. Đây là phương thức trên mô hình, model.track(source), chạy phát hiện trên từng frame và liên kết kết quả theo thời gian. Phương thức là generator: nó yield một Results trên mỗi frame đã xử lý, với result.track_id được đặt thành tensor số nguyên (N,) căn theo result.boxes. Cùng các ID đó cũng nằm trên result.boxes.id.

Chỉ các đối tượng đã xác nhận và hiện đang được theo dõi mới được yield. Track bị mất liên kết vẫn tồn tại trong số frame đã cấu hình trước khi bị loại, track_buffer cho ByteTrack và BoT-SORT, max_age cho hai biến thể OC-SORT, vì vậy đối tượng được tìm lại trong cửa sổ đó giữ ID ban đầu.

Vì việc liên kết diễn ra sau phát hiện, các payload khác của frame vẫn còn: Results được theo dõi là Results phát hiện được cắt theo các dòng khớp, vì vậy mặt nạ và keypoint đi cùng hộp.

Mô hình

Một lượt theo dõi có hai lựa chọn độc lập: mô hình tạo hộp trên mỗi frame và tracker liên kết chúng.

Mọi mô hình LibreYOLO gốc có tác vụ phát hiện, phân đoạn hoặc tư thế đều cung cấp track(), nên việc chọn detector vẫn như thông thường. Xem chỉ mục mô hình để biết danh sách đầy đủ, hoặc bắt đầu với YOLO9, RF-DETR, D-FINE hay RTMDet. Tác vụ có kết quả không chứa hộp để liên kết sẽ từ chối lời gọi thay vì trả về ID vô nghĩa: phân loại, hộp xoay, điểm, độ sâu, pháp tuyến bề mặt, cạnh, phân đoạn ngữ nghĩa và toàn cảnh, phục hồi, OCR cùng lưới cơ thể đều phát sinh lỗi từ track().

Hai tầng mô hình LibreYOLO cũng từ chối. Mô hình được nạp qua LibreSAM là image segmenter, còn mô hình được nạp qua LibreOpenVocab là detector theo từng frame; cả hai phát sinh lỗi từ track() và được dùng với predict() trên mỗi frame.

Theo dõi chạy trên mô hình PyTorch gốc. Artifact đã xuất được nạp qua LibreYOLO("model.onnx") trả về đối tượng backend runtime, có predict() nhưng không có track().

Bốn tracker đi kèm thư viện, được chọn bằng đối số tracker:

"bytetrack" là mặc định. Nó chỉ dùng chuyển động, với Kalman filter và liên kết ba giai đoạn: kết quả phát hiện có độ tin cậy cao trước, sau đó lượt thứ hai cho kết quả có độ tin cậy thấp cơ hội khớp với track hiện có trước khi bị loại, cuối cùng là track chưa xác nhận. Cấu hình bằng TrackConfig.

"botsort" giữ vòng đời ba giai đoạn của ByteTrack nhưng dùng trạng thái Kalman theo tâm, chiều rộng và chiều cao, đồng thời bù chuyển động camera cho track dự đoán trước khi khớp. Đây là biến thể BoT-SORT chỉ dùng chuyển động; nó không chạy mô hình appearance. Cấu hình bằng BoTSortConfig, bổ sung enable_cmc, cmc_methodcmc_downscale.

"ocsort" cũng chỉ dùng chuyển động, bổ sung thành phần hướng vận tốc vào chi phí liên kết, lượt liên kết thứ hai với quan sát thực cuối cùng của mỗi track và làm mượt trạng thái Kalman theo quỹ đạo ảo khi tìm lại track. Cấu hình bằng OCSortConfig.

"deepocsort" mở rộng OC-SORT bằng appearance. Mỗi track giữ moving average có trọng số độ tin cậy của embedding tái định danh, còn thành phần cosine similarity tham gia chi phí liên kết, giúp định danh tồn tại qua che khuất dài và target đi cắt nhau. Nó tốn một forward pass của mạng embedding nhỏ trên mỗi frame, và trọng số OSNet được tải trong lần sử dụng đầu tiên. Cấu hình bằng DeepOCSortConfig.

Dự đoán

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # track() là generator: mỗi frame đã xử lý có một Results.for result in model.track("video.mp4"):    print(result.track_id)        # tensor int (N,), căn theo các hộp    print(result.boxes.xyxy)
Chọn tracker
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # "bytetrack" (mặc định), "botsort", "ocsort" hoặc "deepocsort".for result in model.track("video.mp4", tracker="botsort"):    print(result.track_id)
Lưu video đã chú thích
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Nếu không có output_path, tệp nằm tại runs/track/<video_stem>.mp4.for result in model.track("video.mp4", save=True, vid_stride=2):    pass
Điều chỉnh tracker
from libreyolo import BoTSortConfig, LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Kiểu cấu hình chọn tracker, vì vậy tracker= là dư thừa ở đây.config = BoTSortConfig(track_buffer=60, frame_rate=25, enable_cmc=False)for result in model.track("video.mp4", tracker_config=config):    print(result.track_id) # Hoặc truyền cùng các trường dưới dạng đối số keyword để track() tự dựng.for result in model.track("video.mp4", tracker="botsort", track_buffer=60):    print(result.track_id)

track_conf đặt ngưỡng cho giai đoạn liên kết đầu tiên: track_high_thresh cho ByteTrack và BoT-SORT, det_thresh cho OC-SORT và Deep OC-SORT. Đây không phải conf của predict(), và với ByteTrack, BoT-SORT cùng OC-SORT, detector chạy nội bộ ở ngưỡng thấp hơn để kết quả yếu vẫn có sẵn cho lượt khôi phục. Deep OC-SORT chạy detector ở chính det_thresh. Với ByteTrack và BoT-SORT, track_conf phải lớn hơn hoặc bằng track_low_thresh, mặc định là 0.1.

Cài đặt tracker được truyền theo một trong hai cách. Truyền instance cấu hình cho tracker_config=, kiểu của nó sẽ chọn tracker và khiến tracker= dư thừa. Hoặc truyền các trường dưới dạng đối số keyword và để track() dựng cấu hình cho tracker đã nêu; key không xác định sẽ cảnh báo thay vì được âm thầm áp dụng. Theo cả hai cách, track_conf bị bỏ qua khi key tương ứng được đặt tường minh.

Các đối số còn lại giống dự đoán: iou, imgsz, classes, max_det, vid_stride, showsave với output_path. Nguồn là đường dẫn tệp video. Xem dự đoán để biết cách xử lý kết quả.

Huấn luyện

Tracker không được huấn luyện. Ba trong bốn loại là mô hình chuyển động thuần không có tham số học được, còn mạng appearance của Deep OC-SORT là checkpoint tái định danh đã công bố, được tải trong lần sử dụng đầu tiên. Cải thiện chất lượng theo dõi nghĩa là cải thiện detector hoặc điều chỉnh các ngưỡng liên kết ở trên.

Đã kiểm chứng với LibreYOLO v1.5.0.