Qengineering / Install-OpenCV-Jetson-Nano

OpenCV installation script with CUDA and cuDNN support
https://qengineering.eu/install-opencv-on-jetson-nano.html
BSD 3-Clause "New" or "Revised" License
142 stars 46 forks source link

OpenCV CUDA - Jetpack 6 Support #17

Open starlight-traveler opened 8 months ago

starlight-traveler commented 8 months ago

Hello,

With the advent of Jetpack 6.0 and with it Ubuntu LTS 22.04, I was inquiring whether or not the scripts would be updated to support the newest edition.

Some of the packages have been superseded or are not available, though I think running the commands manually still works.

Qengineering commented 7 months ago

Noted. I will address the issue soon. Update 2-11-2023: I can't install the pre-released JetPack 6 on my Jetson Orin Nano. It loops during bootup. Let's wait a few weeks for the official version 6 release.

starlight-traveler commented 7 months ago

Ahh, you would need to follow this thread, if you installed via SD Image or regular Nvidia SDK then the QSPI won't recognize it. Been an error for months:

https://forums.developer.nvidia.com/t/unable-to-flash-r36-on-orin-nano-8gb-dev-kit-using-external-storage/275185

No problem though!

robbiesrobotics1 commented 5 months ago

Hey there @starlight-traveler and @Qengineering, I have the AGX Orin running Jetpack 6-dp and was able to update the 4.9 script to work. Jetpack 6 uses Cuda 12.2 and I believe that is why 4.8 wouldn't work for me when I tried. Below is the updated script for 4.9. I hope this is helpful!

!/bin/bash

set -e install_opencv () {

Check if the file /proc/device-tree/model exists

if [ -e "/proc/device-tree/model" ]; then

Read the model information from /proc/device-tree/model and remove null bytes

  model=$(tr -d '\0' < /proc/device-tree/model)
  # Check if the model information contains "Orin"
  echo ""
  if [[ $model == *"Orin"* ]]; then
      echo "Detecting an NVIDIA Orin Device."
  # Use always "-j 4"
      NO_JOB=4
      ARCH=8.7
      PTX="sm_87"
  elif [[ $model == *"Jetson Nano"* ]]; then
      echo "Detecting a regular Jetson Nano."
      ARCH=5.3
      PTX="sm_53"
  # Use "-j 4" only swap space is larger than 5.5GB
  FREE_MEM="$(free -m | awk '/^Swap/ {print $2}')"
  if [[ "FREE_MEM" -gt "5500" ]]; then
    NO_JOB=4
  else
    echo "Due to limited swap, make only uses 1 core"
    NO_JOB=1
  fi
  else
      echo "Unable to determine the Jetson model."
      exit 1
  fi
  echo ""

else echo "Error: /proc/device-tree/model not found. Are you sure this is a Jetson Product?" exit 1 fi

echo "Installing OpenCV 4.9.0 on your AGX Orin" echo "It will take 3.5 hours !"

reveal the CUDA location

cd ~ sudo sh -c "echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.conf" sudo ldconfig

install the Jetson Nano dependencies first

if [[ $model == "Jetson Nano" ]]; then sudo apt-get install -y build-essential git unzip pkg-config zlib1g-dev sudo apt-get install -y python3-dev python3-numpy sudo apt-get install -y python-dev python-numpy sudo apt-get install -y gstreamer1.0-tools libgstreamer-plugins-base1.0-dev sudo apt-get install -y libgstreamer-plugins-good1.0-dev sudo apt-get install -y libtbb2 libgtk-3-dev v4l2ucp libxine2-dev fi

install the common dependencies

sudo apt-get install -y cmake sudo apt-get install -y libjpeg-dev libjpeg8-dev libjpeg-turbo8-dev sudo apt-get install -y libpng-dev libtiff-dev libglew-dev sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install -y libgtk2.0-dev libgtk-3-dev libcanberra-gtk* sudo apt-get install -y python3-pip sudo apt-get install -y libxvidcore-dev libx264-dev sudo apt-get install -y libtbb-dev libdc1394-dev libxine2-dev sudo apt-get install -y libv4l-dev v4l-utils qv4l2 sudo apt-get install -y libtesseract-dev libpostproc-dev sudo apt-get install -y libswresample-dev libvorbis-dev sudo apt-get install -y libfaac-dev libmp3lame-dev libtheora-dev sudo apt-get install -y libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get install -y libopenblas-dev libatlas-base-dev libblas-dev sudo apt-get install -y liblapack-dev liblapacke-dev libeigen3-dev gfortran sudo apt-get install -y libhdf5-dev libprotobuf-dev protobuf-compiler sudo apt-get install -y libgoogle-glog-dev libgflags-dev

remove old versions or previous builds

cd ~ sudo rm -rf opencv*

download the latest version

git clone --depth=1 https://github.com/opencv/opencv.git git clone --depth=1 https://github.com/opencv/opencv_contrib.git

set install dir

cd ~/opencv mkdir build cd build

run cmake

cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \ -D WITH_OPENCL=OFF \ -D CUDA_ARCH_BIN=${ARCH} \ -D CUDA_ARCH_PTX=${PTX} \ -D WITH_CUDA=ON \ -D WITH_CUDNN=ON \ -D WITH_CUBLAS=ON \ -D ENABLE_FAST_MATH=ON \ -D CUDA_FAST_MATH=ON \ -D OPENCV_DNN_CUDA=ON \ -D ENABLE_NEON=ON \ -D WITH_QT=OFF \ -D WITH_OPENMP=ON \ -D BUILD_TIFF=ON \ -D WITH_FFMPEG=ON \ -D WITH_GSTREAMER=ON \ -D WITH_TBB=ON \ -D BUILD_TBB=ON \ -D BUILD_TESTS=OFF \ -D WITH_EIGEN=ON \ -D WITH_V4L=ON \ -D WITH_LIBV4L=ON \ -D WITH_PROTOBUF=ON \ -D OPENCV_ENABLE_NONFREE=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D INSTALL_PYTHON_EXAMPLES=OFF \ -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D BUILD_EXAMPLES=OFF \ -D CMAKE_CXX_FLAGS="-march=native -mtune=native" \ -D CMAKE_C_FLAGS="-march=native -mtune=native" ..

make -j ${NO_JOB}

directory="/usr/include/opencv4/opencv2" if [ -d "$directory" ]; then

Directory exists, so delete it

sudo rm -rf "$directory"

fi

sudo make install sudo ldconfig

cleaning (frees 320 MB)

make clean sudo apt-get update

echo "Congratulations!" echo "You've successfully installed OpenCV 4.9.0 on your NVIDIA Embedded Device" }

