[YOLO] YOLOv8 + DeepSORT 이동물체추적

2025. 3. 20. 16:58Computer Engineering/강화학습

목표

YOLOv8을 사용해 실시간으로 물체를 탐지하고, DeepSORT 알고리즘을 사용해 같은 물체를 지속적으로 추적(ID 부여)

 

왜 필요한가?

  • YOLO는 각 프레임에서 개별적으로 탐지 → 물체가 움직일 때 이전 프레임과 연결되지 않음
  • DeepSORT는 이전 프레임의 물체와 현재 프레임의 물체를 비교해서 같은 물체에 ID를 부여
  • 예: "사람 1", "사람 2", "자동차 1"처럼 ID를 유지하면서 추적"

 

1. DeepSORT 라이브러리 설치

pip install deep-sort-realtime

 

2. 추적 코드 작성

from ultralytics import YOLO
import cv2
from deep_sort_realtime.deepsort_tracker import DeepSort

model = YOLO("yolov8n.pt")

#DeepSORT 추적기 초기화, 물체가 30 프레임 동안 보이지 않으면 추적 중단
tracker = DeepSort(max_age=30)

cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    results = model(frame)
    result = results[0]

    detections = []
    for box in result.boxes:
        x1, y1, x2, y2 = map(int, box.xyxy[0])
        conf = box.conf[0].item()
        cls = int(box.cls[0].item())

        detections.append(([x1, y1, x2, y2], conf, cls))

    #DeepSORT를 이용해 객체 추적
    tracked_objects = tracker.update_tracks(detections, frame=frame)

    for obj in tracked_objects:
        if obj.is_confirmed():
            x1, y1, x2, y2 = obj.to_tlbr()
            track_id = obj.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.5, (0, 255, 0),
                        2)

    cv2.imshow('YOLOv8 + DeepSORT Tracking', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

 

3. YOLO단독사용과 DeepSORT사용의 차이

이건 개인적으로 헷갈렸던 점이다.

 

Q. 프로그램 실행시 둘 다 같은 객체에 대해서 같은 ID값을 계속해서 제공하는 것 같은데.. 뭐가 다르다는거지?

 

알고보니 내가 촬영한 카메라 내에서는 한 종류의 객체에 대해서 계속해서 하나씩만 촬영이 되고 있어서 차이점을 느끼지 못한 것이었다. 

 

예를 들어, YOLO만 단독 사용했을 때는 사람A, 사람B의 ID 모두 0으로 나타난다. '사람'이라는 종류의 객체들이기 때문이다.

하지만 DeepSORT를 함께 사용했을 때는 사람A, 사람B에게 다른 ID 값인 1, 2로 주어진다.  DeepSORT는 같은 객체를 계속 추적하며, 객체의 이동을 인식해서 ID를 유지한다.

 

A. 즉, YOLO는 매 프레임마다 "이 물체가 무엇인지" 탐지하는 것이고, DeepSORT는 이전 프레임의 객체와 현재 프레임의 객체를 비교해서 ID 유지하는 것이다.