jetson nano上手记录

英伟达Jetson nano A02上手记录

    • 1、 硬件介绍
    • 2、上手使用
      • 1、获取镜像
      • 2、开始使用
      • 3、CUDA和CUDNN配置
      • 4、 opencv测试
    • 3、部署深度学习
      • 1、电源选配
      • 2、增大内存空间
      • 3、资源查看工具
    • 4、跑通darknet
      • 1、前期准备
      • 2、图片检测
      • 3、视频检测
      • 4、csi摄像头检测
      • 5、usb摄像头检测
    • 4、TensorRT优化的-能达到接近30fps!
      • 1、前期准备
      • 2、开始测试tensorRT
      • 3、调用usb摄像头进行检测

本文用于记录本人在使用nano中遇到的问题及解决方案,本文目前用到的镜像及工具软件整理:

「nano工具分享」https://www.aliyundrive.com/s/hEEe9UfsXv1
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

1、 硬件介绍

jetson nano系列一共有三款主要的板卡,分别是jetson nano B01,jetson nano A02还有jetson nano 2GB。其中nano2GB和其他两款主要区别在于内存,也就是RAM上的区别,这让他在跑一些大的模型的时候非常吃力,甚至于都不了,不过除了这一点,其他方面参数都是一样的,英伟达官方也专门针对其出了一系列教程,在知乎及其他一些创客网站上都可找到。

知乎官方教程

jetson nano上手记录_第1张图片

英伟达官方主页

NVD|A英伟达中国知乎主页

通过查阅载板手册,可以很明显看出两块板卡的差异,下面是A02版本的

jetson nano上手记录_第2张图片
下面是B01版本的,其中B01版本的载板好像是和NX是兼容的,可以混用
jetson nano上手记录_第3张图片
或者我们直接去淘宝查询,商家也把参数对比图例举出来了,可以比较方便的看出两者差异。

2、上手使用

1、获取镜像

直接去英伟达官网地址下载,就和电脑更新显卡的驱动一样的位置(英伟达官网地址),选择对应的版本,最新的不一定好,网上资源不一定匹配,**因此选择4.4.1或者4.5.1版本。**这里我用的是4.4.1版本的镜像。

jetson nano上手记录_第4张图片

准备一张sd卡,系统是在sd卡中运行的,sd卡尽量选好一点的,sd卡的好坏对后面系统运行速度有影响,新的TX2-NX模块和NX模块都有硬盘,硬盘的运行速度比sd卡要快很多,但是nano还不支持,所以这里目前还是和树莓派一样使用sd的方式来进行烧录,这里我使用两个工具,分别是格式化和烧录工具。这两个软件都会自动检测盘符,对系统硬盘误操作时会有提示,烧录过程基本按照英文提示来即可,这里不再赘述。

格式化工具

jetson nano上手记录_第5张图片

镜像工具

jetson nano上手记录_第6张图片

