다중 객체 추적(Multi-Object Tracking, MOT)은 영상의 각 프레임에서 여러 객체를 지속적으로 식별하고, 시간에 따라 동일한 객체를 연결하는 작업이다. 객체 탐지(Object Detection)가 “어디에 무엇이 있는가”를 알려준다면, 객체 추적은 “그것이 어디로 움직이는가”를 알려준다. 자율주행차가 보행자를 추적하고, CCTV가 침입자를 따라가며, 스포츠 중계에서 선수들의 움직임을 분석하는 모든 곳에 다중 객체 추적 기술이 활용된다.
객체 추적에는 탐지 이상의 기술이 필요하다. 객체 탐지는 각 프레임에서 독립적으로 객체의 위치를 파악하면 되지만, 추적에서는 예컨대 프레임 1의 "객체 A"와 프레임 100의 "객체 A"가 동일한 객체임을 보장해야 한다. 이를 정체성 유지(ID Preservation)라고 한다. 또한 객체가 다른 물체에 의해 일시적으로 가려지거나 영상에서 사라졌다가 다시 나타나는 경우에도 추적을 유지할 수 있어야 한다. 이러한 능력을 가림 처리(Occlusion Handling)라고 한다. 이 외에도 거리, 조명, 자세의 변화 속에서도 동일 객체로 인식할 수 있어야 하며, 실시간 영상 스트림에서도 지연 없이 작동할 수 있는 높은 처리 속도 역시 요구된다.
이 글에서는 대표적인 MOT 알고리즘인 SORT, DeepSORT, ByteTrack, BoT-SORT를 비교한다.

