DeepSORT는 Object tracking 알고리즘이다.
Yolo 모델에서 detection한 Object를 DeepSORT을 통해 Tracking까지 할 수 있다.
순서는 다음과 같다.
시작해보자.
필자의 환경 및 패키지 버전은 다음과 같다. (Conda 가상환경을 만들어서 진행함.)
Python
: 3.8.16GPU
: NVIDIA GeForce RTX 3060Memory
: 16 GBCUDA Toolkit
: 11.7Tensorflow
: 2.7.0Numpy
: 1.18.5Opencv-python
: 4.7.0.72Pillow
: 9.3.0Matplotlib
: 3.5.0DeepSORT python 파일을 가지고 온다.
git clone https://github.com/haroonshakeel/yolov4_deepSort.git
Clone한 폴더로 이동
cd yolov4_deepSort
이동한 yolov4_deepSort
에 save_model.py
을 실행.
(save_model.py
을 열어보고 모델에 맞게 명령어를 입력하자)
python save_model.py --weights ./yolov4_best.weights --output ./checkpoint/yolov4_best --input_size 416 --model yolov4
weights
: 변환할 Yolo 모델의 경로output
: Tracking 결과에 원본 동영상에 mapping 되어 저장될 영상의 경로input_size
: Yolo 모델의 .cfg
파일에 설정된 input size (dafault: 416)model
: 모델 형식yolov4-tiny
에 해당한다, yolov4
의 Total params
수는 6000만 개 이상) Total params
, Trainable params
, Non-trainable params
개수 이후에 로그도 나온다.'model.compile_metrics' will be empty ...
이 포함된 에러가 나온다면 모델이 정상적으로 변환되지 않은 것이다. save_model.py
에서 --output
으로 설정한 경로에 들어가면 정상적으로 된 것처럼 보이겠지만track_object.py
을 실행할 때 하나도 detection이 되지 않는 상황이 발생한다.save_model.py
를 실행하면 해결할 수 있다.pip uninstall tensorflow
실행 후 pip install tensorflow==2.3.0
track_objects.py
를 실행
track_objects.py --weights ./checkpoint/yolov4_best --score 0.5 --video ./video.mp4 --model yolov4 --output ./output.avi --info
weights
: save_model.py
로 변환한 모델의 경로score
: detection thresholdvideo
: Video 경로. Webcam이나 RTSP url도 가능model
: 모델 형식output
: Tracking 결과에 원본 동영상에 mapping 되어 저장될 영상의 경로--info
: Log를 display 여부를 설정
Output
으로 설정했던 경로로 가보면 위와 같은 영상이 저장되어 있다.
track_objects.py
max_cosine_distance
(default: 0.4
)
두 벡터 사이의 유사성을 나타내는 값을 cosine distance라고 함.
(cosine_distance = 1 - cosine similiarity)
그리고 cosine distance 값이 작을수록 두 벡터가 유사하다고 함.
DeepSORT에서는 현재 frame에서 추출된 객체의 feature vector와 이전 프레임에서 추출된 객체의 feature vector를 비교하여 cosine distance를 계산함.
여기서 max_cosine_distance
를 큰 값으로 설정한다면 cosine distance가 조금 커도 (두 벡터가 유사하지 않아도) 유사하다고 간주됨. 반대로 작은 max_cosine_distance
는 두 벡터간의 cosine distance가 조금만 커져도 다른 객체로 인식함.
nn_budget
(default: None
)
DeepSORT 알고리즘에서 KNN(K-Nearest Neighbors) tracker의 이웃(neighbors) 수를 뜻함. None
값은 이웃 수에 제한을 두지 않겠다는 의미. 즉, KNN tracker가 가능한 모든 이웃을 찾도록 함. (이 값이 커질수록 추적 성능은 올라가지만 연산 cost가 증가한다.)
nms_max_overlap
(default: 1.0
)
겹치는 bounding box를 제거하는 기준이다. nms_max_overlap
를 0.5로 설정한다면
IOU(Intersection over Union)가 0.5보다 큰 bounding box는 제거된다. 이를 통해서 겹치는 객체들 중에서 가장 신뢰도가 높거나 정확한 bounding box를 선택할 수 있다.
(default가 높을수록 bounding box간에 겹침을 더 허용한다는 의미이므로 객체가 이동하면서
가려질 수도 있는 경우를 고려하기 위해서 default값을 1.0으로 둔 것 같다. (개인적인 견해))
Tracker.py
max_age
(default: 60
)
객체를 최대 몇 개의 프레임까지 추적할 지 결정함.
만약 max_age
를 10으로 설정했다면, 객체가 최근 10개의 프레임에서 detection 되지 않은 경우 해당 객체는 새로운 객체로 간주되고, 새로운 tracking id가 부여됨. 너무 낮은 max_age
값은 객체가 잠깐 detection되지 않았을 경우 민감하게 반응하여 실제로는 동일한 객체이지만 새로운 tracking id가 부여될 수도 있음. max_age
가 높을수록 일반적으로 메모리 사용량이 증가됨.
n_init
(default: 3
)
tracking을 시작하기 위해 필요한 관측치 수. 객체가 이 값보다 적은 관측치를 가지면
tracking이 되지 않음. (tracking id가 부여되기 위해서 객체가 관측되어야 할 프레임 수)
max_iou_distance
(default: 0.7
)