opencv4를 jetson nano에 qemu로 설치해보자
abstract
Jetson nano, 특히 emmc 버전을 사용하는 경우 16GB의 emmc 용량과 4GB의 RAM으로 인한 제한으로 인해 opencv와 같은 굉장히 덩치가 큰 프로젝트를 customizing하기 위해 build를 해서 사용하기가 어렵다. 이 과정의 어려움은 아래와 같다.
- opencv는 ram의 크기가 8G이상이지 않으면 build 도중에 중단이 되는 문제가 종종 있다.
- ram의 크기를 8GB인 것 처럼 swap memory 4GB를 eMMC나 SD card에 추가하여 확장할 수 있다. 하지만 eMMC의 경우 16GB밖에 용량이 없고 linux kernel과 nvidia에서 제공하는 기본적인 filesystem에서 6~7GB, cuda 설치용 library 2~3GB하면 벌써 10GB 가까이 사용한다.
남은 6GB에서 swap memory 4GB를 수탈당하면 opencv build는 정신건강을 해칠 수 있다.
그래서 풍족한 호스트 환경에서 빌드하고 꼭 필요한 파일들 만 복사해서 사용하면 jetson의 용량을 아낄수 있다.
상당히 많은 파일을 다운로드 하게 되므로 인터넷이 빠른 곳에서 작업하는 것을 추천한다.
참조한 링크
https://codepyre.com/2019/08/building-custom-root-filesystems/#chroot-there-it-is
https://yunslog.tistory.com/53
사양
required SW packages
- sdkmanager
- 설치 과정 중에 cuda, cudnn 패키지를 다운받는 용도
- opencv 4.5.1 (미리 받을 필요는 없음. 설치 중 다운로드 예정.)
- opencv_contrib 4.5.1 (미리 받을 필요는 없음. 설치 중 다운로드 예정.)
- qt5 (apt로 설치)
host
- Ubuntu 18.04
- VMware Workstation 16 Player
- ram 8G
- storage 100G
- core 수가 많을수록, ram이 클수록 build가 빨라진다.
가능한한 최대로 설정한다.
target
- Jetson nano eMMC
- Telelian vs301
host
- host에서 할 일. target(jetson)에서 할 일은 아래에 별도로 구분.
qemu
- 나무 위키에서 알 수 있듯이 여러 플랫폼을 에뮬레이션 할 수 있는 오픈소스 툴이다.
- 이번엔 arm64를 에뮬레이션하기 위해 사용한다.
install
sudo apt update
sudo apt install -y qemu-user-static debootstrap
make rootfs
- linux의 root filesystem을 생성하고 jetson에서 사용할 ubuntu 18.04 (bionic)의 root를 에뮬레이션한다.
- work directory를 /home/$USER/work에 있다고 가정.
~/work$ mkdir rootfs
# 아래 명령으로 arm64용 library들과 daemon들을 받고 설치함. 꽤 걸림.
~/work$ sudo qemu-debootstrap --arch arm64 bionic ./rootfs
~/work$ sudo chroot ~/work/rootfs
- 여기까지 실행하면 명령 프롬프트가 바뀐다.
- 이제 arm emulation이 시작된다.
root@ubuntu:/#
- 이제 부터 프롬프트는 $로 표기.
- 제대로 됐는지 확인.
- aarch 64가 나오면 ok. arm64의 또 다른 이름.
$ uname -m
aarch64
update & install packages in qemu
$ cat /etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports bionic main
- 기본 source.list에 위의 서버 밖에 없는데 저러면 수많은 패키지가 설치가 안된다. 아래 명령으로 파일 교체
$ echo "# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted" > /etc/apt/sources.list
- 본격 설치 시작
$ apt update
$ apt install --no-install-recommends -y curl wget unzip gnupg1 git build-essential \
cmake git ccache pkg-config \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libfreetype6 libfreetype6-dev libharfbuzz-dev \
libgflags-dev liblapack-dev \
libopenblas-dev libatlas3-base libbliss2 gfortran liblapack3 libeigen3-dev \
libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev \
libdc1394-22-dev \
libv4l-dev v4l-utils qv4l2 v4l2ucp \
mesa-utils libgl1-mesa-dri \
python3-pip python3-dev python3-numpy \
qt5-default qttools5-dev libqt5opengl5-dev
install cuda & libcudnn
- 위에 있는 required SW package의 sdkmanager를 이용해 필요한 패키지를 다운로드하자.
- 아래의 파일들이 있다면 sdkmanager는 설치할 필요 없다.
- 필요한 파일 리스트 (jetpack 4.6.1의 경우)
- cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
- libcudnn8_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-dev_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-samples_8.2.1.32-1+cuda10.2_arm64.deb
- 필요한 파일 리스트 (다른 버전의 jetpack의 경우 파일명은 비슷하고 cuda version과 libcudnn의 버전만 다르다.)
- cuda-repo-l4t-{cudaversion}-local{cuda_version}.{cuda_version_revision}-1_arm64.deb
- libcudnn8_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-dev_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-samples_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
install sdkmanager
- 설치 과정 중에 cuda, cudnn 패키지를 다운받는 용도
- ram 8G
- storage 100G
- core 수가 많을수록, ram이 클수록 build가 빨라진다.
가능한한 최대로 설정한다.
- host에서 할 일. target(jetson)에서 할 일은 아래에 별도로 구분.
qemu
- 나무 위키에서 알 수 있듯이 여러 플랫폼을 에뮬레이션 할 수 있는 오픈소스 툴이다.
- 이번엔 arm64를 에뮬레이션하기 위해 사용한다.
install
sudo apt update
sudo apt install -y qemu-user-static debootstrap
make rootfs
- linux의 root filesystem을 생성하고 jetson에서 사용할 ubuntu 18.04 (bionic)의 root를 에뮬레이션한다.
- work directory를 /home/$USER/work에 있다고 가정.
~/work$ mkdir rootfs
# 아래 명령으로 arm64용 library들과 daemon들을 받고 설치함. 꽤 걸림.
~/work$ sudo qemu-debootstrap --arch arm64 bionic ./rootfs
~/work$ sudo chroot ~/work/rootfs
- 여기까지 실행하면 명령 프롬프트가 바뀐다.
- 이제 arm emulation이 시작된다.
root@ubuntu:/#
- 이제 부터 프롬프트는 $로 표기.
- 제대로 됐는지 확인.
- aarch 64가 나오면 ok. arm64의 또 다른 이름.
$ uname -m
aarch64
update & install packages in qemu
$ cat /etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports bionic main
- 기본 source.list에 위의 서버 밖에 없는데 저러면 수많은 패키지가 설치가 안된다. 아래 명령으로 파일 교체
$ echo "# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security universe
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted" > /etc/apt/sources.list
- 본격 설치 시작
$ apt update
$ apt install --no-install-recommends -y curl wget unzip gnupg1 git build-essential \
cmake git ccache pkg-config \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libfreetype6 libfreetype6-dev libharfbuzz-dev \
libgflags-dev liblapack-dev \
libopenblas-dev libatlas3-base libbliss2 gfortran liblapack3 libeigen3-dev \
libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev \
libdc1394-22-dev \
libv4l-dev v4l-utils qv4l2 v4l2ucp \
mesa-utils libgl1-mesa-dri \
python3-pip python3-dev python3-numpy \
qt5-default qttools5-dev libqt5opengl5-dev
install cuda & libcudnn
- 위에 있는 required SW package의 sdkmanager를 이용해 필요한 패키지를 다운로드하자.
- 아래의 파일들이 있다면 sdkmanager는 설치할 필요 없다.
- 필요한 파일 리스트 (jetpack 4.6.1의 경우)
- cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
- libcudnn8_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-dev_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-samples_8.2.1.32-1+cuda10.2_arm64.deb
- 필요한 파일 리스트 (다른 버전의 jetpack의 경우 파일명은 비슷하고 cuda version과 libcudnn의 버전만 다르다.)
- cuda-repo-l4t-{cudaversion}-local{cuda_version}.{cuda_version_revision}-1_arm64.deb
- libcudnn8_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-dev_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-samples_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
install sdkmanager
dpkg install cuda & cudnn
- x86 host에서 확보한 cuda, cudnn 설치파일을 arm64용 rootfs/tmp로 옮긴다.
$ cp cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb libcudnn8* ~/work/rootfs/tmp/
- arm64 에뮬레이터에서 아래 명령을 실행한다.
$ cd /tmp
$ dpkg -i cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
$ apt-key add /var/cuda-repo-l4t-10-2-local/7fa2af80.pub
$ apt update
$ apt install -y cuda-toolkit-10-2 libgomp1 libfreeimage-dev libopenmpi-dev openmpi-bin
$ dpkg --purge cuda-repo-l4t-10-2-local
$ dpkg -i libcudnn8*
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
$ export CUDA_HOME=/usr/local/cuda
$ export PATH=$PATH:$CUDA_HOME/bin
install opencv
- build는 /tmp에서 설치는 /opt에
- CUDA_ARCH_BIN의 설정값은 nano의 경우 5.3
- 출처
- 설정 안하면 모든 hardware를 지원하도록 빌드되는데 시간과 용량을 아끼려면 특정해 두는 것이 좋다.
$ cd /tmp
$ mkdir opencv
$ cd opencv
$ wget https://github.com/opencv/opencv/archive/refs/tags/4.5.1.tar.gz -O opencv-4.5.1.tar.gz
$ wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.1.tar.gz -O opencv_contrib-4.5.1.tar.gz
$ tar xvzf opencv-4.5.1.tar.gz
$ tar xvzf opencv_contrib-4.5.1.tar.gz
$ cd opencv-4.5.1
$ mkdir build
$ cd build
$ cmake -D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN="5.3" \
-D CUDA_ARCH_PTX="" \
-D USE_NEON=ON \
-D WITH_CUBLAS=ON -D WITH_CUDNN=ON \
-D ENABLE_FAST_MATH=ON -D CUDA_FAST_MATH=ON \
-D WITH_EIGEN=ON -D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D WITH_GTK=OFF -D WITH_QT=ON -D WITH_OPENGL=ON\
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.1/modules \
-D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON \
-D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON \
-D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2 \
-D CUDNN_INCLUDE_DIRS=/usr/include/ \
-D CUDNN_LIBRARIES=/usr/lib/aarch64-linux-gnu \
-D CMAKE_INSTALL_PREFIX=/opt/opencv-4.5.1 \
..
-
cmake 까지 하면 아래 같이 출력되면 다음으로 진행.
펼침-- General configuration for OpenCV 4.5.1 ===================================== -- Version control: unknown -- -- Extra modules: -- Location (extra): /tmp/opencv/opencv_contrib-4.5.1/modules -- Version control (extra): unknown -- -- Platform: -- Timestamp: 2022-03-23T07:22:10Z -- Host: Linux 5.4.0-65-generic aarch64 -- CMake: 3.10.2 -- CMake generator: Unix Makefiles -- CMake build tool: /usr/bin/make -- Configuration: RELEASE -- -- CPU/HW features: -- Baseline: NEON FP16 -- -- C/C++: -- Built as dynamic libs?: YES -- C++ standard: 11 -- C++ Compiler: /usr/bin/c++ (ver 7.5.0) -- C++ flags (Release): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG -- C++ flags (Debug): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG -- C Compiler: /usr/bin/cc -- C flags (Release): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG -- C flags (Debug): -fsigned-char -ffast-math -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG -- Linker flags (Release): -Wl,--gc-sections -Wl,--as-needed -- Linker flags (Debug): -Wl,--gc-sections -Wl,--as-needed -- ccache: YES -- Precompiled headers: NO -- Extra dependencies: m pthread /usr/lib/aarch64-linux-gnu/libGL.so /usr/lib/aarch64-linux-gnu/libGLU.so cudart_static dl rt nppc nppial nppicc nppicom nppidei nppif nppig nppim nppist nppisu nppitc npps cublas cudnn cufft -L/usr/local/cuda-10.2/lib64 -L/usr/lib/aarch64-linux-gnu -- 3rdparty dependencies: -- -- OpenCV modules: -- To be built: alphamat aruco bgsegm bioinspired calib3d ccalib core cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor mcc ml objdetect optflow phase_unwrapping photo plot python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab xfeatures2d ximgproc xobjdetect xphoto -- Disabled: world -- Disabled by dependency: - -- Unavailable: cnn_3dobj hdf java julia matlab ovis python2 sfm ts viz -- Applications: apps -- Documentation: NO -- Non-free algorithms: NO -- -- GUI: -- QT: YES (ver 5.9.5) -- QT OpenGL support: YES (Qt5::OpenGL 5.9.5) -- OpenGL support: YES (/usr/lib/aarch64-linux-gnu/libGL.so /usr/lib/aarch64-linux-gnu/libGLU.so) -- VTK support: NO -- -- Media I/O: -- ZLib: /usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.11) -- JPEG: /usr/lib/aarch64-linux-gnu/libjpeg.so (ver 80) -- WEBP: build (ver encoder: 0x020f) -- PNG: /usr/lib/aarch64-linux-gnu/libpng.so (ver 1.6.34) -- TIFF: /usr/lib/aarch64-linux-gnu/libtiff.so (ver 42 / 4.0.9) -- JPEG 2000: build (ver 2.3.1) -- OpenEXR: build (ver 2.3.0) -- HDR: YES -- SUNRASTER: YES -- PXM: YES -- PFM: YES -- -- Video I/O: -- DC1394: YES (2.2.5) -- FFMPEG: YES -- avcodec: YES (57.107.100) -- avformat: YES (57.83.100) -- avutil: YES (55.78.100) -- swscale: YES (4.8.100) -- avresample: NO -- GStreamer: YES (1.14.5) -- v4l/v4l2: YES (linux/videodev2.h) -- -- Parallel framework: pthreads -- -- Trace: YES (with Intel ITT) -- -- Other third-party libraries: -- Lapack: NO -- Eigen: YES (ver 3.3.4) -- Custom HAL: YES (carotene (ver 0.0.1)) -- Protobuf: build (3.5.1) -- -- NVIDIA CUDA: YES (ver 10.2, CUFFT CUBLAS FAST_MATH) -- NVIDIA GPU arch: 53 -- NVIDIA PTX archs: -- -- cuDNN: YES (ver 8.2.1) -- -- OpenCL: YES (no extra features) -- Include path: /tmp/opencv/opencv-4.5.1/3rdparty/include/opencl/1.2 -- Link libraries: Dynamic load -- -- Python 3: -- Interpreter: /usr/bin/python3 (ver 3.6.9) -- Libraries: /usr/lib/aarch64-linux-gnu/libpython3.6m.so (ver 3.6.9) -- numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.13.3) -- install path: lib/python3.6/dist-packages/cv2/python-3.6 -- -- Python (for build): /usr/bin/python3 -- -- Java: -- ant: NO -- JNI: NO -- Java wrappers: NO -- Java tests: NO -- -- Install to: /opt/opencv-4.5.1 -- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /tmp/opencv/opencv-4.5.1/build
-
make
- 이게 가장 오래 걸리는 작업이다.
- host pc와 virtual machine의 사양에 따라 2-3시간에서 하루 이상도 소요될 수 있다.
$ make -j$(nproc)
$ make install
to the target
- target board에 복사하기 위한 준비
- make install 까지 완료했으면 cmake 할 때 지정했던 위치에 build된 결과물이 준비되어 있다.
- 지금은 -D CMAKE_INSTALL_PREFIX=/opt/opencv-4.5.1 옵션을 줬으므로 아래 폴더를 확인.
$ cd /opt $ du -d1 -h 210M ./opencv-4.5.1 $ cd /opt/opencv-4.5.1 $ ls bin include lib share
압축
$ cd /opt
$ tar cvzf opencv-4.5.1_release.tar.gz ./opencv-4.5.1
- 이제 opencv binary가 준비됐다.
마무리
$ exit
-
exit를 하면 emulation이 종료되고 x86 mode로 돌아온다.
위의 안내대로 진행했으면 ~/work/rootfs/opt에 opencv-4.5.1_release.tar.gz 가 존재한다.
이 파일을 jetson nano board로 복사한다. -
jetson nano에 cuda, libcudnn이 깔리지 않았다면 아래 파일들도 복사한다.
- 필요한 파일 리스트 (jetpack 4.6.1의 경우)
- cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
- libcudnn8_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-dev_8.2.1.32-1+cuda10.2_arm64.deb
- libcudnn8-samples_8.2.1.32-1+cuda10.2_arm64.deb
- 필요한 파일 리스트 (다른 버전의 jetpack의 경우)
- cuda-repo-l4t-{cudaversion}-local{cuda_version}.{cuda_version_revision}-1_arm64.deb
- libcudnn8_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-dev_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- libcudnn8-samples_{cudnn8_version}-1+cuda{cuda_version}_arm64.deb
- 필요한 파일 리스트 (jetpack 4.6.1의 경우)
target
- 이제부터 jetson nano에서 해야할 작업.
- 여기에도 work 폴더를 만들고 시작한다.
- 위에서 필요한 파일들을 work 폴더로 복사해 둘 것.
- 이 부분의 설명은 생략. work 폴더에 파일들이 있다고 가정.
- qemu에서 했던 opencv build와 make rootfs를 제외한 작업을 다시 해줘야 한다.
- 다시 반복 설명할 예정이므로 위로 돌아갈 필요없다.
- sudo가 추가되거나 sources.list에 추가할 작업등 미묘하게 다른 부분이 있으므로 target board에선 아래대로 진행한다.
update & install packages in jetson nano
$ sudo echo "deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted" >> /etc/apt/sources.list
$ sudo apt update
$ sudo apt install --no-install-recommends -y curl wget unzip gnupg1 git build-essential \
cmake git ccache pkg-config \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libfreetype6 libfreetype6-dev libharfbuzz-dev \
libgflags-dev liblapack-dev \
libopenblas-dev libatlas3-base libbliss2 gfortran liblapack3 libeigen3-dev \
libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev \
libdc1394-22-dev \
libv4l-dev v4l-utils qv4l2 v4l2ucp \
mesa-utils libgl1-mesa-dri \
python3-pip python3-dev python3-numpy \
qt5-default qttools5-dev libqt5opengl5-dev
install cuda & cudnn
$ cd ~/work
$ sudo dpkg -i cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
$ sudo apt-key add /var/cuda-repo-l4t-10-2-local/7fa2af80.pub
$ sudo apt update
$ sudo apt install -y cuda-toolkit-10-2 libgomp1 libfreeimage-dev libopenmpi-dev openmpi-bin
$ sudo dpkg --purge cuda-repo-l4t-10-2-local
$ sudo dpkg -i libcudnn8*
$ export LD_LIBRARY_PATH=/opt/opencv-4.5.1/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
$ export PATH=/opt/opencv-4.5.1/bin:/usr/local/cuda/bin:$PATH
$ ldconfig
- 다시 로그인을 했을 때 PATH가 남아있어야 하므로 ~/.bashrc 에 아래 두줄 추가.
- 다른 shell을 쓴다면 그에 맞는 file에 쓸 것
export LD_LIBRARY_PATH=/opt/opencv-4.5.1/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export PATH=/opt/opencv-4.5.1/bin:/usr/local/cuda/bin:$PATH
copy & setup opencv
- 이제 거의 다 왔다.
$ cd /opt
$ sudo tar xvzf ~/work/opencv-4.5.1_release.tar.gz
- python3에서 cv2를 쓸수 있게 연결
$ sudo ln -s /opt/opencv-4.5.1/lib/python3.6/dist-packages/cv2 /usr/lib/python3/dist-packages/cv2
test
- 설치가 잘 됐는지 확인을 해보자.
jtop
- shell 에서 jtop을 실행하고 숫자6을 눌러서 아래와 같이 나오면 성공
- Libraries의 CUDA, OpenCV, cuDNN을 확인할 것.
- Cuda ARCH는 원래 53이 표시돼야 하지만 L4T 32.7.1과 jtop이 호환이 안되는 부분이 있어서 NONE으로 표시된다고 함.
$ jtop
# 실행 중 숫자 6을 입력
- 위에서 필요한 파일들을 work 폴더로 복사해 둘 것.
- 이 부분의 설명은 생략. work 폴더에 파일들이 있다고 가정.
- 다시 반복 설명할 예정이므로 위로 돌아갈 필요없다.
- sudo가 추가되거나 sources.list에 추가할 작업등 미묘하게 다른 부분이 있으므로 target board에선 아래대로 진행한다.
$ sudo echo "deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted" >> /etc/apt/sources.list
$ sudo apt update
$ sudo apt install --no-install-recommends -y curl wget unzip gnupg1 git build-essential \
cmake git ccache pkg-config \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libfreetype6 libfreetype6-dev libharfbuzz-dev \
libgflags-dev liblapack-dev \
libopenblas-dev libatlas3-base libbliss2 gfortran liblapack3 libeigen3-dev \
libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev \
libdc1394-22-dev \
libv4l-dev v4l-utils qv4l2 v4l2ucp \
mesa-utils libgl1-mesa-dri \
python3-pip python3-dev python3-numpy \
qt5-default qttools5-dev libqt5opengl5-dev
$ cd ~/work
$ sudo dpkg -i cuda-repo-l4t-10-2-local_10.2.460-1_arm64.deb
$ sudo apt-key add /var/cuda-repo-l4t-10-2-local/7fa2af80.pub
$ sudo apt update
$ sudo apt install -y cuda-toolkit-10-2 libgomp1 libfreeimage-dev libopenmpi-dev openmpi-bin
$ sudo dpkg --purge cuda-repo-l4t-10-2-local
$ sudo dpkg -i libcudnn8*
$ export LD_LIBRARY_PATH=/opt/opencv-4.5.1/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
$ export PATH=/opt/opencv-4.5.1/bin:/usr/local/cuda/bin:$PATH
$ ldconfig
- 다른 shell을 쓴다면 그에 맞는 file에 쓸 것
export LD_LIBRARY_PATH=/opt/opencv-4.5.1/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export PATH=/opt/opencv-4.5.1/bin:/usr/local/cuda/bin:$PATH
$ cd /opt
$ sudo tar xvzf ~/work/opencv-4.5.1_release.tar.gz
$ sudo ln -s /opt/opencv-4.5.1/lib/python3.6/dist-packages/cv2 /usr/lib/python3/dist-packages/cv2
$ jtop
# 실행 중 숫자 6을 입력
- jtop 실행이 안되고 없다고 나오면 아래 명령어 실행 후 터미널을 껐다가 재접속 한다.
$ sudo -H pip3 install -U jetson-stats
$ sudo systemctl restart jetson-stats
python3
- 아래의 확인 코드는 python3 실행 후 REPL mode 임.
cv2
- opencv 4.5.1을 깔았으니 version 이 맞나 확인
- cuda device 확인
>>> import cv2
>>> cv2.__version__
'4.5.1'
>>> cv2.cuda.printCudaDeviceInfo(0)
*** CUDA Device Query (Runtime API) version (CUDART static linking) ***
Device count: 1
Device 0: "NVIDIA Tegra X1"
CUDA Driver Version / Runtime Version 10.20 / 10.20
CUDA Capability Major/Minor version number: 5.3
Total amount of global memory: 3964 MBytes (4156764160 bytes)
GPU Clock Speed: 0.92 GHz
Max Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536,65536), 3D=(4096,4096,4096)
Max Layered Texture Size (dim) x layers 1D=(16384) x 2048, 2D=(16384,16384) x 2048
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 32768
Warp size: 32
Maximum number of threads per block: 1024
Maximum sizes of each dimension of a block: 1024 x 1024 x 64
Maximum sizes of each dimension of a grid: 2147483647 x 65535 x 65535
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: Yes
Support host page-locked memory mapping: Yes
Concurrent kernel execution: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support enabled: No
Device is using TCC driver mode: No
Device supports Unified Addressing (UVA): Yes
Device PCI Bus ID / PCI location ID: 0 / 0
Compute Mode:
Default (multiple host threads can use ::cudaSetDevice() with device simultaneously)
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.20, CUDA Runtime Version = 10.20, NumDevs = 1
>>>
pyqt5
>>> import PyQt5.QtCore
>>> PyQt5.QtCore.QT_VERSION_STR
'5.9.5'
대단히 수고 하셨습니다!
Author And Source
이 문제에 관하여(opencv4를 jetson nano에 qemu로 설치해보자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@telelian/opencv4를-jetson-nano에-qemu로-설치해보자
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Author And Source
이 문제에 관하여(opencv4를 jetson nano에 qemu로 설치해보자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@telelian/opencv4를-jetson-nano에-qemu로-설치해보자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)