YOLO系列正传(五)YOLOv4论文精解(上):从CSPNet、SPP、PANet到CSPDarknet-53

系列文章

YOLO系列基础

YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客

YOLO系列正传

YOLO系列正传(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客

YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53-CSDN博客

YOLO系列正传(三)神经网络的反向传播(back propagation)与公式推导-CSDN博客

YOLO系列正传(四)YOLOv3论文精解(下)——损失函数推导与其他优化项-CSDN博客

YOLO系列正传(五)YOLOv4论文精解(上):从CSPNet、SPP、PANet到CSPDarknet-53-CSDN博客


目录

系列文章

YOLO系列基础

YOLO系列正传

YOLOv4基础介绍

从CSPNet开始

背景与改进

过渡层详解

跨阶段连接分支卷积层详解

SPP模块详解

SPP背景介绍

什么是空间金字塔池化(SPP)?

PANet网络详解

背景与挑战

从FPN网络到PANet网络

CSPDarknet-53模型

CSP模块改进说明

SPP模块改进说明

SPP模块的结构

解释每一部分

PANet网络改进说明

 总结


YOLOv4基础介绍

YOLOv4进一步优化了YOLOv3,主要改进点包括:

  1. 主干网络:使用了CSPDarknet-53替代原YOLOv3中的Darknet-53。
  2. 新方法引入:例如Mish激活函数、Mosaic数据增强、DropBlock正则化和自对抗训练(SAT)。
  3. 优化策略:使用了CIoU Loss和多锚点匹配策略,使得模型在准确率和速度上实现了更好的平衡。

 我们本文专注与YOLOv4网络结构的内容,即CSPDarknet-53的结构梳理。

从CSPNet开始

背景与改进

        跨阶段部分连接网络CSPNet(Cross Stage Partial Network)是针对现有CNN设计的一种改进结构,旨在解决冗余梯度问题并减少计算成本。其实是类似残差结构中的一种,但是相比较于最基本的残差结构,CSPNet有两点不同:

  • CSPNet在密集层之后还有一层卷积作为过渡层
  • CSPNet在跨阶段连接分支上也有一层卷积进行信息的选择性传递。

有关CSPNet的基础内容,可以查看以下博客:

深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解-CSDN博客

以上博客讲诉了残差网络Residual、加权残差连接WRC、以及跨阶段部分连接CSP的基础信息。
本博文在上诉的基础上更进一步详解CSPNet的此两点不同

过渡层详解

过渡层的主要作用是用以在反向传播中梯度传导过程中过渡传导过程。图例如下:

(c)图是没有过渡层的CSPNet,(d)图是有过渡层的CSPNet

        我们先看a图,a图两层分支直接进行了concat拼接后进行Transition后续处理,那么在反向传播中,梯度传播到concat形成的大特征图的时候会对左右两条分支产生一样的前序梯度信息,那么在很大程度上,左右两条分支会产生冗余和重复。

我们此时看b图,b图中密集层(DenseBlock)处理完之后先进行了一次过渡层(Transition)操作(大多是卷积)再和另外一条分支进行concat操作。此时,当我们进行反向传播的时候,抵达concat之后的大特征图的时候梯度信息是一致的,但是梯度信息传递到过渡层的之后再传递给密集层的时候,梯度信息和另一分支就产生了差异性,这在很大程度上避免了梯度冗余和重复。

跨阶段连接分支卷积层详解

在基础残差网络中,我们是没有这一层卷积的,图例如下:

图a:普通的神经网络密集层,图b:Part1为一层卷积操作的CSP改造网络 

此处CSP增加这里的卷积的理由有哪些呢?有如下 两点:

  • 避免硬件计算资源浪费
  • 增加模型表达能力

        在传统残差网络中,密集层大多采用瓶颈层来降低计算量,那么很明显,针对低层的瓶颈层是无法吃满硬件计算资源的,这就给另一分支的构建提供了机会。也就是说另一分支完全可以增加复杂度而不会影响模型速度。给另一分支增加卷积层等处理模块可以避免计算资源的浪费。

        其次,在残差网络中,我们采用跳跃连接的方式是为了使得低层特征可以传递给高层输出,以不丢失低层特征信息,并以此使得模型的深度可以无限往下延深。实际上我们真正需要做的,是在尽可能少的层数里(降低推理速度)获取足够有效的特征信息,也就是说我们不需要模型无限延展,我们需要的是模型每一层的效率足够高,可以处理输出足够有效的特征信息,所以,在另一分支上增加卷积层提高模型效果的思路是完全可行的。

综上CSPNet的结构我们完全解释清晰了。

SPP模块详解

YOLOv4这一版本引入了空间金字塔池化技术(SPP:Spatial Pyramid Pooling)

图例如下:

SPP背景介绍

卷积层对所有的输入size都能正常运行,但是对于最后的检测头,若是采用了FC层(FC层的具体输出维度是固定的)就会产生对输入图像size的要求,这也是传统的CNN架构通常要求输入图像具有固定尺寸的原因,这一要求限制了网络的灵活性,直接resize又会导致图像尺寸信息的丢失。为了克服这一限制,许多研究者提出了不同的解决方案,其中之一就是空间金字塔池化(Spatial Pyramid Pooling,SPP)。SPP通过引入多层次的池化结构,有效地解决了图像尺寸固定的问题,使得CNN能够处理不同尺寸和尺度的图像。

什么是空间金字塔池化(SPP)?

        空间金字塔池化(SPP)的核心思想是通过在多个空间尺度上进行池化,从而生成一个固定长度的特征向量。具体来说,SPP方法通过在卷积神经网络的最后一层卷积层上添加一个池化层,将特征图分成多个不同大小的区域进行池化操作。这些池化操作可以是1×1、2×2、4×4等不同的空间网格,这样能够在不同的尺度上提取图像的特征。最终,来自各个尺度的池化特征会被拼接在一起,形成一个固定长度的特征向量。

空间金字塔池化层的工作原理可以通过以下几个步骤来概括:

  1. 输入特征图:最后一个卷积层生成的特征图,其空间尺寸根据输入图像的大小而不同。
  2. 多层次池化:SPP层将特征图分成多个不同大小的空间区域(如1×1、2×2、4×4等),并在每个区域内进行池化操作。这样,SPP层从不同尺度提取特征。
  3. 特征拼接:池化后的特征会被拼接在一起,形成一个固定长度的特征向量。
  4. 传递至全连接层:这个固定长度的特征向量被传递给全连接层,用于最终的分类或其他任务。

通过这一过程,SPP层能够有效地从不同尺寸的图像中提取重要特征,并为后续的高层任务提供稳健的输入。

PANet网络详解

背景与挑战

实例分割任务的主要挑战在于如何精确地分割图像中的每个实例,尤其是当不同实例之间存在重叠、形状复杂或者尺寸差异较大时。虽然像Mask R-CNN这样的基于深度学习的方法已经取得了较好的结果,但它们仍然面临以下问题:

  • 特征丢失: 网络中的高层特征提供了丰富的语义信息,但缺乏足够的细节。相反,低层特征包含更多的局部细节信息,却缺乏语义理解。
  • 边界模糊: 复杂实例的边界分割往往不够精细,导致误分割和漏分割现象。
  • 多尺度问题: 不同尺寸的物体在图像中可能有很大的差异,现有的分割方法在处理小物体和大物体时常常表现不佳。

        为了克服这些问题,PANet提出了一种新的路径聚合策略,将低层次的细节信息与高层次的语义信息进行有效融合,从而提高了实例分割的准确性。

从FPN网络到PANet网络

FPN通过自底向上的特征金字塔模型给低维特征数据提高了更高维的特征向量支持,简单来说较低层的数据通常用于检测小目标 ,高层特征用于检测大目标。

随着网络深度的加深,越深的网络会丢失越来越多的细节信息以保持对大范围特征信息的识别,而较低层的网络虽然保留了更多信息,但是却没有经过足够多的处理获取更高层级的特征信息。所以在以上的背景下,FPN被提出了,这使得小目标的检测头在保留大量细节信息的基础上也可以获得高层级特征向量。

也许有人就会问了,那为什么没有从低层直接向高层连接的向量给高层检测头提高更多的细节信息呢?没错,答案就是PANet层!

        图中b图展示了在左侧FPN层之后再次进行了PANet层,底层特征信息被传递给了高维数据

        PANet通过路径聚合模块,将多层次的特征进行有效融合。网络不仅仅依赖于高层的抽象语义信息,同时也保留了低层次的局部细节,从而更好地适应不同尺寸、不同复杂度的物体。这种多尺度特征融合方法使得PANet在处理大物体和小物体时,均能获得较好的分割效果。 

CSPDarknet-53模型

终于来到了我们今天的正题:YOLOv4的网络结构

模型图如下:

YOLOv4的网络结构图

YOLOv4 CSPDarknet-53 主干网络部分如下: 

标YOLOv4 CSPDarknet-53 主干网络题
大家可以参考以下YOLOv3模型的结构图:

YOLOv3的详解可以查看以下博客:

YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53-CSDN博客

其实,细心的读者可以发现,主干网络的逻辑是近乎一致的。

CSP模块改进说明

YOLOv3中的Residual残差模块和CSPNet思想结合构建了CSPBlock模块,由于使用了CSP模块,密集层也无需有瓶颈层了,全部都是一样的维度.其对比如下:

左图:YOLOv3Darknet-53网络残差结构,右图:YOLOv3CSP魔改后的残差结构 

可以看出,YOLOv4改进点无非就是以下两点:

  • Residual没有使用瓶颈层,提高了计算效率(毕竟瓶颈层是对计算是有负面影响的)
  • 使用CSP进行跨阶段连接,提升了特征提取能力

SPP模块改进说明

在YOLOv4中,SPP(Spatial Pyramid Pooling)模块是为了增强模型在处理不同尺度的物体时的表现。YOLOv4在模型中加入了SPP模块,旨在通过多尺度特征池化来捕获更多的上下文信息,帮助检测不同尺寸的物体。下面我将详细解释YOLOv4中SPP模块的设计。

SPP模块主要是为了达成以下目标:

  • 多尺度特征提取:SPP模块通过使用不同大小的池化层(max-pooling)来捕捉不同尺度的信息。这使得网络能够在不增加额外计算量的情况下,提取多尺度的上下文信息。
  • 增强局部特征的上下文信息:通过对不同大小的区域进行池化,SPP模块能够更好地理解输入图像的全局上下文信息,帮助模型对不同尺度的物体做出更准确的预测。

SPP模块的结构

在YOLOv4的cfg文件中,SPP模块的实现如下:

### SPP ###
[maxpool]
stride=1
size=5[route]
layers=-2[maxpool]
stride=1
size=9[route]
layers=-4[maxpool]
stride=1
size=13[route]
layers=-1,-3,-5,-6
### End SPP ###

解释每一部分

[maxpool]:SPP模块在YOLOv4中包含三个不同大小的maxpool层,每个层使用不同的池化窗口大小,分别是5x59x913x13。这些池化层分别作用于不同尺度的区域来提取特征。

  • 第一层:池化大小为5x5,stride为1。这是最小的池化层,用于捕获较小范围的上下文信息。
  • 第二层:池化大小为9x9,stride为1。它比第一个池化层捕获更大的上下文信息。
  • 第三层:池化大小为13x13,stride为1。这是最大的池化层,可以捕获最大范围的上下文信息。

[route]:这些route层将不同池化层的输出连接在一起,以形成一个多尺度的特征图。

  • layers=-2:将来自前一层的输出连接到当前层。
  • layers=-4:将离当前层更远的输出连接起来,进行多尺度的特征融合。
  • layers=-1,-3,-5,-6:最终将所有池化层的输出(5x5, 9x9, 13x13池化的结果)通过route层合并到一起,形成一个丰富的特征图。

PANet网络改进说明

YOLOv4检测头图例如下:

其中P3、P4、P5是FPN金字塔的输出,后面的N3、N4、N5是PANet网络的输出。

我们可以清晰的看见FPN有一个由下向上的路径,PANet有一个由上向下的路径。这样网络不仅仅依赖于高层的抽象语义信息,同时也保留了低层次的局部细节,从而更好地适应不同尺寸、不同复杂度的物体。很好的补齐了FPN的不足和缺失。

 总结

至此,我们详细讲解了CSPNet、SPP、PANet的相关重点,以及YOLOv4模型网络CSPDarknet-53的模型结构内容!

最后,各位广大读者!看到这您也知道准备一篇类似的博客实属不易,还请多多点赞收藏哦!

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

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

相关文章

Vulnhub靶场-Driftingblues 6靶机(至获取shell)

靶机安装好后,照例扫描IP 端口 目录 首页为一个图片,没有什么信息 访问robots.txt,存在一个textpattern/textpattern目录,我们访问为一个登录窗口,sqlmap无法注入 提示我们扫目录时添加.zip扩展名,所以我们…

基于springboot的汽车租赁系统丨源码+数据库+万字文档+PPT

作者简介: 作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 技术框架 开发语言:Java 框架:spring…

学习,指针和FLASH

一个经典的指针交换数值函数&#xff1a; #include <stdio.h>void interchange(int *u,int *v); void interchange(int *u,int *v) {int temp;temp*v;*v*u;*utemp; }int main() {int x5,y10;printf("before swap value x:%d value y:%d\n",x,y);interchange(&…

【每日学点鸿蒙知识】组件封装通用方法、callback和await性能对比、Web组件下拉刷新、hsp包报错、WebView圆角

1、HarmonyOS 自定义的组件如何封装一些通用的属性和方法&#xff0c;例如 Java 中的继承&#xff1f; export class Animal{name:stringage:stringconstructor(name:string,age:string) {this.name namethis.age age} }export class Person extends Animal{reading:stri…

Qt父窗口处理子窗口大小变化消息installEventFilter

1.需求描述 父窗口从上到下时标题栏&#xff0c;播放窗口和工具栏&#xff0c;希望监测中间播放窗口的大小变化&#xff0c;来根据分辨率自动调整播放画面的宽高&#xff1b;因为工具栏和标题栏可以隐藏&#xff0c;所以父窗口大小不变&#xff0c;中间的播放窗口也会随着工具…

策略模式以及优化

使用场景 在一个条件语句中又包含了多个条件语句 具体策略类会过多 把抽象策略和具体策略放在一个枚举类里。 方法 exe() 相当于抽象策略&#xff0c;而A和B就相当于实现了抽象策略的具体策略 这样就只需要一个枚举类就可以解决具体策略类过多的问题 public enum Strategy {A{O…

17_HTML5 Web 存储 --[HTML5 API 学习之旅]

HTML5 Web 存储&#xff08;Web Storage&#xff09;是 HTML5 引入的一种在用户浏览器中存储数据的机制。它提供了比传统的 cookies 更加方便和强大的功能&#xff0c;包括更大的存储空间、更好的性能以及更简单的 API。Web 存储主要分为两种类型&#xff1a;localStorage 和 s…

Java处理视频思路

1.首先实现断点续传功能。 断点续传实现思路&#xff1a; 前端对文件分块。前端使用多线程一块一块上传&#xff0c;上传前给服务端发一个消息校验该分块是否上传&#xff0c;如果已上传则不再上传。如果从该断点处断网了&#xff0c;下次上传时&#xff0c;前面的分块已经存在…

RealityCapture导入视频序列失败

问题原因&#xff1a;如果导入的视频文件存在多余的元数据&#xff0c;那么在这里会发生导入失败。 以本人华为手机拍摄的一段.mp4视频为例&#xff1a; 利用ffmpeg在窗口命令行中检查你的视频—— ffmpeg -i your_video_name.mp4your_video_name是你的视频文件名 如下图所示&…

Windows下Python+PyCharm的安装步骤及PyCharm的使用

Windows下PythonPyCharm的安装步骤及PyCharm的使用 文章目录 Windows下PythonPyCharm的安装步骤及PyCharm的使用一、Python的安装&#xff08;1&#xff09;环境准备&#xff08;2&#xff09;Python安装&#xff08;3&#xff09;pip组件的安装 二、PyCharm的安装&#xff08;…

khadas edge2安装ubuntu22.04与ubuntu20.04 docker镜像

khadas edge2安装ubuntu22.04与ubuntu20.04 docker镜像 一、资源准备1.1 镜像文件1.2 刷机工具1.3 ubuntu20.04 docker镜像&#xff08;具备demon无人机所需各种驱动&#xff09; 二、开始刷机&#xff08;安装ubuntu22.04系统&#xff09;2.1 进入刷机状态2.2 刷机 三、docker…

ASP.NET |日常开发中常见问题归纳讲解

ASP.NET &#xff5c;日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态&#xff08;在ASP.NET Web Forms 中&#xff09; 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击&#xff08;XSS&#xff09; 三、状态管理问题3.1 会话状态&#xff08;Session …

基础爬虫案例实战

我们已经学习了多进程、requests、正则表达式的基本用法,但还没有完整地实现过一个爬取案例。这一节&#xff0c;我们就来实现一个完整的网站爬虫&#xff0c;把前面学习的知识点串联起来&#xff0c;同时加深对这些知识点的理解。 准备工作 我们需要先做好如下准备工作。 安…

JAVA: 子类“覆盖”父类的成员变量

参考&#xff1a;JAVA: 子类“覆盖”父类的成员变量_子类覆盖父类成员变量-CSDN博客 public class Person {static String name "person";public String getName() {return name;}public void setName(String name) {this.name name;} }public class Dad extends …

Pandas08

Pandas01 Pandas02 Pandas03 Pandas04 Pandas05 Pandas06 Pandas07 文章目录 内容回顾同期群分析1.1 同期群分析概念1.2 案例代码 数据分析报告数据分析工作内容数据分析简历说明用户生命周期标签1 什么是生命周期标签2 如何计算生命周期标签 内容回顾 TGI 偏好分析 TGI 目标…

Linux 硬盘扩容 分区 挂载

Linux 硬盘扩容 分区 & 挂载 1. 添加分区 1.1. 查看新添加的硬盘 fdisk -l假设当前未挂载的盘符是/dev/sdb&#xff0c;后文中所有操作都按挂载/dev/sdb 操作 1.2. 分区管理 小硬盘 fdisk /dev/sdb大硬盘&#xff08;2TB以上&#xff09; gdisk /dev/sdb1.3. 编辑分…

Python einops库介绍

einops 是一个轻量级的 Python 库,提供了直观和灵活的张量操作方法。其核心功能包括重排(rearrange)、重塑(reshape) 和 归约(reduce),并通过简单的字符串表达式定义复杂的张量操作,适用于 Numpy、PyTorch、TensorFlow、JAX 等常用深度学习框架。 einops 的主要功能 …

Spring Boot 项目中 Maven 剔除无用 Jar 引用的最佳实践

目录 引言Maven 依赖管理的基础概念 2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机制 无用依赖的常见问题与影响剔除无用 Jar 引用的常见方法 4.1 识别无用依赖4.2 使用 Maven 的 dependency:analyze 插件4.3 配置 scope 以优化依赖范围4.4 使用 exclude 排除传递依赖4.5 分析…

Windows11家庭版 Docker Desktop 的安装历程

1.下面是 Docker Desktop 的官网下载地址 窗户 |Docker 文档 不出意外下载会很慢&#xff0c;下载好了先不安装 2.打开电脑的一些兼容程序 控制面板 -> 程序 -> 启用或关闭Windows功能 勾选下列兼容功能&#xff0c;有Hyper-v也勾上&#xff0c;不过我没有 3.下载WSL…

总结TCP/IP四层模型

总结TCP/IP四层模型 阅读目录(Content) 一、TCP/IP参考模型概述 1.1、TCP/IP参考模型的层次结构二、TCP/IP四层功能概述 2.1、主机到网络层  2.2、网络互连层  2.3、传输层  2.3、应用层 三、TCP/IP报文格式 3.1、IP报文格式3.2、TCP数据段格式3.3、UDP数据段格式3.4、套…