Object Tracking trong video
Giữ identity qua thời gian bằng motion prediction, data association và quản lý track.
Detection tìm vật thể trong từng frame; tracking cố giữ một danh tính nhất quán khi vật thể di chuyển, mất dấu hoặc xuất hiện lại. Nhiều object tracking là bài toán liên kết theo thời gian, không chỉ vẽ box nhanh.
Mục tiêu học tập
- Tách detection khỏi track state và track ID.
- Giải thích predict–associate–update và ID switch.
- Chọn cách đánh giá tách chất lượng phát hiện khỏi identity.
Một track nhớ điều gì?
Theo dõi một chiếc xe qua các frame giống nối các vị trí liên tiếp của cùng chiếc xe. Nếu xe khuất sau cột, hệ thống có thể giữ một phỏng đoán ngắn hạn thay vì lập tức coi nó đã biến mất vĩnh viễn.
ID là nhãn nội bộ của tracker, không phải danh tính con người. ID có thể đổi sau khi mất dấu hoặc khởi động lại; không dùng nó như định danh bền vững nếu chưa có quy trình khác.
Track state có thể chứa box, vận tốc, tuổi và độ bất định. Mỗi frame: dự đoán vị trí, ghép detection với track, cập nhật track được ghép, rồi quản lý track mới hoặc mất dấu. SORT dùng Kalman filter và Hungarian assignment trong một thiết kế tracking-by-detection.
Timestamp và khoảng cách thời gian giữa frame quan trọng: nếu bỏ frame mà vẫn giả định chu kỳ cũ, dự đoán chuyển động có thể sai. Không dùng frame tương lai trong hệ thống được đánh giá là online.
Một mô hình tuyến tính dùng , . Kalman filter cần giả định về noise và động học; object đổi hướng đột ngột làm dự đoán kém dù phép cập nhật được cài đúng.
Box state trong SORT là một lựa chọn cụ thể, không phải state vector bắt buộc cho mọi tracker. Track lifecycle, gating và cost matrix ảnh hưởng mạnh đến identity continuity.
Ghép object giữa các frame
Hai xe đi cắt nhau có thể đổi vị trí gần nhất. Nếu chỉ nối theo khoảng cách, tracker có thể trao nhầm ID. Hình dáng hoặc lịch sử chuyển động cung cấp thêm dấu hiệu, nhưng cũng có lúc không đủ để chắc chắn.
Association có thể dùng IoU, khoảng cách chuyển động hoặc embedding appearance. Deep SORT bổ sung deep appearance metric để hỗ trợ ghép qua che khuất. Trước assignment nên loại cặp không hợp lý bằng gating theo thiết kế.
Ví dụ số 1D trong mã chỉ dự đoán vị trí từ vận tốc; nó không giải bài toán ghép nhiều người và không cài toàn bộ Kalman filter.
Hungarian assignment tối ưu tổng cost của một ma trận đã chọn, không bảo đảm association đúng về ngữ nghĩa. Khi ảnh giống nhau hoặc detector bỏ sót, một nghiệm tối ưu số học vẫn có thể đổi ID.
Appearance features có domain bias và có thể không bền với thay đổi pose hoặc ánh sáng. Định nghĩa ngưỡng bỏ ghép và chính sách tái nhận dạng trước khi xem test sequence.
Đọc lỗi theo chuỗi
Một tracker có box đẹp nhưng đổi ID mỗi frame không hữu ích để đo đường đi. Ngược lại, giữ đúng ID nhưng thường mất object cũng gây lỗi. Xem cả đoạn video thay vì chọn một frame đại diện.
Theo dõi false positives, false negatives, ID switches và fragmentation. Các metric như IDF1 hoặc HOTA tập trung những khía cạnh khác nhau của tracking; ghi evaluator và protocol thay vì gọi mọi chỉ số là accuracy.
Chia train/test theo sequence hoặc camera phù hợp mục tiêu. Những frame sát nhau của cùng video không nên chia ngẫu nhiên rồi được mô tả là đánh giá trên video mới.
Cố định detections khi so hai bộ association để tách hiệu ứng detector. Nếu thay cả detector lẫn association, cần ablation để hiểu nguyên nhân. Độ trễ online, frame drops và trạng thái khi camera reset nên được đưa vào kiểm thử hệ thống.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Đo quỹ đạo và thời gian hiện diện trong video.
- Đếm lượt đi qua một vùng bằng track thay vì box từng frame.
Điểm mạnh
Tận dụng lịch sử để giữ object identity và mô tả chuyển động.
Giới hạn cần nhớ
Occlusion dài, camera đổi cảnh và detection sai có thể gây mất track hoặc đổi ID.
Thử trong một project nhỏ
Tạo chuỗi vị trí 1D của hai object đi cắt nhau. Chỉ ra frame mà nearest-neighbor có thể đổi ID và thông tin bổ sung cần có để giải quyết.
def predict(position, velocity, dt):
if dt < 0:
raise ValueError("dt must be nonnegative")
return position + velocity * dt
last_position, speed = 10.0, 2.0
assert predict(last_position, speed, 0.5) == 11.0
assert predict(last_position, speed, 1.5) == 13.0
print(predict(last_position, speed, 0.5))Dự đoán constant-velocity 1D trên số giả định; không phải SORT, bộ association hay tracker hoàn chỉnh.
