Jetson Nano & TX2配置教程

  • Jetson Nano 激活
  • Jetson TX2 烧录
  • 更新系统国内源
  • 安装系统工具jtop
  • 从源代码编译opencv
  • 安装archconda
  • 安装mmdetection



更新于2021年4月10日。本文介绍了Jetson Nano 和 Jetson TX2两种设备的配置教程,前一部分以Jetson Nano为例,后半部分以Jetson TX2为例。这两种设备的配置教程,大体上是相近的。

Jetson Nano 激活

首先,拿到一张64GB/128GB(12GB的卡不够用)的micro-SD card,并进行格式化。SD卡的格式化工具,直接从官网下载即可,使用时选择“快速格式化”。

然后,从Nvidia官网下载你需要的jetson nano镜像。

注意确定安装的jetpack版本,这关系到其自带的cuda版本。简单来说,jetpack4.4以上,只能安装pytorch1.6以上PyTorch for Jetson - version 1.8.0 now available。而且在pytorch1.6环境下保存的模型,没办法在更低版本的pytorch中打开。

旧版本可以从官网JetPack Archive寻找。
最后,根据Nvidia官网教程完成镜像的烧录,大概需要半个小时的时间。

Jetson TX2 烧录

这里给出两个链接,一个是官网链接使用SDK Manager安装Jetson软件,另一个是知乎上的链接Jetson TX2 入门教程(镜像烧写)

更新系统国内源

在使用系统之前,我们先将系统更换为国内安装源。
首先,备份source.list。

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

然后,修改source.list。推荐用gedit,十分方便。如果没有安装的话,需要先安装一下。

sudo apt-get install gedit
sudo gedit /etc/apt/sources.list

接着,替换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

最后,更新软件。update和upgrade的区别可以参考linux命令系列 sudo apt-get update和upgrade的区别。
这一步可能需要花一段时间。

sudo apt-get update 
sudo apt-get upgrade

安装系统工具jtop

Jetson Nano中有个工具jtop, 可以查看CPU和GPU资源,还可以显示系统的jetpack版本,十分好用。
首先,安装pip3.

sudo apt-get install python3-pip

同样的,我们也可以将pip修改为国内源。
第一种方式,长期修改。我以阿里源为例,其他国内源只需要修改链接即可。

pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/

然后,使用pip安装jetson-stats。
第二种方式,一次性修改。我以清华源为例,其他国内源只需要修改链接即可。

sudo pip3 install jetson-stats -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好之后,我们来看一下效果如何。

sudo jtop

从源代码编译opencv

刷机后的Nano已经预装了opencv,但是预装版本不支持CUDA,所以我们还要在Jetson Nano上手动安装OpenCV。

方法一
安装已编译的opencv,简单方便,但是这个版本过低,且不能指定其他版本。

sudo apt-get install opencv-python

方法二
从源代码安装,但是使用别人写好的脚本,如buildOpenCVXaviernano_build_opencv。但是报错之后,可能不知道自己为什么错了,因为脚本不是你自己写的。

方法三
自己从源代码编译安装,有很多坑要踩啊。
不能先安装archconda等虚拟环境管理包,否则会有问题!参考在Jetson Nano中为python3安装OpenCV

  1. 增加交换空间

opencv的编译时生成的中间文件很大,Jetson Nano原始空间放不下。这里介绍一种永久生效的方法。要是只想临时生效,可以参考Enlarge memory swap

查看当前系统的交换空间。

sudo swapon --show

查看内存大小。

free -h

创建用于swap的文件。

sudo fallocate -l 2G /swapfile

设置交换空间。

sudo mkswap /swapfile

激活交换空间。

sudo swapon /swapfile
#为了使这个激活永久有效
sudo gedit /etc/fstab
#粘贴 /swapfile swap swap defaults 0 0

验证增加空间是否有效。

sudo swapon --show
sudo free -h
  1. 安装依赖项
    这个依赖项的要求五花八门,取决于你对功能的要求,这里我只给出我使用的依赖项,参考compile deeplearning libraries for jetson nano。如果遇到包冲突问题,参考aptitude与apt-get解决。
dependencies=(build-essential
              cmake
              pkg-config
              libavcodec-dev
              libavformat-dev
              libopenblas-base
              libopenmpi-dev
              libswscale-dev
              libv4l-dev
              libxvidcore-dev
              libavresample-dev
              python3-dev
              python3-numpy
              libtbb2
              libtbb-dev
              libtiff-dev
              libjpeg-dev
              libpng-dev
              libtiff-dev
              libdc1394-22-dev
              libgtk-3-dev
              libcanberra-gtk3-module
              libatlas-base-dev
              gfortran
              wget
              unzip)

sudo apt install -y ${dependencies[@]}
  1. 下载源代码
    安装所有第三方依赖项后,我们就需要下载OpenCV啦。需要两个压缩包:基本库和其他拓展库。在opencv官网下载你需要的版本。这里以4.4.0版本为例。

