【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录

一 YOLOv5

二 YOLOv8


yolo通常采用backbone-neck-head的网络结构。

  • Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层,构建了一个深层次的特征提取器。
  • Neck通常用来进一步整合与调整backbone提取的特征,有利于将不同层次的特征融合进而提升网络对目标的感知能力。
  • Head通常包括边界框回归层(用于预测目标的位置)和分类层(用于预测目标的类别)。进行最终的回归预测。

一 YOLOv5

YOLOv5有s、m、l、x四个版本,模型的结构基本一样,不同的是depth_multiple模型深度和width_multiple模型宽度这两个参数。

1 YOLOv5的网络结构

主要结构图如下所示:

Input

YOLOv5在输入端Input采用了Mosaic进行数据增强

采用Mosaic数据增强的优点:

  • 随机使用4张图像,随机缩放后随机拼接,增加很多小目标,丰富数据集
  • 随机拼接的方式让一张图像可以计算四张图像的数据,减少每个batch的数量,即使只有一个GPU,也能得到较好的结果(减少GPU数量)。
  • 通过对识别物体的裁剪,使模型根据局部特征识别物体,有助于被遮挡物体的检测,从而提升了模型的检测能力。

Backbone 

Conv卷积层由卷积,Batch Normalization和SiLu激活层组成。其中,BN(batch normalization)具有防止过拟合,加速收敛的作用。BN层的输入为一个batch的特征图,它将每个通道上的特征进行均值和方差的计算,并对每个通道上的特征进行标准化处理。标准化后的特征再通过一个可学习的仿射变换(拉伸和偏移)进行还原,从而得到BN层的输出。激活函数用于给神经网络引入非线性变换能力。综上所述,Conv模块是常用的基础模块,它通过卷积操作提取局部空间信息,并通过BN层规范化特征值分布,最后通过激活函数引入非线性变换能力,从而实现对输入特征的转换和提取。

k:卷积核大小;S:步长;P:padding填充;C:Channels通道数。

C3模块的作用是增加网络的深度和感受野,从不同维度去提取特征并融合,提高特征提取的能力。

SPPSpatial Pyramid Pooling),空间金字塔池化模块其主要思想是将不同大小的感受野应用于同一张图像,从而能够捕捉到不同尺度的特征信息。在SPP模块中,首先对输入特征图进行不同大小的池化操作,以得到一组不同大小的特征图。然后将这些特征图连接Concat在一起,并通过全连接层进行降维,最终得到固定大小的特征向量。综上所述,SPP的作用是将不同尺度的特征进行融合,通过对特征图进行金字塔划分和池化操作,将多尺度特征整合到一个固定长度的特征向量中。

SPP模块的具体可参考下图,仅便于理解,不要纠结于数字哈!

与SPP相比,SPPF模块的池化操作由并联变为串联,且池化区域大小不变。后面两次池化是在上一次的基础上进行的。

Neck

特征金字塔是一种用于处理多尺度目标检测的技术。在Neck部分,yolov5主要采用了PANet结构。

FPN通过自顶向下(Top-down)的结构,将深层的语义信息传递到浅层,但是浅层的位置信息却无法影响到深层特征。PANet在FPN(feature pyramid network)上提取网络内特征层次结构,在FPN的基础上又引入了一个自底向上(Bottom-up)的路径。经过自顶向下(Top-down)的特征融合后,再进行自底向上(Bottom-up)的特征融合,这样底层的位置信息也能够传递到深层,从而增强多个尺度上的定位能力。

其中自底向上(Bottom-up)的过程是沿着N 2 → N 3 → N 4 → N 5 的路径,逐个stage通过卷积进行2倍下采样,然后与FPN中相应大小的feature map进行相加融合(在YOLOv5中采用的是拼接融合)。

Head

YOLOv5的Head对Neck中得到的不同尺度的特征图分别通过1×1卷积将通道数扩展,扩展后的特征通道数为:(类别数量+5)×每个检测层上的anchor数量。

5对应的是预测框的中心点横坐标、纵坐标、宽度、高度和置信度Head中的3个检测层分别对应Neck中得到的3种不同尺寸的特征图。

二 YOLOv8

Yolov8提供了N/S/M/L/X不同尺度的模型,以满足不同部署平台和应用场景的需求。

YOLOV8的改进内容如下:

  • Backbone:同样借鉴了CSP模块思想,但是将Yolov5中的C3模块替换成了C2f模块,实现了进一步轻量化,同时沿用Yolov5中的SPPF模块,并对不同尺度的模型进行精心微调,不再是无脑式一套参数用于所有模型,大幅提升了模型性能。
  • Neck:继续使用PAN的思想,但是删除了上采样阶段的卷积结构,同时将C3模块替换为C2f模块。
  • Head:相比YOLOv5改动较大,Yolov8换成了目前主流的解耦头结构(Decoupled-Head),将分类和检测头分离。从Anchor-Based换成了Anchor-Free思想(anchor-free和anchor-based是两种不同的目标检测方法,区别在于是否使用预定义的anchor框来匹配真实的目标框)
  • Loss计算:使用VFL Loss作为分类损失(实际训练中使用BCE Loss);使用DFL Loss+CIOU Loss作为回归损失。
  • 标签分配:Yolov8抛弃了以往的IoU分配或者单边比例的方式,而是采用Task-Aligned Assigner分配方式

