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.
<NVIDIA L4T PyTorch homepage>
Caution: Since we use anaconda virtual environment, refer to the contents of the above page, but do not follow the same installation process as above.
PyTorch Download
Instead of downloading the PyTorch whl file to your local computer, you can also install the remote whl file directly using the pip command. But I will safely download and install it.
First install requred packages.
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
Since we have installed most of the software we need, we now install YOLOv8 with the pip command.
(yolov8) spypiggy@spypiggy-NX:~/Downloads$ pip install ultralytics
Note that the package name is ultralytics, not yolov8. But the moment I load YOLOv8 in python I get an error like this.
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.