As of March 2023, the most recent version of YOLO is v8. VOLOv8 is published by Ultralytics, the creators of v5. In this article, we will learn how to use the latest YOLOv8 on Xavier NX with JetPack 5.1 installed.
Tips: In this article, I used my username as spypiggy. Therefore, change the user name of spypyggy to the user name you use, such as /home/spypyggy/anaconda3.
First of all, let's look at the software required to use YOLOv8. Refer to the requirement.txt file on the YOLOv8 homepage.
# Base ---------------------------------------- matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.6.0 Pillow>=7.1.2 PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 torch>=1.7.0 torchvision>=0.8.1 tqdm>=4.64.0
The modules you need to pay attention to are opencv and pytorch. Earlier, we already created a virtual environment in Anaconda with python3.8 installed. We will continue to work on this virtual environment.
Prerequsites
Install OpenCV 4.6
JetPack 5.1 comes with OpenCV 4.5 installed. However, since we will be using an anaconda virtual environment, we need to install OpenCV newly. And as you can see from the contents of the requirement.txt file, OpenCV version 4.6 or higher must be used to install YOLOv8.
To install a package in an anaconda environment, you can use the "conda install" command or the python package management command "pip install".
Caution: However, OpenCV 4.5, which is already installed in JetPack 5.1, and Anaconda's OpenCV 4.6, which we want to install, have differences as well as differences in version. This difference becomes a problem when doing video or camera processing later. I will explain this part again later. If you want to use OpenCV for video playback or recording as well as image processing, please do not install OpenCV from Anaconda, go to "Build the latest version of OpenCV "later.
Packages that can be installed using the conda install command can be found with the conda search command. Let's find OpenCV with this command. If you can't find it, install it with "pip install" command. In general, it is recommended to install with the conda command in an anaconda environment. The reason is that the Python package installed with the conda install command is well-optimized for the anaconda environment, so it is known that better performance can be achieved.
(yolov8) spypiggy@spypiggy-NX:~$ conda install opencv=4.6.0 Collecting package metadata (current_repodata.json): done Solving environment: done ## Package Plan ## environment location: /home/spypiggy/anaconda3/envs/yolov8 added / updated specs: - opencv=4.6.0 The following NEW packages will be INSTALLED: blas pkgs/main/linux-aarch64::blas-1.0-openblas bzip2 pkgs/main/linux-aarch64::bzip2-1.0.8-hfd63f10_2 cairo pkgs/main/linux-aarch64::cairo-1.16.0-h537eab0_3 dbus pkgs/main/linux-aarch64::dbus-1.13.18-h821dc26_0 eigen pkgs/main/linux-aarch64::eigen-3.3.7-h59a28a9_1 expat pkgs/main/linux-aarch64::expat-2.4.9-h419075a_0 ffmpeg pkgs/main/linux-aarch64::ffmpeg-4.2.2-hdfaaa67_0 fontconfig pkgs/main/linux-aarch64::fontconfig-2.14.1-haa5834d_1 freetype pkgs/main/linux-aarch64::freetype-2.12.1-h6df46f4_0 giflib pkgs/main/linux-aarch64::giflib-5.2.1-h998d150_3 glib pkgs/main/linux-aarch64::glib-2.69.1-h94b7715_2 gmp pkgs/main/linux-aarch64::gmp-6.2.1-h22f4aa5_3 gnutls pkgs/main/linux-aarch64::gnutls-3.6.15-hc6589d6_0 graphite2 pkgs/main/linux-aarch64::graphite2-1.3.14-h22f4aa5_1 gst-plugins-base pkgs/main/linux-aarch64::gst-plugins-base-1.14.1-h419075a_1 gstreamer pkgs/main/linux-aarch64::gstreamer-1.14.1-h998d150_1 harfbuzz pkgs/main/linux-aarch64::harfbuzz-4.3.0-h085e3a5_0 hdf5 pkgs/main/linux-aarch64::hdf5-1.10.6-h8b20701_1 icu pkgs/main/linux-aarch64::icu-68.1-h22f4aa5_0 jpeg pkgs/main/linux-aarch64::jpeg-9e-h998d150_1 krb5 pkgs/main/linux-aarch64::krb5-1.19.4-ha2725d6_0 lame pkgs/main/linux-aarch64::lame-3.100-hfd63f10_0 lerc pkgs/main/linux-aarch64::lerc-3.0-h22f4aa5_0 libclang pkgs/main/linux-aarch64::libclang-10.0.1-default_h6b8c85e_2 libdeflate pkgs/main/linux-aarch64::libdeflate-1.17-h998d150_0 libedit pkgs/main/linux-aarch64::libedit-3.1.20221030-h998d150_0 libevent pkgs/main/linux-aarch64::libevent-2.1.12-ha9ffb65_0 libgfortran-ng pkgs/main/linux-aarch64::libgfortran-ng-11.2.0-h6e398d7_1 libgfortran5 pkgs/main/linux-aarch64::libgfortran5-11.2.0-h1234567_1 libidn2 pkgs/main/linux-aarch64::libidn2-2.3.1-h2f4d8fa_0 libllvm10 pkgs/main/linux-aarch64::libllvm10-10.0.1-h6c8bc22_6 libopenblas pkgs/main/linux-aarch64::libopenblas-0.3.21-hc2e42e2_0 libopus pkgs/main/linux-aarch64::libopus-1.3.1-h2f4d8fa_0 libpng pkgs/main/linux-aarch64::libpng-1.6.39-h998d150_0 libpq pkgs/main/linux-aarch64::libpq-12.9-h140f9b7_3 libtasn1 pkgs/main/linux-aarch64::libtasn1-4.16.0-hfd63f10_0 libtiff pkgs/main/linux-aarch64::libtiff-4.5.0-h419075a_2 libunistring pkgs/main/linux-aarch64::libunistring-0.9.10-h2f4d8fa_0 libuuid pkgs/main/linux-aarch64::libuuid-1.41.5-h998d150_0 libvpx pkgs/main/linux-aarch64::libvpx-1.8.2-h7c1a80f_0 libwebp pkgs/main/linux-aarch64::libwebp-1.2.4-he1bfee4_1 libwebp-base pkgs/main/linux-aarch64::libwebp-base-1.2.4-h998d150_1 libxcb pkgs/main/linux-aarch64::libxcb-1.15-h2f4d8fa_0 libxkbcommon pkgs/main/linux-aarch64::libxkbcommon-1.0.1-h1897131_0 libxml2 pkgs/main/linux-aarch64::libxml2-2.9.14-he30c317_0 libxslt pkgs/main/linux-aarch64::libxslt-1.1.35-hd0e857b_0 lz4-c pkgs/main/linux-aarch64::lz4-c-1.9.4-h419075a_0 nettle pkgs/main/linux-aarch64::nettle-3.7.3-h82288b7_1 nspr pkgs/main/linux-aarch64::nspr-4.33-h22f4aa5_0 nss pkgs/main/linux-aarch64::nss-3.74-hcaefab4_0 numpy pkgs/main/linux-aarch64::numpy-1.23.5-py38h8708280_0 numpy-base pkgs/main/linux-aarch64::numpy-base-1.23.5-py38h4a83355_0 opencv pkgs/main/linux-aarch64::opencv-4.6.0-py38he2e48ef_3 openh264 pkgs/main/linux-aarch64::openh264-1.8.0-h22f4aa5_0 openjpeg pkgs/main/linux-aarch64::openjpeg-2.4.0-hf3eb033_0 pcre pkgs/main/linux-aarch64::pcre-8.45-h22f4aa5_0 pixman pkgs/main/linux-aarch64::pixman-0.40.0-h2f4d8fa_1 qt-main pkgs/main/linux-aarch64::qt-main-5.15.2-h1cb44d8_7 qt-webengine pkgs/main/linux-aarch64::qt-webengine-5.15.9-ha607213_4 qtwebkit pkgs/main/linux-aarch64::qtwebkit-5.212-h2b8f10b_4 x264 pkgs/main/linux-aarch64::x264-1!152.20180806-h2f4d8fa_0 zstd pkgs/main/linux-aarch64::zstd-1.5.2-hfcb3217_0 Proceed ([y]/n)? y
Since the conda install command automatically installs related packages required for the package installation process, errors do not occur except in special cases.
After the installation is complete, you can check:
(yolov8) spypiggy@spypiggy-NX:~/Downloads$ python Python 3.8.16 (default, Mar 2 2023, 03:16:31) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '4.6.0' >>>
JetPack 5.1 built in OpenCV 4.5 Vs. Anaconda OpenCV 4.6
Now the Xavier NX I use has two OpenCVs installed.
One is OpenCV 4,5 installed by default in JetPack 5.1, and the other is OpenCV 4.6 installed in Anaconda virtual environments. Let's take a look at the difference between these two.
The best way to verify the properties of OpenCV is to use the cv2.getBuildInformation() function. This function shows various options at the time of OpenCV package build.
This is the output of the built-in version. Please pay attention to the red marked part.
>>> print(cv2.getBuildInformation()) General configuration for OpenCV 4.5.4 ===================================== Version control: 4.5.4-8-g3e4c170df4 Platform: Timestamp: 2022-01-18T10:01:01Z Host: Linux 5.10.65-tegra aarch64 CMake: 3.16.3 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 9.3.0) C++ flags (Release): -fsigned-char -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 -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 -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 -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: NO Precompiled headers: NO Extra dependencies: dl m pthread rt 3rdparty dependencies: OpenCV modules: To be built: calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo python2 python3 stitching ts video videoio Disabled: world Disabled by dependency: - Unavailable: java Applications: tests perf_tests examples apps Documentation: NO Non-free algorithms: NO GUI: GTK2 GTK+: YES (ver 2.24.32) GThread : YES (ver 2.64.6) GtkGlExt: 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.37) TIFF: /usr/lib/aarch64-linux-gnu/libtiff.so (ver 42 / 4.1.0) JPEG 2000: build (ver 2.4.0) HDR: YES SUNRASTER: YES PXM: YES PFM: YES Video I/O: FFMPEG: YES avcodec: YES (58.54.100) avformat: YES (58.29.100) avutil: YES (56.31.100) swscale: YES (5.5.100) avresample: YES (4.0.0) GStreamer: YES (1.16.2) v4l/v4l2: YES (linux/videodev2.h) Parallel framework: TBB (ver 2020.1 interface 11101) Trace: YES (with Intel ITT) Other third-party libraries: Lapack: NO Eigen: YES (ver 3.3.7) Custom HAL: YES (carotene (ver 0.0.1)) Protobuf: build (3.5.1) Python 2: Interpreter: /usr/bin/python2.7 (ver 2.7.18) Libraries: /usr/lib/aarch64-linux-gnu/libpython2.7.so (ver 2.7.18) numpy: /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.16.5) install path: lib/python2.7/dist-packages/cv2/python-2.7 Python 3: Interpreter: /usr/bin/python3 (ver 3.8.10) Libraries: /usr/lib/aarch64-linux-gnu/libpython3.8.so (ver 3.8.10) numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.17.4) install path: lib/python3.8/dist-packages/cv2/python-3.8 Python (for build): /usr/bin/python2.7 Java: ant: NO JNI: NO Java wrappers: NO Java tests: NO Install to: /usr -----------------------------------------------------------------
<output of Jetpack 5.1 pre-installed OpenCV 4.5>
This is the output of the Anaconda OpenCV version 4.6. A meaningless placehold garbage string is being output, but I'm not sure what's causing this. But the important part is the part marked in red.
Compared to OpenCV 4.5 installed with JetPack 5.1, the package is built without support for ffmpeg. And the GStreamer version is also a little lower.
>>> print(cv2.getBuildInformation()) General configuration for OpenCV 4.6.0 ===================================== Version control: unknown Extra modules: Location (extra): /croot/opencv-suite_1676452041368/work/opencv_contrib-4.6.0/modules Version control (extra): unknown Platform: Timestamp: 2023-02-15T09:08:53Z Host: Linux 5.10.162-141.675.amzn2.aarch64 aarch64 CMake: 3.22.1 CMake generator: Ninja CMake build tool: /croot/opencv-suite_1676452041368/_build_env/bin/ninja Configuration: Release CPU/HW features: Baseline: NEON FP16 C/C++: Built as dynamic libs?: YES C++ standard: 11 C++ Compiler: /croot/opencv-suite_1676452041368/_build_env/bin/aarch64-conda-linux-gnu-c++ (ver 11.2.0) C++ flags (Release): -fvisibility-inlines-hidden -std=c++11 -fmessage-length=0 -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O3 -pipe -isystem /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/include -fdebug-prefix-map=/croot/opencv-suite_1676452041368/work=/usr/local/src/conda/opencv-suite-4.6.0 -fdebug-prefix-map=/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac=/usr/local/src/conda-prefix -D__STDC_CONSTANT_MACROS -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-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 -fopenmp -O3 -DNDEBUG -DNDEBUG C++ flags (Debug): -fvisibility-inlines-hidden -std=c++11 -fmessage-length=0 -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O3 -pipe -isystem /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/include -fdebug-prefix-map=/croot/opencv-suite_1676452041368/work=/usr/local/src/conda/opencv-suite-4.6.0 -fdebug-prefix-map=/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac=/usr/local/src/conda-prefix -D__STDC_CONSTANT_MACROS -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-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 -fopenmp -g -DDEBUG -D_DEBUG C Compiler: /croot/opencv-suite_1676452041368/_build_env/bin/aarch64-conda-linux-gnu-cc C flags (Release): -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O3 -pipe -isystem /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/include -fdebug-prefix-map=/croot/opencv-suite_1676452041368/work=/usr/local/src/conda/opencv-suite-4.6.0 -fdebug-prefix-map=/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac=/usr/local/src/conda-prefix -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-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 -fopenmp -O3 -DNDEBUG -DNDEBUG C flags (Debug): -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O3 -pipe -isystem /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/include -fdebug-prefix-map=/croot/opencv-suite_1676452041368/work=/usr/local/src/conda/opencv-suite-4.6.0 -fdebug-prefix-map=/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac=/usr/local/src/conda-prefix -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-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 -fopenmp -g -DDEBUG -D_DEBUG Linker flags (Release): -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib -Wl,-rpath-link,/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib -L/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined Linker flags (Debug): -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib -Wl,-rpath-link,/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib -L/croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined ccache: NO Precompiled headers: NO Extra dependencies: dl m pthread rt 3rdparty dependencies: OpenCV modules: To be built: alphamat aruco bgsegm bioinspired calib3d ccalib core cvv datasets dpm face features2d flann freetype fuzzy gapi hdf hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor ml objdetect optflow phase_unwrapping photo plot python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching tracking video videoio videostab xfeatures2d ximgproc xobjdetect xphoto Disabled: world Disabled by dependency: barcode dnn_objdetect dnn_superres mcc text wechat_qrcode Unavailable: cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev dnn java julia matlab ovis python2 sfm ts viz Applications: - Documentation: NO Non-free algorithms: NO GUI: QT5 QT: YES (ver 5.15.2 ) QT OpenGL support: NO Media I/O: ZLib: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/libz.so (ver 1.2.13) JPEG: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/libjpeg.so (ver 90) PNG: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/libpng.so (ver 1.6.37) TIFF: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/libtiff.so (ver 42 / 4.2.0) JPEG 2000: OpenJPEG (ver 2.3.0) OpenEXR: build (ver 2.3.0) HDR: YES SUNRASTER: YES PXM: YES PFM: YES Video I/O: GStreamer: YES (1.14.1) v4l/v4l2: YES (linux/videodev2.h) Parallel framework: OpenMP Trace: YES (built-in) Other third-party libraries: Eigen: YES (ver 3.3.7) Custom HAL: YES (carotene (ver 0.0.1)) Python 3: Interpreter: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/bin/python3 (ver 3.8.15) Libraries: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/libpython3.8.so (ver 3.8.15) numpy: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/python3.8/site-packages/numpy/core/include (ver 1.16.6) install path: lib/python3.8/site-packages/cv2/python-3.8 Python (for build): /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/bin/python Java: ant: NO JNI: NO Java wrappers: NO Java tests: NO Install to: /croot/opencv-suite_1676452041368/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac -----------------------------------------------------------------
<output of Anaconda installed OpenCV 4.6>
As a result of my testing, there is no problem opening and working with normal images, but problems occur when opening and working with videos. Since GStreamer is supported, you might work with video files by creating a GStreamer pipeline.
>>> import cv2 >>> cap = cv2.VideoCapture("./WUzgd7C1pWA.mp4") [ WARN:0@41.141] global /croot/opencv-suite_1676452041368/work/modules/videoio/src/cap_gstreamer.cpp (2386) handleMessage OpenCV | GStreamer warning: your GStreamer installation is missing a required plugin [ WARN:0@41.142] global /croot/opencv-suite_1676452041368/work/modules/videoio/src/cap_gstreamer.cpp (2401) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module uridecodebin0 reported: Your GStreamer installation is missing a plug-in. [ WARN:0@41.145] global /croot/opencv-suite_1676452041368/work/modules/videoio/src/cap_gstreamer.cpp (1356) open OpenCV | GStreamer warning: unable to start pipeline [ WARN:0@41.146] global /croot/opencv-suite_1676452041368/work/modules/videoio/src/cap_gstreamer.cpp (862) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created>>> print(cap.read()) (False, None)
<Video File Open Error in Anaconda OpenCV>
So if you have to use OpenCV to process video files in an anaconda environment, there are two possible ways.
The first method is to create and use GStreamer's pipeline in OpenCV. And the second is to build and install the OpenCV package that supports ffmpeg.
Build the latest version of OpenCV for Anaconda
For how to install the latest version of OpenCV in Xavier NX, Jetpack 5.1, refer to "Installing the Latest Version of OpenCV on Xavier NX".
Install Pytorch
There are two ways to use PyTorch with JetPack 5.1. The first is to use a Docker image. The second is download and install PyTorch for Jetson Xavier NX. In an anaconda environment, I will use the second method.
Caution: Do not follow the installation instructions on the PyTorch homepage. Since NVidia provides a PyTorch package adapted for the Jetson series of GPUs, you must use PyTorch provided by NVidia.
NVIDIA PyTorch Docker Image
How to download and use PyTorch docker images on the Jetson series is well documented on the NVIDIA L4T PyTorch page.
Using docker images with Jetpack 5.1 will work up to PyTorch 2.0.
Download and install PyTorch
Previously, to install PyTorch on the Jetson series, refer to https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048. But now the official page to install PyTorch from the Jetson series has moved to https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html.
PyTorch Download
sudo apt-get -y update sudo apt-get -y install bc lld-8 gettext-base gfortran-8 iputils-ping \ libbz2-dev libc++-dev libcgal-dev libfreetype6-dev \ libhdf5-dev libjpeg-dev liblzma-dev libncurses5-dev libncursesw5-dev \ libpng-dev libreadline-dev libssl-dev libsqlite3-dev libxml2-dev \ libxslt-dev locales moreutils python-openssl rsync scons libopenblas-dev
Caution : The official NVidia PyTorch installation page, https://developer.download.nvidia.cn/compute/redist/jp/v51/pytorch/, says to install libffi-dev together, but in the Anaconda environment, libffi-3.4.2 version is already installed. Therefore, there is no problem with the build. Rather, installing a new libffi-dev causes a version collision problem. Therefore, if PyTorch is installed in an anaconda environment, this package is not installed.
Then download and install PyTorch.
(yolov8) spypiggy@spypiggy-NX:~/Downloads$ wget https://developer.download.nvidia.cn/compute/redist/jp/v51/pytorch/torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl --2023-03-09 23:47:41-- https://developer.download.nvidia.cn/compute/redist/jp/v51/pytorch/torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl Resolving developer.download.nvidia.cn (developer.download.nvidia.cn)... 129.227.6.166, 129.227.6.167 Connecting to developer.download.nvidia.cn (developer.download.nvidia.cn)|129.227.6.166|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 573441346 (547M) [application/octet-stream] Saving to: ‘torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl’ torch-1.14.0a0+44dac51c.nv23.0 100%[=================================================>] 546.88M 11.7MB/s in 49s 2023-03-09 23:48:31 (11.1 MB/s) - ‘torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl’ saved [573441346/573441346] (yolov8) spypiggy@spypiggy-NX:~/Downloads$ pip install --no-cache torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl Processing ./torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl Collecting networkx Downloading networkx-3.0-py3-none-any.whl (2.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 11.2 MB/s eta 0:00:00 Collecting sympy Downloading sympy-1.11.1-py3-none-any.whl (6.5 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.5/6.5 MB 12.3 MB/s eta 0:00:00 Collecting typing-extensions Downloading typing_extensions-4.5.0-py3-none-any.whl (27 kB) Collecting mpmath>=0.19 Downloading mpmath-1.3.0-py3-none-any.whl (536 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 17.3 MB/s eta 0:00:00 Installing collected packages: mpmath, typing-extensions, sympy, networkx, torch Successfully installed mpmath-1.3.0 networkx-3.0 sympy-1.11.1 torch-1.14.0a0+44dac51c.nv23.2 typing-extensions-4.5.0
Let's verify that we have successfully installed PyTorch.
(yolov8) spypiggy@spypiggy-NX:~/Downloads$ python Python 3.8.16 (default, Mar 2 2023, 03:16:31) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import torch >>> torch.__version__ '1.14.0a0+44dac51c.nv23.02' >>> torch.cuda.is_available() True
Build Torchvision
Now it is time to install Torchvision. Torchvision doesn't seem to be provided separately by NVidia. You can download the source code and build it yourself.
You need ffmpeg to process the video on Torchvision. Install ffmepg 4.2 in advance.
(yolov8) spypiggy@spypiggy-NX:~/Downloads$ sudo apt-get install ffmpeg
Download the source code and build torchvision
(yolov8) spypiggy@spypiggy-NX:~/Downloads$ wget https://github.com/pytorch/vision/archive/v0.14.0.tar.gz (yolov8) spypiggy@spypiggy-NX:~/Downloads$ tar -xvzf v0.14.0.tar.gz (yolov8) spypiggy@spypiggy-NX:~/Downloads$ cd vision-0.14.0 #This takes very long time, have a coffee time (yolov8) spypiggy@spypiggy-NX:~/Downloads/vision-0.14.0$ python setup.py install
Let's check whether the installation is correct. If you see the screen like this, the installation is successful.
(yolov8) spypiggy@spypiggy-NX:~/Downloads/vision-0.14.0$ cd .. (yolov8) spypiggy@spypiggy-NX:~/Downloads$ python Python 3.8.16 (default, Mar 2 2023, 03:16:31) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import torchvision >>> torchvision.__version__ '0.14.0a0' >>>
Caution: Do not test in the vision-0.14.0 directory. The reason is that this directory contains a subdirectory named torchvision, so Python's "import torchvision" statement doesn't work.
Install the rest of the packages
Now install the packages that were not installed from the requirement.txt file in the YOLOv8 directory. Use conda install whenever possible.
(yolov8) spypiggy@spypiggy-NX:~$ conda install matplotlib requests scipy tqdm Collecting package metadata (current_repodata.json): done Solving environment: done ## Package Plan ## environment location: /home/spypiggy/anaconda3/envs/yolov8 added / updated specs: - matplotlib - requests - scipy - tqdm The following packages will be downloaded: package | build ---------------------------|----------------- brotlipy-0.7.0 |py38hfd63f10_1002 319 KB cffi-1.15.1 | py38h998d150_3 270 KB contourpy-1.0.5 | py38hb8fdbf2_0 200 KB cryptography-39.0.1 | py38h3d58568_0 1.4 MB idna-3.4 | py38hd43f75c_0 93 KB importlib_resources-5.2.0 | pyhd3eb1b0_1 21 KB kiwisolver-1.4.4 | py38h419075a_0 77 KB matplotlib-3.7.0 | py38hd43f75c_0 8 KB matplotlib-base-3.7.0 | py38he2e48ef_0 6.6 MB packaging-22.0 | py38hd43f75c_0 68 KB pillow-9.4.0 | py38h419075a_0 716 KB pooch-1.4.0 | pyhd3eb1b0_0 41 KB pyopenssl-23.0.0 | py38hd43f75c_0 96 KB pyparsing-3.0.9 | py38hd43f75c_0 148 KB pysocks-1.7.1 | py38hd43f75c_0 28 KB requests-2.28.1 | py38hd43f75c_0 93 KB scipy-1.10.0 | py38h7caaa05_1 23.5 MB tornado-6.2 | py38h998d150_0 598 KB tqdm-4.64.1 | py38hd43f75c_0 126 KB urllib3-1.26.14 | py38hd43f75c_0 192 KB zipp-3.11.0 | py38hd43f75c_0 19 KB ------------------------------------------------------------ Total: 34.6 MB
You are now ready to install YOLOv8. Finally, let's install YOLOV8.
Install YOLOv8
(yolov8) spypiggy@spypiggy-NX:~/Downloads$ pip install ultralytics
Fixing GLIBCXX_3.4.29 Problem
(yolov8) spypiggy@spypiggy-NX:~$ python Python 3.8.16 (default, Mar 2 2023, 03:16:31) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> from ultralytics import YOLO Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/ultralytics/__init__.py", line 5, in <module> from ultralytics.yolo.engine.model import YOLO File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/ultralytics/yolo/__init__.py", line 3, in <module> from . import v8 File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/ultralytics/yolo/v8/__init__.py", line 3, in <module> from ultralytics.yolo.v8 import classify, detect, segment File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/ultralytics/yolo/v8/classify/__init__.py", line 3, in <module> from ultralytics.yolo.v8.classify.predict import ClassificationPredictor, predict File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/ultralytics/yolo/v8/classify/predict.py", line 5, in <module> from ultralytics.yolo.engine.predictor import BasePredictor File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/ultralytics/yolo/engine/predictor.py", line 34, in <module> import cv2 File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/cv2/__init__.py", line 181, in <module> bootstrap() File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/cv2/__init__.py", line 153, in bootstrap native_module = importlib.import_module("cv2") File "/home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) ImportError: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/spypiggy/anaconda3/envs/yolov8/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-aarch64-linux-gnu.so)
If you look for libstdc++.so.6 in anaconda virtual environment, you can see that it is a symbolic link of libstdc++.so.6.0.29 file at /home/spypiggy/anaconda3/lib.
(base) spypiggy@spypiggy-NX:~/anaconda3/lib$ ll /home/spypiggy/anaconda3/lib/libstdc++*
lrwxrwxrwx 1 spypiggy spypiggy 19 3월 9 20:54 libstdc++.so -> libstdc++.so.6.0.29* -rwxrwxr-x 3 spypiggy spypiggy 3934728 6월 1 2022 libstdc++.so.6.0.29*
And the /usr/lib/aarch64-linux-gnu directory has the following files.
(base) spypiggy@spypiggy-NX:/usr/lib$ ll aarch64-linux-gnu/libstd* lrwxrwxrwx 1 root root 19 5월 29 2021 aarch64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.28 -rw-r--r-- 1 root root 1907992 5월 29 2021 aarch64-linux-gnu/libstdc++.so.6.0.28
There are two ways to solve this problem./usr/linux-linux-gnu directory link 64-gnu directory link.
And a little safer way to change the LD_LIBRARY_PATH environment variable changes.
The first way
Replace the symbolic link in the /usr/lib/aarch64-linux-gnu directory with libstdc++.so.6.0.29 in the anaconda directory, or copy the libstdc++.so.6.0.29 file to the /usr/lib directory and remake the symbolic link like this:
(base) spypiggy@spypiggy-NX:~/anaconda3/lib$ sudo cp /home/spypiggy/anaconda3/lib/libstdc++.so.6.0.29 /usr/lib/aarch64-linux-gnu/ (base) spypiggy@spypiggy-NX:~/anaconda3/lib$ cd /usr/lib/aarch64-linux-gnu (base) spypiggy@spypiggy-NX:/usr/lib/aarch64-linux-gnu$ sudo rm -f libstdc++.so.6 (base) spypiggy@spypiggy-NX:/usr/lib/aarch64-linux-gnu$ sudo ln -s libstdc++.so.6.0.29 libstdc++.so.6 (base) spypiggy@spypiggy-NX:/usr/lib/aarch64-linux-gnu$ ll libstd* lrwxrwxrwx 1 root root 19 3월 10 02:09 libstdc++.so.6 -> libstdc++.so.6.0.29* -rw-r--r-- 1 root root 1907992 5월 29 2021 libstdc++.so.6.0.28 -rwxr-xr-x 1 root root 3934728 3월 10 02:07 libstdc++.so.6.0.29*
This operation carries some risks. If another program wants to use libstdc++.so.6 linked to libstdc++.so.6.0.28, it can be a problem. In this case, you can restore the symbolic link again.
A safer second way (recommended method)
If you want to avoid the risks described above, do not modify the symbolic link in the /usr/lib/aarch64-linux-gnu directory, but change the LD_LIBRARY_PATH environment variable.
Automatically execute shell scripts in the ./etc/conda/activate.d directory when the Anaconda virtual environment is activated. Conversely, when the virtual environment is deactivated, it automatically executes the shell script in the ./etc/conda/deactivate.d directory. If you create a script as follows, when the virtual environment is activated, you first find the lib path of the anaconda.
(yolov8) spypiggy@spypiggy-NX:~$ cd ~/anaconda3/envs/yolov8 (yolov8) spypiggy@spypiggy-NX:~/anaconda3/envs/yolov8$ mkdir -p ./etc/conda/activate.d (yolov8) spypiggy@spypiggy-NX:~/anaconda3/envs/yolov8$ mkdir -p ./etc/conda/deactivate.d (yolov8) spypiggy@spypiggy-NX:~/anaconda3/envs/yolov8$ touch ./etc/conda/activate.d/env_vars.sh (yolov8) spypiggy@spypiggy-NX:~/anaconda3/envs/yolov8$ touch ./etc/conda/deactivate.d/env_vars.sh (yolov8) spypiggy@spypiggy-NX:~/anaconda3/envs/yolov8$ cat etc/conda/activate.d/env_vars.sh export OLD_LD_LIBRARY_PATH=${LD_LIBRARY_PATH} export LD_LIBRARY_PATH=/home/spypiggy/anaconda3/lib:${LD_LIBRARY_PATH} (yolov8) spypiggy@spypiggy-NX:~/anaconda3/envs/yolov8$ cat etc/conda/deactivate.d/env_vars.sh export LD_LIBRARY_PATH=${OLD_LD_LIBRARY_PATH} unset OLD_LD_LIBRARY_PATH
And of course, the symbolic links in the /usr/lib/aarch64-linux-gnu directory do not need to be changed. It is still as follows.
(base) spypiggy@spypiggy-NX:/usr/lib$ ll aarch64-linux-gnu/libstd* lrwxrwxrwx 1 root root 19 5월 29 2021 aarch64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.28 -rw-r--r-- 1 root root 1907992 5월 29 2021 aarch64-linux-gnu/libstdc++.so.6.0.28
Now let's test again.
(yolov8) spypiggy@spypiggy-NX:~$ python Python 3.8.16 (default, Mar 2 2023, 03:16:31) [GCC 11.2.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> from ultralytics import YOLO >>> model = YOLO("yolov8n.pt") Downloading https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt to yolov8n.pt... 100%|█████████████████████████████████████████████████████████████████████████████████| 6.23M/6.23M [00:01<00:00, 3.59MB/s] >>>
Finally I successfully loaded the YOLOv8 model.
Tips : Occasionally, a Permission denied error may occur during package installation. The reason for this is that most of the previous installation process works with the root account rather than the current user (in my case, spypyggy), and the owner of a specific file or directory is the root. If this error occurs, it changes the owner of the entire anaconda directory at once.
(yolov8) spypiggy@spypiggy-NX:~/$ sudo chown -R spypiggy:spypiggy /home/spypiggy/anaconda3
Wrapping up
Since YOLOv8 is based on PyTorch, it is important to have PyTorch properly installed. It is not difficult to install packages such as PyTorch and OpenCV because it is very easy to install and manage packages in the Anaconda environment.
I will cover how to use VOLOv8 in Xavier NX while testing YOLOv8 in the next article.
댓글 없음:
댓글 쓰기