yolov5 原理解析

news/2024/5/2 17:34:06/文章来源:https://blog.csdn.net/u013451076/article/details/127193147

1、 网络结构

关于YOLOv5的网络结构其实网上相关的讲解已经有很多了。网络结构主要由以下几部分组成:

  • BackboneNew CSP-Darknet53
  • NeckSPPFNew CSP-PAN
  • HeadYOLOv3 Head

激活函数Swish = SiLU = x*sigmoid(x)

        通过和上篇博文讲的YOLOv4对比,其实YOLOv5在Backbone部分没太大变化。但是YOLOv5在v6.0版本后相比之前版本有一个很小的改动,把网络的第一层(原来是Focus模块)换成了一个6x6大小的卷积层。两者在理论上其实等价的,但是对于现有的一些GPU设备(以及相应的优化算法)使用6x6大小的卷积层比使用Focus模块更加高效。下图是原来的Focus模块(和之前Swin Transformer中的Patch Merging类似),将每个2x2的相邻像素划分为一个patch,然后将每个patch中相同位置(同一颜色)像素给拼在一起就得到了4个feature map,然后在接上一个3x3大小的卷积层。这和直接使用一个6x6大小的卷积层等效。

 2、Neck部分

       在Neck部分的变化还是相对较大的,首先是将SPP换成成了SPPF(Glenn Jocher自己设计的),这个改动我个人觉得还是很有意思的,两者的作用是一样的,但后者效率更高。SPP结构如下图所示,是将输入并行通过多个不同大小的MaxPool,然后做进一步融合,能在一定程度上解决目标多尺度问题。

        而SPPF结构是将输入串行通过多个5x5大小的MaxPool层,这里需要注意的是串行两个5x5大小的MaxPool层是和一个9x9大小的MaxPool层计算结果是一样的,串行三个5x5大小的MaxPool层是和一个13x13大小的MaxPool层计算结果是一样的。

        在Neck部分另外一个不同点就是New CSP-PAN了,在YOLOv4中,Neck的PAN结构是没有引入CSP结构的,但在YOLOv5中作者在PAN结构中加入了CSP。详情见上面的网络结构图,每个C3模块里都含有CSP结构。在Head部分,YOLOv3, v4, v5都是一样的,这里就不讲了。

 3、损失计算

YOLOv5的损失主要由三个部分组成:

  • Classes loss,分类损失,采用的是BCE loss,注意只计算正样本的分类损失。
  • Objectness loss,obj损失,采用的依然是BCE loss,注意这里的obj指的是网络预测的目标边界框与GT Box的CIoU。这里计算的是所有样本的obj损失。
  • Location loss,定位损失,采用的是CIoU loss,注意只计算正样本的定位损失。

Loss = \lambda _{1}L_{cls} + \lambda _{2}L_{obj} + \lambda _{3}L_{loc} 

其中,\lambda _{1}, \lambda _{2}, \lambda _{3}为平衡系数。

       针对三个预测特征层(P3, P4, P5)上的obj损失采用不同的权重。在源码中,针对预测小目标的预测特征层(P3)采用的权重是4.0,针对预测中等目标的预测特征层(P4)采用的权重是1.0,针对预测大目标的预测特征层(P5)采用的权重是0.4,作者说这是针对COCO数据集设置的超参数。

L_{obj} = 4.0\cdot L_{obj}^{small} + 1.0\cdot L_{obj}^{medium} + 0.4\cdot L_{obj}^{large}

4、消除Grid敏感度

      YOLOv4中有提到过,主要是调整预测目标中心点相对Grid网格的左上角偏移量。下图是YOLOv2,v3的计算公式。

 

其中:

  • t_{x}是网络预测的目标中心x坐标偏移量(相对于网格的左上角)
  • t_{y}是网络预测的目标中心y坐标偏移量(相对于网格的左上角)
  • c_{x}是对应网格左上角的x坐标
  • c_{y}是对应网格左上角的y坐标
  • σ是Sigmoid激活函数,将预测的偏移量限制在0到1之间,即预测的中心点不会超出对应的Grid Cell区域