cd ~

if [ -d ~/opencv/build ]; then echo " " echo "You have a directory ~/opencv/build on your disk." echo "Continuing the installation will replace this folder." echo " "

printf "Do you wish to continue (Y/n)?" read answer

if [ "$answer" != "${answer#[Nn]}" ] ;then echo "Leaving without installing OpenCV" else install_opencv fi else install_opencv fi

Qengineering commented 5 months ago

@robbiesrobotics1 ,

Thanks for your contribution.

One question. Where is the difference? Both scripts look identical to me.

robbiesrobotics1 commented 5 months ago

@Qengineering no problem at all! I just made a couple changes to the packages installed because there were two in the old script that aren't available for 22.04.

  1. libdc1394-22-dev wasn't available so I used libdc1394-dev

  2. libavresample-dev wasn't available so replaced with libswresample-dev

  3. At first the script wouldn't run on my AGX because it wasn't a Nano so in the if statement when checking for device I just changed the device or "Orin" so that any orin series device would be detected. Post install I was able to verify opencv 4.9.0-dev with cuda in jtop. Additionally, after exposing the path to python3.10 I'm also able to see opencv with cuda in python.

Qengineering commented 5 months ago

@robbiesrobotics1 I've updated the script with your suggestions. Thanks!

robbiesrobotics1 commented 5 months ago

@Qengineering no problem at all! I'm glad it was helpful.

Qengineering commented 5 months ago

Question. Are you using JetPack 6? And have you installed OpenCV with the script? It seems quite an ordeal to get it running. See issue #24. And https://forums.developer.nvidia.com/t/build-python-opencv2-with-cuda-support-for-jetpack-6-0/289016/3