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数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀

主要有几个优点:

  1. 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
  2. **减少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