关于预测目标中心点相对Grid网格左上角(c_{x},c_{y})偏移量为\sigma(t_{x})\sigma(t_{y})。YOLOv4的作者认为这样做不太合理,比如当真实目标中心点非常靠近网格的左上角点\sigma(t_{x})\sigma(t_{y}) 应该趋近与0)或者右下角点 \sigma(t_{x})\sigma(t_{y})应该趋近与1)时,网络的预测值需要负无穷或者正无穷时才能取到,而这种很极端的值网络一般无法达到。为了解决这个问题,作者对偏移量进行了缩放从原来的( 0 , 1 ) 缩放到( − 0.5 , 1.5 )这样网络预测的偏移量就能很方便达到0或1,故最终预测的目标中心点 b_{x}, b_{y}的计算公式为:

下图是我绘制的y=\sigma(x)对应before曲线和y=2\cdot \sigma(x) - 0.5对应after曲线,很明显通过引入缩放系数scale以后,y对x更敏感了,且偏移的范围由原来的( 0 , 1 )调整到了( − 0.5 , 1.5 ) 。

 在YOLOv5中除了调整预测Anchor相对Grid网格左上角(c_{x},c_{y})偏移量以外,还调整了预测目标高宽的计算公式,之前是:

 在YOLOv5调整为:

 原来的计算公式并没有对预测目标宽高做限制,这样可能出现梯度爆炸,训练不稳定等问题。下图是修改前 y=e^{x} 和修改后 y=(2\cdot\sigma(x))^{2}(相对Anchor宽高的倍率因子)的变化曲线, 很明显调整后倍率因子被限制在( 0 , 4 )之间。

5、 匹配正样本(Build Targets)

       之前在YOLOv4介绍中有讲过该部分内容,其实YOLOv5也差不多。主要的区别在于GT Box与Anchor Templates模板的匹配方式。在YOLOv4中是直接将每个GT Box与对应的Anchor Templates模板计算IoU,只要IoU大于设定的阈值就算匹配成功。但在YOLOv5中,作者先去计算每个GT Box与对应的Anchor Templates模板的高宽比例,即:

 然后统计这些比例和它们倒数之间的最大值,这里可以理解成计算GT BoxAnchor Templates分别在宽度以及高度方向的最大差异(当相等的时候比例为1,差异最小):

 接着统计r_{w}^{max}r_{h}^{max}之间的最大值,即宽度和高度方向差异最大的值:

      如果GT Box和对应的Anchor Template的r^{max}小于阈值anchor_t(在源码中默认设置为4.0),即GT Box和对应的Anchor Template的高、宽比例相差不算太大,则将GT Box分配给该Anchor Template模板。为了方便大家理解,可以看下我画的图。假设对某个GT Box而言,其实只要GT Box满足在某个Anchor Template宽和高的×0.25倍和×4.0倍之间就算匹配成功。匹配方式如下图所示,其中黑色虚线框表示缩放过的anchor。

 剩下的步骤和YOLOv4中一致:

  • 将GT投影到对应预测特征层上,根据GT的中心点定位到对应Cell,注意图中有三个对应的Cell。因为网络预测中心点的偏移范围已经调整到了( − 0.5 , 1.5 ) ,所以按理说只要Grid Cell左上角点距离GT中心点在( − 0.5 , 1.5 )范围内它们对应的Anchor都能回归到GT的位置处。这样会让正样本的数量得到大量的扩充。
  • 则这三个Cell对应的AT2和AT3都为正样本。

 

还需要注意的是,YOLOv5源码中扩展Cell时只会往上、下、左、右四个方向扩展,不会往左上、右上、左下、右下方向扩展。下面又给出了一些根据GT_{x}^{center}GT_{y}^{center} 的位置扩展的一些Cell案例,其中%1表示取余并保留小数部分。

跨预测分支匹配正样本:yolov5一共有三个预测分支,假设一个ground truth框可以和2个甚至3个预测分支上的anchor匹配,则这2个或3个预测分支都可以预测该ground truth框,即一个ground truth框可以由多个预测分支来预测。

