DeepSORT

도룩·2023년 5월 18일
2
post-thumbnail

DeepSORT는 Object tracking 알고리즘이다.
Yolo 모델에서 detection한 Object를 DeepSORT을 통해 Tracking까지 할 수 있다.
순서는 다음과 같다.

  1. 환경세팅
  2. DeepSORT 가져오기
  3. Darknet Yolo 모델을 Tensorflow 형식으로 변환
  4. Tracking

시작해보자.

1. 환경세팅

필자의 환경 및 패키지 버전은 다음과 같다. (Conda 가상환경을 만들어서 진행함.)

  • Python: 3.8.16
  • GPU: NVIDIA GeForce RTX 3060
  • Memory: 16 GB
  • CUDA Toolkit: 11.7

Package version

  • Tensorflow: 2.7.0
  • Numpy: 1.18.5
  • Opencv-python: 4.7.0.72
  • Pillow: 9.3.0
  • Matplotlib: 3.5.0

2. DeepSort 가져오기

  1. DeepSORT python 파일을 가지고 온다.

    git clone https://github.com/haroonshakeel/yolov4_deepSort.git
  1. Clone한 폴더로 이동

    cd yolov4_deepSort

3. DarkNet Yolo 모델을 Tensorflow 형식으로 변환

  1. 이동한 yolov4_deepSortsave_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에 해당한다, yolov4Total params 수는 6000만 개 이상)

  1. 모델이 정상적으로 변환되었는지 확인
    모델 파라미터 개수 Total params, Trainable params, Non-trainable params 개수 이후에 로그도 나온다.
    아마 두 개 중 하나가 나올 것이다.


    만약 노란색으로 칠해진 'model.compile_metrics' will be empty ... 이 포함된 에러가 나온다면 모델이 정상적으로 변환되지 않은 것이다. save_model.py에서 --output으로 설정한 경로에 들어가면 정상적으로 된 것처럼 보이겠지만
    다음 단계에서track_object.py을 실행할 때 하나도 detection이 되지 않는 상황이 발생한다.
    (detection이 안 되니깐 당연히 tracking도 안 된다. 그냥 넣은 input video 그대로 output이 나옴.)


    이 때 tensorflow를 2.3.0 버전으로 새로 설치해주고 다시 save_model.py를 실행하면 해결할 수 있다.
    (출처: https://github.com/theAIGuysCode/yolov4-deepsort/issues/79)
    pip uninstall tensorflow 실행 후 pip install tensorflow==2.3.0

4. Tracking

  1. 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 threshold
    • video: Video 경로. Webcam이나 RTSP url도 가능
    • model: 모델 형식
    • output: Tracking 결과에 원본 동영상에 mapping 되어 저장될 영상의 경로
    • --info: Log를 display 여부를 설정


Output으로 설정했던 경로로 가보면 위와 같은 영상이 저장되어 있다.

5. Hyperparameter

  • 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)

0개의 댓글