SORT는 매 frame의 검출 box를 Kalman Filter로 예측한 track과 IoU 기준으로 연결하기 때문에 빠르지만, 외형 정보를 쓰지 않아 오래 가려진 객체를 다시 같은 ID로 찾는 데 약합니다. 따라서 검출이 안정적이고 frame 사이 이동이 작으며 짧은 연결이 중요한 장면에 적합합니다. ID switch가 업무상 큰 오류라면 TLost만 늘리지 말고 appearance feature가 필요한지 먼저 판단해야 합니다.
SORT가 빠른 대신 ID를 놓치는 이유: Kalman Filter와 Hungarian 매칭
검출과 추적을 분리하면 무엇이 보이나
SORT 논문과 공개 코드는 다중 객체 추적을 복잡한 시각 모델보다 data association 문제로 단순화합니다. detector가 매 frame마다 bounding box를 주면 tracker는 이전 객체가 지금 어디에 있을지 예측하고, 새 box와 연결해 ID를 유지합니다.
논문 기록에서 detector만 바꿔도 tracking 성능이 최대 18.9% 향상됐습니다. 이는 tracker의 정교함만큼 입력 detection의 품질이 중요하다는 뜻입니다. 원문 실험은 Faster R-CNN에서 confidence 50%가 넘는 보행자 box를 사용하고 ACF detector와 비교했습니다.
SORT가 사용하는 정보는 box의 위치와 크기입니다. appearance model과 복잡한 재식별은 의도적으로 제외합니다. 이 선택 덕분에 속도와 구현 단순성을 얻지만, 검출이 끊기거나 비슷한 객체가 교차하는 장면에서는 ID가 바뀔 여지가 커집니다.
한 frame이 처리되는 네 단계
한 번의 update는 다음 순서로 읽을 수 있습니다.
- 각 기존 track의 다음 box를 Kalman Filter로 예측합니다.
- 새 detection과 예측 box의 모든 조합에서 IoU를 계산해 비용행렬을 만듭니다.
- Hungarian algorithm으로 전체 할당 비용이 작아지는 짝을 고릅니다.
- 매칭된 track은 측정값으로 갱신하고, 남은 detection은 새 track으로 만들며, 오래 관측되지 않은 track은 지웁니다.
상태는 box 모서리 좌표 자체가 아니라 중심 u, v, 면적 s, 종횡비 r와 속도 성분으로 표현합니다. 원문의 변환 코드는 다음 관계를 사용합니다.
1
2
3
4
5
6
w = bbox[2] - bbox[0]
h = bbox[3] - bbox[1]
x = bbox[0] + w / 2.
y = bbox[1] + h / 2.
s = w * h
r = w / float(h)
선형 등속 모델로 다음 위치를 예측하고, detection이 연결되면 box 측정을 사용해 상태와 속도를 보정합니다. 연결되지 않으면 측정 보정 없이 예측 상태만 남습니다. Kalman Filter의 예측, 보정 원리는 이전 글에 정리돼 있습니다.
IoU와 Hungarian이 서로 다른 일을 하는 이유
IoU는 두 box가 얼마나 겹치는지 점수로 바꿉니다. 기존 track과 새 detection의 모든 IoU를 행렬에 넣고, Hungarian algorithm은 한 detection이 여러 track에 중복 배정되지 않도록 전체 짝을 정합니다.
매칭 결과가 나와도 IoU가 iou_threshold보다 낮으면 그 짝은 거부하고 양쪽을 unmatched로 돌립니다. 원문 코드의 기본 threshold는 0.3입니다. 즉, Hungarian algorithm이 “최선의 조합”을 찾고, IoU threshold가 “그 최선이 받아들일 만큼 좋은가”를 다시 판단합니다.
box가 짧은 시간 서로 겹치는 가림에서는 예측 위치와 IoU가 연결을 유지할 수 있습니다. 그러나 객체가 오래 사라지거나 카메라 움직임과 실제 운동이 등속 가정을 크게 벗어나면 box geometry만으로 같은 대상을 확신하기 어렵습니다.
track의 생성과 삭제에도 지연 조건이 있습니다. 원문 Sort 클래스의 기본값은 max_age=1, min_hits=3입니다.
- unmatched detection은 속도 0과 큰 초기 공분산으로 새 tracker가 됩니다.
- 충분한 연속 검출을 얻은 track만 안정된 대상으로 취급합니다.
max_age보다 오래 갱신되지 않으면 track을 제거합니다.- detection이 없는 빈 frame도
update를 한 번 호출해야 시간 상태가 맞게 흐릅니다.
SORT가 맞는 장면과 피해야 할 기대
SORT 결과를 볼 때 MOTA, MOTP만 보지 말고 false positive, false negative, ID switch, fragmentation을 함께 봐야 합니다. 검출 누락이 tracker 오류처럼 나타날 수 있고, detector가 만든 잘못된 box는 IoU 매칭 전체를 흔듭니다.
다음 조건에서는 SORT의 단순함이 장점입니다.
- frame 사이 이동이 비교적 작고 등속 모델로 근사됩니다.
- detector가 안정적으로 box를 냅니다.
- 긴 가림 뒤 재식별보다 실시간 frame-to-frame 연결이 중요합니다.
- appearance feature를 계산하는 비용을 피하고 싶습니다.
반대로 장기 가림, 화면 재진입, 서로 닮은 객체의 교차에서 같은 ID를 유지해야 한다면 box만 쓰는 설계의 한계를 먼저 인정해야 합니다. TLost를 크게 잡아 track을 오래 남기는 것만으로는 재식별 정보가 생기지 않으며, 잘못된 예측이 더 오래 유지될 수도 있습니다.
원문의 Python 코드는 filterpy, NumPy, linear_assignment 등 주변 의존성을 전제로 한 함수별 발췌입니다. 게시된 class 조각만으로 완전한 추적 앱이 되는 것은 아니지만, predict → IoU matrix → assignment → update/create/delete 흐름을 실제 구현과 대응해 읽기에는 충분합니다.
ID 오류는 어느 단계에서 생겼는지 어떻게 찾나
첫째, detector 출력을 추적 결과와 따로 저장합니다. 객체가 사라진 frame에 detection도 없다면 추적기만 고쳐서는 해결되지 않습니다. Detection은 있는데 새 ID가 만들어졌다면 예측 box와의 IoU, assignment 결과, track 삭제 시점을 차례로 봅니다. 잘못된 box가 연결됐다면 검출 중복과 NMS 영향도 확인해야 합니다.
둘째, 장면을 교차, 가림, 급이동으로 나눕니다. 단순 이동에서도 ID가 바뀌면 상태 모델이나 frame 간 간격을 의심할 수 있고, 서로 겹칠 때만 바뀌면 box 겹침만으로 정체성을 구분하는 한계가 드러납니다. 화면을 나갔다 다시 들어온 객체는 SORT 관점에서 새 track이 되는 것이 자연스럽습니다.
셋째, threshold 변화의 양쪽 비용을 봅니다. 느슨한 IoU 기준은 멀리 있는 detection을 잘못 붙일 수 있고, 엄격한 기준은 같은 객체도 새 track으로 쪼갭니다. max_age에 해당하는 생존 기간을 늘리면 짧은 누락은 견디지만 유령 track과 오연결 가능성도 늘어납니다. 하나의 전체 정확도보다 ID switch, fragmentation, false track을 함께 비교해야 합니다.
함께 읽으면 이해가 이어지는 글
- Deep SORT의 코사인 거리는 어디에 쓰일까: Feature Gallery와 추적 코드 흐름 — Deep SORT가 검출마다 붙은 appearance feature를 target별 gallery와 코사인 거리로 비교하는 과정을 설명합니다. frame별 detection 필터링, NMS, predict, update…
- Darknet NMS는 Class별로 해야 할까? do_nms_obj와 do_nms_sort 차이 — Darknet box.c의 objectness 기준 NMS와 class별 NMS를 비교하고, IoU 계산, stride box 변환, encode/decode, 비활성 diou 미분 코드의 주의점을 코드 흐름으로 설명합니다.
- YOLOv1은 왜 빠르지만 작은 물체에 약할까: 7×7 Grid와 Loss 해설 — YOLOv1이 region proposal 없이 한 번의 CNN 평가로 bounding box와 class를 함께 예측해 빠른 이유를 설명합니다. 7×7×30 출력, confidence와 IoU, 다섯 부분의 loss가 어떤 문제를…
자주 묻는 질문
SORT는 객체 검출기 없이도 동작하나요?
아닙니다. 매 frame의 detection box와 score가 입력으로 필요합니다. 검출 누락이나 위치 오류는 track 생성, 연결, 삭제에 직접 전달됩니다.
IoU와 Hungarian algorithm은 같은 역할인가요?
다릅니다. IoU는 예측 box와 새 detection이 얼마나 겹치는지 비용을 만들고, Hungarian algorithm은 그 비용행렬에서 전체 대응 관계를 정합니다.
가려진 객체의 ID를 유지하려면 TLost만 늘리면 되나요?
충분하지 않습니다. Track을 오래 남길 수는 있지만 외형 정보가 새로 생기지는 않아 잘못된 예측도 오래 유지될 수 있습니다. 긴 가림과 재진입에는 appearance 기반 재식별을 검토해야 합니다.
Detector를 바꿀 때 추적기도 다시 평가해야 하는 이유
SORT의 입력은 detector 결과이므로 confidence 기준이나 NMS를 바꾸면 track의 생명주기도 달라집니다. 낮은 score box를 많이 허용하면 잘못된 track이 늘 수 있고, 기준을 높이면 짧은 detection 누락 때문에 ID가 끊길 수 있습니다. Detector mAP가 올랐다는 사실만으로 동일한 추적 지표가 좋아진다고 단정하지 않습니다.
같은 영상에서 detection 파일을 고정한 채 SORT 파라미터를 비교하면 추적기 영향만 볼 수 있습니다. 반대로 detector를 비교할 때는 track 설정을 고정합니다. 두 실험을 나눠야 ID 오류가 motion, assignment에서 생겼는지 입력 box에서 시작됐는지 설명할 수 있습니다.
←→ 키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.