首页 > 编程语言 >yolov5及其算法改进

yolov5及其算法改进

时间:2024-12-28 15:00:58浏览次数:10  
标签:YOLOv5 GT 样本 yolov5 Fusion 算法 改进 YOLOv4 Anchor

yolov5及其算法改进

1、YOLOV5目标检测简介

在这里插入图片描述
YOLOv5 是一个基于 Anchor 的单阶段目标检测,其主要分为以下 5 个阶段:
1、输入端:Mosaic 数据增强、自适应Anchor计算、自适应图像缩放;
2、Backbone:提取出高中低层的特征,使用了 CSP 结构、SPPF、SiLU 等操作;
3、Neck:使用 FPN+PAN 结构,将各层次的特征进行融合,并提取出大中小的特征图;
4、Head:进行最终检测部分,在特征图上应用 Anchor Box,并生成带有类别概率、类别
得分以及目标框的最终输出向量;
5、损失函数:计算预测结果与 Ground Truth 之间的 Loss。

2、前处理

2.1、自适应 Anchor 计算

在 YOLOv3、YOLOv4 中,训练不同的数据集时,计算初始 Anchor 的值是通过单独的程序运行的。但 YOLOv5 中将此功能嵌入到代码中,每次训练时会自适应的计算不同训练集中的最佳 Anchor 值。

2.2、自适应计算 Anchor 的流程如下:

1、载入数据集,得到数据集中所有数据的 w、h;
2、将每张图像中 w、h 的最大值等比例缩放到指定大小,较小边也相应缩放;
3、将 bboxes 从相对坐标改成绝对坐标(乘以缩放后的 w、h);
4、筛选 bboxes,保留 w、h 都大于等于 2 像素的 bboxes;
5、使用 k-means 聚类得到 n 个 Anchors;
6、使用遗传算法随机对 Anchors 的 w、h 进行变异,如果变异后效果变得更好就将变异后的结果赋值给 Anchors,如果变异后效果变差就跳过。

2.3、图像自适应

在这里插入图片描述
在常用的目标检测算法中,不同的图像长宽都不相同,因此常用的方式是将原始图像统一缩放到一个标准尺寸,再送入检测网络中。

如图所示,YOLOv5 作者认为,在项目实际应用时,很多图像的长宽比不同,因此均直接进行缩放填充后,两端的灰边大小会不同,而如果填充的比较多,则存在信息的冗余,也可能会影响推理速度。

在 YOLOv5 中作者对 Letterbox 函数中进行了修改,对原始图像自适应的添加最少的灰边。

1、计算收缩比,这里的收缩比选取的是长宽方向变化范围最小的那个:
在这里插入图片描述
img _ w为原始图像的宽,img _ h为原始图像的高,img _ w为模型输入图像的宽,img _ h为模型输入图像的高。
2、计算收缩后图像的长宽:
在这里插入图片描述
3、计算要填充的像素,这里其实就是在计算那个收缩比大的那一边需要填充的像素:
在这里插入图片描述
式中,dr为模型的下采样倍数,比如 YOLOv5 的下采样倍数为 32, padding_num即为要填充边的填充像素的数量,s为缩放后的图像尺寸。

在这里插入图片描述
1、首先计算比例:
min(416/800, 416/600)=0.52
2、计算收缩后图像的长宽:
w,h = 8000.52,6000.52=416, 312
3、计算要填充的像素:
这里其实就是在计算那个需要收缩比大的那一边需要填充的像素:
padding_num = 0.5*(32*(1-(312/32 - int(312/32))))
= 0.5 * (32*(1-(9.75-9)))
=0.5 * (32 * 0.25)=4
通过前面的计算可以知道,上下单边的填充像素数量为4,因此最终的图像尺寸为416*(312+4+4)=416*320。

3、YOLOV4与YOLOV5的架构区别

3.1、SiLU激活函数

