目录
前言
一,yolov5 v6.1训练(主机windows)
1.准备好pycharm,anaconda。
2.在anaconda中创建python虚拟环境
3.下载yolov5源码(记住自己选择的版本)
4.在pytorch中验证pytorch与cuda是否成功
5. 在创建的虚拟环境中安装源码的requirment所需依赖
问题记录:
6.准备数据集
7.训练数据集
8.主机上推理
二,tensorttx部署
1.查看nano上的配置
2.准备.wts文件
3.运行.wts文件生成.engine
4.deppstream加速部署
做这个项目的时候,考虑到nano性能不足,于是在主机(windows)上训练,然后再将模型部署到jetson nano上。但是模型训练好后始终没有找到满意的方法,将模型文件移植到Nano上运行。后来随着搜索慢慢了解到了TensorRT,然后再接触到了大佬在GitHub上传的tensorrtx,让我一个对tensorrt和cuda编程不是很懂的人,也能使用TensorRT部署。(后续熟悉掌握再更新教程,现在只做问题记录)
开始学习的时候,跟着炮哥用的yolov5 v5.0版的(初学者建议直接看参考文章的第一个链接,从下源码到训练数据集,炮哥讲得很细)。此时我再回首时,yolov5 v6.0、v6.1都已出来。秉着有最新的用最新的原则,就以v6.1版本为教程(yolov5 5.0和yolov5 6.0目录结构特性都有所不同,习惯5.0的,还是建议看炮哥)。当然主要也是yolov5 v6版本有我想要的特性,导出的onnx模型可直接被opencv dnn加载,还有更轻便的yolov5 nano迷你版pt模型等等。
(4.13更新)前排提醒,tensorrtx最高目前只支持yolov5-6.0版本,所以想用tensorrtx加速,请换6.0的版本。6.0的windows训练推理过程和6.1一样,也可参考如下6.1的训练过程。
pycharm官方网址:下载地址
anaconda官方网址:下载地址
pycharm社区版用来训练运行深度学习应该够用,annaconda直接下载就好。安装过程简单,不作过多赘述。
记住anaconda安装位置。
annconda安装完成后,cmd终端查询是否安装成功
conda -V
①安装成功,则创建自己的虚拟环境。(yolov5 v6.1要求 Python>=3.7,PyTorch>=1.7)
#conda create -n 虚拟环境名 python=所需版本
conda create -n yolov5_6.1 python=3.8
②终端输入activate 进入自己环境
③终端输入nvidia-smi,查看电脑英伟达显卡cuda最高支持版本
④pytorch官网选择合适的版本,复制红框中的命令
⑤在虚拟环境中下载,着一步命令在安装pytorch的同时,也将cuda'安装
常用conda命令
#激活环境
activate 环境名
#退出环境
deactivate 环境名
#下载
conda install
#查看所有用conda install命令安装的包
conda list
#删除当前环境中的包
conda remove 包名
#删除环境
conda remove --name 环境名 –all
①github下载地址,选择自己想要的版本
②yolov5初始权重下载地址,根据自己的需求下载合适版本
③考虑部署Nano,能小就尽量小,所以我选择下载yolov5n.pt作为初始权重
①打开pycharm,导入下载yolov5源码
②导入虚拟环境,虚拟环境在之前安装的anaconda路径中
③在源码根目录新建main文件,添加以下代码,运行显示如下结果。则安装成功
import torch
print(torch.cuda.is_available())
print(torch.backends.cudnn.is_available())
print(torch.cuda_version)
print(torch.backends.cudnn.version())
①在源码解压目录,搜索cmd,回车打开终端
②进入环境,保证网络畅通,下载依赖
activate yolov5_6.1
pip install -r requirements.txt
①安装pycocotools时会报错没有找到.whl文件,此时求快的话将其注释掉,然后运行源码训练就行,若担心则需要在搜索pycocotools手动安装下载。
yolov5 v6.1直接注释了(捂脸笑)
勾选数据集比较麻烦,建议直接网上下载划分好的yolo数据集
想要自己制作的话,转参考博客第一个链接
问题记录:
报错信息:UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 125: illegal multibyte sequence
解决办法:读取文件所用格式 不对 ,在读取文件时,设置utf-8编码读取
in_file = open('VOCdevkit/VOC2007/Annotations/%s.xml' % image_id,encoding="utf-8")
①准备完数据集此时,应该有一个如下目录结构包含数据集的文件夹(yolo标准的格式)。
②修改cfg和data配置yaml文件
②-1,修改data的yaml文件,复制yolov5 6.1源码data目录下的VOC.yaml文件,粘贴在data目录下改名,然后对yaml文件进行更改。将数据集路径、数据集种类和分类名改为自己数据集的对应的数据。我找的一个垃圾分类的数据集,有9种分类如下图,分类名顺序和(自己的yolo数据集分类顺序一致)。
②-2,修改cfg的yaml文件,和上步类似,复制models下的yaml文件,注意选择和自己所下载pt权重对应的yaml文件,我下载的是yolov5n.pt,所以我更改的是yolov5n.yaml文件。
③修改源码根目录下的rain代码,将配置文件改为自己修改的路径。权重文件yolov5n.pt放在根目录。轮数决定训练时间,训练得越久,效果越好。注意batch大小,第一次训练建议直接设置为1,后续可根据自己显存大小调整以加快训练速度。(PS:yolov5 6.1路径前加上了ROOT/,我看着不习惯就删了,作用应该是将代码的相对路径变为运行时的绝对路径)
④开始训练ing
问题记录
ImportError: DLL load failed while importing _ni_label: 页面文件太小,无法完
解决办法:将batch-size调小
⑤训练完成后,生成的pt文件在runs/train/exp15/weights(15是训练第十五轮的意思),如果上次训练中止,还没训练完想接着训练,那么将训练用的pt文件替换为这里的last.pt(训练中止前一轮论训练结果)就行,推理一般就有best.pt.
⑥打开终端,进入tensorboard
tensorboard --logdir=runs/train
⑥-1,点击下方的本地链接,查看训练结果。每一轮的训练结果都在这,可以说非常贴心了
推理就很简单了,只需修改两句detect源码就能运行
最后由于垃圾分类的数据集太差,效果不好,预测图就不展示了。
若不是jetson nano自带的开发套件,普通的ubuntu需要自己选择tensorrt版本下载。
警告一下,目前的tensorrttx还没有出6.1版本的,博主大意了,所以用tensorrttx部署需要使用yolov5-6.0或yolov5-5.0的进行训练导出,训练时注意下载对应的版本权重下载。
操作系统查看命令:lsb_release -i -r
内核版本查看命令:uname -r
驱动版本查看命令:head -n 1 /etc/nv_tegra_release
CUDA版本查看命令:nvcc -V
cuDNN版本查看命令:dpkg -l libcudnn8
opencv版本查看命令:
dpkg -l libopencv / pkg-config opencv --modversion
Tensorrt版本查看:
dpkg -l tensorrt
官方源码及教程:GitHub - wang-xinyu/tensorrtx: Implementation of popular deep learning networks with TensorRT network definition API
问题记录:
Loading weights: ../best.wts
[03/01/2022-18:34:23] [E] [TRT] Parameter check failed at: ../builder/Network.cpp::addConvolutionNd::488, condition: kernelWeights.values != nullptr
yolov5: /home/upre/me/tensorrtx/yolov5/common.hpp:165: nvinfer1::ILayer* convBlock(nvinfer1::INetworkDefinition*, std::map, nvinfer1::Weights>&, nvinfer1::ITensor&, int, int, int, int, std::__cxx11::string): Assertion `conv1' failed.
已放弃
yolov5的版本和tentsor版本没有对应,在github上下载时要选择yolov5标签,下载正确后的源码压缩包有yolov5版本号如:tensorrtx-yolov5-v5.0。下载对应的版本后,报错解决。
官方教程及源码:https://github.com/DanaHan/Yolov5-in-Deepstream-5.0.git
问题记录
不知道是不是为用的yolov5版本有问题,第一部make源码都不行,我的yolov5版本为5.0.网上教程为3.0,3.1的。
问题(1)找不到cuda的库
g++ -c -o yolo.o -Wall -std=c++11 -shared -fPIC -Wno-error=deprecated-declarations -I../includes -I/usr/local/cuda-11.3/include yolo.cpp
In file included from yolo.cpp:24:0:
yoloPlugins.h:28:10: fatal error: cuda_runtime_api.h: 没有那个文件或目录
#include
解决办法1:在主目录的隐藏文件中.bashrc中,添加以下代码,添加完成后,在主目录打开终端输入source ./.bashrc,一般情况就能解决。
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_ROOT=/usr/local/cuda
export PATH=/usr/local/cuda/targets/aarch64-linux/include:$PATH
export PATH=/usr/local/cuda/include:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/include:$LD_LIBRARY_PATH
export CUDA_ROOT=/usr/local/cuda/include
解决办法2:一般情况,解决办法1就能搞定,很不幸,我遇到了不一般的情况。报错的.h文件,我都在/usr/local/cuda/include中找到了,但是它却找不到。感觉还是对这个linux的环境下,编译文件寻找库的原理还不是很懂。之后详细看报错信息发现他是 g++ -I,-I表示它优先在这个文件夹里面寻找库文件。我的jetson nano cuda版本为10.0,所以后面的cuda11.3肯定是找不到,但前面的../includes可以找到,在编译文件的上一层,于是我将/usr/local/cuda/include中所有文件复制到该文件夹中,则解决报错。
解决办法3:更改Makefile文件中的cuda版本,在第23行
CUDA_VER?=10.0
改之前为11.3
问题(2)make时yoloPlugins.h报错
g++ -c -o yolo.o -Wall -std=c++11 -shared -fPIC -Wno-error=deprecated-declarations -I../includes -I/usr/local/cuda-11.3/include yolo.cpp
In file included from yolo.cpp:24:0:
yoloPlugins.h:74:9: error: ‘int YoloLayerV3::enqueue(int, const void* const*, void* const*, void*, cudaStream_t)’ marked ‘override’, but does not override
int enqueue (
^~~~~~~
yoloPlugins.h: In member function ‘virtual nvinfer1::IPluginV2* YoloLayerV3PluginCreator::deserializePlugin(const char*, const void*, size_t)’:
yoloPlugins.h:122:56: error: invalid new-expression of abstract class type ‘YoloLayerV3’
return new YoloLayerV3(serialData, serialLength);
尚未解决,感觉是版本问题,如果看这篇博客的也遇到相同的问题,建议更换yolov5版本为3.0或3.1。
参考博客
https://blog.csdn.net/didiaopao/category_11321656.html?spm=1001.2014.3001.5482
Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件_sinat_28371057的博客-CSDN博客_jetson nano tensorrt加速 yolov5
DeepStream5.0系列之yolov5使用_ZONGXP的博客-CSDN博客_deepstream yolov5