yolov5 (Macre)
目录
文章目录
- yolov5 (Macre)
- 一、yolov5介绍
- 1 四种网络模型
- 2 yolov5 输入结构
- 2.1 **Mosaic数据增强**
- 2.2 **自适应锚框计算**
- 2.3 **自适应图片缩放**
- 3 Backbone 主干网
- 3.1 **Focus结构**
- 3.2 **CSP结构**
- 4 Neck
- 5 输出端
- 5.1 **Bounding box损失函数**
- 5.2 **nms非极大值抑制**
- 二、环境搭建
- 1、anaconda
- 1.1 下载
- 1.2 安装
- 1.3 Anaconda Navigator 尝试
- 2、利用Anaconda Promp创建新环境
- 2.1 创建新的环境
- 2.2 激活新的环境
- 3、yolov5 框架部署
- 3.1 克隆gitgub上的项目
- 3.2 文件结构说明
- 3.3 检测配置是否成功
- 4 为yolo环境配置pytorch gpu版本
- 5 配置gpu的CUDA
- 5.1 查看正确的版本
- 5.2 下载和安装
- 测试环境是否安装成功
- cuDNN配置
- 三、制作数据集
- 3.1获取视频和视频转图片
- 3.2 使用labelimg来制作yolotxt数据
- 3.2.1 labelimg 介绍
- 3.2.2 下载
- 3.2.3 标注
- 3.2.4 yolo产生的txt数据
- 3.2.5 voc数据产生的xml
- 3.2.6 数据之间的转换
- 3.2.7 数据集文件夹结构
- 3.2.8 训练集和测试集制作
- 四、配置模型
- 4.1 修改数据配置文件
- 五、开始训练 模型的使用
- 六 、检测效果
- 6.1 训练可视化
- 6.2 检测效果
**笔记思路和结构 **
以项目部署的思路来写的
一、配置anaconda
二、环境配置
三、制作数据集合
效果展示
yolov5 原神测试
一、yolov5介绍
1 四种网络模型
Yolov5官方代码中,给出的目标检测网络中一共有4个版本,按大小来分,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。只需要记住越大的效果越好,但是花费的时间就越多。
2 yolov5 输入结构
Yolov5的网络结构图,可以看出,还是分为输入端、Backbone、Neck、Prediction四个部分。
**(1)输入端:**Mosaic数据增强、自适应锚框计算、自适应图片缩放
**(2)Backbone:**Focus结构,CSP结构
**(3)Neck:**FPN+PAN结构
**(4)Prediction:**GIOU_Loss
2.1 Mosaic数据增强
为什么要进行Mosaic数据增强?
在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。
主要有几个优点:
- 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
- **减少GPU:**可能会有人说,随机缩放,普通的数据增强也可以做,但作者考虑到很多人可能只有一个GPU,因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。
此外,发现另一研究者的训练方式也值得借鉴,采用的数据增强和Mosaic比较类似,也是使用4张图片(不是随机分布),但训练计算loss时,采用“缺啥补啥”的思路:
如果上一个iteration中,小物体产生的loss不足(比如小于某一个阈值),则下一个iteration就用拼接图;否则就用正常图片训练,也很有意思。
2.2 自适应锚框计算
在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框。
在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。
因此初始锚框也是比较重要的一部分。
在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。
但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。
当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭。
parser.add arqument('--noautu=oanchor',aaction='store ture',help = 'disable autoanchor check')
控制的代码即train.py中上面一行代码,设置成False,每次训练时,不会自动计算。
2.3 自适应图片缩放
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。
3 Backbone 主干网
3.1 Focus结构
Focus结构,在Yolov3&Yolov4中并没有这个结构,其中比较关键是切片操作。
比如右图的切片示意图,443的图像切片后变成2212的特征图。
以Yolov5s的结构为例,原始6086083的图像输入Focus结构,采用切片操作,先变成30430412的特征图,再经过一次32个卷积核的卷积操作,最终变成30430432的特征图。
需要注意的是:Yolov5s的Focus结构最后使用了32个卷积核,而其他三种结构,使用的数量有所增加,先注意下,后面会讲解到四种结构的不同点。
3.2 CSP结构
而Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。
4 Neck
Yolov5现在的Neck和Yolov4中一样,都采用FPN+PAN的结构,但在Yolov5刚出来时,只使用了FPN结构,后面才增加了PAN结构,此外网络中其他部分也进行了调整。
Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。
5 输出端
5.1 Bounding box损失函数
5.2 nms非极大值抑制
二、环境搭建
技术流程是
1、使用anaconda配置一个yolov5的专属环境,
2、在环境里基于pytroch利用yolov5框架进行目标检测。
3、数据利用python脚本把视频分割为图片,图片利用labelimg来制作yolov5所需要的txt文件。
1、anaconda
1.1 下载
链接:Anaconda | Individual Edition
https://www.anaconda.com/products/individual
Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
选择最新的就行
1.2 安装
我的卸载了,再走一遍,应该不会有什么问题。安装包我会放在群里。
点击next
i agree
只有我使用
选择合适的路径
第一个选项:
选择是否将 Anaconda 添加到 PATH 环境变量中,默认是不添加的。不添加意味着你不能在cmd(命令提示符)以及powershell中使用命令行操作。我不建议你添加,是因为anaconda有自带的 Anaconda Prompt 以及 Anaconda Powershell Prompt,这与cmd和powershell是一样的,没有必要添加到路径。当然如果你有其他想法,你可以选择添加。
第二个选项:
选择是否将 Anaconda 注册为你的默认 Python,默认是选择的。(我这个默认为python为3.8的)如果你要安装和运行 Anaconda 的多个版本或 Python 的多个版本,基本上是不勾选此选项的 。如果你有其它想法,另说。如果你之前安装过python并且使用vs、pycharm等软件时,勾选此选项,anaconda自带的python会成为这些软件的默认选项。
如果没有配置过之前的python那就勾选第二个
安装即可
等待安装成功后,再菜单里找到最近添加,右键打开文件位置。
发送桌面快捷方式,打开后有几个文件:
Anaconda Navigator:
Anaconda Navigator的官方介绍:Anaconda Navigator是Anaconda发行版中包含的桌面图形用户界面(GUI),可让您启动应用程序并轻松管理conda程序包,环境和通道,而无需使用命令行命令。
Anaconda Powershell Prompt 以及 Anaconda Prompt:
与上面一致,但是是使用命令行模式
Jupyter Notebook:这个使用的人非常多
Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。简而言之,Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示。如在编程过程中需要编写说明文档,可在同一个页面中直接编写,便于作及时的说明和解释。
Spyder:
百度百科:Spyder是Python的作者为它开发的一个简单的集成开发环境。和其他的Python开发环境相比,它最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值。
验证安装是否成功。
打开Anaconda Promp,输入 conda info
成功
1.3 Anaconda Navigator 尝试
打开后是这样。重要的是environments和applications on 。
environments:
是一个你的环境,左边是你的环境名称,右边是你的环境里的包名称。目的是针对你的不同应用场景来管理不同的包,是你的开发环境更便捷不被你的混乱的包搞混乱。和pycharm的venv是一样的。例如你的web工程为一个环境,人工智能为一个环境,数据可视化一个环境。
create是创建新的环境。
2、利用Anaconda Promp创建新环境
通常一个环境就足够了,但是我还是建议再创建一个新的环境。
在有些情况下,你可以在新环境上做实验,没问题后再在默认环境中操作,新环境中遭遇不可控错误,那就删除重建一个。或者你要搭建 tesorflow 、pytorch深度学习环境,那你肯定要新建环境的。
图形化创建环境:
默认的环境是base(root)
检查是否安装成功:conda --version
检查目前的安装环境:conda info --envs
或者 conda info -e
2.1 创建新的环境
conda create --name object_detaction tensorflow python=3.9 中途需要输入 y 表示同意继续
–name 或者 -n :指定环境名
tensorflow:环境名python=3.9:指定安装python的版本,python=3.9表示安装3.9中的最新版也可以指定具体的版本 比如:python=3.9.4
旧的解析器创建
新的环境创建成功
推荐使用:
新的解析器创建
使用
conda create -n tensorflow python=3.9 -y
命令来创建。
2.2 激活新的环境
conda activate 环境名来激活环境
激活成功
这个环境就是来做开放环境目标检测的了。这是使用yolo框架的,其实你也可以之间用pytorch或者tf来命名,来确定使用的基础是pytorch还是tf。
3、yolov5 框架部署
看此文章之前先看四配置pytorch。
3.1 克隆gitgub上的项目
使用git来部署,或者下载zip都是可以的。我使用的是git来部署。
部署成功
3.2 文件结构说明
现在来对代码的整体目录做一个介绍:
├── data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。但是自己的数据集不建议放在这个路径下面,而是建议把数据集放到yolov5项目的同级目录下面。
├── models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。这就是所谓的鱼和熊掌不可兼得。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。
├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。
├── detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。
├── train.py:训练自己的数据集的函数。
├── test.py:测试训练的结果的函数。
├──requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包。
以上就是yolov5项目代码的整体介绍。我们训练和测试自己的数据集基本就是利用到如上的代码。
3.3 检测配置是否成功
首先切换到yolo5的位置
(1)配置requirements.txt里的数据
pip install -r requirements.txt -i <源地址>
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
常见的源地址,避免下载包出问题。
下载完yolov5后,什么都不用改,运行detect.py
这个是帮你检测能不能正常运行的
(2)检测是否成功
python detect.py
运行一下试试
在runs里的detect文件里找到exp如果有下面的图片就是成功:
4 为yolo环境配置pytorch gpu版本
cpu太慢了,因为不是gpu版本是不可以使用gpu来就行训练的。
打开pytorch的官网, https://pytorch.org/
根据你的版本选择合适的下载:
使用conda来配置在环境里:
执行run this commond这个命令
出现后要输入Y。
如果下载太慢了,可以换源:
使用清华镜像源网站
切换到国内的镜像源(为什么要切换原因就不用多说了吧(手动狗头))
分别输入以下4行代码:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/conda config --set show_channel_urls yesconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorc
注意!如果切换镜像后当出现下载不了的情况,就先切换默认源,然后再修改另一个可以使用的conda源(一定要先恢复默认,再换另一个!!!)
切回默认源:
conda config --remove-key channels
如果是cpu版本:
进入python查看当前pytorch是否可用
查看版本得知是512.36
支持的是11.6
cuda toolkit与driver对应表:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
5.2 下载和安装
选择正确的版本和选择exe local 来安装。
选择自定义安装。
不要选Visual Studio Integration,即使选了也不能成功安装
一直安装下去就行
完成后需要就行查看系统变量中是否添加了路径,如果没有需要自己添加
测试环境是否安装成功
运行cmd,输入nvcc –version 即可查看版本号;
set cuda,可以查看 CUDA 设置的环境变量。
nvcc --versionset cuda
cuDNN配置
cuDNN地址如下,不过要注意的是,我们需要注册一个账号,才可以进入到下载界面。大家可以放心注册的。
https://developer.nvidia.com/rdp/cudnn-download
cuDNN叫配置更为准确,我们先把下载的 cuDNN 解压缩,会得到下面的文件:
cuDNN 解压缩后的文件
下载后发现其实cudnn不是一个exe文件,而是一个压缩包,解压后,有三个文件夹,把三个文件夹拷贝到cuda的安装目录下。
拷贝时看到,CUDA 的安装目录中,有和 cuDNN 解压缩后的同名文件夹,这里注意,不需要担心,直接复制即可。cuDNN 解压缩后的同名文件夹中的配置文件会添加到 CUDA安装目录中的同名文件夹中。
现在大家应该可以理解,cuDNN 其实就是 CUDA 的一个补丁而已,专为深度学习运算进行优化的。然后再参加环境变量
往系统环境变量中的 path 添加如下路径(根据自己的路径进行修改)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\libnvvp
到此环境搭建成功!!!!
三、制作数据集
3.1获取视频和视频转图片
3.2 使用labelimg来制作yolotxt数据
3.2.1 labelimg 介绍
Labelimg是一款开源的数据标注工具,可以标注三种格式。
1 VOC标签格式,保存为
上图是界面,open是打开,opendir是打开文件夹,他会把文件夹的所有图片导入,如何按下快捷键D可以快速浏览下一个图片。yolo 是导出的是txt文件,还可以导出voc 的xml文件。create rectbox可以创建窗口。
(3)标签一次演示
3.2.4 yolo产生的txt数据
(1)格式解释
(2)用处
3.2.5 voc数据产生的xml
(1)格式解释
(2)用处
3.2.6 数据之间的转换
(1)xml转txt
(2)json 转txt
3.2.7 数据集文件夹结构
(1)标准的数据文件格式:
这里暂时不用,之后会对标准的数据格式进行一个解析。
(2)看懂项目的文件结构后,也可以随意的保存数据文件
推荐使用
yolov5
- label –> 标签文件夹
- images –> 图片文件夹
- predefined_classes.txt –> 初始化labelimg的分类文件
- imagesets
- main
- 训练集和测试集合
3.2.8 训练集和测试集制作
训练集和测试集制作的代码:
# coding:utf-8import osimport randomimport argparseparser = argparse.ArgumentParser()#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')#数据集的划分,地址选择自己数据下的ImageSets/Mainparser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')opt = parser.parse_args()trainval_percent = 1.0 # 训练集和验证集所占比例。 这里没有划分测试集train_percent = 0.9 # 训练集所占比例,可自己进行调整xmlfilepath = opt.xml_pathtxtsavepath = opt.txt_pathtotal_xml = os.listdir(xmlfilepath)if not os.path.exists(txtsavepath): os.makedirs(txtsavepath)num = len(total_xml)list_index = range(num)tv = int(num * trainval_percent)tr = int(tv * train_percent)trainval = random.sample(list_index, tv)train = random.sample(trainval, tr)file_trainval = open(txtsavepath + '/trainval.txt', 'w')file_test = open(txtsavepath + '/test.txt', 'w')file_train = open(txtsavepath + '/train.txt', 'w')file_val = open(txtsavepath + '/val.txt', 'w')for i in list_index: name = total_xml[i][:-4] + '\n' if i in trainval: file_trainval.write(name) if i in train: file_train.write(name) else: file_val.write(name) else: file_test.write(name)file_trainval.close()file_train.close()file_val.close()file_test.close()
会产生一个ImageSets里面有一个Main,main文件夹里有四个文件,分别用来训练和测试的。
(3)利用pt模型
在yolov5文件夹新建一个weights文件夹,将yolov5s.pt复制一个放进去。
到这里数据集就制作完成了。
四、配置模型
4.1 修改数据配置文件
(1)选择适当的模型
选择一个模型,在yolov5目录下的model文件夹下是模型的配置文件,有n、s、m、l、x版本,逐渐增大(随着架构的增大,训练时间也是逐渐增大)。
这里选用 yolov5s.yaml
打开yolov5/models里面选择yolov5s.yaml
修改参数
(2)yolov5/data文件夹里配置mydata.yaml
创建一个txt,根据具体情况来创建
train: D:/Yolov5/yolov5/VOCData/dataSet_path/train.txt #训练文件地址val: D:/Yolov5/yolov5/VOCData/dataSet_path/val.txt #测试文件地址 # number of classes 类别个数nc: 2# class names 类别名字names: ["light", "post"]
配置文件成功!
五、开始训练 模型的使用
打开yolov5 目录下的 train.py 程序,我们可以多看看这些参数使用。
常用参数解释如下:
weights:权重文件路径
cfg:存储模型结构的配置文件
data:存储训练、测试数据的文件
epochs:指的就是训练过程中整个数据集将被迭代(训练)了多少次,显卡不行你就调小点。
batch-size:训练完多少张图片才进行权重更新,显卡不行就调小点。
img-size:输入图片宽高,显卡不行就调小点。
device:cuda device, i.e. 0 or 0,1,2,3 or cpu。选择使用GPU还是CPU
workers:线程数。默认是8。
其他:
noautoanchor:不自动检验更新anchors
rect:进行矩形训练
resume:恢复最近保存的模型开始训练
nosave:仅保存最终checkpoint
notest:仅测试最后的epoch
evolve:进化超参数
bucket:gsutil bucket
cache-images:缓存图像以加快训练速度
name: 重命名results.txt to results_name.txt
adam:使用adam优化
multi-scale:多尺度训练,img-size +/- 50%
single-cls:单类别的训练集
进入pytorch环境,进入yolov5文件夹
python train.py --weights weights/yolov5s.pt --cfg models/cs1.yaml --data data/mydata.yaml --epoch 200 --batch-size 2 --img 640 --device 0
问题
如果出现 winerror 1455 页面太小的问题。
原因是:如果你装anaconda是在c盘就不会有这个问题,安装到其他的盘,就应该去添加那个盘的虚拟内存。
打开我的电脑,点开属性,点开高级设计,点开高级,在性能下边点开高级,再点开高级,在虚拟内存下打开更改。把自动管理去掉。点击你安装的盘,根据总的大小来分配
六 、检测效果
6.1 训练可视化
训练时或者训练后可以利用 tensorboard 查看训练可视化
tensorboard --logdir=runs
浏览器输入本地接口地址:
http://localhost:6006/
可以看到各种训练的可视化效果。
6.2 检测效果
检测的命令:
python detect.py --source 0 # webcam 自带摄像头 file.jpg # image 图片 file.mp4 # video 视频 path/ # directory path/*.jpg # glob 'https://youtu.be/NUsoVlDFqZg' # YouTube 'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP stream
640 –device 0
[外链图片转存中...(img-GRHY9C34-1671794265513)][外链图片转存中...(img-slj3QnhL-1671794265513)]**问题**如果出现 winerror 1455 页面太小的问题。原因是:如果你装anaconda是在c盘就不会有这个问题,安装到其他的盘,就应该去添加那个盘的虚拟内存。打开我的电脑,点开属性,点开高级设计,点开高级,在性能下边点开高级,再点开高级,在虚拟内存下打开更改。把自动管理去掉。点击你安装的盘,根据总的大小来分配[外链图片转存中...(img-npv89HMt-1671794265513)]## 六 、检测效果### 6.1 训练可视化训练时或者训练后可以利用 tensorboard 查看训练可视化
tensorboard –logdir=runs
[外链图片转存中...(img-exFhmKj8-1671794265514)]浏览器输入本地接口地址:http://localhost:6006/[外链图片转存中...(img-r596wi5X-1671794265514)]可以看到各种训练的可视化效果。### 6.2 检测效果检测的命令:
python detect.py –source 0 # webcam 自带摄像头
file.jpg # image 图片
file.mp4 # video 视频
path/ # directory
path/*.jpg # glob
‘https://youtu.be/NUsoVlDFqZg’ # YouTube
‘rtsp://example.com/media.mp4’ # RTSP, RTMP, HTTP stream
python detect.py --weights runs/train/exp11/weights/best.pt --source D:\yolo\yolov5\VOCcs\pig.mp4