为了扩充正样本个数一共采用了以下方案:

  1. 跨预测分支预测:假设一个ground truth框可以和2个甚至3个预测分支上的anchor匹配,则这2个或3个预测分支都可以预测该ground truth框,即一个ground truth框可以由多个预测分支来预测。

  2. 跨网格预测:假设一个ground truth框落在了某个预测分支的某个网格内,则该网格有左、上、右、下4个邻域网格,根据ground truth框的中心位置,将偏移范围在( − 0.5 , 1.5 )之间的网格也作为预测网格,也即一个ground truth框最多可以由3个网格来预测;

  3. 跨anchor预测:假设一个ground truth框落在了某个预测分支的某个网格内,该网格具有3种不同大小anchor,若ground truth可以和这3种anchor中的多种anchor匹配,则这些匹配的anchor都可以来预测该ground truth框,即一个ground truth框可以使用多种anchor来预测。

 6、数据增强

在YOLOv5代码里,关于数据增强策略还是挺多的,这里简单罗列部分方法:

  • Mosaic,将四张图片拼成一张图片

  •  Copy paste,将部分目标随机的粘贴到图片中,前提是数据要有segments数据才行,即每个目标的实例分割信息。下面是Copy paste原论文中的示意图

 

  • Random affine(Rotation, Scale, Translation and Shear),随机进行仿射变换,但根据配置文件里的超参数发现只使用了ScaleTranslation即缩放和平移。

 

  • MixUp,就是将两张图片按照一定的透明度融合在一起,具体有没有用不太清楚,毕竟没有论文,也没有消融实验。代码中只有较大的模型才使用到了MixUp,而且每次只有10%的概率会使用到。 

 

  • Albumentations,主要是做些滤波、直方图均衡化以及改变图片质量等等,我看代码里写的只有安装了albumentations包才会启用,但在项目的requirements.txt文件中albumentations包是被注释掉了的,所以默认不启用。

  •  Augment HSV(Hue, Saturation, Value),随机调整色度,饱和度以及明度。

 

  • Random horizontal flip,随机水平翻转 

 

 

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

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

相关文章

基础 | NIO - [0 复制]

INDEX1 0 复制1 0 复制演进1 示例1 0 复制 通常在进行 IO 操作时,涉及到 2 种复制 DMA 复制 不需要 CPU 参与,效率极高,但不可避免CPU 复制 就是 0 复制中需要消灭的复制,0 复制其实是指 0 CPU 复制 1 0 复制演进 BIO 用户态/…

如何自己设计一个定时任务分布式调度器

为什么要使用分布式调度器 分布式调度器主要应用于系统中一些任务定时调度处理。通常我们设计一个定时任务,最简单的就是直接使用scheduled注解配置好定时任务,这样开发工作也简单。但是也许会有一种情况,如果发生在生产环境上,需…

FPGA学习笔记(五)Testbench文件编写

这里写目录标题Testbench文件时间单位/精度测试模块输入信号初始化always 语句实现信号变化实例化系统函数Testbench文件 编写Testbench的目的是在Modsim中进行仿真验证,查看仿真波形和打印信息验证代码逻辑。 例如下面代码: timescale 1ns/1ns modul…

python数据容器---list

目录 1、列表的定义 1.1 基本语法 1.2 定义变量 1.3 定义空列表 2、列表的下标(索引) 2.1 基本语法 2.1.1 正向查找 2.1.2 方向查找 2.1.3 嵌套列表 3、列表的常用操作 3.1 查找某元素的下标 3.2 修改特定索引的值 3.3 插入追加元素 3.4 删…

基于java+jsp+ssm水果蔬菜销售系统

生活中,人们买水果或者蔬菜都是去菜市场买,因为那里是卖水果、蔬菜的聚集地。农商们把水果、蔬菜从远处运到那里,进行销售。但是这种销售方式的不足在于每次运输的数量是有限的,并且运输过程中也影响了水果、蔬菜的口感。随着生活节奏的加快,人们越来越注重高效的在线服务。在线…

让GPU跑的更快

作为一个cuda爱好者 一定要好好看看 不再让CPU和总线拖后腿:Exafunction让GPU跑的更快!确实只用cpu会卡的一比... 在云服务中使用 GPU 是获得低延迟深度学习推理服务最经济的方式。使用 GPU 的主要瓶颈之一是通过 PCIe 总线在 CPU 和 GPU 内存之间复制…

关卡一: ajax

