本文用于记录本人在使用nano中遇到的问题及解决方案,本文目前用到的镜像及工具软件整理:
「nano工具分享」https://www.aliyundrive.com/s/hEEe9UfsXv1
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
jetson nano系列一共有三款主要的板卡,分别是jetson nano B01,jetson nano A02还有jetson nano 2GB。其中nano2GB和其他两款主要区别在于内存,也就是RAM上的区别,这让他在跑一些大的模型的时候非常吃力,甚至于都不了,不过除了这一点,其他方面参数都是一样的,英伟达官方也专门针对其出了一系列教程,在知乎及其他一些创客网站上都可找到。
知乎官方教程
英伟达官方主页
NVD|A英伟达中国知乎主页
通过查阅载板手册,可以很明显看出两块板卡的差异,下面是A02版本的
下面是B01版本的,其中B01版本的载板好像是和NX是兼容的,可以混用
或者我们直接去淘宝查询,商家也把参数对比图例举出来了,可以比较方便的看出两者差异。
直接去英伟达官网地址下载,就和电脑更新显卡的驱动一样的位置(英伟达官网地址),选择对应的版本,最新的不一定好,网上资源不一定匹配,**因此选择4.4.1或者4.5.1版本。**这里我用的是4.4.1版本的镜像。
准备一张sd卡,系统是在sd卡中运行的,sd卡尽量选好一点的,sd卡的好坏对后面系统运行速度有影响,新的TX2-NX模块和NX模块都有硬盘,硬盘的运行速度比sd卡要快很多,但是nano还不支持,所以这里目前还是和树莓派一样使用sd的方式来进行烧录,这里我使用两个工具,分别是格式化和烧录工具。这两个软件都会自动检测盘符,对系统硬盘误操作时会有提示,烧录过程基本按照英文提示来即可,这里不再赘述。
格式化工具
镜像工具
硬件安装,注意,这里需要网卡,后面很多资源是从网上配置,网卡可以选择usb或者直接板载接口的,下面是载板示意图
如果没有网卡需要我们自己选购网卡,下面是USB网卡
本身的载板也带了一个网卡接口,如下所示
要是还是没有的话就需要我们自己给他插上网线使用了,下面用B01版本的进行演示(本篇文章对于A02还是B01其实区别不大,基本上可以混用,部分地方的差异我已经标明了)
这个是路由器自动配网的,我们输入ifconfig就可以看到网络信息了,通过这个也可以进行ssh的远程连接。
最后开机,在上述工作做完之后,可以开始上电开机了,这里要注意下,和树莓派不同的在于,nano镜像是ubuntu18.04的系统,和树莓派自己的系统不一样,不带vnc工具,所以最好有个显示屏,外接显示屏可以方便进行一些设置。然后我们就可以开机了,选择一些相关的设置,基本小手点一点,看不懂就默认,一路就完成了。
换源,这基本是必须操作了,下的镜像源都在国外,因此如果不能科学上网就只能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
sudo apt-get update
sudo apt-get full-upgrade
下面我们就可以开始来安装一些需要的软件了,用来帮助我们开发,体验笔记本电脑的感觉:
远程工具:这里比较推荐nomachine点击进入下载页面,选择armv8,deb的包,安装了之后就可以向vnc一样,先用扫描工具扫描局域网下的所有ip,然后按照主机名字就能找到需要的设备了。之后我们在输入账号密码就能远程连接了,嗯,从室友那里借来的副屏可以还回去了。
这里说明下,apt就相当于应用市场,但是应用市场没有的话我们就只能去下载相应的安装包,用其他方式来安装,这里我们用的就是这种方式。
QQ:个人觉得QQ还是很有必要的hh,传文件方便一点,当然我们也可以用ssh的方式来传输文件,这都不影响的,用QQ可以方便我们对遇到的问题及时反馈给万能群友,期望获得回答。点击进入下载页面风格比较古老,用起来别有一番风味。
vscode:宇宙最强编译器还是很需要的,点击进入下载页面,经过这三个下载我们也大概明白怎么安装使用deb包的软件了,百度搜索对应软件(nano进入浏览器要先修改搜索引擎),寻找符合要求的包,下载下来,命令行进入安装包所在的文件夹:
sudo dpkg -i xxxx.deb
当然,我们也不用全记住,包的名字都老长了,我们输几个字母,之后按下Tab键自动补全就OK了。
下面是深度学习的一些环境了,深度学习需要算力的支撑,英伟达的显卡是比较支持的,很多开源的项目也都有使用相关板卡测试作为一项参数。镜像自带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
source .bashrc
nvcc -V
就会打印出版本号了,4.4.1的应该是10.2,其他的不清楚,还没试过。
先把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的应用。
这里特别强调,一定要准备一个好的电源,nano推荐使用5V4A的电源,使用DC口供电,usb供电的话供电能力有限,跑这样计算的时候容易掉电死机,不对,应该是基本都会掉电死机,十分痛苦,所以墙裂建议选购一个电源。
下面介绍下我在使用过程中尝试的两种方法,我主要尝试了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))
之后可以安装一个资源查看工具:
首先是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
好的,经过上面的操作,我们已经完成前期的基本准备工作了。
首先还是从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
还是一样的,有下载不来的,可以去网页下载,链接下载地址
下载完成之后解压放到同一个文件夹即可。(电脑本地下载在传输过去是比较方便的)
文件夹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
再次执行图片检测命令就不会报错了,检测效果如下所示
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/test_video.mp4
这里要注意,data文件夹要事先准备一个视频进去
使用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"
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -c 0
经过实测,大概7-9fps的样子,确实不太行,不过基本能跑了。
我靠,后面居然能跑到14fps,还可以啊
这里特别感谢这位博主的资源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
上述安装过程中可能会出现一些问题,这里我提出的解决方案就是复制错误信息,然后去搜素,一般是缺了什么包,基本都能修正过来。
从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
这里要特别注意:这个转化过程特别耗内存,尽量关闭其他应用,浏览器也可以关掉了,前面说的扩展内存一定要做,不然就会卡死,最后kill掉。整个过程大概几分钟,可能一分钟吧,nano进入卡死状态,不要着急,等一等就好了。
先要进入最开始的文件夹,就是yolo的上一级
cd ..
使用下面的命令
python3 trt_yolo.py --usb 0 -m yolov4_tiny
这里我最后跑到了28到29的样子,还不错,目标检测就这样了,后面将分享一些使用自己训练的模型来部署的案例。