在github网址下载opencv-4.4.0.zip,复制下面的网址,在浏览器直接下载。

https://github.com/opencv/opencv/archive/4.4.0.zip

在github网址下载opencv_contrib-4.4.0.zip,复制下面的网址,在浏览器直接下载。

https://github.com/opencv/opencv_contrib/archive/4.4.0.zip

对下载后的opencv-4.4.0.zip和opencv_contrib-4.4.0.zip进行解压缩。
在opencv-4.4.0文件夹下打开命令行,新建一个build文件夹,并切换到build文件夹下。

mkdir build
cd build
  1. 编写cmake配置文件my_cmake.sh
    这里是对opencv和cuda做的一些配置,和依赖库一样也是五花八门,看你的需求吧。这里我给出自己的配置,仅供参考。

新建脚本文件。

gedit my_cmake.sh

粘贴cmake命令。

cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D WITH_CUDA=ON \
      -D CUDA_ARCH_PTX="" \
      -D CUDA_ARCH_BIN="5.3,6.2,7.2" \
      -D WITH_CUBLAS=ON \
      -D WITH_LIBV4L=ON \
      -D BUILD_opencv_python3=ON \
      -D BUILD_opencv_python2=OFF \
      -D BUILD_opencv_java=OFF \
      -D WITH_GSTREAMER=OFF \
      -D WITH_GTK=ON \
      -D BUILD_TESTS=OFF \
      -D BUILD_PERF_TESTS=OFF \
      -D BUILD_EXAMPLES=OFF \
      -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.4.0/modules \
      ..

具体每个选项的介绍,可以参考Jetson Nano 从头配置OpenCV+CUDA+QT完整流程。

执行make命令。

sh ./my_cmake.sh

在我们进入实际编译步骤之前,请确保检查CMake的输出!参考树莓派安装OpenCV-4.1.0及Contrib

  1. 开始构建
$ make -j4

-j4表示4个CPU核心同时运行。
查看CPU核心数,参考Ubuntu 18.04配置OpenCV 4.2.0。

nproc

经过漫长的等待,约两小时。
可能遇到错误,这是网络问题导致部分依赖包没有下载。
错误一
参考Jetson Nano 从头配置OpenCV+CUDA+QT完整流程中相关部分的解决方案。

fatal error: boostdesc_bgm.i: No such file or directory

错误二

fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory

参考opencv安装opencv_contrib出现无法打开包括文件: “opencv2/xfeatures2d/cuda.hpp”中的解决方案。记得加在最开始,不要加在最后面!

错误三