【学习前提】 完成前端开发基础和JavaScript基础学习 【阶段说明】 Ajax这个术语源自描述从基于 Web 的应用到基于数据的应用。 Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。 使用 JavaScript 向服务器提出请求并处理响…

有被惊艳到 复刻一个大型互联网项目有多简单?大型网约车项目实战+东宝商城(附项目白皮书+核心源码)

从上图可以看出,面试准备其实可以分为两个部分:第一个部分是日常工作中对自己负责项目的抽象、提效、数据化表达;不断反思如何用技术的手段提升业务价值,就是我们日常常说的技术为业务赋能;第二个部分才是决定面试后 &…

第八章 CSP 架构 - CSP 网关配置

文章目录第八章 CSP 架构 - CSP 网关配置CSP 网关配置CSP 网关管理器定义服务器访问定义应用程序访问CSP 网关参数第八章 CSP 架构 - CSP 网关配置 CSP 网关配置 CSP 网关是安装在 Web 服务器上并由其加载的 DLL 或共享库。 CSP 网关检测对扩展名为 .csp 或 .cls 的文件的任何…

ApplicationRunner和CommandLineRunner的作用和区别

一、作用 ApplicationRunner和CommandLineRunner都用于在容器启动后(也就是SpringApplication.run()执行结束)执行某些逻辑。 可用于项目的一些准备工作,比如加载配置文件,加载执行流,定时任务等 二、共同点和区别 …

nodejs+vue+elementui学生成绩管理系统python/php/java445

前台首页功能模块 学生成绩管理系统设计;主要实现首页、优秀教师、优秀班主任、学校简介、教学课件、公告信息、优秀学生、试卷列表、新闻资讯、我的、跳转到后台,功能。 优秀教师,在优秀教师页面可以填写标题、教师工号、荣誉等详细&#xf…

经典论文研读:《F1:A Distributed SQL Database That Scales》

一 简介 F1是Google提出的分布式关系型数据库,支持便捷的水平伸缩。这篇论文是NewSQL分布式数据库架构的基石。论文首先定义了F1分布式数据库设计的关键方向: 可伸缩性:数据库要提供对业务透明的水平扩展能力,并支持数据迁移、数…

全同态加密(FHE)体系概述

同态加密定义 假设有这样一个场景,用户有一组私密数据,被加密存储在了第三方的云平台,现在,该用户想对这组数据进行某种处理,但是处理过程和结果都不想让第三方云平台看到。当然,用户可以选择将数据下载下…

ITU-T G.781解读(一)

引言 本系列是作者在学习ITU-T时做学习笔记之用,ITU-T的标准库是一个非常庞大的系列,尽管网络上有许多对标准的解读,但作者认为要想系统的掌握一个系列的知识,还是要自己看一遍原汁原味的原文。 时钟同步准则 同步信息通过同步…

【操作系统】第三章:内存管理

第三章:内存管理 OVERVIEW第三章:内存管理一、内存管理1.内存管理内容(1)地址转换:Point1:程序装入Point2:程序链接(2)内存保护:(3)内…

Linux命令:netstat【监控TCP/IP网络,可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息】【TCP的11种状态】

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。 netstat [选项] 选项描述-a显示所有网络连接和监听的所有端口。-b显示创建每个连接或者监听商品的相关可执行程序。有时候有些已知的可执行…

参数传递和重定向

目录 1、参数传递 方法一 (1)修改路由配置, 主要是router下的index.js中的 path 属性中增加了 :id 这样的占位符 (2)视图层传递参数 (3)接收参数 (4)测试 方法二(…

2022年中国研究生数学建模竞赛A题——移动场景超分辨定位问题

目录一、题目原文1、背景2、研究现状3、待解决的问题二、雷达基础知识三、解决方案一、题目原文 1、背景 在日常家庭生活中,人们可能需要花费大量时间去寻找随意摆放在家中某些角落里的小物品。但如果给某些重要物品贴上电路标签,再利用诸如扫地机器人…

IS-IS(v4)协议分析

IS-IS协议分析 基本概述 工作原理 基本配置 一、基本概述 IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是ISO (International Organization for Standardization,国际标准化组织&#x…

BGP(边界网关)协议的介绍与配置

边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系…