🧠 Giới thiệu
Sau khi đã biết cách phát hiện vật thể với OpenCV + YOLO, bước tiếp theo trong các ứng dụng thực tế như camera giám sát, phân tích hành vi, đếm người… là theo dõi (Tracking) từng vật thể qua các khung hình (frames).
Bài viết này sẽ hướng dẫn cách kết hợp YOLO và DeepSORT để theo dõi người và vật thể trong video thời gian thực, gắn ID riêng cho từng đối tượng và duy trì nhận dạng trong suốt quá trình di chuyển.
⚙️ 1. Tracking là gì?
Tracking (theo dõi) là quá trình nhận diện và duy trì vị trí của vật thể qua nhiều khung hình liên tiếp trong video.
Nó khác với Object Detection ở chỗ:
Object Detection | Object Tracking |
---|---|
Xác định vật thể trong từng frame | Theo dõi vật thể qua các frame |
Kết quả độc lập giữa các frame | Có “nhớ” và ID cho từng vật thể |
Dùng YOLO, SSD, Faster R-CNN | Dùng DeepSORT, ByteTrack, StrongSORT,… |
Ví dụ: YOLO nhận ra “3 người trong frame”, nhưng DeepSORT giúp biết “người số 2 vừa đi từ trái qua phải”.
🧩 2. DeepSORT là gì?
DeepSORT (Deep Simple Online and Realtime Tracking) là phiên bản nâng cao của SORT (Simple Online Realtime Tracking), được cải tiến để:
- Nhận dạng vật thể bằng đặc trưng (feature embedding)
- Giảm lỗi “nhảy ID” giữa các frame
- Theo dõi ổn định hơn, ngay cả khi vật thể bị che khuất tạm thời
DeepSORT = 👉 Detection (YOLO) + Feature Extraction (CNN) + Kalman Filter + Hungarian Algorithm
🧱 3. Kiến trúc hệ thống
Dưới đây là pipeline xử lý:
[Video Frame]
↓
[YOLO Detection] → (Bounding boxes + Class + Confidence)
↓
[DeepSORT Tracker] → (Object ID + Position Tracking)
↓
[Visualization bằng OpenCV]
Kết quả: Mỗi vật thể (người, xe, thú cưng, v.v.) được gắn một ID duy nhất (ID_1, ID_2, …) và được theo dõi liên tục qua các khung hình.
💻 4. Code ví dụ: YOLOv8 + DeepSORT + OpenCV
import cv2
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSort
# 1️⃣ Load YOLO model
model = YOLO("yolov8n.pt") # mô hình nhỏ, tốc độ cao
# 2️⃣ Khởi tạo DeepSORT tracker
tracker = DeepSort(max_age=30)
# 3️⃣ Mở webcam
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 4️⃣ Phát hiện bằng YOLO
results = model(frame)
detections = []
for box in results[0].boxes:
x1, y1, x2, y2 = box.xyxy[0]
conf = box.conf[0]
cls = int(box.cls[0])
if conf > 0.5:
detections.append(([x1, y1, x2 - x1, y2 - y1], conf, cls))
# 5️⃣ Theo dõi bằng DeepSORT
tracks = tracker.update_tracks(detections, frame=frame)
# 6️⃣ Vẽ kết quả
for track in tracks:
if not track.is_confirmed():
continue
x1, y1, x2, y2 = track.to_ltrb()
track_id = track.track_id
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.putText(frame, f"ID {track_id}", (int(x1), int(y1)-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
cv2.imshow("Tracking người & vật thể", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
⚡ 5. Kết quả
Khi chạy chương trình:
- YOLO phát hiện người/vật thể
- DeepSORT gán mã ID riêng
- Các vật thể được theo dõi mượt mà ngay cả khi di chuyển hoặc bị khuất tạm thời
💡 Ví dụ:
Người #1: di chuyển từ trái qua phải
Xe #2: tiến lại gần camera
Chó #3: rời khỏi khung hình
🔍 6. Best Practices
Kỹ thuật | Mục đích | Gợi ý |
---|---|---|
Chạy trên GPU (CUDA) | Tăng FPS đáng kể | Cài torch GPU + OpenCV-CUDA |
Giới hạn lớp (class) | Giảm nhiễu | Ví dụ: chỉ theo dõi người (person ) |
Lọc confidence | Giảm false positive | conf > 0.5 |
Tối ưu khung hình | Tăng tốc | Resize xuống 640x480 |
Fine-tune YOLO | Nhận diện tốt hơn trong môi trường riêng | Huấn luyện lại với dữ liệu thật của doanh nghiệp |
⚠️ 7. Các lỗi thường gặp
Lỗi | Nguyên nhân | Cách xử lý |
---|---|---|
“ID nhảy liên tục” | Che khuất lâu hoặc mất detection | Giảm max_age , tăng n_init |
FPS thấp | CPU xử lý YOLO | Dùng GPU hoặc mô hình nhỏ (yolov8n.pt ) |
Lỗi “CUDA out of memory” | GPU yếu | Giảm batch size hoặc độ phân giải |
Không hiển thị video | Thiếu imshow() hoặc capture lỗi |
Kiểm tra cap.isOpened() |
🧠 8. Ứng dụng thực tế
-
🎥 Camera giám sát thông minh Theo dõi và đếm người trong khu vực cấm.
-
🚗 Phân tích giao thông Theo dõi phương tiện, nhận dạng biển số kết hợp OCR.
-
🏢 Phân tích hành vi khách hàng Xác định thời gian dừng lại, khu vực quan tâm.
-
🏭 Theo dõi sản phẩm trong dây chuyền sản xuất Tự động phát hiện lỗi, tắc nghẽn.
🧩 9. Mở rộng: Tracking + AI nâng cao
Khi đã có pipeline YOLO + DeepSORT, bạn có thể mở rộng:
- Nhận diện khuôn mặt (Face Recognition)
- Phân loại hành động (Action Recognition)
- RAG-based Video Analysis — kết hợp AI để hỏi đáp về nội dung video
- Event Detection — cảnh báo khi có hành động bất thường
✅ Kết luận
Sự kết hợp giữa YOLO (phát hiện vật thể) và DeepSORT (theo dõi ID) mang đến một giải pháp tracking thời gian thực mạnh mẽ và ổn định. Đây là nền tảng để xây dựng các ứng dụng AI hiện đại trong an ninh, giám sát, giao thông và công nghiệp.