在这里插入图片描述
YOLOv5的Backbone和Neck模块和YOLOv4中大致一样,都采用CSPDarkNet和FPN+PAN的结构,但是网络中其他部分进行了调整,其中YOLOv5使用的激活函数是SiLU(YOLOv4为Mish激活函数),同时YOLOv5在CSP Block中没有使用Transition First卷积

Swish激活函数具备无上界有下届、平滑、非单调的特性,Swish在深层模型上效果优于ReLU,表达式如下
在这里插入图片描述
β是个常数或者可训练的参数,当β=1时,也称作SiLU激活函数。

3.2、CSPBlock结构图

在这里插入图片描述
注意:上图中Fusion last为Fusion first
在这里插入图片描述
在这里插入图片描述
对比一下YOLOv5中的C3模块与YOLOv4中的CSPResBlock模块:

  1. YOLOv4的激活函数主要使用了Mish激活函数,而YOLOv5的C3 Block主要使用了SiLU激活函数,在速度上更快;
  2. YOLOv4的CSPResBlock同时使用了Fusion First与Fusion Last操作,而YOLOv5的C3 Block仅仅使用了Fusion Last结构;
  3. YOLOv4的CSPResBlock的Fusion First模块以及短梯度路径分支都是用了单卷积结构,而YOLOv5的C3 Block使用了Conv-BN-SiLU;
  4. YOLOv4的CSPResBlock在进行Concat特征融合后,进行了BN-Mish操作,而YOLOv5的C3 Block没有此操作。
    在这里插入图片描述
    注意:上图中Fusion last为Fusion first ,Fusion first为Fusion last
    在这里插入图片描述
    注意:上图中Fusion last为Fusion first

3.3、yolov5的spp改进

在这里插入图片描述
SSPF模块将经过CBS的x与一次池化后的y1、两次池化后的y2和3次池化后的y3进行拼接,然后再CBS进一步提取特征。
仔细观察不难发现,虽然SSPF对特征图进行了多次池化,但是特征图尺寸并未发生变化,通道数更不会变化,所以后续的4个输出能够在channel维度进行融合。
这一模块的主要作用是对高层特征进行提取并融合,在融合的过程中多次运用最大池化,尽可能多的去提取高层次的语义特征。

4、正负样本匹配与损失函数

4.1、坐标表示

对于之前的 YOLOv3 和 YOLOv4,使用的是如图所示的坐标表示形式:
在这里插入图片描述
在这里插入图片描述
YOLOv5 参数化坐标的方式和 YOLOv3 和 YOLOv4 是不一样的,具体如图所示:

在这里插入图片描述
在这里插入图片描述

4.2、正负样本匹配

首先,将GT与当前特征图的 3 个 Anchors 作比较,如果GT的宽与Anchor 宽的比例、GT的高与 Anchor 高的比例都处于 1/4 到4区间内,那么当前GT就能与当前特征图匹配。
然后,将当前特征图的正样本分配给对应的 Grid;如图所示在 YOLOv5 中会将一个 Grid 点分为4个象限,针对第一步中匹配的GT,会计算该GT(图中蓝点)处于4个象限中的哪一个,并将邻近的两个特征点也作为正样本。
如图所示,左边所示的GT偏向于右下象限,会将GT所在 Grid 的右、下特征点也作为正样本。而图中右边所示的GT偏向于左上象限,会将GT所在 Grid 的左、上特征点作为正样本。
相比较 YOLOv3 和 YOLOv4 匹配正样本的方式,YOLOv5的这种匹配方式能够分配更多的正样本,有助于训练加速收敛,以及正负样本的平衡。而且由于每个特征图都会将所有的 GT与当前特征图的 Anchor 计算能否分配正样本,也就说明一个GT可能会在多个特征图中都分配到正样本。

在这里插入图片描述
yolov3:可以匹配最多一个正样本
yolov4:可以匹配1-3个正样本
yolov5:可以匹配3-9个正样本

4.3、损失函数

