Jetson Nano 重新編譯 OpenCV + CUDA

Max Chang
10 min readJul 22, 2021

--

此篇為教學如何在Jetson Nano中將OpenCV使用CUDA重新編譯,編譯後將可以進行AI加速,OpenCV的一些應用或模組便有更多選擇可以玩~

起手式

開始之前請先幫我安裝這個好用的第三方工具jetson_stats,可以監測Jetson 系列的設備使用狀況,安裝方法如下:


$ sudo -H pip install -U jetson-stats
$ sudo reboot

重開機過後可以先執行jtop來看是否能成功運行!其中 jtop可以監控即時的狀況、jetson_swap可以開啟swap空間、jetson_release可以查看Jetson Nano系統以及常用工具的版本等等:

$ jtop

這次的內容主要是運行OpenCV,Jetson系列的Tegra系統已經支援OpenCV 4.4.1,不過我們這次會使用到OpenCV的深度學習模組(DNN) 需要使用到CUDA,然而Tegra預設的OpenCV是沒辦法使用CUDA的,我們可以透過jetson_release來查看OpenCV的版本以及是否能使用CUDA ( compiled CUDA):

$ jetson_release

可以注意到 compiled CUDA的選項是 NO,所以我們需要耗費一點時間來重建OpenCV。

重新建構OpenCV

1. 將 gdm3調整成 lightdm ( 可選 )

Gdm3就是常見的ubuntu介面,可以透過下列指令調整成lightdm介面,這是一個輕量化的圖形化介面:

$ sudo dpkg-reconfigure gdm3

透過jtop指令可以查看兩個介面的記憶體使用狀況,在MEM的欄位可以發現原本gdm3使用了大概1.1G左右的容量,轉成lightdm之後變成了0.7G左右:

2. 給Jetson Nano更多swap空間

原本的swap空間僅有2GB,但我們可以透過jetson_swap來開啟swap空間:

$ sudo jetson_swap -d ~ -s 4 -a

3.檢查CUDA

原廠系統已經安裝好CUDA了,不過有時候還是會發生抓不到CUDA的問題,我們可以透過nvcc來檢查:

$ nvcc -V 

如果找不到則需要手動新增到環境變數當中:

$ nano ~/.bashrc

開啟 bashrc後新增下列指令:

export CUDA_HOME=/usr/local/cuda-10.0/
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
export PATH=${CUDA_HOME}bin:$PATH

ctrl+c 存檔 Y 確定 Enter保持檔案名稱不變,接著再執行”nvcc -V”,確認是否成功。

4. 安裝相依套件

大部分的套件在安裝Jetson系列的原廠系統後都已經打包在裡面了,不過這邊還是全部都列出來以防萬一:

# reveal the CUDA location
$ sudo sh -c “echo ‘/usr/local/cuda/lib64’ >> /etc/ld.so.conf.d/nvidia-tegra.conf” -y
$ sudo ldconfig -y
# third-party libraries
$ sudo apt-get install build-essential cmake git unzip pkg-config -y
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev -y
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev -y
$ sudo apt-get install libgtk2.0-dev libcanberra-gtk* -y
$ sudo apt-get install python3-dev python3-numpy python3-pip -y
$ sudo apt-get install libxvidcore-dev libx264-dev libgtk-3-dev -y
$ sudo apt-get install libtbb2 libtbb-dev libdc1394–22-dev -y
$ sudo apt-get install gstreamer1.0-tools libv4l-dev v4l-utils -y
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -y
$ sudo apt-get install libavresample-dev libvorbis-dev libxine2-dev -y
$ sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev -y
$ sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev -y
$ sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev -y
$ sudo apt-get install liblapack-dev libeigen3-dev gfortran -y
$ sudo apt-get install libhdf5-dev protobuf-compiler -y
$ sudo apt-get install libprotobuf-dev libgoogle-glog-dev libgflags-dev -y

5. 從來源建置OpenCV

我們可以到OpenCV Release當中去找想要的版本,可以從下圖看到4.5.2跟3.4.14是OpenCV官網所推薦的,那我們就直接嘗試安裝最新的版本看看,因為最新版的DNN模組(深度學習)支援了更多元的神經網路層。

a. 移動到家目錄並下載OpenCV來源包並解壓縮:

$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.2.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.2.zip
$ unzip opencv.zip && unzip opencv_contrib.zip

b. 改目錄名稱並刪除壓縮檔:

$ mv opencv-4.5.2 opencv
$ mv opencv_contrib-4.5.2 opencv_contrib
# clean up the zip files
$ rm opencv.zip && rm opencv_contrib.zip

c. 建立一個資料夾存放所有建構完的函式庫:

$ cd ~/opencv
$ mkdir build && cd build

d. 產生CMake配置檔案,-D將給予特定參數,這些參數將會宣告OpenCV建構的位置、方法等等的:

$ 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 WITH_CUDA=ON \
-D CUDA_ARCH_BIN=5.3 \
-D CUDA_ARCH_PTX=”” \
-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 WITH_OPENGL=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 OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_opencv_python3=TRUE \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_EXAMPLES=OFF ..

執行成功你將會看到與我類似的畫面。

e. 進行建構,這邊可以透過 -j 設定要用幾個核心運行 make:

$ make -j4

f. 刪除舊有的OpenCV:

$ sudo rm -r /usr/include/opencv4/opencv2
$ sudo make install
$ sudo ldconfig
# cleaning (frees 300 MB)
$ make clean
$ sudo apt-get update

g. 清除OpenCV 來源包:

$ sudo rm -rf ~/opencv
$ sudo rm -rf ~/opencv_contrib

h. 檢查OpenCV

透過jetson_release 可以注意到 complied CUDA的選項已經變成 YES了:

$ jetson_release

可以注意到 compiled CUDA已經是Yes了,後續就可以使用CUDA來幫助OpenCV的一些AI應用加速了!

--

--

No responses yet