本篇文章主要将我拿到Jetson Xavier NX板子后,一系列的操作,中间遇到的困难和疑惑以及解决的方式,知道能够在Jetson Xavier NX上跑出一个自己的基于tensorflow2.1的一个目标检测的程序。
一 Jetson Xavier NX开发套件刷机。
1.下载NX开发套件。2.下载烧录工具。3烧录TF卡。4开机启动,并配置。以上这些操作,我没有自己动手,我拿到的是已经完成以上工作的板子,如需以上操作,请参考连接https://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/Leo_whj/article/details/108710624