1 YOLOV8的网络结构

主要结构图如下所示:

YOLOv5和YOLOv8配置文件参数对比:

YOLOv5YOLOv8

Backbone

V8同样借鉴了CSPDarkNet结构网络结构,但是将Yolov5中的C3模块替换成了C2f模块,实现了进一步轻量化,同时沿用Yolov5中的SPPF模块。

具体改进为:

  • 第一个卷积层的卷积核大小(Kernel size从6×6改为3x3。
  • 所有的C3模块改为C2f模块多了更多的跳层连接和额外Split操作
C3C2f
  • Block数由C3模块3-6-9-3改为C2f模块的3-6-6-3。

YOLOv5和YOLOv8的Backbone对比:

YOLOv5        YOLOv8

 ② Neck

Neck部分起到的作用是特征提取和特征融合,YOLOv8采用的是PAN-FPN的思想。

获取Neck产物的过程参考下图:

Layer4、Layer6、Layer9作为PANet(PANet是一个双向通路网络,引入了自下向上的路径,使得底层信息更容易传递到顶层)结构的输入,经过上采样,通道融合,最终将PANet的三个输出分支送入到Detect head中进行Loss的计算或结果解析。

③ Head

YOLOv8直接将耦合头改为类似Yolox的解耦头结构(Decoupled-Head),将回归分支和预测分支分离。

YOLOv5和YOLOv8的Head图对比:

YOLOv5和YOLOv8的配置文件Head对比:

YOLOv5YOLOv8

④ Loss

Loss计算过程包括两部分:正负样本分配策略和Loss计算分类和回归分支

常见的正负样本分配策略包括动态分配策略和静态分配策略两种。

  • 静态分配策略是指在训练开始之前,固定为一组预先定义的权重,这些权重不会在训练过程中改变。
  • 动态分配策略则可以根据训练的进展和样本的特点动态调整权重,使之可以更加关注那些容易被错分的样本。动态分配策略可以根据训练损失或者其他指标来进行调整,可以更好地适应不同的数据集和模型。

YOLOv5采用的是静态分配策略,考虑到动态分配策略的优异性,Yolov8算法中直接引用了TOOD中的Task-Aligned Assigner(对齐分配器)正负样本分配策略

分类得分和 IoU表示了这两个任务的预测效果,所以,TaskAligned使用分类得分和IoU的高阶组合来衡量Task-Alignment的程度。

s 和 u 分别为分类得分和 IoU 值,α 和 β 为权重超参。从上边的公式可以看出来,t 可以同时控制分类得分和IoU 的优化来实现 Task-Alignment,可以引导网络动态的关注于高质量的Anchor。

LOSS计算

分类损失:Yolov8团队应该是对VFL Loss和BCE Loss都尝试过,但最终发现使用VFL和使用普通的BCE效果相当,优势不明显,故采用了简单的BCE Loss。

回归损失CIou_Loss + Distribution Focal Loss

其中,CIou_Loss用于计算预测框与目标框之间的IoU。

通常,对于遮挡、模糊场景下目标框的边界存在一定的不确定性,常规的回归方式不能解决这种不确定问题。

DFL将边界表示成一种分布,解决边界不明确的问题。

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

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

相关文章

odoo10 创建第一个应用

当odoo10环境创建好之后,需要设置一个用户 我这里设置的叫做odoo_user,并给他设置全部的权限,用于创建数据库。 当我们在odoo的web主页创建一个数据库,我这里叫做my_odoo,然后我们创建一个名为myapp的模块 python .…

Linux云计算之Linux基础3——Linux系统基础part-2

1、终端、shell、文件理论 1、终端 终端(terminal):人和系统交互的必要设备,人机交互最后一个界面(包含独立的输入输出设备) 物理终端(console):直接接入本机器的键盘设备和显示器虚拟终端(tty):通过软件…

知了汇智鸿蒙系列讲座进校园,赋能产业数字化升级,助力创新人才培养

随着信创国产化战略的深入推进,以及万物互联时代的加速到来,信息技术产业正迎来前所未有的发展机遇。在这一背景下,成都知了汇智科技有限公司作为产教融合领域的先行者,积极响应国家号召,通过举办鸿蒙系列讲座进校园活…

对OceanBase中的配置项与系统变量,合法性检查实践

在“OceanBase 配置项&系统变量实现及应用详解”的系列文章中,我们已经对配置项和系统变量的源码进行了解析。当涉及到新增配置项或系统变量时,通常会为其指定一个明确的取值范围或定义一个专门的合法性检查函数。本文将详细阐述在不同情境下&#x…

【TB作品】MSP430单片机读取大气压强传感器BMP180

文章目录 实物main所有代码 实物 main #include <msp430.h> #include "stdio.h" #include "OLED.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>// P2.2 oled scl // P2.3 oled sda// p…

【vue/uniapp】使用 smooth-signature 实现 h5 的横屏电子签名

通过github链接进行下载&#xff0c;然后代码参考如下&#xff0c;功能包含了清空、判断签名内容是否为空、生成png/jpg图片等。 签名效果&#xff1a; 预览效果&#xff1a; 下载 smooth-signature 链接&#xff1a;https://github.com/linjc/smooth-signature 代码参考&a…

数据结构OJ题——栈和队列

1. 用栈实现队列&#xff08;OJ链接&#xff09; 题目描述&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回…

SpringBoot快速入门笔记(5)

文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架&#xff0c;安装 npm i element-ui -S 建议查看官方文档 Element组件&#xff0c;这里是Vue2搭配elementUI&#xff0c;如果是vue3就搭配elementPlus&#xff0c;这里初学就以Vue2为例子…

【软考---系统架构设计师】计算机网络章节

目录 一、TCP/IP协议族 &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;TCP和UDP的区别 &#xff08;3&#xff09;DNS协议 &#xff08;4&#xff09;DHCP协议 二、网络规划与设计 &#xff08;1&#xff09;需求分析 &#xff08;2&#xff09;通信规范…

Vue3(一):win7使用vue-cli创建vue3工程

一、资料分享 网课地址&#xff1a;尚硅谷Vue3入门到实战&#xff0c;最新版vue3TypeScript前端开发教程_哔哩哔哩_bilibili vuecli创建vue3项目官网&#xff1a;创建一个项目 | Vue CLI vite创建vue3官网&#xff1a;快速上手 | Vue.js 尚硅谷笔记&#xff1a;https://pan.ba…

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美(含源码仅此一份,先到先得)

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09; 目录 【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09;1.面向对象的引用1.1简介1…

day55 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1 300 最长递增子序列 题目链接 300 最长递增子序列 题意 找到整数数组nums的最长严格递增子序列的长度&#xff08;子序列并不改变原始的顺序&#xff0c;但是可以删除元素&#xff09; 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i] 表示以nums[i…

SpringMVC数据接收(全面/详细注释)

SpringMVC涉及组件&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ]HandlerMapping : SpringMVC提供&#xff0c;我们需要进行…

