YOLOv5 学习记录

文章目录

  • 整体概况
  • 数据增强与前处理
    • 自适应Anchor的计算
    • Lettorbox
  • 架构
    • SiLU激活函数
    • YOLOv5改进点
    • SSPF 模块
  • 正负样本匹配
  • 损失函数

整体概况

在这里插入图片描述

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

数据增强与前处理

自适应Anchor的计算

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

自适应计算 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,如果变异后效果变差就跳过。

Lettorbox

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

前期 YOLO算法中常用 416×416、608×608 等尺寸,比如对 800×600 的图像进行缩放和填充。如图所示,YOLOv5 作者认为,在项目实际应用时,很多图像的长宽比不同,因此均直接进行缩放填充后,两端的灰边大小会不同,而如果填充的比较多,则存在信息的冗余,也可能会影响推理速度。

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

架构

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

SiLU激活函数

在这里插入图片描述
Swish激活函数具备无上界有下届、平滑、非单调的特性,Swish在深层模型上效果优于ReLU,表达式如下:
在这里插入图片描述

β是个常数或者可训练的参数,当β=1时,也称作SiLU激活函数。

YOLOv5改进点

由于YOLOv5没有论文,这里便根据官方的源码绘制一下CSPBlock的结构图,其实对应的便是YOLOv5官方库的C3 Block:

为了读者更方便地搭建 CSPDarkNet53,笔者这里也给出 CSPDarkNet53 的结构图,如图所示,这里CSPDarkNet53依然使用的是类似 ResNet 的层次结构设计的思想,以及这里CSPDarkNet53对于每个 Stage的配置同DarkNet53一样,分别是 3,6,9,3,依次对应的下采样倍数为:4、8、16、32。

SSPF 模块

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

正负样本匹配

与损失函数
首先,将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可能会在多个特征图中都分配到正样本。在这里插入图片描述

损失函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习 --vector

目录 1, 什么是vector 2, 创建vector 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作vector 3-1, 赋值 3-2, 添加元素 3-2-1, 添加元素(assi…

简单聊一聊幂等和防重

大家好,我是G探险者。 每年的双十一,618,电商系统都会面临这超高的流量,如果一个订单被反复提交,那电商系统如何保证这个订单之后执行一次减库存,扣款的操作? 这里就引入两个概念,…

下一代搜索引擎会什么?

现在是北京时间2023年11月18日。聊一聊搜索。 说到搜索,大家首先想到的肯定是谷歌,百度。我把这些定义成上一个时代的搜索引擎。ChatGPT已经火热了有一年的时间了,大家都认为Ai搜索是下一代的搜索。但是AI搜索,需要的是很大算力&a…

大语言模型的三阶段训练

为了训练专有领域模型,选择LLaMA2-7B作为基座模型,由于LLaMA模型中文词表有限,因此首先进行中文词表的扩展,然后进行三阶段训练(增量预训练,有监督微调,强化学习)。 代码将全部上传…

力扣刷题篇之位运算

系列文章目录 目录 系列文章目录 前言 一、位运算的基本运算 二、位运算的技巧 三、布隆过滤器 总结 前言 本系列是个人力扣刷题汇总,本文是数与位。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode&#xff0…

【数据结构(一)】线性结构和非线性结构

文章目录 线性结构和非线性结构1. 线性结构2. 非线性结构 线性结构和非线性结构 数据结构包括:线性结构和非线性结构。 1. 线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。线性结构有两种不同的存储结构&#xff…

go学习之简单项目

项目 文章目录 项目1.项目开发流程图2.家庭收支记账软件项目2)项目代码实现3)具体功能实现 3.客户信息管理系统1)项目需求说明2)界面设计3)项目框架图4)流程5)完成显示客户列表的功能6&#xff…

Jenkins测完通知到人很麻烦?一个设置配置钉钉消息提醒!

Jenkins 作为最流行的开源持续集成平台,其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。但其实 Jenkins 还可以支持钉钉消息通知,其主要通过 DingTa…

三十分钟学会Hive

