最近项目有需要,需要接入多路视频,并借助深度学习完成识别。硬件平台为 jetson 系列的nano,上一篇文章已经说明了yolov5的配置方法,不过那一篇是借助miniforge,利用python3.10实现的,之前一直以为是nano自带的3.6.9不可以,经过一番研究发现其实是可以的,只是之前方法不对,今天主要是介绍从开始下载系统,到能够跑通多路视频,做一个比较详细的记录。
一、系统环境搭建
1、烧写系统,目前为止有两个办法,一种是借助内存卡和烧写软件,去官网下载好系统镜像,然后将镜像烧写进内存卡,这个方法适用于后续批量化生产,会比较快一些;另外一种办法是借助另外一台电脑,利用linux电脑或者虚拟机(需注意必须是ubuntu18.04以下,目前20.04是不支持的),利用英伟达官网提供的sdkmanager,对jetsaon nano进行烧写,烧写完毕后,是自带Deepstream的,比较方便。
下载并安装 JetPack SDK Manager,下载需要 NVIDIA 账户,JDK Manager 可以安装不同版本的 JetPack,本文使用的是 JetPack-4.6.1。平台的环境搭建具体流程可参考这篇下面这篇文章。
sudo dpkg -i sdkmanager_x.x.x-xxxx_amd64.deb
Nvidia Jetson 平台 DeepStream-6.0.1 部署 YoloV5-6.0 实现目标检测_秦至皆木的博客-CSDN博客_error from primary_gie: failed to create nvdsinfer 2、安装相关软件
①更换清华源,将source.list文件先备份下,然后修改里面的内容
sudo chmod -R 777 /etc/apt/
#更换为清华源
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
#更新
sudo apt-get update
②安装pip3
sudo apt-get install python3-pip python3-dev
③安装输入法
#安装必要的软件包
sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4
im-config -s ibus
sudo apt-get install ibus-pinyin
ibus-setup
没有中文选项就重启
然后选择右上角输入法那里得Text entry,添加中文和英文进去
④安装jtop
sudo pip3 install jetson-stats
⑤查看性能模式、查看jetpack版本
sudo nvpmodel -q
sudo apt-cache show nvidia-jetpack
⑥GPU测试
cd /usr/local/cuda-10.2/samples/5_Simulations/nbody
sudo make
./nbody
⑦tensorrt 测试
cd /usr/src/tensorrt/samples
sudo make
⑧安装pytorch==1.8.0,numpy版本最好选择1.19.3
sudo apt-get install libopenblas-base libopenmpi-dev
pip3 install protobuf==3.3.0
sudo pip3 install numpy==1.19.3
pip3 install torch-1.8.0-cp36-cp36m-linux_aarch64.whl
sudo apt-get install libjpeg-dev zlib1g-dev libavcodec-dev libavformat-dev libswscale-dev liblapack-dev libblas-dev gfortran
⑨安装torchvision==0.9.0,pillow 版本最好选择8.4.0
pip3 install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com pillow==8.4.0
export BUILD_VERSION=0.9.0
python3 setup.py install --user
⑩配置yolov5所需库
pip3 install pyyaml
pip3 install tensorboard
pip3 install tqdm
pip3 install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com seaborn
pip3 install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com opencv-python==4.5.1.48
11)安装pycuda,提前下载好pycuda==2019.1.2
python3 configure.py --cuda-root=/usr/local/cuda-10.2
sudo python3 setup.py install
12)摄像头相关
sudo apt install v4l-utils
v4l2-ctl --list-devices
v4l2-ctl --device=/dev/video0 --list-formats-ext
13)增加虚拟内存
在运行某些程序时,会卡死,提前增加swap内存
#1)新增swapfile文件大小自定义
sudo fallocate -l 6G /var/swapfile
#2)配置该文件的权限
sudo chmod 600 /var/swapfile
#3)建立交换分区
sudo mkswap /var/swapfile
#4)启用交换分区
sudo swapon /var/swapfile
#5)自启动启用
sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'
二、使用tensorrt加速
①克隆代码,yolov5(之前已经下好了),两个版本之间注意要对应
yolov5 : git clone https://github.com/ultralytics/yolov5.git
tensorRT : git clone https://github.com/wang-xinyu/tensorrtx.git
②转换模型
1、把tensorrt/yolov5下的gen_wts.py复制到yolov5的文件夹下
2、执行gen_wts.py生成.wts文件。
python gen_wts.py yolov5s.pt
3、到目录tensorrtx下的yolov5文件夹老规矩,创建一个build文件,并进入
mkdir build
cd build
cmake ..
4、将yololayer.h里的CLASS_NUM修改成你的。官方用的是coco数据集,所以默认是80。
5、执行makeFile。(每次修改为CLASS_NUM都要make一次)
make
6、将上一步生成的.wts文件复制到tensorrtx/yolov5里。这一步单纯的是生成.wts文件,后面使用deepstream里面的gen_wtsyoloV5.py软件会生成两个文件,即.cfg 和.wts文件,两个文件都用用处。
7、生成.engine文件
sudo ./yolov5 -s ../yolov5s.wts yolov5s.engine s
如果你训练时是自定义depth_multiple 和 width_multiple就这样写:
sudo ./yolov5 -s ../yolov5.wts yolov5.engine c 0.17 0.25
在tensorrtx 5.0里也更新了yolov5的P6模型:
sudo ./yolov5 -s ../yolov5.wts yolov5.engine s6
8、在samples里有两张测试图片,可以测试一下
sudo ./yolov5 -d yolov5s.engine ../samples
9.也可以运行yoloV5_trt.py测试是否成功
sudo python3 yolov5_trt.py
三、Deepstream配置使用
①模型转换(在电脑上操作或者在Jeston上操作都可以)
#注意deepstream版本,nano上是6.0,这里也要下载6.0
git clone https://github.com/marcoslucianops/DeepStream-Yolo.git
#网址
https://github.com/marcoslucianops/DeepStream-Yolo
cd DeepStream-Yolo/utils
#主要拷贝转换脚本到自己的yolov5项目下即可
cp gen_wts_yoloV5.py ../../yolov5
cd ../../yolov5
#根据自己的权重文件修改
python gen_wts_yoloV5.py -w ./yolov5s.pt -c ./models/yolov5s.yaml
②模型拷贝至Jetson
1.上一步骤运行成功会生成yolov5n.wts 与 yolov5n.cfg 。
2.将2个文件拷贝至Jetson下DeepStream-Yolo 项目下。
③部署模型
git clone https://github.com/marcoslucianops/DeepStream-Yolo.git
#将项目拷贝至deepstream/source下
cp -r DeepStream-Yolo /opt/nvidia/deepstream/deepstream/source
cd /opt/nvidia/deepstream/deepstream/source/DeepStream-Yolo
#这里使用的默认模型
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo
④自训练模型:
修改 config_infer_primary_yoloV5.txt中的num-detected-classes;如果没修改就还是80;
修改 labels.txt;没修改就拷贝coco数据集的内容即可
⑤运行
修改deepstream_app_config.txt 中 config-file=config_infer_primary_yoloV5.txt
#运行deepstream案例
deepstream-app -c deepstream_app_config.txt
首次运行 Build Engine 会比较久,会根据config_infer_primary_yoloV5.txt构建模型;后续可以注释掉,这样就不用每次都重新生成引擎文件了。这里需要注意的是,deepstream6.0版本基本都是这样生成引擎文件的,之前的5.0可能都是先进去tensorrt转换完成拷贝过来,如果6.0这样操作的话,生成的引擎文件复制过来是不能用的,必须用自己生成的。
custom-network-config=yolov5n.cfg
model-file=yolov5n.wts
⑥调用多路摄像头
需要根据实际使用情况去修改deepstream_app_config_yoloV5.txt 文件,关于相关参数分析,可参考博客:
https://blog.csdn.net/u010414589/article/details/115338399
https://blog.csdn.net/lk007cx/article/details/110228243
https://blog.csdn.net/W1995S/article/details/119858078
https://zhuanlan.zhihu.com/p/296314513
https://github.com/marcoslucianops/DeepStream-Yolo
https://blog.csdn.net/qq122716072/article/details/114156647
https://blog.csdn.net/djj199301111/article/details/123628292