Machine Learning/Computer Vision

Jetson Nano에서 yolov7 SORT를 이용한 실시간 영상 분석

코방코 2024. 1. 6. 16:27
728x90
 

Jetson Nano에서 TensorRT 기반 yolov7 동영상 분석

지난 번 글에서 TensorRT를 이용하여 yolov7 분석을 하기 위해 사전 환경을 구성하였습니다. 이번에는 실제로 Jetson Nano에서 TensorRT를 적용하여, yolov7-tiny 모델로 동영상을 분석하는 과정에 대해 글을

cobang.tistory.com

 

이번 글에서는 DeepSORT와 SORT 분석을 이용해서

YOLOv7을 ID 기반 분석을 수행할 수 있도록 발전(?)시킨 과정에 대해 설명드리겠습니다.

 

먼저 DeepSORT 에 대해서 설명하겠습니다.

DeepSORT (Deep Learning to Track and Sort)는 객체 추적을 위한 알고리즘으로, 

주로 YOLO와 같은 Object detecting 알고리즘과 함께 사용됩니다. 

 

DeepSORT의 핵심은 비디오 프레임 간에 검출된 객체들을 연속적으로 추적하는 것입니다. 

이 과정에서 Object 의 동적인 움직임과 외형적 특징을 모두 고려합니다.

 

즉, YOLO 에 DeepSORT 를 결합하면, person, dog, cat 이런 식으로 검출하는 것이 아니라 

하나의 object에 대해 id를 부여하여 검출할 수 있습니다.

 

조금 더 활용해보면 원래 사람 3명이 화면에 검출되면

YOLO는 3 person을 감지해냅니다.

여기에 DeepSORT 를 적용시키면 사람 A, 사람 B, 사람 C 이런 식으로도 추적이 가능하다는 것입니다.

굉장히 신기합니다.이것이 어떻게 가능할까요?

 


DeepSORT의 분석 과정과 원리

Object 위치 수신

  • DeepSORT는 먼저 YOLO에서 출력된 object 위치 정보(box 좌표)를 입력으로 받습니다.
  • 이 단계에서 각 객체의 위치가 정의됩니다.

 

특징 추출

  • Object의 Bounding box 안에서 Object의 외형적 특징을 추출하는 Neural Network를 작동시킵니다.
  • 추출된 특징들은 Object 를 식별하는 데 사용되며, 외형이 비슷한 다른 객체들과 구분하는 데 도움을 줍니다.

 

Kalman Filter

  • Object 추적 과정에서 Kalman Filter를 사용하여 Object 의 위치와 속도를 추정합니다.
  • 칼만 필터는 Object 의 현재 상태(위치 및 속도)와 관측된 데이터(새로운 프레임에서의 위치)를 결합하여, 객체가 다음 프레임에서 어디에 있을지를 예측합니다.

 

Hungarian Algorithm 기반의 추적 관리

  • Hungarian Algorithm 은 각 프레임에서 검출된 객체와 기존 추적 객체들 사이의 매칭을 결정합니다.
  • 매칭 cost는 주로 거리(객체의 프레임 간 이동 거리)와 외형적 특징의 유사성을 기반으로 계산됩니다.

 

ID 관리

  • 추적 중인 각 Object 에 고유한 식별자(ID)가 할당됩니다.
  • 프레임 간에 같은 객체는 동일한 ID를 유지하며, 이를 통해 Object의 움직임이 연속적으로 추적됩니다.

 

추적 문제 처리

  • DeepSort는 특정 Object가 일시적으로 검출되지 않거나, 여러 Object가 겹치는 상황을 처리할 수 있습니다.
  • 예를 들어, 객체가 화면 밖으로 나갔다가 다시 들어오는 경우에도 object 정보를 보존할 기간을 결정하여, 기존 ID를 유지시킬 수 있습니다.

 

놀라운 기술입니다.

그럼 이걸 이용해서 분석을 해봅시다.

개인적으로 제 Jetson이 Python3.8 환경에 빌드되었고,

yolov8 TRT가 정상적으로 지원된다면 DeepSORT를 위해서도 무조건 yolov8 을 선택했을 것 같습니다. 

그렇게 생각한 이유는 다음 코드를 웹캠이 있는 컴퓨터에서 돌려보시면 아실 것이라 생각합니다.

 

 

코드가 굉장히 짧은데도 yolov8 기반 분석 결과를 이용해 DeepSORT 를 수행하는 것을 확인하실 수 있습니다.

제가 코드를  lable == 0 인 물체(person)만 id 분석을 진행하게 하였습니다.

max_age = 50 이라 되어있는데,

50프레임동안 사라졌다가 나타나도 정보가 저장되어 로드가 가능하다는 뜻입니다.

 

제 노트북에서 yolov8n.pt 모델로 실행했는데도 분석 속도가 7~8프레임 정도가 나옵니다.

 