YOLOv5 和 YOLOv4 一样都采用 CIoU Loss 做 Bounding Box 的回归损失函数,而分类损失和目标损失都使用的是交叉熵损失。
对于回归损失,其数学表达式如下:
在这里插入图片描述
式中,d,c 分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离。这样CIOU Loss 将目标框回归函数应该考虑的 3 个重要几何因素都考虑进去了:重叠面积、中心点距离、长宽比。
对于分类损失和目标损失,其数学表达式如下:
在这里插入图片描述

标签:YOLOv5,GT,样本,yolov5,Fusion,算法,改进,YOLOv4,Anchor
From: https://blog.csdn.net/m0_38113054/article/details/144778027

相关文章

  • 强化学习算法:soft actor-critic (SAC)—— SAC中的alpha_losse是什么?
    官方实现地址:https://openi.pcl.ac.cn/devilmaycry812839668/softlearning在SAC算法的官方实现中有一个论文中没有介绍的部分,这就是SAC中的alpha_losse,在SAC论文中alpha是以超参数的形式存在的,但是在论文作者发布的具体实现的代码中关于这个alpha却给出了一种计算方法,该方法可......
  • 基于 Python +线性回归算法 的 股票价格预测
    以下是一个基于Python控制台的股票价格预测程序,适合作为课程设计作业。程序基于机器学习模型(如线性回归),实现对股票价格的预测,并支持用户通过控制台输入或加载历史数据进行操作。功能描述数据加载:用户可输入股票历史价格数据,或从文件中加载CSV数据。数据可视化:显示......
  • node.js基于协同过滤算法的企业入职评测系统服务端程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于企业入职评测系统的研究,现有研究主要以传统的评测模式为主,如单纯依靠简历筛选、简单面试等方式进行人员筛选1。专门针对利用协同过滤算法构建企业入......
  • 强化学习算法:soft actor-critic (SAC)—— 官方发布的核心代码
    完整的官方代码地址如下:https://openi.pcl.ac.cn/devilmaycry812839668/softlearning核心代码实现:点击查看代码fromcopyimportdeepcopyfromcollectionsimportOrderedDictfromnumbersimportNumberimportnumpyasnpimporttensorflowastfimporttensorf......
  • 网络流 Dinic 算法笔记
    网络流Dinic算法笔记步骤建图,初始时令反向边权值为零,之后将该边每次用去的权值累计赋值给该反向边。分层,每次只能找下一个层的点。每次多向找增广路,并将跑满的边去掉,之后再去跑残量网络,直到榨干所有可用管道。大致就这样,然后注意时时减脂优化。code#include<bits/stdc+......
  • 【算法一周目】从时光的边缘看世界:前缀和揭示的算法真谛
    文章目录1.一维前缀和2.二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为k的子数组6.和可被k整除的子数组7.连续数组8.矩阵区域和1.一维前缀和题目链接:【模板】一维前缀和题目描述:给定一个长度为n的整数数组arr和q个查询,每个查询由两个整数l......
  • Java动态规划算法
    ①动态规划动态规划(DynamicProgramming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产......
  • 遗传算法——附python实现与各方法的作用与修改
    前言遗传算法是数学建模中非常重要的一种搜索和优化算法,掌握遗传算法的精髓除了在竞赛中具有优势以外,更主要的是在解决实际问题的时候提供了一种全新的思路,通过将现实中的某种模式转换成算法,并用以解决某种问题的这种思路,或许是算法创新,提高效率的另一条路。本文将会介绍......
  • 代码随想录算法训练营第六十天|Bellman_ford队列优化法(SPFA)、bellman_ford之判断负
    前言打卡代码随想录算法训练营第49期第六十天(づ◕‿◕)づ首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。Bellman_ford队......
  • 2024牛客寒假算法基础集训营2(个人训练)
    TokitsukazeandCats思路1对没有只猫我们只需要枚举它的四个方向,看一下有没有猫,如果有他们就会公用一条边,需要注意的是这个方法会重复计算同一条共用的边,最后除2就行代码1#include<bits/stdc++.h>typedefstd::pair<int,int>pii;#defineINF0x3f3f3f3f#defineMOD......