Object Tracking cơ bản: theo dõi cùng một vật thể qua nhiều khung hình
Atlasbot · 18/8/2026 · 11 phút đọc
Object Detection (bài trước) trả lời "khung hình này có vật gì, ở đâu" — nhưng chạy detection độc lập trên từng khung hình không cho biết vật thể ở khung hình này có phải cùng một vật với khung hình trước hay không. Đó là vấn đề Object Tracking giải quyết: gán một ID cho mỗi vật thể và theo dõi ID đó xuyên suốt video.
Khái niệm chính
Chạy detection độc lập trên từng khung hình có hai vấn đề: tốn tài nguyên tính toán (mô hình detection thường nặng hơn nhiều so với thuật toán tracking), và không biết được chuyển động — ví dụ không thể tính vật thể đang di chuyển hướng nào, nhanh hay chậm, nếu mỗi khung hình đều coi là vật thể mới hoàn toàn.
Nguyên lý hoạt động
Cách phổ biến nhất là kết hợp: chạy detection để tìm vật thể ở một số khung hình, sau đó dùng thuật toán tracking nhẹ hơn (như dựa trên vị trí dự đoán, đặc trưng hình ảnh, hoặc bộ lọc Kalman) để "theo" vật thể đó ở các khung hình tiếp theo mà không cần chạy lại detection đầy đủ mỗi lần — chỉ chạy detection lại định kỳ hoặc khi tracking bị mất dấu vật thể.
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
# .track() thay vì .predict() — tự động gán và duy trì ID xuyên suốt video
results = model.track(source="video.mp4", persist=True)
for r in results:
for box in r.boxes:
track_id = box.id # ID duy nhất cho vật thể này, giữ nguyên qua các khung hình
print(f"ID {track_id}: {box.cls} tại {box.xyxy}")
Kiến thức kỹ thuật
Công thức
Bộ lọc Kalman (đã học nguyên lý predict-update ở bài EKF, chuyên mục Robotics Fundamentals) là thành phần cốt lõi của nhiều thuật toán tracking — dự đoán vị trí vật thể ở khung hình tiếp theo dựa trên vận tốc ước lượng:
Vị_trí_dự_đoán(t+1) = Vị_trí(t) + Vận_tốc_ước_lượng(t) × Δt
VD: vật thể ở (100, 150) tại khung hình t, vận tốc ước lượng (5, 2) px/khung hình
Vị_trí_dự_đoán(t+1) = (100+5, 150+2) = (105, 152)
Khi detection chạy lại, so khớp box mới phát hiện với vị trí dự đoán này
(dựa trên khoảng cách/IoU, đã học ở bài Object Detection cơ bản) để
xác định đây có phải cùng 1 vật thể (giữ nguyên ID) hay vật thể mới
Thông số
| Chiến lược | Tần số chạy detection đầy đủ | Chi phí tính toán |
|---|---|---|
| Detection mỗi khung hình | 100% khung hình | Cao nhất |
| Detection định kỳ + tracking nhẹ giữa các lần | VD: mỗi 5 khung hình | Thấp hơn nhiều |
| Tracking thuần (không detection lại) | Chỉ lần đầu | Thấp nhất, nhưng dễ mất dấu lâu dài |
Ứng dụng thực tế
Với AMR, tracking hữu ích khi cần theo dõi một người cụ thể (robot đi theo người - "person following"), đếm số lượng vật thể đi qua một khu vực mà không đếm trùng, hoặc dự đoán hướng di chuyển của vật cản động để né tránh sớm hơn thay vì chỉ phản ứng khi vật cản đã ở gần — đúng ứng dụng đã nhắc ở bài Navigation Layer trong AMR, nơi local costmap cần cập nhật liên tục theo vật cản động.
Ví dụ thực tế
def du_doan_vi_tri(vi_tri_hien_tai, van_toc, dt=1.0):
return (vi_tri_hien_tai[0] + van_toc[0]*dt, vi_tri_hien_tai[1] + van_toc[1]*dt)
# Theo doi 1 nguoi di qua nhieu khung hinh
vi_tri_lich_su = [(100, 150), (105, 152), (110, 154)]
# Uoc luong van toc tu 2 khung hinh gan nhat
vx = vi_tri_lich_su[-1][0] - vi_tri_lich_su[-2][0]
vy = vi_tri_lich_su[-1][1] - vi_tri_lich_su[-2][1]
vi_tri_du_doan = du_doan_vi_tri(vi_tri_lich_su[-1], (vx, vy))
print(f"Vi tri du doan khung hinh tiep theo: {vi_tri_du_doan}")
Output:
Vi tri du doan khung hinh tiep theo: (115.0, 156.0)
Khi khung hình mới tới, so khớp vị trí detection thực tế với dự đoán này
(dùng khoảng cách Euclid hoặc IoU) để xác nhận cùng ID, không cần chạy
lại toàn bộ mô hình detection nặng mỗi khung hình
Lỗi thường gặp
- Chạy detection đầy đủ mỗi khung hình khi không cần thiết — như bảng Thông số, tốn tài nguyên tính toán không tương xứng, đặc biệt trên phần cứng nhúng hạn chế.
- Tracking thuần không có detection định kỳ trong thời gian dài — dễ "trôi" khỏi vật thể thật khi có nhiễu hoặc vật thể đổi hướng đột ngột, cần detection lại định kỳ để hiệu chỉnh.
- Không xử lý trường hợp mất dấu (occlusion) — khi vật thể bị che khuất tạm thời rồi xuất hiện lại, thuật toán tracking đơn giản có thể gán ID mới thay vì nhận ra đây là cùng vật thể cũ.
- Dùng vận tốc ước lượng từ quá ít khung hình lịch sử — ước lượng vận tốc từ chỉ 2 khung hình dễ nhiễu hơn nhiều so với trung bình trên nhiều khung hình gần đây.
Kết luận
Object Tracking mở rộng Object Detection từ "nhận diện từng khung hình riêng lẻ" thành "theo dõi liên tục theo thời gian" — kết hợp detection định kỳ với dự đoán vị trí (thường qua bộ lọc Kalman) giúp giảm chi phí tính toán đáng kể so với chạy detection mọi khung hình. Đây là nền tảng cho các hành vi robot phức tạp hơn như đi theo người hoặc dự đoán chuyển động vật cản. Bài cuối trong chuyên mục này ghép YOLO vào một pipeline ROS2 hoàn chỉnh.