OSCP靶场--Dibble

OSCP靶场–Dibble 考点(前端鉴权参数修改node.js代码注入 suid cp提权 ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.110 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-09 06:36 EDT Nmap scan repor…

使用yolov8实现自动车牌识别(教程+代码)

该项目利用了一个被标记为“YOLOv8”的目标检测模型&#xff0c;专门针对车牌识别任务进行训练和优化。整个系统通常分为以下几个核心步骤&#xff1a; 数据准备&#xff1a; 收集包含车牌的大量图片&#xff0c;并精确地标记车牌的位置和文本信息。数据集可能包含各种环境下的…

MyLife 使用 TianliGPT 自动生成文章的AI摘要

博客还未迁移的时候&#xff0c;文章摘要就是使用 TianliGPT 自动生成的&#xff0c;现在迁移到 MyLife主题 后&#xff0c;特此记录一下。 前言 此教程的前提需要阅读 张洪Heo 的文章&#xff1a;如何让博客支持AI摘要&#xff0c;使用TianliGPT自动生成文章的AI摘要 购买 Ti…

探索 ChatGPT:解读 AI 对话的魔力(文末推荐一款AI工具聚合平台,可免费体验)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;个人主页&#xff1a;hacker707的csdn博客 &#x1f4ac;推荐一款AI工具聚合平台&#x1f449;Hulu AI 探索 ChatGPT&#xff1a;解读 AI 对话的魔力 ChatGPT 的魅力如何使用 C…

Linux系统本地搭建DbGate数据库并结合内网穿透实现无公网IP远程连接

文章目录 1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数据库管理工…

ios苹果ipa文件app内测分发有哪些操作流程

哈喽&#xff0c;大家好&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;在iOS应用开发过程中&#xff0c;进行内测分发是非常重要的一环&#xff0c;它能帮助开发者发现并修复应用中的问题&#xff0c;提升用户体验。上两期咱们一起探讨了一下App内测分发的目的及优势&#…

海山数据库(He3DB)原理剖析:浅析OLAP数据库计算引擎中的统计信息

背景&#xff1a; 统计信息在计算引擎的优化器模块中经常被提及&#xff0c;尤其是在基于成本成本优化&#xff08;CBO&#xff09;框架中统计信息发挥着至关重要的作用。CBO旨在通过评估执行查询的可能方法&#xff0c;并选择最有效的执行计划来提高查询性能。而统计信息则提…