티스토리 뷰
https://github.com/ifzhang/ByteTrack
https://arxiv.org/abs/2110.06864
트래킹 알고리즘을 개발할 일이 있어서 최근 SOTA 성능을 보이는 트래킹 방법을 서칭해보았다. 멀티플 오브젝트 트래킹 알고리즘의 성능평가를 위해 사용되는 벤치마크 데이터셋인 MOT17, MOT20 데이터셋에서 어떠한 방법이 SOTA 를 달성했나보니 ByteTrack 이란 방법이 SOTA를 달성한 것을 확인했다. (2021년 12월 24일 기준)
논문을 읽기전에는 "Transformer 모델 디자인 잘해서 SOTA 달성한 방법이겠구나" 라는 생각이 들었다. 그런데 웬걸 논문을 읽어보니 너무나도 간단한 아이디어로 Detection 기반의 Tracking 방법의 성능을 획기적으로 높인 후처리 방법이였다.
ByteTrack에서 제안하는 방법을 설명함에 앞서 가장 직관적이면서 간단한 트래킹 알고리즘인 SORT(Simple Online and Realtime Tracking)의 핵심 아이디어에 대해 먼저 설명해보겠다. SORT 논문을 읽어보면 Kalman Filter와 Hungarian Algorithm에 대한 얘기가 나오는데 이부분에 대한 자세한 내용은 해당 포스트에서 다루지 않는다.
먼저 트래킹을 시작하기전에 초기에 어떤 대상들을 트래킹할 것인지에 대한 Initialization 단계가 요구된다.
t1 시각에 취득된 프레임부터 트래킹을 시작하겠다고 가정하겠다. 먼저 해당 프레임을 Detection Model에 넣고 객체를 검출한다. 검출된 객체 중 Confidence Score(이미지 상에서 노란 박스위에 있는 숫자)가 낮은 객체를 필터링한다. 여기서는 Confidence Score가 0.5 보다 낮은 바운딩 박스들은 Background로 간주한다. 엄밀한 정의는 아니지만 일단 Confidence Score를 해당 객체가 사람일 확률로 생각해보자.
그리고 나머지 Box들에 대해 ID를 부여한다. Initialization 단계에서 각 바운딩 박스에 어떤 ID 값을 부여할 것인지는 크게 상관없다.
바운딩 박스의 센터 좌표의 X값이 낮은 순으로 ID 를 부여했다고 치자. 그리고, 이 ID와 각 ID에 맞는 바운딩박스들을 어디 배열 하나 만들어 놓고 [(ID0, 바운딩박스0), (ID1, 바운딩박스1), (ID2, 바운딩박스2)] 꼴로 저장해두자
t2 시각에 새 프레임이 들어왔다. 그리고 검출 결과는 위와 같다. 악! 왼쪽에서 두번째 사람이 첫번째 사람에 의해 Occlusion 이 발생하면서 Visual Information 들이 소실됨에 따라 모델이 이게 사람인지 맞는지 헷갈려하면서 Confidence Score를 굉장히 낮게 예측해버렸다. 이러한 박스들은 Confidence Score가 0.5보다 낮으므로 해당 박스는 필터링 된다.
Confidence Score에 따른 필터링 과정을 거친 뒤 이제 t1 시각 부터 트래킹을 시작했던 3개의 ID0, ID1, ID2 박스와 t2 시각에 취득된 프레임에서 검출된 2개의 바운딩 박스들을 매칭시켜야한다. 매칭은 ID0, ID1, ID2 박스와 t2 시각에 취득된 프레임에서 검출된 바운딩 박스들간의 IoU를 모두 측정(3x2 행렬이 나옴)하고 IoU가 가장 높은 Box들 끼리 매칭 시킨다. 이는 이전 프레임에서 검출된 객체가 전속력으로 달리는 우사인 볼트가 아닌 이상 현재 프레임에서도 트래킹 해온 위치 근처에 있을것이라는 가정하에 이렇게 매칭시키는 것이다. 실제로 이 단계에서 매칭 단계에서 Kalman Filter를 사용하여 트래킹 중인 객체들의 위치를 업데이트 해준 뒤, Kalman Filter에 의해 업데이트된 박스와 t2 시각에 취득된 프레임에서 검출된 바운딩 박스들간의 IoU를 측정한다. Kalman Filter에 대해 아직 완전히 이해하지 못해서 이 부분은 설명을 생략...
Kalman Filter가 SORT 알고리즘에 미치는 영향에 대해 실험했었다. 해당 부분에 관심이 생긴다면 아래에 글을 읽어보면 도움이 될것이다.
https://developer0hye.tistory.com/entry/does-sort-need-kalman-filter
이때 트래킹중인 박스의 수는 3개고, t2 시각에 취득된 프레임에서 검출된 Box의 수는 2개이다. 여기서, 매칭되는 Box의 개수는 최대 min(트래킹중인 박스의 수=3, t2 시각에 취득된 프레임에서 검출된 박스의 수=2) 가 되게끔 매칭된다. 최대와 min 을 같이 써서 표현이 좀 이상한데... 트래킹중인 박스와 매칭 시키려는 박스간에 IoU가 너무 낮으면 매칭을 안시키기 때문이다.이 과정은 Hungarian Algorithm을 사용하면 매칭시킬 수 있다.
매칭 과정이 끝나면 트래킹 결과를 업데이트 해주어야한다. 사실 이 단계에서도 Kalman Filter가 사용된다.
흑흑 우리의 트래킹 알고리즘은 t2 시각에서 왼쪽에서 두번째 사람(t1시각에서 1번 ID를 가졌던)의 트래킹을 실패하고 말았다. 지금까지 본 포스트를 읽어주셔서 감사합니다.
자, 이제 Frame t2에서 ID1 박스를 트래킹 하지 못했던 이유를 다시 한 번 봐보자. Occlusion에 의해 Visual Information 이 소실되어 모델에서 Confidence Score를 낮게 예측했기 때문이였다. 그럼 이러한 문제에 대한 해결방법은 뭐가 있을까? Occlusion 이 발생해도 Confidence Score가 높게 나오도록 Detection 모델의 성능을 높이면 되는 일이야! Occlusion에 강인한 모델을 설계하자!! 라고 생각할 수도 있다. 좋은 방법이다. SORT 논문을 보면 알듯이 Detection 모델의 성능은 Detection 기반의 Tracking방법의 성능에 지대한 영향을 미침을 실험적으로 검증하였었다.
또 이 문제에 대한 해결방법에 대해 진짜 간단하게는 이렇게 생각할 수도 있겠다. "Confidence Threshold 를 그냥 낮춰보자"
Confidence Threshold를 낮춰서 Occlusion에 의해 낮은 Confidence Score를 갖는 바운딩 박스들을 살리자니, 이번에는 또 False Positive(검출하면 안되는 데 검출한 경우, 위 사진처럼 개를 사람으로 검출한것도 이에 해당함) 케이스의 수가 증가돼버렸다.
근데!!! ByteTrack은 다르게 생각했다. ByteTrack의 저자들은 "매칭 과정"에서 Confidence Score가 적당히 낮은 것들에 대해 면죄부를 한 번 줘봐야 겠다는 생각을 가지고 있었다. 아래 내용부터 ByteTrack에서 제안한 핵심적인 방법에 대한 내용이다.
처음 Tracking 하려는 대상을 선정할때는 Confidence Score가 높은것들을 Tracking 하자! 이 철학은 그대로 가져간다. 이후 다음 프레임에서 기존에 트래킹 되어 온 박스들과 해당 프레임에서 검출된 박스들을 매칭할때 Confidence Score가 적당히 낮은 것들도 일단은 살려둔다 (아래 그림에서 세모가 이걸 의미).
먼저 기존에 Tracking 되어 온 박스들과 t2 시각에 프레임에 검출된 박스들 중 Confidence Score가 높은 박스들간의 매칭을 수행한다.
여기서! ByteTrack은 한 번 더! 기존에 Tracking 되어 온 박스들 중 매칭이 안되었던 박스들(위 그림에서 Frame t1에서 ID 1번 박스)과 Frame t2에서 추론된 Confidence Score가 낮은 박스들(세모 표시된 박스들)에게 면죄부를 주고 이 박스들끼리(ID1번 박스와 Frame t2에서 검출된 세모 표시된 박스)만 매칭을 한 번 더 수행한다.
최종적으로 Occlusion이 발생한 왼쪽에서 두번째 사람 또한 매칭이 되었다. 가장 우측에 Background 를 검출한 박스(Confidence Score가 0.1인 박스)는 Tracking 되어 온 박스들간의 IoU가 0.0으로 나오기 때문에 알아서 필터링 된다. 이게 다다.
기존 Tracking 방법들에 해당 기법을 추가로 적용했을때 거의 일관적으로 성능이 향상되는 것을 볼 수 있다. 특히 ID Swtiching 횟수(IDs)가 크게 줄어드는 것을 볼 수 있다. 여기서 ID Switching 횟수는 객체 별로 트래킹 과정에 ID가 바뀐 횟수를 뜻한다. 테이블에서 화살표가 위를 가리키고 있으면 Higher is better고 아래를 가리키고 있으면 Lower is better다.
이외에도 Detector를 좋은 걸 쓰고(YOLOX), Fully-Occluded 된 객체에 대한 후처리 과정을 좀 더 보완하는 방법(Tracklet interpolation)으로 Byte는 Tracking 분야에서 SOTA를 달성하게 됐다. 실험 부분을 읽어보면 SOTA 성능을 달성하기 위한 보다 디테일한 설명이 많이 있으니 다시 꼼꼼히 읽어봐야겠다.
전통적인 컴퓨터 비전 기법들에 대해 공부해본 사람이라면 Canny Edge 방법에서 Threshold를 두개두고 에지라고 확실히 판단된 에지와 인접한 애매한 에지들은 에지로 검출해내는 Hysteresis Thresholding 기법이 있음을 알고있을 것이다. 개인적인 생각으로 Canny Edge의 Hysteresis Thresholding 기법과 ByteTrack의 아이디어가 비슷하지 않나라는 생각이 들었다. 단지 Spatial 하냐 Temporal + Spatial 하냐의 차이일뿐...?
'Deep Learning' 카테고리의 다른 글
[딥 러닝, Object Detection] Gaussian YOLOv3 논문 리뷰 (0) | 2022.01.31 |
---|---|
칼만 필터(Kalman Filter)는 과연 SORT 트래킹 알고리즘에 필요할까 (10) | 2021.12.27 |
[MLOPS] Shadow mode deployment (0) | 2021.11.22 |
[MLOPS] 머신러닝 프로젝트 사이클 (0) | 2021.11.22 |
OpenCV Color Conversion Coefficients (0) | 2021.08.31 |
- Total
- Today
- Yesterday
- C++ Deploy
- 백준 1766
- 백트래킹
- 가장 긴 증가하는 부분 수열
- PyCharm
- 백준 11437
- 백준
- FairMOT
- 단축키
- 이분탐색
- LCA
- MOT
- ㅂ
- 인공지능을 위한 선형대수
- 위상 정렬 알고리즘
- 문제집
- 파이참
- 조합
- 순열
- 백준 11053
- 자료구조
- Lowest Common Ancestor
- cosine
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |