Jetson Xavier NX ubunt18.04 编译opencv4 安装tensorflow

 

本篇文章主要将我拿到Jetson Xavier NX板子后,一系列的操作,中间遇到的困难和疑惑以及解决的方式,知道能够在Jetson Xavier NX上跑出一个自己的基于tensorflow2.1的一个目标检测的程序。

一 Jetson Xavier NX开发套件刷机。

1.下载NX开发套件。2.下载烧录工具。3烧录TF卡。4开机启动,并配置。以上这些操作,我没有自己动手,我拿到的是已经完成以上工作的板子,如需以上操作,请参考连接https://blog.csdn.net/zbb297918657/article/details/106390209

二 查看Jetson Xavier NX一系列信息,并安装一些组件。

刷机预装组件版本检查

我的NX开发板的刷机版本为Jetpack4.4.0
1、驱动版本:head -n 1 /etc/nv_tegra_release

2、内核版本:uname -r
3、操作系统:lsb_release -i -r
4、CUDA版本:nvcc -V

这一步,我遇到了没有这个命令,可能是没有把CUDA的路径添加到PATH中。
5、cuDNN版本:dpkg -l libcudnn8
6、opencv版本:dpkg -l libopencv
7、Tensorrt版本: dpkg -l tensorrt

换源

我没有换源,如果想换源,可以参考以下操作,参考链接https://blog.csdn.net/zbb297918657/article/details/106403331

添加国内清华源,首先备份原本的source.list文件

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak    #为防止误操作后无法恢复,先备份原文件sources.list
sudo gedit /etc/apt/sources.list 
  • 然后删除所有内容,复制下列内容到到sources.list后保存
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
  • 之后打开终端输入
sudo apt-get update

完成!一定要注意处理器是aarch64架构的Ubuntu 18.04.2 LTS系统类型的,要使用与之匹配的源 

关于python

一般我们用这个板子要来跑python程序,需要安装python环境,板子的ubunt18.04 系统默认安装了 python2.7和python3.6,(这我有点问题,当时我好像忘记查看是否有python3.6了,我直接自己安装了虚拟环境的python3.6,之后因为自己按的python还出现了问题。之后再说)

如果没有默认的python3,按照以下操作执行。所以在这里我安装了python3,直接终端输入

sudo apt-get install python3-pip python3-dev

在这里插入图片描述
接着将pip升级为最新版

python3 -m pip install --upgrade pip  #升级pip

在这里插入图片描述

 编译opencv4.4.0(非虚拟环境python)

(如果你安装一虚拟环境的python,下面再说)

参考https://elinux.org/Jetson_Zoo#Computer_Vision,官方在这类板子上编译安装的教程。(似乎板子上自带opencv,上边查看信息时有过,但是说实话,我不知道咋用呢还,以后再研究。)

编译安装过程。

1.在https://github.com/mdegans/nano_build_opencv这个网址中,下载code,有一个build_opencv.sh脚本,用直接执行

./build_opencv.sh 4.4.0

 可以写4.4.0 ,代表opencv的版本,默认是4.4.0,可以不写,但是如果你想编译其他版本,如4.1.1,你就要写4.1.1.

直接执行这个脚本,可能回有问题,我在执行过程中,就出现过不少问题,下面大概列出来我出的问题。

首先我们看看build_opencv.sh这个脚本

#!/usr/bin/env bash
# 2019 Michael de Gans

set -e

# change default constants here:
readonly PREFIX=/usr/local  # install prefix, (can be ~/.local for a user install)
readonly DEFAULT_VERSION=4.4.0  # controls the default version (gets reset by the first argument)
readonly CPUS=$(nproc)  # controls the number of jobs

# better board detection. if it has 6 or more cpus, it probably has a ton of ram too
if [[ $CPUS -gt 5 ]]; then
    # something with a ton of ram
    JOBS=$CPUS
else
    JOBS=1  # you can set this to 4 if you have a swap file
    # otherwise a Nano will choke towards the end of the build
fi

cleanup () {
# https://stackoverflow.com/questions/226703/how-do-i-prompt-for-yes-no-cancel-input-in-a-linux-shell-script
    while true ; do
        echo "Do you wish to remove temporary build files in /tmp/build_opencv ? "
        if ! [[ "$1" -eq "--test-warning" ]] ; then
            echo "(Doing so may make running tests on the build later impossible)"
        fi
        read -p "Y/N " yn
        case ${yn} in
            [Yy]* ) rm -rf /tmp/build_opencv ; break;;
            [Nn]* ) exit ;;
            * ) echo "Please answer yes or no." ;;
        esac
    done
}

setup () {
    cd /tmp
    if [[ -d "build_opencv" ]] ; then
        echo "It appears an existing build exists in /tmp/build_opencv"
        cleanup
    fi
    mkdir build_opencv
    cd build_opencv
}

git_source () {
    echo "Getting version '$1' of OpenCV"
    git clone --depth 1 --branch "$1" https://github.com/opencv/opencv.git
    git clone --depth 1 --branch "$1" https://github.com/opencv/opencv_contrib.git
}

install_dependencies () {
    # open-cv has a lot of dependencies, but most can be found in the default
    # package repository or should already be installed (eg. CUDA).
    echo "Installing build dependencies."
    sudo apt-get update
    sudo apt-get dist-upgrade -y --autoremove
    sudo apt-get install -y \
        build-essential \
        cmake \
        git \
        gfortran \
        libatlas-base-dev \
        libavcodec-dev \
        libavformat-dev \
        libavresample-dev \
        libcanberra-gtk3-module \
        libdc1394-22-dev \
        libeigen3-dev \
        libglew-dev \
        libgstreamer-plugins-base1.0-dev \
        libgstreamer-plugins-good1.0-dev \
        libgstreamer1.0-dev \
        libgtk-3-dev \
        libjpeg-dev \
        libjpeg8-dev \
        libjpeg-turbo8-dev \
        liblapack-dev \
        liblapacke-dev \
        libopenblas-dev \
        libpng-dev \
        libpostproc-dev \
        libswscale-dev \
        libtbb-dev \
        libtbb2 \
        libtesseract-dev \
        libtiff-dev \
        libv4l-dev \
        libxine2-dev \
        libxvidcore-dev \
        libx264-dev \
        pkg-config \
        python-dev \
        python-numpy \
        python3-dev \
        python3-numpy \
        python3-matplotlib \
        qv4l2 \
        v4l-utils \
        v4l2ucp \
        zlib1g-dev
}

configure () {
    local CMAKEFLAGS="
        -D BUILD_EXAMPLES=OFF
        -D BUILD_opencv_python2=ON
        -D BUILD_opencv_python3=ON
        -D CMAKE_BUILD_TYPE=RELEASE
        -D CMAKE_INSTALL_PREFIX=${PREFIX}
        -D CUDA_ARCH_BIN=5.3,6.2,7.2
        -D CUDA_ARCH_PTX=
        -D CUDA_FAST_MATH=ON
        -D CUDNN_VERSION='8.0'
        -D EIGEN_INCLUDE_PATH=/usr/include/eigen3 
        -D ENABLE_NEON=ON
        -D OPENCV_DNN_CUDA=ON
        -D OPENCV_ENABLE_NONFREE=ON
        -D OPENCV_EXTRA_MODULES_PATH=/tmp/build_opencv/opencv_contrib/modules
        -D OPENCV_GENERATE_PKGCONFIG=ON
        -D WITH_CUBLAS=ON
        -D WITH_CUDA=ON
        -D WITH_CUDNN=ON
        -D WITH_GSTREAMER=ON
        -D WITH_LIBV4L=ON
        -D WITH_OPENGL=ON"

    if [[ "$1" != "test" ]] ; then
        CMAKEFLAGS="
        ${CMAKEFLAGS}
        -D BUILD_PERF_TESTS=OFF
        -D BUILD_TESTS=OFF"
    fi

    echo "cmake flags: ${CMAKEFLAGS}"

    cd opencv
    mkdir build
    cd build
    cmake ${CMAKEFLAGS} .. 2>&1 | tee -a configure.log
}

main () {

    local VER=${DEFAULT_VERSION}

    # parse arguments
    if [[ "$#" -gt 0 ]] ; then
        VER="$1"  # override the version
    fi

    if [[ "$#" -gt 1 ]] && [[ "$2" == "test" ]] ; then
        DO_TEST=1
    fi

    # prepare for the build:
    setup
    install_dependencies
    git_source ${VER}

    if [[ ${DO_TEST} ]] ; then
        configure test
    else
        configure
    fi

    # start the build
    make -j${JOBS} 2>&1 | tee -a build.log

    if [[ ${DO_TEST} ]] ; then
        make test 2>&1 | tee -a test.log
    fi

    # avoid a sudo make install (and root owned files in ~) if $PREFIX is writable
    if [[ -w ${PREFIX} ]] ; then
        make install 2>&1 | tee -a install.log
    else
        sudo make install 2>&1 | tee -a install.log
    fi

    cleanup --test-warning

}

main "$@"

主要看main函数,

执行setup函数,就是建一个把源码下载下来的存放地址

install_dependencies函数,安装所有需要的依赖项

git_source函数,在特定网址,根据4.4.0还是4.1.1,下载不同的源码,下载的是release版本。

configure,是cmake过程。一系列-D是配置信息,这个编译的是包含CUDA的版本。

出现的问题:

1 git下载太慢,出错,将git的网址替换

https://gitee.com/dhfhub/opencv.git

https://gitee.com/mirrors/opencv_contrib.git下载速度加快。

2 在cmake过程中无法生成makefile文件,各种修改都不行,最后决定使用cmake-gui,在执行build_opencv.sh之前其他都注释掉,只保留安装依赖的函数。然后参考了cmake 的 -D参数,在cmake-gui中配置参数。

安装玩依赖之后的步骤:

(1)操作cmake-gui

安装

sudo apt-get install cmake-gui
  • 打开,也可以在软件中心打开。
cmake-gui

执行步骤我,忘了保存图了,大家可以参考类似的,总之,第一步选择好源码地址和build的地址,第二部点击Configure,等一会,中间空白出会出现红的配置选项,保持默认的配置,然后按照build_opencv.sh文件中的-D 配置信息添加,没有的变量,点击Add Entry按钮,选择是string bool 还是 path变量。第三步,选择好配置信息之后,再次点击Configure,等一会没有错误,在点击Generate.等一会运行结束,此时完成了cmake 的过程。

(2)然后在build目录下执行 make -j4

会出现以下信息,这个代表哪个python2和python3能使用opencv。

--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.17)
--     Libraries:                   /usr/lib/aarch64-linux-gnu/libpython2.7.so (ver 2.7.17)
--     numpy:                       /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.13.3)
--     install path:                lib/python2.7/dist-packages/cv2/python-2.7
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.6.9)


--     numpy:                       /home/bit201/.local/lib/python3.6/site-packages/numpy/core/include (ver 1.19.2)
--     install path:                lib/python3.6/di st-packages/cv2/python-3.6
-- 
--   Python (for build):            /usr/bin/python2.7

在此过程出现的问题有

           (1)opencv 找不到 feature2d/test/test_detectors_regression.impl.hpp 文件

在opencv 的cmake编译的时候遇到 找不到 feature2d/test/test_detectors_regression.impl.hpp文件的问题。

先找这个文件在哪儿:

find -name test_detectors_regression.impl.hpp

发现这个路径在opencv下的 modules 目录下的:

opencv/modules/feature2d/test/test_detectors_regression.impl.hpp

为啥找不到呢,我查看make的运行命令:

make VERBOSE=1

发现报错的gcc执行命令中 -I参数的序列中并没有包含 modules这个路径。

知道问题了就简单了,解决方法就是添加这个参数。

我是通过修改项目的 CMakeLists.txt 来实现的,简单暴力 的那种:

vim opencv/CMakeLists.txt

大概在 567 行作用添加:找到有include_directories关键词的语句后添加

include_directories("modules")

这就完成了!!

         (2)出现fatal error: boostdesc_bgm.i: No such file or directory。

自己去github或是其他网站把这些文件下载下来,然后放到opencv_contrib/modules/xfeatures2d/src目录下就可以了。

下载链接:https://github.com/opencv/opencv_contrib/issues/1301

或是百度云网盘:链接:https://pan.baidu.com/s/1mB1tc2UplD4ZMeSXyuweIw 
提取码:k7y3

在第一次make -j4之前,执行上面两个问题的操作,应该就不会出错了。

[100%] Building CXX object modules/python2/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.o
[100%] Built target opencv_perf_superres
[100%] Building CXX object modules/videostab/CMakeFiles/opencv_test_videostab.dir/test/test_stabilizer.cpp.o
[100%] Linking CXX executable ../../bin/opencv_test_videostab
[100%] Built target opencv_test_videostab
 [100%] Linking CXX shared module ../../lib/cv2.so
[100%] Linking CXX shared module ../../lib/python3/cv2.cpython-36m-aarch64-linux-gnu.so
[100%] Built target opencv_python2
[100%] Built target opencv_python3

(3)执行完make -j4,执行

sudo make install

 sudo ldconfig  

-- Installing: /usr/local/share/opencv4/haarcascades/haarcascade_profileface.xml
-- Installing: /usr/local/share/opencv4/haarcascades/haarcascade_righteye_2splits.xml
-- Installing: /usr/local/share/opencv4/haarcascades/haarcascade_russian_plate_number.xml
-- Installing: /usr/local/share/opencv4/haarcascades/haarcascade_smile.xml
-- Installing: /usr/local/share/opencv4/haarcascades/haarcascade_upperbody.xml
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalcatface.xml
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalface.xml
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_frontalface_improved.xml
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_profileface.xml
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_silverware.xml
-- Installing: /usr/local/bin/opencv_annotation
-- Set runtime path of "/usr/local/bin/opencv_annotation" to "/usr/local/lib:/usr/local/cuda/lib64"
-- Installing: /usr/local/bin/opencv_visualisation
-- Set runtime path of "/usr/local/bin/opencv_visualisation" to "/usr/local/lib:/usr/local/cuda/lib64"
-- Installing: /usr/local/bin/opencv_interactive-calibration
-- Set runtime path of "/usr/local/bin/opencv_interactive-calibration" to "/usr/local/lib:/usr/local/cuda/lib64"
-- Installing: /usr/local/bin/opencv_version
-- Set runtime path of "/usr/local/bin/opencv_version" to "/usr/local/lib:/usr/local/cuda/lib64"

 出现以上信息,说明install成功了。我安装完以后没有添加动态库路径配置,好像自动配置了。如需配置,参考https://blog.csdn.net/qq_30155503/article/details/79419206

(4)执行

$ ls -l /usr/local/lib/python3.6/dist-packages/

看看是否有cv2.cpython-36m-arrch-linux-gnu.so

执行

$ ln -s/usr/local/lib/python3.6/dist-packages/cv2.cpython-36m-arrch-linux-gnu.so cv2.so

在上述命令中将 cv2.cpython-35m-x86_64-linux-gnu.so 的名字改成了 cv2.so,这样在 Python3 中就能直接导入 cv2 了。这时候使用 ls 命令就可以看到 cv2.so 文件了。
如果没有 cv2.so 文件,将不能导入 cv2 。

(5)测试opencv

/usr/bin/python3
import cv2
cv2.__version__

 注:

默认的python,不管是python2还是python3,安装路径为:

(1)
usr/bin   下是可执行文件
usr/lib/python3.6   库文件
usr/share/python3.6  默认配置文件

usr/lib/python3.6/dist-packages 下有板子自带的opencv4

(2)
自己安装的东西,一般安装在
usr/local/bin
usr/local/lib
usr/local/share


usr/local/lib/python3.6/site-packages 下是我自己编译的opencv4, 但是编译opencv的python3的解释器,是/usr/bin/python3 (ver 3.6.9),应该是默认的python3

(3)
查看一个目录下,python命令指向
ls -l /usr/bin | grep python

删除软链接
sudo rm /usr/bin/python 

建立新链接
sudo ln -s /usr/bin/python3.6 /usr/bin/python
目的是在终端直接输入python时,使用的是哪一个python

(4)查看PATH中的变量
echo $PATH

(5)在 linux 里设置环境变量的方法 ( export PATH )
如果使用源码包安装的软件,在安装完成后一般情况下要设置该软件命令执行的路径,那就是 PATH 变量。如何来设置 PAHT变量呢?我们又三种方法实现
   
    1.直接使用 export 命令 (我们以 mysql 服务举例说明)
          [root@liyao ~]# export PATH=$PATH:/usr/local/mysql/bin
查看是否已经设置好,可以使用命令 export 命令来查看,也可以直接$#变量名#来查看
           [root@liyao ~]# echo $PATH


 
需要注意: 直接使用 export 设置的变量都是临时变量,也就是说退出当前的 shell ,为该变量定义的值便不会生效了。如何能让我们定义的变量永久生效呢?那就看我们的第二种定义的方式
    
      2. 修改 /etc/profile
          [root@liyao ~]# vi /etc/profile
            export PATH=$PATH:/usr/local/mysql/bin  # 在配置文件中加入此行配置
需要注意的是:修改完这个文件必须要使用 以下命令在不用重启系统的情况下使修改的内容生效
           [root@liyao ~]# source /etc/profile
或者是:
           [root@liyao ~]# . /etc/profile
 
            [root@liyao ~]# echo $PATH
  /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
# 配置已经生效

          3. 修改 .bashrc 文件是在当前用户 shell 下生效
                 # vi /root/.bashrc?在里面加入:
                  export PATH=$PATH:/usr/local/mysql/bin
修改这个文件之后同样也需要使用 source 或者是 . 使配置文件生效。
再来使用 echo $PATH看下变量是否生效
                  [root@liyao ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin

查看python指向命令时,类似这张图, 

安装tensorflow(非虚拟环境)

参考https://blog.csdn.net/Leo_whj/article/details/108710624

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值