Hive的概念与运用 Hive 是一个构建在Hadoop 之上的数据分析工具(Hive 没有存储数据的能力,只有使用数据的能力),底层由 HDFS 来提供数据存储,可以将结构化的数据文件映射为一张数据库表,并且提供类似 SQL …

C语言结构体

#include <stdio.h> #include <string.h> #include <stdlib.h>//struct Student_s { // int num; // char name[20]; // char gender; // int age; // float Chinese; // float Math; // float English; // char addr[30]; //}; //最后的分号一定要写&#x…

Oracle如何快速删除表中重复的数据

方法一&#xff1a; 在Oracle中&#xff0c;你可以使用DELETE语句结合ROWID和子查询来删除重复的记录。以下是一个示例&#xff1a; DELETE FROM your_table WHERE ROWID NOT IN (SELECT MAX(ROWID)FROM your_tableGROUP BY column1, column2, ... -- 列出用于判断重复的列 )…

C语言链式栈

stack.h typedef struct Node_s {int data;struct Node_s *pNext; } Node_t, *pNode_t;typedef struct Stack_s {pNode_t pHead;//栈顶指针&#xff0c;指向了链表的第一个结点int size;//栈的元素个数 } Stack_t, *pStack_t;void init(pStack_t pStack); void push(pStack_t …

python-opencv 培训课程作业

python-opencv 培训课程作业 作业一&#xff1a; 第一步&#xff1a;读取 res 下面的 flower.jpg&#xff0c;读取彩图&#xff0c;并用 opencv 展示 第二步&#xff1a;彩图 -> 灰度图 第三步&#xff1a;反转图像&#xff1a;最大图像灰度值减去原图像&#xff0c;即可得…

HCIA-综合实验(三)

综合实验&#xff08;三&#xff09; 1 实验拓扑2 IP 规划3 实验需求一、福州思博网络规划如下&#xff1a;二、上海思博网络规划如下&#xff1a;三、福州思博与上海思博网络互联四、网络优化 4 配置思路4.1 福州思博配置在 SW1、SW2、SW3 上配置交换网络SW1、SW2、SW3 运行 S…

Redis哨兵模式(Docker)

获取配置 #---------------------------------------------------------- 拉取镜像 docker pull redis:latest #---------------------------------------------------------- 创建容器 docker run --name redis -d redis:latest #-------------------------------------------…

RDD的创建 - Python

第1关&#xff1a;集合并行化创建RDD # -*- coding: UTF-8 -*- from pyspark import SparkContextif __name__ "__main__":#********** Begin **********## 1.初始化 SparkContext&#xff0c;该对象是 Spark 程序的入口sc SparkContext("local", "…

redis问题归纳

1.redis为什么这么快&#xff1f; &#xff08;1&#xff09;基于内存操作&#xff1a;redis的所有数据都存在内存中&#xff0c;因此所有的运算都是内存级别的&#xff0c;所以性能比较高 &#xff08;2&#xff09;数据结构简单&#xff1a;redis的数据结构是专门设计的&…

Python技术栈 —— 语言基础

Python基础 语法拾遗List与Tuple的区别yield关键字for in enumeratefor in zip 精彩片段测量程序用时 语法拾遗 List与Tuple的区别 ListTuple建立后是否可变可变不可变建立后是否可添加元素可添加不可添加 # list and tuple List [1, 2, 3, 4, 5] Tuple (1, 2, 3, 4, 5) p…

jvm 内存结构 ^_^

1. 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 程序计数器 定义&#xff1a; Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff0c;是记住下一条jvm指令的执行地址 特点&#xff1a; 是线程私有的 不会存在内存溢出 虚拟机栈…

使用C#插件Quartz.Net定时执行CMD任务工具2

目录 创建简易控制台定时任务步骤完整程序 创建简易控制台定时任务 创建winform的可以看&#xff1a;https://blog.csdn.net/wayhb/article/details/134279205 步骤 创建控制台程序 使用vs2019新建项目&#xff0c;控制台程序&#xff0c;使用.net4.7.2项目右键&#xff08…