그러나 yolov7에서 DeepSORT를 선택한 이유는 지금까지 빌드해온 것들이 Python 3.6 환경이었고,

yolov8 은 최소 3.8을 필요로 하기 때문입니다.

 

그리고 yolov7 TensorRT를 적용시켜서 DeepSORT를 적용시켜보려 했기 때문에,

yolov8은 TRT 빌드 하는 법을 확인하지 못해서 yolov7 을 선택한 이유도 있었습니다.

 

결론적으로는 yolov7 에서 TensorRT 기반의 DeepSORT를 성공시키진 못했습니다.

저는 간단하게 yolov7 TRT를 통해 나온 결과를 DeepSORT에 넣으면 된다고 생각해서

그렇게 수행해보았는데, 분석이 이루어지지 않았습니다.

다른 전문가 분들의 말을 들어보면, TensorRT 결과를 이용해서 DeepSORT를 하기 위해서는

DeepSORT도 TRT에 맞게 수정되어야 한다는 것을 확인했습니다.

 

당시 프로젝트 진행 시간이 짧았었고 실력이 부족해서

yolov7 TRT용 DeepSORT를 빌드하기도,  yolov8 으로 갈아타기도 애매해서

일단 yolov7에서 TensorRT 없이 SORT로 ID Traking을 수행했습니다.

SORT는 DeepSORT에 비해 물체가 완전히 가려졌을 때 추적하기가 어렵지만,

분석 속도가 조금 더 빠르다는 장점이 있습니다.

Jetson이 .pt 기반의 DeepSORT를 실행시켰을 때 터지려고 하기 때문에,

단점이 있더라도 그나마 조금 가벼운 SORT를 넣어 수행시켰습니다.

다음 2024 봄학기 때 이를 보완해서 결과물을 완성 시킬 예정입니다.

 

그럼 본론으로 돌아와서 yolov7 을 이용해서 SORT를 빌드를 해보겠습니다.

 

 

GitHub - haroonshakeel/yolov7-object-tracking

Contribute to haroonshakeel/yolov7-object-tracking development by creating an account on GitHub.

github.com

 

위 Reference 가 정말로 큰 도움이 되었습니다.

위 동영상을 따라서 바로 성공했습니다.

제가 추가적인 설명을 할 필요가 없을 정도로.. 간단하게 성공했습니다.

 

간단하게만 설명하도록 하겠습니다.

우선 이전 과정을 따라오셨다면, yolov7 git은 이미 다운이 되어있으실 것입니다.

yolov7 이 있는 디렉토리에서 아래를 git clone 해줍니다.

 

git clone https://github.com/haroonshakeel/yolov7-object-tracking.git

 

이제 해당 yolov7-object-tracking 디렉토리에서 

detect_or_track.py

sort.py

requirements.txt

requirements_gpu.txt

street.mp4

를 복사해서 yolov7 디렉토리로 옮겨줍니다.

Jetson에서 gpu 기반 분석을 하는, 이전 게시물들의 과정을 따라오셨다면

requirements_gpu.txt 는 필요가 없습니다. 

또한, gpu 분석을 위해 requiremnts.txt를 설치하기 전에 

opencv 와 torch, torchvision은 주석 처리를 하시기 바랍니다.

다음 명령을 수행해서 정상적인 torch 설치 여부와 gpu 구동이 가능한지 확인할 수 있습니다.

python

import torch
torch.cuda.is_available()

 

아마 가상 환경도 이미 있으실 것이기 때문에, 

가상 환경에서 yolov7 디렉토리에서 다음 명령을 수행합니다.

pip install -r requirements.txt

 

그리고 아래 명령을 수행하면 yolov7-tiny.pt 를 이용하여

정상적으로 동영상에서 class 0(person)과 1(bicycle) 에 대해 id 기반 분석이 이루어져야 합니다.

python detect_or_track.py --weights yolov7-tiny.pt --no-trace --view-img --nosave --source street.mp4 --show-fps --seed 2 --track --classes 0 1 --show-track

 

각 옵션들은 동영상과 코드를 확인하면 알 수가 있습니다.

일단 저희가 중요한 것은 웹캠을 통해 사람을 id 기반으로 실시간 분석이 가능해야하므로, 

source 0, classes 0 으로 변경해보겠습니다.

python detect_or_track.py --weights yolov7-tiny.pt --no-trace --view-img --nosave --source 0 --show-fps --seed 2 --track --classes 0 --show-track

 

그럼 웹캠을 통해 정상적으로 SORT 가 수행될 것입니다.

 

Jetson Nano의 경우 3fps가 획득되었습니다.

 

최종적으로 이를 가공하여 서보 모터를 제어시켜 물체를 추적한 방법을 다음 글에서 작성하겠습니다.

 

 

728x90
반응형