Jetson Nano 4GB에서 yolov7-tiny 모델 기반으로 웹캠으로 들어온 실시간 영상 처리를 해보았습니다.
이 때 실시간 영상 처리 속도는 TensorRT를 사용하여 17fps 를 획득하였는데,
해당 과정에 대해서 설명하도록 하겠습니다.
이전 글에서 이어지는 내용입니다.
이 글에서는 영상 처리를 위한 환경 구성과 같은 사전 과정에 대해서 다루겠습니다.
먼저 저의 Jetson Nano 환경은 CUDA 10.2, JetPack 4.6, Python 3.6 이 설치되어 있습니다.
개인적으로 가상환경에 대한 지식이 부족하기 때문에 어떻게 하라고 추천은 못해드리지만,
실력이 뛰어나시다면 무조건 가상 환경이 좋습니다.
그리고 애초에 python3.8 과 같은 다른 구동 환경이 필요하다면 무조건 가상 환경을 만드셔야 합니다.
그러나 이 경우 python3.6이 이미 깔려있고, yolov7이 이 버전에서 돌아가는 상태이기 때문에,
저와 비슷하게 잘 모르신다면,
다음과 같은 장점과 단점이 있다고 말씀드릴 수 있을 것 같습니다. (확실하지 않습니다.)
가상환경을 만들고 빌드 하는 것의 장점
안전하다. 만들고 망하면 시원하게 갈아 엎을 수 있다.
기존 환경과 사용하고자 하는 환경이 버전 차이가 존재하지만 원래 환경을 유지시켜야하는 경우 매우 유용하다.
단점
실력이 부족하면 동적 링킹 과정이나 설치 및 빌드 과정에서 실수해서 가상 환경이 아닌 원래 환경에 설치 빌드한다거나 하는 뻘짓 때문에 무수히 많은 리빌딩과 디버깅 시간을 가질 수 있다.
Python3.6을 기반으로 하기 때문에 가상 환경 없이 하더라도 가능은 하다고 예상하지만..
일단 구현할 때 저는 가상 환경에서 했습니다.
돌아보면 그래서 더 힘들었던 것 같습니다.
그러나 아래 레퍼런스 동영상을 달아놨기 때문에,
이 과정을 따라가시면 가상환경에서 잘 빌드하실 수 있을 것이라 생각합니다.
yolov7-tiny 모델을 선택한 이유
가장 최신 모델 yolov8은 굉장히 사용하기 편리하다는 장점이 있습니다.
ultralytics 를 설치하여 import ultralytics 를 통해 특정 모델을 불러서 쉽게 사용할 수 있습니다.
그러나 yolov8은 최소 python3.8을 필요로 하였으며,
이에 따라 새로 가상환경에서 python3.8 빌드가 필요했습니다.
어찌저찌 python3.8 설치하고 yolov8 기반으로 시도해보다가 결국엔 던지게 되었습니다.
그 이유는 TensorRT 사용을 위해서 trt engine 파일로 만드는 과정에 대해 명확한 정보가 존재하지 않고,
꽤 최근까지도 ultralytics 개발자가 Q&A에 답변한 것을 보면 아직 불완전하다고 하는 글을 확인했습니다.
제 부족한 실력에 이 길은 아니다 싶어서 쿨하게 접고 새 출발 했습니다.
python3.6을 사용할 수 있고,
trt 모델을 통해 GPU 최적으로 분석할 수 있는 가장 최신 모델인 yolov7을 선택하였고,
그 중에서도 분석 과정이 가장 가벼운 tiny 모델을 선택했습니다.
Jetson Nano에서 yolov7 최적 사용을 위한 사전 과정
가장 먼저 Jetson Nano 의 swap memory 를 늘리고,
최대 성능으로 사용하는 과정부터 수행해보도록 하겠습니다.
우선 Jetson Nano 터미널에서 다음 명령어를 입력하면
nproc
처음 사용하시는 경우에는 대부분 2가 뜰 것입니다.
만약 2가 뜬다면, 아직 CPU 코어 2개를 사용하지 않는 것입니다.
따라서 이를 최대로 늘려주기 위해 다음과 같은 명령어를 수행합니다.
최대 성능으로 작동을 시키는 것이기 때문에
Jetson Nano 4GB에 필요한 전원 공급이 충분할 필요가 있습니다.
이에 관해서는 다른 문서에서 정격 전압과 전류를 참조하시기 바랍니다.
sudo nvpmodel -m0
이렇게 하고 다시
nproc
이 명령어를 입력하면 코어 수가 4로 늘어난 모습을 확인할 수 있습니다.
이번엔 Jetson Nano의 OS 환경을 확인할 수 있는 jtop 을 설치하겠습니다.
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-pip
필요한 환경을 먼저 설치해주고,
jtop 을 설치합니다.
sudo -H pip install -U jetson-stats
설치했으니, 재시작 해줍니다.
sudo reboot
이제 다시 jtop 명령어를 치면 다음과 같은 화면이 나타나게 됩니다.
Jetson Nano의 상태를 자세히 시각적으로 확인할 수 있습니다.
그럼 마지막으로 swap memory를 늘려야하는데 이는 좋은 레퍼런스가 있어
과정에 대해서는 아래에서 다시 설명하겠습니다.
swap memory는 RAM 용량이 부족할 때 해당 memory만큼을 디스크에서 확보하여
데이터 손실이 발생하지 않게 해주는 역할을 합니다.
Jetson Nano 4GB 모델은 가난하게도 4GB RAM을 가지고 있기 때문에,
이 swap memory 확보가 중요한 것 같습니다.
가상 환경 구성과 Swap memory 확장 및 OpenCV with CUDA 빌드
이제 필요한 라이브러리를 설치하겠습니다.
먼저 OpenCV와 PyTorch, torchvision은 별도의 설치와 빌드 과정이 필요합니다.
Jetson Nano가 CUDA 를 사용하기 때문에 그렇습니다.
PyTorch, torchvision은 아래에서 다시 설명드리고 먼저 레퍼런스 동영상 첨부하겠습니다.
인터넷 사부님이신데, 굉장히 자세히 잘 설명해주십니다.
이 동영상의 과정을 처음부터 끝까지 잘 따라가면
가상환경 + swap memory 확장 + OpenCV를 성공적으로 빌드하실 수 있습니다.
저는 기존 환경에 OpenCV가 별도로 존재했고,
가상환경에서 빌드해서 그런지 jtop에서 OpenCV with CUDA 가 Yes가 되진 않았습니다.
그러나 가상 환경에서 버전이 바뀌었고, 아래 명령을 수행해서 확인해보면
python3 -c 'import cv2; print(cv2.getBuildInformation())'
CUDA 에 대해서 Yes 가 찍혀있었습니다.
만약 여러 빌드를 거쳐서 오셨다면
여기에서 Yes가 찍혀있지 않거나 import cv2 가 안되는 문제가 발생할 수 있습니다.
저는 python3.8 기반으로 빌드를 한 뒤에 python3.6 OpenCV 빌드를 다시 수행해서
위 영상의 cmake 과정대로 해결되지 않았습니다.
cmake 가장 마지막 부분에 .. 을 지우시고
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D PYTHON3_EXECUTABLE=/usr/bin/python3.6 -D PYTHON_INCLUDE_DIR=/usr/include/python3.6 -D PYTHON_LIBRARY=/usr/lib/python3.6/config-3.6m-aarch64-linux-gnu/libpython3.6.so ..
위 내용을 추가해서 해보시기 바랍니다.
그래도 안된다면 위 경로에 존재하는 파일들이 본인에게 맞는지 확인해보시길 추천드리고
만약 그래도 안되면 다른 방법을 찾아보셔야 할 것 같습니다.
다시 본론으로 돌아와서
실시간 영상 처리에 webcam 을 사용하실 수도 있고,
jetson nano 전용 카메라를 사용하실 수도 있고,
Raspberry Pi V2 camera를 사용하실 수도 있는데,
크게 USB camera와 CSI camera로 구분하겠습니다.
USB camera는 USB 포트를 사용하는 카메라고
CSI camera는 하얀색 넓적하고 얇은 연결 선을 사용하는 카메라입니다.
속도는 USB camera가 압도적으로 빠릅니다.
별도 포트가 존재하는 CSI camera가 빠를 것이라 생각했는데,
Gstreamer라는 OpenCV에 맞는 비디오 변환 과정을 거치기 때문에 오히려 느려집니다.
둘 다 사용해본 입장에서 USB camera의 코드가 훨씬 간단하고,
시작 후 딜레이 현상도 약 1.5초 정도 감소하기 때문에
그래서 더더욱 USB 웹캠을 사용하는 것을 추천 드립니다.
실시간 영상 처리에서 처음 딜레이 2초는 굉장한 손실이고,
USB camera는 약 0.3~0.5초 뒤에 현재 상태를 반영하지만
CSI camera는 2초 정도가 소요됩니다.
이 딜레이는 영상처리를 하는 동안 계속 존재하기 때문에
항상 2초 전의 상태를 분석한다고 이해하시면 될 것 같습니다.
그래도 반드시 CSI camera를 사용해야하는 경우가 존재하기 때문에
해당 부분의 코드도 남겨두었습니다.
해당 코드는 다음 글에서 소개 드리도록 하겠습니다.
버전에 맞는 PyTorch, torchvision 설치
저는 JetPack 4.6, python3.6 버전을 사용했기 때문에
PyTorch v1.10.0 - torchvision v.0.11.1 을 설치했습니다.
자신의 버전에 맞는 PyTorch는 아래 링크에서 찾아볼 수 있고,
해당 whl 링크로 수정하여 다운 받으시면 됩니다.
먼저 PyTorch를 whl 링크를 통해 설치합니다.
아래의 경우 v1.10.0 을 설치합니다.
cd ~
sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
이어서 PyTorch 버전에 맞는 torchvision을 설치해줍니다.
아래는 v0.11.1입니다. 버전을 적절히 바꿔서 다운받으시면 됩니다.
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.11.1 https://github.com/pytorch/vision torchvision
cd torchvision
sudo python3 setup.py install
이로써 yolov7 tensorrt 구동을 위한 환경이 거의 70% 완성되었습니다.
다음 글은 tensorrt 기반 yolov7 설치 방법과 구동에 관한 글로 이어집니다.
2024.01.01 - [Project/Tracker (2023.11~2023.12)] - Jetson Nano에서 TensorRT 기반 yolov7 동영상 분석
'Setup & Example > Linux' 카테고리의 다른 글
docker 설치 + NVIDIA docker 설치 + docker 사용법 (0) | 2024.01.15 |
---|---|
Ubuntu 22.04 에 Intel RealSense Viewer 설치 (1) | 2024.01.10 |
Linux(Ubuntu 22.04) conda 가상 환경에서 CUDA 를 위한 OpenCV, PyTorch, Torchvision 빌드 (1) | 2024.01.10 |
Ubuntu 22.04 에서 CUDA 업그레이드 + cuDNN 설치 (0) | 2024.01.09 |
Window WSL 설치 + VS code 연동 (1) | 2023.12.23 |