硬件安装,注意,这里需要网卡,后面很多资源是从网上配置,网卡可以选择usb或者直接板载接口的,下面是载板示意图
jetson nano上手记录_第7张图片
如果没有网卡需要我们自己选购网卡,下面是USB网卡
jetson nano上手记录_第8张图片
本身的载板也带了一个网卡接口,如下所示
jetson nano上手记录_第9张图片
要是还是没有的话就需要我们自己给他插上网线使用了,下面用B01版本的进行演示(本篇文章对于A02还是B01其实区别不大,基本上可以混用,部分地方的差异我已经标明了

这个是路由器自动配网的,我们输入ifconfig就可以看到网络信息了,通过这个也可以进行ssh的远程连接。
jetson nano上手记录_第10张图片
最后开机,在上述工作做完之后,可以开始上电开机了,这里要注意下,和树莓派不同的在于,nano镜像是ubuntu18.04的系统,和树莓派自己的系统不一样,不带vnc工具,所以最好有个显示屏,外接显示屏可以方便进行一些设置。然后我们就可以开机了,选择一些相关的设置,基本小手点一点,看不懂就默认,一路就完成了。

2、开始使用

换源,这基本是必须操作了,下的镜像源都在国外,因此如果不能科学上网就只能gg了。打开命令行进行换源操作如下:
备份软件源

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

编辑源,gedit是linux系统文本编辑的默认编辑器,这里可以自由选择想要的,比如vim,nano之类的

sudo gedit /etc/apt/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

如下所示
jetson nano上手记录_第11张图片
更新完软件源后使用更命令对软件更新:

sudo apt-get update
sudo apt-get full-upgrade

jetson nano上手记录_第12张图片

下面我们就可以开始来安装一些需要的软件了,用来帮助我们开发,体验笔记本电脑的感觉:

  • 远程工具:这里比较推荐nomachine点击进入下载页面,选择armv8,deb的包,安装了之后就可以向vnc一样,先用扫描工具扫描局域网下的所有ip,然后按照主机名字就能找到需要的设备了。之后我们在输入账号密码就能远程连接了,嗯,从室友那里借来的副屏可以还回去了。
    jetson nano上手记录_第13张图片
    这里说明下,apt就相当于应用市场,但是应用市场没有的话我们就只能去下载相应的安装包,用其他方式来安装,这里我们用的就是这种方式。

  • QQ:个人觉得QQ还是很有必要的hh,传文件方便一点,当然我们也可以用ssh的方式来传输文件,这都不影响的,用QQ可以方便我们对遇到的问题及时反馈给万能群友,期望获得回答。点击进入下载页面风格比较古老,用起来别有一番风味。
    jetson nano上手记录_第14张图片

  • vscode:宇宙最强编译器还是很需要的,点击进入下载页面,经过这三个下载我们也大概明白怎么安装使用deb包的软件了,百度搜索对应软件(nano进入浏览器要先修改搜索引擎),寻找符合要求的包,下载下来,命令行进入安装包所在的文件夹:

sudo dpkg -i xxxx.deb

当然,我们也不用全记住,包的名字都老长了,我们输几个字母,之后按下Tab键自动补全就OK了。

jetson nano上手记录_第15张图片

3、CUDA和CUDNN配置

下面是深度学习的一些环境了,深度学习需要算力的支撑,英伟达的显卡是比较支持的,很多开源的项目也都有使用相关板卡测试作为一项参数。镜像自带python环境,同时镜像中也已经存在了opencv环境了,我们输入:

python3

之后

import cv2
cv2.__version__

就可以打印opencv的版本了。
接下来是cuda和cudnn,进入命令行工具,输入:

gedit ~/.bashrc

在末尾添加:

export PATH=/usr/local/cuda-10.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_ROOT=/usr/local/cuda

如下所示
jetson nano上手记录_第16张图片
之后我们保存退出,输入:

source .bashrc

这一步一定不要忘了,不然就没有成功哦。
jetson nano上手记录_第17张图片

nvcc -V

就会打印出版本号了,4.4.1的应该是10.2,其他的不清楚,还没试过。
jetson nano上手记录_第18张图片

4、 opencv测试

先把pip安装下,pip可是很重要的包管理工具,但是注意和win不同的是我们平时输入的时候都要用pip3来安装,对应Python3

sudo apt-get install python3-pip 

下面来安装csi摄像头驱动,使用树莓派摄像头之前需要先安装驱动,有了驱动才能跑的起来,插上摄像头之后查看摄像头是否存在(注意这里不要带电插拔,要插拔也给我先把电断了,不然很容易烧坏摄像头

ls /dev/vid*

就可以查看设备了,返回

/dev/video0

输入

gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e

就可以看到顺利打开摄像头

可以通过下面的代码使用opencv对摄像头查看一段实时视频检测

新建一个csi_test.py文件

import cv2
 
 
def gstreamer_pipeline(
    capture_width=1280,
    capture_height=720,
    display_width=1280,
    display_height=720,
    framerate=60,
    flip_method=0,
):
    return (
        "nvarguscamerasrc ! "
        "video/x-raw(memory:NVMM), "
        "width=(int)%d, height=(int)%d, "
        "format=(string)NV12, framerate=(fraction)%d/1 ! "
        "nvvidconv flip-method=%d ! "
        "video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
        "videoconvert ! "
        "video/x-raw, format=(string)BGR ! appsink"
        % (
            capture_width,
            capture_height,
            framerate,
            flip_method,
            display_width,
            display_height,
        )
    )
 
 
def show_camera():
    cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)
 
    while cap.isOpened():
        flag, img = cap.read()
        cv2.imshow("CSI Camera", img) 
        if cv2.waitKey(1) == ord('q'):  # 按下 q 键,退出
            break
    cap.release()
    cv2.destroyAllWindows()  
 
if __name__ == "__main__":
    show_camera()

如果是普通的USB摄像头的话,直接使用opencv的方法就可以了,是免驱的,驱动代码如下:

import cv2
import numpy
 
cap = cv2.VideoCapture(1)  #调整参数实现读取视频或调用摄像头
while 1:
    ret, frame = cap.read()
    cv2.imshow("cap", frame)
    if cv2.waitKey(100) & 0xff == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

opencv的部分就到这里了,后面还将继续分享一些opencv的应用。

3、部署深度学习

1、电源选配

这里特别强调,一定要准备一个好的电源,nano推荐使用5V4A的电源,使用DC口供电,usb供电的话供电能力有限,跑这样计算的时候容易掉电死机,不对,应该是基本都会掉电死机,十分痛苦,所以墙裂建议选购一个电源。

jetson nano上手记录_第19张图片
上面的这种就行,19RMB,可以满足需求。

2、增大内存空间

下面介绍下我在使用过程中尝试的两种方法,我主要尝试了darknet和trt加速的yolo

参考链接:Jetson nano从烧录系统到DeepStream+TensorRT+yolov5检测CSI摄像头视频

先提一个增加内存的操作吧,经过我实测,如果只是测试darknet的话,是没有什么问题的,不扩容也能正常跑,就是这个帧率,2-3帧的样子吧,后面我看到群里有人说用trt加速可以加速十倍,好家伙,我一测试果然逼近30了,真牛啊。当然,前提是要扩容,不然跑起来很容易就被keil掉,这就是内存不足的原因了,同时建议这个时候nano也不要开太多应用。

我实测使用A02来增加内存的命令如下:

sudo fallocate -l 4G /var/swapfile
sudo chmod 600 /var/swapfile
sudo mkswap /var/swapfile
sudo swapon /var/swapfile
sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'

当然,如果是B01版本,也可以使用上面文章中推荐的:

sudo vim /etc/systemd/nvzramconfig.sh

然后修改

mem=$((("${totalmem}" / 2 / "${NRDEVICES}") * 1024))

mem=$((("${totalmem}" * 2 / "${NRDEVICES}") * 1024))

注意这个步骤完成之后需要重新启动板子才行
jetson nano上手记录_第20张图片

3、资源查看工具

之后可以安装一个资源查看工具:

首先是jtop的依赖项安装:

sudo apt-get install git cmake
sudo apt-get install python3-dev
sudo apt-get install libhdf5-serial-dev hdf5-tools
sudo apt-get install libatlas-base-dev gfortran

安装jtop,使用pip安装,前面pip我们已经装过了,这里不在赘述

sudo -H pip3 install -U jetson-stats

运行jtop服务

sudo systemctl restart jetson_stats.service

之后我们每次需要使用jtop,在命令行输入:

jtop

好的,经过上面的操作,我们已经完成前期的基本准备工作了。

4、跑通darknet

1、前期准备

首先还是从git上获取代码:

git clone https://github.com/AlexeyAB/darknet.git

这里我使用的是克隆命令,当然如果一直克隆不下来,可以选择电脑本地下载,在通过QQ,远程工具,ssh等方式传输到nano上面。之后我也会提供本文我用到的所有工具。

修改Makefile文件:

vi Makefile

修改几个参数,因为我们是有CUDA,CUDNN,OPENCV也是预装的,所以这些值修改下。

GPU=1 CUDNN=1 OPENCV=1 LIBSO=1

修改效果如下所示

按"Esc"输入“:wq”保存退出

输入完之后就可以进行编译了,输入

make -j

这里需要一段时间,中间会出现一些警告,但是无所谓了,只要不出现红色的报错都没什么大问题。

之后输入:

./darknet

可以看到结果如下,这样是没什么问题的

下载训练所需要的权重

wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights

还是一样的,有下载不来的,可以去网页下载,链接下载地址
jetson nano上手记录_第21张图片
下载完成之后解压放到同一个文件夹即可。(电脑本地下载在传输过去是比较方便的

2、图片检测

文件夹data里面有个狗的图片,很经典的,可以来试试,当然你也可以使用其他图片。

./darknet detect cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg

这里跑完后极有可能出现这样的报错:

Failed to load module "canberra-gtk-module"

安装这个模块即可

sudo apt install libcanberra-gtk0 libcanberra-gtk-module

再次执行图片检测命令就不会报错了,检测效果如下所示

3、视频检测

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/test_video.mp4

这里要注意,data文件夹要事先准备一个视频进去

4、csi摄像头检测

使用CSI摄像头前,要安装GStreamer

sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo apt-get update
sudo apt-get install gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev 

输入命令检测

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=30/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink"

5、usb摄像头检测

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -c 0

经过实测,大概7-9fps的样子,确实不太行,不过基本能跑了。

我靠,后面居然能跑到14fps,还可以啊

4、TensorRT优化的-能达到接近30fps!

1、前期准备

这里特别感谢这位博主的资源tensorRT优化模型做到实时检测

这里需要安装三个包:

1.pycuda =2019.1.2
2.numpy=1.19.5
3.onnx=1.4.1

基本上都可以用pip的方法来安装,但是可能pyuda有点难装,这里我没有出现相关问题,我直接装上了,原博主提供了网盘链接,大家可以参照下。之后也可以看我的大资源包。(本文开头提供的云盘里面都有

#安装pyuda,进入文件安装
cd pycuda-2019.1.2/  
python3 configure.py --cuda-root=/usr/local/cuda-10.2 
sudo python3 setup.py install

#安装numpy
pip3 install Cython
pip3 install numpy

#安装onnx=1.4.1
sudo apt-get install protobuf-compiler libprotoc-dev 
pip3 install onnx==1.4.1

上述安装过程中可能会出现一些问题,这里我提出的解决方案就是复制错误信息,然后去搜素,一般是缺了什么包,基本都能修正过来。

2、开始测试tensorRT

从git上下载代码

git clone https://github.com/jkjung-avt/tensorrt_demos

下不下来:1.换网,多次测试表明,手机热点是最佳选择。2.直接浏览器下载,3。直接从我的资源包里面找。(这个包有180多m,下不下来很正常,建议电脑本地下载然后传过去

下载权重文件

cd yolo

进入后可以通过这个命令下载权重文件

sh download_yolo.sh

这里不知道为啥,我运行了没反应,有知道的老哥可以评论区教教我。(直接从前面的darknet下载的yolov4-tiny权重复制过来使用

但是其实也没啥问题,我们上一个darknet不是下了权重文件吗,直接从上一个copy过来就行了,hhh。

返回上一级编译

cd ..

进入下面的文件夹编译

cd plugins
make

生成onxx文件

这里首先还是进入yolo文件夹

python3 yolo_to_onnx.py -m yolov4-tiny

执行之后生成一个.onxx的文件(这里如果编译失败,请检查里面的readme文件,根据要求安装onxx的版本)

比如这里说需要安装1.9.0的

那就按照要求安装1.9.0的即可

最后再次执行,可以看到生成的onxx文件了

生成trt文件

python3 onnx_to_tensorrt.py -m yolov4-tiny

执行之后就能看到最终的.trt文件了
jetson nano上手记录_第22张图片

这里要特别注意:这个转化过程特别耗内存,尽量关闭其他应用,浏览器也可以关掉了,前面说的扩展内存一定要做,不然就会卡死,最后kill掉。整个过程大概几分钟,可能一分钟吧,nano进入卡死状态,不要着急,等一等就好了。

3、调用usb摄像头进行检测

先要进入最开始的文件夹,就是yolo的上一级

cd ..

使用下面的命令

python3 trt_yolo.py --usb 0 -m yolov4_tiny

这里我最后跑到了28到29的样子,还不错,目标检测就这样了,后面将分享一些使用自己训练的模型来部署的案例。

你可能感兴趣的:(小白的深度学习笔记,arm,目标检测,深度学习,嵌入式硬件)