가장 먼저 소개할 알고리즘은 SORT (Simple Online and Realtime Tracking)이다. SORT는 2016년에 발표된 간결하고 빠른 실시간 추적 알고리즘이다. 객체 탐지기로부터 받은 바운딩 박스를 기반으로, 칼만 필터(Kalman Filter)와 헝가리안 할당 알고리즘(Hungarian Algorithm)을 활용하여 다중 객체를 효율적으로 추적한다. 외형 정보(appearance)를 활용하지 않고, 기하학적 정보만으로 추적을 수행하는 방식이다. 칼만 필터는 객체의 운동 모델로서 등속 운동 모델을 사용하였다. 헝가리안 알고리즘에 대해서는 추후 논의하기로 한다.
SORT의 장점은 구조가 단순하고 처리 속도가 매우 빨라, 리소스가 제한된 임베디드 시스템에서도 쉽게 활용할 수 있다는 점이다. 하지만 외형 정보를 사용하지 않기 때문에 ID 스위칭(ID Switching)이 자주 발생하고, 가림 상황에 특히 취약하다는 단점이 있다.
DeepSORT는 SORT의 약점을 보완하기 위해 2017년에 제안된 알고리즘으로, SORT의 기본 구조에 딥러닝 기반 외형 정보(appearance descriptor)를 추가한 방식이다. 기존 SORT는 바운딩 박스의 위치만을 고려하여 객체를 추적했기 때문에, 비슷한 궤적을 가진 객체 간에 ID가 자주 바뀌는 문제가 있었다. DeepSORT는 여기에 외형 특징을 추가함으로써 객체를 더 정확하게 식별하고 ID 스위칭을 줄였다.
외형 정보는 사전 학습된 CNN(Convolutional Neural Network)을 통해 추출되며, 각 객체에 대한 고유한 feature vector로 사용된다. 이를 통해 동일 객체 여부를 판단할 때 위치뿐 아니라 시각적 유사성도 함께 고려하게 된다 DeepSORT의 강점은 ID 정합성(Identity Consistency)이 크게 향상된다는 점이다. 그러나 외형 정보를 추출하는 CNN의 연산 부담이 커서 처리 속도가 상대적으로 느려질 수 있으며, 리소스가 제한된 환경에서는 적용이 어려울 수 있다.
ByteTrack(Better Tracking by Association)은 2021년에 발표된 알고리즘으로, MOT의 새로운 패러다임을 제시한 기법이다. 기존 대부분의 알고리즘은 신뢰도(confidence score)가 높은 탐지 결과만을 사용하여 객체를 연결했지만, ByteTrack은 낮은 신뢰도의 탐지 결과까지 고려함으로써 보다 정교한 객체 연결이 가능하도록 했다.
핵심 아이디어는 탐지기의 신뢰도가 낮은 바운딩 박스들도 객체 연결에 적극 활용함으로써 가림 상황(Occlusion)이나 일시적인 탐지 누락(Missed Detection)을 견고하게 처리하는 것이다. 이로 인해 추적의 연속성과 정체성 유지가 크게 향상된다.
ByteTrack은 외형 정보를 사용하지 않고도 매우 우수한 성능을 보이며, 속도 또한 빠르기 때문에 실제 응용에 적합하다.
BoT-SORT(Bag of Tricks for SORT)는 이름 그대로 SORT에 다양한 개선 기법들을 조합해 성능을 향상시킨 2022년 알고리즘이다. 기존 SORT의 빠른 속도는 유지하면서도 정체성 유지와 가림 처리 성능을 높이기 위한 여러 트릭(trick)을 적용했다.
이 알고리즘은 외형 정보와 함께 Re-ID 모델(re-identification network), Motion Compensation, IOU 및 거리 기반 보정, 비선형 이동 보정 등의 요소를 통합하여, 복잡한 환경에서도 안정적인 추적을 가능하게 한다.
BoT-SORT의 장점은 모듈형 구조로 구성되어 있어, 다양한 추적 시나리오에 맞게 유연하게 조정할 수 있다는 것이다. 다만, 여러 기법을 통합하다 보니 구현 복잡도가 다소 높고, 실시간 처리에서는 하드웨어 성능에 따라 병목이 생길 수 있다.
기술의 발전과 함께 MOT 알고리즘은 점점 더 정교해지고 있다. 최근에는 StrongSORT, OC-SORT, Deep OC-SORT와 같은 고도화된 방식들이 등장하여, 기존 SORT 기반 구조의 한계를 보완하고 복잡한 움직임, 심각한 가림(Occlusion), 외형 변화 등 다양한 상황에서도 더욱 강인한 성능을 보여주고 있다.
앞으로는 Transformer 기반의 구조, 자세 추정과 결합된 3D 추적, 자율 시스템과의 통합 등으로 MOT 기술이 더욱 확장될 것으로 기대된다.
다음 코드는 Ultralytics YOLO 패키지를 활용한 객체 추적의 간단한 예시다. 기존의 model.predict() 를 model.track()으로 바꾸고, tracker 인자에 원하는 MOT 알고리즘 이름을 지정해주기만 하면 된다. 예를 들어, tracker="bytetrack"과 같이 지정하면 ByteTrack 기반으로 객체를 추적하며, source=0으로 설정하면 시스템의 웹캠 영상을 실시간 입력으로 사용할 수 있다.
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
from ultralytics import YOLO
import cv2
# 모델 로드 (nano 버전 예)
model = YOLO("yolo12n.pt")
print("SORT 추적 시작... 종료 'q' 키")
try:
# SORT, BotSORT, ByteTrack 사용
#results = model.track(source="vtest5.mp4", imgsz=640, show=False, save=False, stream=True)
#results = model.track(source="vtest5.mp4", imgsz=640, show=False, save=False, stream=True, tracker="botsort.yaml")
results = model.track(source="vtest6.mp4", imgsz=640, show=False, save=True, stream=True, tracker="bytetrack.yaml")
for result in results:
# 추적 ID가 포함된 프레임 표시
annotated_frame = result.plot()
cv2.imshow('YOLO + SORT 추적', annotated_frame)
# 추적 정보 출력 (선택사항)
if result.boxes is not None and result.boxes.id is not None:
track_ids = result.boxes.id.cpu().numpy()
classes = result.boxes.cls.cpu().numpy()
print(f"추적 중인 객체들: {dict(zip(track_ids, [model.names[int(c)] for c in classes]))}")
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except Exception as e:
print(f"추적 실패: {e}")
finally:
cv2.destroyAllWindows()
다음 영상은 Multiple Object Tracking Benchmark 사이트(https://motchallenge.net/data/MOT16/)에 있는 영상에 ByteTrack을 적용한 것이다.
다음은 세떼를 쫒는 드론 영상인데, 별로 성능이 좋아 보이지는 않는다. 새떼는 개별 객체가 집합을 이룬 형태이므로 군집을 추적하기 위해서는 추가적인 작업이 필요해 보인다.
'AI 딥러닝 > DLA' 카테고리의 다른 글
| [YOLO] 욜로의 진화 (0) | 2025.07.11 |
|---|---|
| [PINN] PINN을 이용한 램버트 문제의 해 (0) | 2024.04.10 |
| [VAE] beta-VAE (0) | 2023.05.11 |
| [VAE] 변이형 오토인코더(Variational Autoencoder) (0) | 2023.04.30 |
| [U-Net] 망막 혈관 세그멘테이션 (Retinal Vessel Segmentation) (0) | 2022.05.11 |
댓글