前言
自我感觉写得较为详细了,如果有不对的地方,或者报错的地方,可以私信我,我尽力提供帮助。
当然希望你是确定自己完整了阅读了这篇小博客,以及通过搜索引擎查询了相关问题,仍然没有解决的话,那么我觉得我们是可以进行交流的。
cuda部分环境的安装,没有做记录(不太好重装,下次换电脑的时候再写),当下可能还是需要各位朋友自己去准备一下,我在博客中也给出了相关的文章可供参考。
笔者此次所编写的为系列文章,涵盖了Yolov5的环境安装、项目运行、模型训练、模型识别、模型部署等一系列文章。
笔者电脑相关环境:
- Windows11
- RTX 3050,(最高支持cuda 11.7,所以我装的是11.7版本的,不装也可以跑的,可以跑CPU版本,后续有说)查询版本命令:
nvidia-smi
- anaconda版本:
conda -V
(我的版本:conda 23.5.0)
安装教程参考:Anaconda超详细安装教程(Windows环境下)
基本使用:anaconda下载及安装 - PyCharm 2023,这个要是也没,咱就说,还是先别看文章啦,
- Yolov5-6.1
一、项目准备
1.1、下载项目
yolov5s.pt是权重文件,后面需要用到的,先下载下来,后面直接放到项目中(也可以不下载哈,后面有命令也可以自动下载下来,不过看网速)
1.2、使用 conda 创建隔离环境
conda create -n yolov5_6.1_demo_py3.8 python=3.8
备注:-n 就是指定名称,python=3.8 就是指定python版本为3.8。
显示如上输出,则表示输出成功。
基本命令:
conda active [name] #根据环境名称激活某个环境
conda deactivate [name] #根据环境名称退出某个环境
conda env list # env list
补充:第一张图使用的是windows powershell,但是发现激活后,没环境前缀,又换回到cmd啦,成果激活会显示环境名称的前缀。
1.3、使用 PyCharm 打开下载的项目
备注:解压后,我修改了项目文件夹名称。
使用 PyCharm 打开项目时,会弹出一个创建虚拟环境的窗口,点击取消
因为我们此前已经使用conda创建了一个隔离环境啦。
打开设置,添加我们之前创建的环境:
后面就是点击ok,点击应用。
成功的话, pycharm的右下角会显示你选中的环境。
1.4、下载依赖
pip install -r requirements.txt # install
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
网好随意,下面的命令是指定了豆瓣的镜像源,相对友好些。下载失败的话,多试几次就好。
显示如上图的输出,则是下载完成,如果失败,可重试几次。
二、项目运行
根据上面的步骤,基本环境应该是没啥问题啦吧,真要有,真没法啦,把能写的都写啦,完全是教小白啦。
想必大家看过yolov5,必然是见过下面这张图的。
下面就来看看如何识别吧。(关于项目基础结构和代码,后续会谈到的,目前重点是先跑起来)
2.1、运行 detect.py 代码
python detect.py --source 0 # webcam
img.jpg # image
vid.mp4 # video
path/ # directory
path/*.jpg # glob
'<https://youtu.be/Zgi9g1ksQHc>' # YouTube
'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP stream
python detect.py --source data/images/zidane.jpg
# 如果是这么运行的话,它会自己去下载那个yolovs.pt 文件,也可以我们自己直接下好,放进项目中
![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/29672bb80535486c95826feba5eef02d~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1920&h=349&s=350981&e=png&b=2b2b2b)
执行这条命令的时候会自动下载 yolov5.pt
文件,网速好,随意,不然我建议先下载,免得搁这卡好一会。(亲测,无梯子时,网速感人)
可以一早下好,然后放进项目中,指定权重文件
python detect.py --weights weights/yolov5s.pt --source data/images/zidane.jpg
# --weights 就是指定 ps 权重文件的位置,path/**.pt 文件
报错解决:你看到这句话的时候,那么多半也是报错了,你放心,你要踩的坑,我这个周末全踩了一遍。
2.2、报错1:AttributeError: ‘Upsample’ object has no attribute ‘recompute_scale_factor’
#将156、157行代码注释掉
#return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners,
# recompute_scale_factor=self.recompute_scale_factor)
#修改为:
return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
浅浅的说下,没细究,这里的代码是 torch 的源码,网上大多数的说法都是不兼容问题,好奇的朋友可以去查找一番。笔者在这里没有展开篇幅啦。
补充:在这里修改的时候,选让你选择修改当前文件,还是将修改于应用于全部文件。选择this file 即可。
重新运行命令,我们可以在项目中看到,识别结果已经出来啦,yolov5s.pt
文件也被成功下载啦。
补充:不知道细节的朋友有没有看到,我标记了这里默认是使用了 CPU 来进行识别,我们通常都会说,跑xxx算法,要用到GPU才会更快,更xxx样,那么我们该如何修改成使用GPU来进行识别呢?对啦, 这里的原因又是为什么呢?
小小的demo总算是运行完成啦,接下来,来简单说一下项目的基本结构,然后再说明该如何使用GPU来进行识别,这篇文章大概率也就步入尾文了。
2.3、项目基本结构和detect.py参数解读
detect.py
文件,初次接触,我们只需要了解其中部分代码就可以,后续有什么特殊的需求,去阅读代码即可,代码阅读难度不高,细心点读就好(纯纯谈应用层面的修改,难度还好)。
别看着吓人,很多我们暂时都还用不上,这里简单陈述几个简单常用的参数。
--weights
:weights 权重文件--source
:为需要推理的数据来源,可以是rtsp视频流,也可以是图片,或者是本地mp4文件,如果有需求,也可以改代码,让它支持更多的。--data
:data参数 数据配置,默认使用 coco128.yaml
--imgsz
:训练配置图片的大小--conf-thres
: 置信度阈值 默认0.25,越大标注框越少--iou-thres
:交并比阈值 默认0.45,越大所得的重叠框越多--max-det
:每张图片最大的目标个数 默认1000--device
:设置代码执行的设备 cuda device, i.e. 0 or 0,1,2,3 or cpu--view-img
:是否展示预测之后的图片或视频 默认False--save-txt
:是否将预测的框坐标以txt文件格式保存 默认True 会在runs/detect/expn/labels下生成每张图片预测的txt文件--save-conf
:是否保存预测每个目标的置信度到预测tx文件中 默认True--save-crop
:是否需要将预测到的目标从原图中扣出来 剪切好 并保存 会在runs/detect/expn下生成--nosave
:是否不要保存预测后的图片 默认False 就是默认要保存预测后的图片--classes
:在nms中是否是只保留某些特定的类 默认是None 就是所有类只要满足条件都可以保留--agnostic-nms
:进行nms是否也除去不同类别之间的框 默认False--augment
: 预测是否也要采用数据增强 TTA--visualize
:可视化特征,默认False--update
:是否将optimizer从ckpt中删除 更新模型 默认False--project
:当前测试结果放在哪个主文件夹下 默认runs/detect--name
:当前测试结果放在run/detect下的文件名 默认是exp--exist-ok
:是否存在当前文件 默认False 一般是 no exist-ok 连用 所以一般都要重新创建文件夹--line-thickness
:画框的框框的线宽 默认是 3--hide-labels
:画出的框框是否需要隐藏label信息 默认False--hide-conf
:画出的框框是否需要隐藏conf信息 默认False--half
:是否使用半精度 Float16 推理 可以缩短推理时间 但是默认是False
注意:参数含default的为默认值,可以直接在文件进行修改,那么运行时直接python detect.py也可;直接在命令行指定也可以。
含action的一般为’store_true’,使用该参数则需要在命令行指定。
三、如何换成使用GPU运行项目呢?
上面已经说到了目前是使用CPU来进行图像的识别的?如果要换成GPU来进行图像的识别,该如何做呢?一步一步往下看吧。
3.1、尝试修改参数
在上面的参数说明的时候,有个--device
:设置代码执行的设备 cuda device, i.e. 0 or 0,1,2,3 or cpu,这里说的0,1,2,3就是指定哪块显卡,我看了下,这好像只会读取你电脑上的独立显卡设备。
那么我电脑上只有一块辣鸡的RTX3050显卡,那么默认就是指定为0,那么我改掉之前的命令试一试。
python detect.py --device 0 --weights weights/yolov5s.pt --source data/images/zidane.jpg
然后就会报下面这样的一个错误。
cuda不可用报错,现实没有有效的驱动可使用,让我们自己检查。
原因就是我们根本没下载这方面的依赖啦。
3.2、CUDA、cuDNN
写到这里的时候很纠结,到底要不要写安装cuda驱动部分的文章,不写有点不完整,写的话,坦白说,有点折腾。最后还是采取了曲线救国的方式,给朋友们,找了几篇可供参考的文章。
补充:pytorch 分为 cpu 版本和gpu版本,像项目中原本下载的就是非GPU版本的,所以即使不看下面的文章,也是可以正常运行的,CUDA和cuDNN都是为了加速计算而准备的
安装附带 cuda 版本的pytorch,首先需要安装nvidia cuda 驱动和cuDNN,那cuda 到底是什么呢?
CUDA:统一计算设备架构(Compute Unified Device Architecture, CUDA),是由NVIDIA推出的通用并行计算架构。解决的是用更加廉价的设备资源,实现更高效的并行计算。
NVIDIA cuDNN:是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中,如谷歌的Tensorflow、加州大学伯克利分校的流行caffe软件。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型,而不是简单调整性能,同时还可以在GPU上实现高性能现代并行计算。
安装CUDA和cuDNN,👉Pytorch05_torch安装(GPU版)、Cuda和cuDNN安装教程(超级详细)
3.3、下载 pytorch
下面所编写的内容,暂时默认各位小伙伴安装好了 CUDA 和 cuDNN哈(有需求以后再补充吧)
PyTorch 官网查看 pytorch 安装指令:pytorch.org/
1)在选择之前,要使用 nvidia-smi
来查看 cuda 的版本信息等,来安装相应版本的依赖
注意此处说的 CUDA Version 11.7
,说的是最高支持到 11.7,不一定非得是这个版本。
查看CUDA runtime API的版本:nvcc -V
2)根据上面的信息,来选择相应的版本安装
选择适合自己的安装命令即可
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
会下载比较多的依赖,中间也会出现输入y/n,输入y即可。
在写后面训练自定义数据集文章时,发现在 torch 2.0.1
的版本下,发现会报下面错误:
RuntimeError: result type Float can't be cast to the desired output type __int64
导致一直无法正常进行训练,主要原因还是 torch 版本的原因。
后面我降至 torch 1.10.1 ,重新安装了 torch 依赖,命令如下:
conda install pytorch==1.10.1 torchvision==0.11.2 torchaudio==0.10.1 cudatoolkit=11.3 -c pytorch -c conda-forge
补充:但是在 torch 2.0.1的版本下,运行 detect.py
是完全没问题的。如果不是需要训练自己数据集的需求,这点倒是无所谓。
3.4、验证是否安装成功
python 环境执行以下指令:
import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(torch.backends.cudnn.version())
3.5、重新测试使用GPU识别
python detect.py --device 0 --weights weights/yolov5s.pt --source data/images/zidane.jpg
遇到报错1:ModuleNotFoundError: No module named ‘chardet’
没找到哪个,那就安装谁。
pip install chardet
再测试:
从输出上可以看出,已经是使用显卡来进行工作啦。
可能会遇到的错误:AttributeError: ‘Upsample’ object has no attribute ‘recompute_scale_factor’,还是遇到之前的这个错误,照着之前说的方式,去修改一下代码即可。
最后
写到这里的时候,本文的大部分内容已经是写完啦,从下载项目到完整的运行起项目,测试观察到效果,形成闭环。
不过这也仅仅是开端罢啦,后续的话,会继续写到如何标注自己的数据集,如何训练自定义数据集等等,以及后续会写到的如何部署等问题。
文章中如有不足,还请各位阅读的朋友,能够指正,我会及时修正和更新,非常感谢大家。
在无聊且无趣的日子里,听着音乐,独自敲着代码、文字,享受自由的孤独的周末时光。