CMakeFiles/example_gpu_surf_keypoint_matcher.dir/surf_keypoint_matcher.cpp.o: In function `main':
surf_keypoint_matcher.cpp:(.text.startup.main+0x352): undefined reference to `cv::cuda::SURF_CUDA::SURF_CUDA()'
surf_keypoint_matcher.cpp:(.text.startup.main+0x579): undefined reference to `cv::cuda::SURF_CUDA::operator()(cv::cuda::GpuMat const&, cv::cuda::GpuMat const&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, bool)'
surf_keypoint_matcher.cpp:(.text.startup.main+0x60d): undefined reference to `cv::cuda::SURF_CUDA::operator()(cv::cuda::GpuMat const&, cv::cuda::GpuMat const&, cv::cuda::GpuMat&, cv::cuda::GpuMat&, bool)'
surf_keypoint_matcher.cpp:(.text.startup.main+0x6af): undefined reference to `cv::cuda::SURF_CUDA::defaultNorm() const'
surf_keypoint_matcher.cpp:(.text.startup.main+0x7ca): undefined reference to `cv::cuda::SURF_CUDA::downloadKeypoints(cv::cuda::GpuMat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&)'
surf_keypoint_matcher.cpp:(.text.startup.main+0x7ea): undefined reference to `cv::cuda::SURF_CUDA::downloadKeypoints(cv::cuda::GpuMat const&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&)'
surf_keypoint_matcher.cpp:(.text.startup.main+0x800): undefined reference to `cv::cuda::SURF_CUDA::downloadDescriptors(cv::cuda::GpuMat const&, std::vector<float, std::allocator<float> >&)'
surf_keypoint_matcher.cpp:(.text.startup.main+0x812): undefined reference to `cv::cuda::SURF_CUDA::downloadDescriptors(cv::cuda::GpuMat const&, std::vector<float, std::allocator<float> >&)'
collect2: error: ld returned 1 exit status
samples/gpu/CMakeFiles/example_gpu_surf_keypoint_matcher.dir/build.make:132: recipe for target 'bin/example_gpu_surf_keypoint_matcher' failed
make[2]: *** [bin/example_gpu_surf_keypoint_matcher] Error 1

参考源码编译安装OpenCV4.5+ CUDA11 带python 遇到的错误总结中的解决方案。

  1. 安装
make install
  1. 验证
$ python3 -c "import cv2; print(cv2.__version__)"
4.4.0

安装archconda

anaconda是深度学习的好工具。在arm64框架平台上,对应有一个archconda,是大神编译好的工具,我们可以直接使用。
从大神github网址上下载sh文件,然后就像在普通linux上安装即可。

如果需要在虚拟环境中使用opencv,有两种方法。
方法一
链接,参考Installing OpenCV 4 on NVIDIA Jetson Nano

# Go to the folder where OpenCV's native library is built
cd /usr/local/lib/python3.6/site-packages/cv2/python-3.6
# Rename
mv cv2.cpython-36m-xxx-linux-gnu.so cv2.so
# Go to your virtual environments site-packages folder if previously set
cd ~/env/lib/python3.6/site-packages/
# Or just go to your home folder if not set a venv site-packages folder
cd ~
# Symlink the native library
ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.so cv2.so

方法二
拷贝,参考How to check for successful install including in virtualenv. #32

# Go to the folder where OpenCV's native library is built
cd /usr/local/lib/python3.6/site-packages/cv2/python-3.6
# copy
cp usr/local/lib/python3.6/site-packages/cv2/python-3.6 [path to venv]/lib/python3.6/site-packages/cv2/python-3.6

在虚拟环境中导入cv2,可能会遇到下面一个错误。

from .cv2 import *
ImportError: numpy.core.multiarray failed to import

这主要是在编译opencv的时候使用的numpy,和虚拟环境中安装的numpy版本不一致,根据安装时的numpy版本修改一下即可,参考cv2: numpy.core.multiarray failed to import
查看编译opencv的时候使用的numpy版本,可以进入系统自带的python环境,输出numpy版本号。

>>> import numpy
>>> print(numpy.__version__)

还有可能遇到另一个问题。

>>> import numpy
>>> Illegal instruction (core dumped)

这是numpy版本的问题,将numpy=1.19.5降级到numpy=1.19.4或更低版本即可,参考Illegal instruction (core dumped)

安装mmdetection

这一部分使用的是Jetson TX2,参考在Jetson tx2安装 mmdetection环境。

这里我遇到了一个小问题,TX2接上网线但是连不上网,解决方法参考Jetson TX2 有线网络网线不识别,灯不亮问题。

其实,安装完opencv后,要运行mmdetection的代码,还有4个重要的包需要安装:torch,torchvision,mmcv-full,mmdet。

  1. 安装torch

去NVIDIA官网下载配套的版本PyTorch for Jetson - version 1.7.0 now available
注意查看自己的Jetpack版本号,4.4要用torch1.6,否则会报错cudnn版本不合适。
查看Jetson设备的信息可以用之前提到的jtop,也可以使用查询Jetson设备与开发环境版本的基础信息
下载好pytorch之后,激活虚拟环境,使用pip命令安装。

pip install torch-1.6.0-cp36-cp36m-linux_aarch64.whl

有可能遇到问题

OSError: libmpi_cxx.so.20: cannot open shared object file: No such file or directory

参考Cannot install pytorch,安装两个依赖。

sudo apt-get install libopenblas-base libopenmpi-dev
  1. 安装torchvision

需要根据torch版本来选择对应版本的torchvision进行安装,参考Jetson Nano 安装torch和torchvision

git clone --branch v0.7.0 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.7.0
sudo python setup.py install
  1. 安装mmcv-full和mmdet

这里的教程跟mmdetection官方教程来走就好了。

安装mmcv-full

git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
MMCV_WITH_OPS=1 pip install -e .  # 安装full版本

安装mmdetection

git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -r requirements/build.txt
pip install -v -e .

注意

  • mmcv-full和mmdet的版本号要对应,官方教程已经给出来了对应关系。
  • 安装mmcv-full,而不是mmcv,否则后面可能会有奇怪的错误。
MMCV_WITH_OPS=1 pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 在使用pip命令时,后面跟上国内源,这样下载其他依赖包会更快一些。
  • 上面两个包安装完,也要花挺长时间的。
  • 有可能遇到安装matplotlib,scipy,pillow等包的时候,与已经安装的numpy版本冲突。这种情况下不能修改numpy的版本,要修改其他包的版本。
  • 可以使用下面这条命令,查看哪个版本的包时候你的numpy,包和版本号可以更改,参考conda查看某个安装包的依赖项。
conda search scipy=1.0.0 -info
  1. 测试

按照官网的代码,做了一些修改。

from mmdet.apis import inference_detector, init_detector, show_result_pyplot

config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
# download the checkpoint from model zoo and put it in `checkpoints/`
# url: http://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
device = 'cuda:0'
# init a detector
model = init_detector(config_file, checkpoint_file, device=device)
# inference the demo image
result = inference_detector(model, 'demo/demo.jpg')
# show the results
show_result_pyplot(model, 'demo/demo.jpg', result, score_thr=0.3)