YOLOv4 学习记录

news2025/1/10 12:08:59

文章目录

  • 整体概况
  • 数据增强
    • Mosaic数据增强
  • 基于CSPNet网络思想的架构改进
    • Mish激活函数
    • CSPNet
      • CSPNet 3 大优势
      • Partial Transition 层
    • CSPDarkNet (yolo v4 中的CSPDarkNet53)
  • Neck
    • SPPNet
    • PAN-FPN 结构
  • 正负样本匹配
  • 损失函数
    • IOU 损失函数
      • IOU的2个问题:
    • GIOU Loss示意图如下:
      • GIOU 问题如下:
    • DIOU 的提出

整体概况

YOLOv4主要涉及的改进内容如下:

  1. 输入端改进:Mosaic数据增强
  2. 主干网络:CSPDarkNet53(涨点最优价值,对后续框架影响最大的一点)
  3. Neck:SPP、PANet
  4. 损失函数:CIOU损失
  5. 激活函数:Mish激活函数
  6. 样本匹配:增加了匹配样本的数量

数据增强

Mosaic数据增强

利用了4张图片,对4张图片进行拼接,每一张图片都有其对应的框框,将4张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框,然后将这样一张新的图片传入到神经网络当中去学习,这极大丰富了检测物体的背景,
Mosaic数据增强的具体步骤如下:

  1. 首先随机取4张图片
  2. 分别对4张图片进行数据增广操作,并分别粘贴至与最终输出图像大小相等掩模的对应位置。
  3. 进行图片的组合和框的组合

注意:数据增广包括:翻转、缩放以及色域变化(明亮度、饱和度、色调)等操作。
在这里插入图片描述

使用 Mosaic 数据增强主要有2个优点:

  1. 丰富数据集:随机使用 4 张图像,随机缩放,再随机分布进行拼接,大大丰富了目标检测的数据集,特别是随机缩放增加了很多小目标,让网络模型对于小目标的稳健性变得更好。
  2. 减少 GPU 的使用:Mosaic 增强训练时,可以在单图像尺度的情况下直接计算 4 张图像的数据,使得 Mini-batch Size 并不需要很大,即使用 1 个 GPU 就可以达到比较好的收敛效果。

基于CSPNet网络思想的架构改进

Mish激活函数

Mish 激活函数是一种自带正则的非单调激活函数,平滑的激活函数能够让模型获得更好的非线性;从而得到更好的准确性和泛化,Mish 激活函数的数学表达式为:

如图所示,首先,Mish 函数和 ReLU 一样都是无正向边界的,可以避免梯度饱和。其次,Mish 函数是光滑的,并且在绝对值较小的负值区域允许一些负值。
注意,Mish 激活函数的计算复杂度比 ReLU 要高,在计算资源不足的情况下,可以考虑使用 LeakyReLU激活函数代替 Mish 激活函数。

CSPNet

涨点最优价值,对后续框架影响最大的一点。

主要目的是使该架构能够实现更丰富的梯度组合,同时减少计算量。这个目的是通过将基础层的特征图分割成两部分,然后通过提出的跨阶段分层(cross-stage hierarchy)结构进行合并来实现的。
主要概念是通过分割梯度流,使梯度流在不同路径中传播。通过这种方式传播的梯度信息更加丰富。此外,CSPNet可以大大减少计算量,提高推理速度以及精度。

CSPNet 3 大优势

基于CSPNet的目标检测器主要有以下3个优势:

  1. 增强学习能力: 现有的CNN在轻量化后,其精度大大降低,因此作者希望加强CNN的学习能力,使其在轻量化的同时保持足够的准确性。
  2. 移除计算瓶颈:过高的计算瓶颈会需要更多的计算周期来完成推理过程,或者一些算力单元经常闲置。因此,作者希望能够均匀分配CNN中各层的计算量,这样可以有效提升各计算单元的利用率,从而减少不必要的能耗。
  3. 降低内存消耗:内存晶圆制造成本非常昂贵,而且还占用了大量的空间。CSPNet能有效降低存储的成本,进而大大降低硬件的成本。

Partial Transition 层

设计Partial Transition 层的目的是使梯度组合的差异最大。Partial Transition 层是一种层次化的特征融合机制,它利用梯度流的聚合策略来防止不同的层学习重复的梯度信息。
在这里CSPNet论文中设计了2个 CSPDenseNet 变体来展示这种梯度流截断是如何影响网络的学习能力的。
Transition 层的含义和 DenseNet 类似,是一个 1×1 的卷积层(没有再使用Average pool)。图中Transition 层的位置决定了梯度的结构方式,并且各有优势:
© Fusion First 方式,先将2个部分进行 Concat,然后再进行输入到 Transion 层中,采用这种做法会使得大量梯度信息被重用,有利于网络学习;
(d) Fusion Last 的方式,先将部分特征输入 Transition层,然后再进行Concat,这样梯度信息将被截断,损失了部分的梯度重用,但是由于 Transition 的输入维度比©图少,相对来说也可以减少计算复杂度。
(b) 图中的结构是论文 CSPNet 所采用的,其结合了 ©、(d) 的特点,提升了学习能力的同时也提高了一些计算复杂度。

在这里插入图片描述
CSPNet作者在论文中给出其使用不同 Partial Transition 层的实验结果,如图所示为PeleeNet改进前后的性能对比。
如果在实际项目中想使用CSPNet来改进自己的模型,作者的建议是:具体使用哪种结构可以根据实际的项目条件和使用场景进行调整。
在这里插入图片描述

CSPDarkNet (yolo v4 中的CSPDarkNet53)

CSPDarkNet结合了Fusion First与Fusion Last的设计思想,设计了 CSPResBlock,并用于 CSPDarkNet 的构建。

如图所示,CSPResBlock 的基本组件是 Conv+BN+Mish 的形式,其中也包含了从 ResNet吸取的残差结构的思想。但是为了降低重复的梯度学习,设计者又使用了另一个 Shortcut和 Conv+BN+Mish 结合的形式,对特征进行了一次提取,以增加梯度的丰富性。

由于跨越的卷积层数比较多,大大降低了梯度学习的重复性。同时,在 Block 的最后使用了 Concat 进行特征的融合,也大大增加了特征的鲁棒性,从而在很大程度上提升了模型的性能。

CSPDarkNet53依然使用的是类似 ResNet 的层次结构设计的思想,以及这里CSPDarkNet53对于每个 Stage的配置同DarkNet53一样,分别是 1、2、8、8、4,依次对应的下采样倍数为:2、4、8、16、32。

Neck

SPPNet

SPP模块的特点如下:

  1. 由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变和降低了过拟合
  2. 实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛;
  3. SPP 对于特定的CNN网络设计和结构是独立的。(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的pooling层)
  4. 不仅可以用于图像分类而且可以用来目标检测;
    因此,YOLOv4借鉴了SPP的思想,在Backbone尾部使用了SPP结构实现了局部特征和全局特征的融合,扩大了感受野,丰富最终特征图的表达能力,进而提高 mAP。

PAN-FPN 结构

FPN 是 Facebook 于 2017 年提出的用于目标检测的模块化结构,但 FPN 在很多计算机视觉任务中都有使用,比如姿态估计、语义分割等领域。
FPN 通过构造一种独特的特征金字塔来避免图像金字塔中计算量过高的问题,同时能够较好地处理目标检测中的多尺度变化问题。如图所示的 FPN 结构,对于 Backbone的特征进行 1×1 卷积来改变特征图的通道数,同时最底层的特征进行向上采样,然后将2个特征进行融合,得到更高分辨率、更强语义的特征,这样也有利于小目标的检测。

可以看到 FPN 是自顶向下将高层的强语义特征传递下来,对整个特征金字塔进行增强,不过 FPN 结构只增强了特征的语义信息,对特征的定位信息没有得到很好的传递,因此在YOLOv4中还添加了 PAN 结构,来增强定位信息的传递。
FPN+PAN 借鉴的是PANet,当时主要应用于图像分割领域,如图所示,FPN 是自顶向下,将高层的强语义特征传递下来,而 FPN+PAN 针对这一点,在 FPN 的后面添加一个自底向上的金字塔,这样的操作是对 FPN 的补充,将底层的强定位特征传递上去,这也YOLOv4的Neck不仅能增强高级语义信息,又能增强特征的定位信息。
在这里插入图片描述

正负样本匹配

在这里插入图片描述
YOLOv4采用了不同于YOLOv3的multi anchor策略,即只要大于IoU阈值的anchor box,都统统视作正样本,换言之,那些原本在YOLOv3中会被忽略掉的样本,在YOLOv4中则统统成为了正样本,不难看出,YOLOv4的正样本会略微多于YOLOv3,对性能的提升也自然会有一些帮助。

GT需要利用max iou原则分配到不同的预测层yolo-head上去,然后在每个层上单独计算正负样本和忽略样本。

损失函数

MSE Loss主要问题就是导数变化不稳定,尤其是在早期阶段(损失越大,导数越大),随着导数越来越小, 训练速度变得越来越慢。也因此有学者提出了IOU一系列的损失函数。
IOU损失函数演变的过程如下:IOU => GIOU => DIOU =>CIOU损失函数,每一种损失函数都较上一种损失函数有所提升。

IOU 损失函数

IOU的表达式如下所示:
在这里插入图片描述

IOU的2个问题:

问题1:即情况1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。
问题2:即情况2和情况3的情况,当2个预测框大小相同,2个IOU也相同,IOU_Loss无法区分两者相交情况的不同。
在这里插入图片描述

GIOU Loss示意图如下:

图中最大外接矩形为C,红色区域为差集A(C-并集),那么给出GIOU Loss的表达式如下:

可以看到GIOU Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU Loss时的问题。
如下图所示的两个案例,他们的IOU均为0.33,而他们的GIOU分别为0.33和0.24.
在这里插入图片描述

GIOU 问题如下:

可以看出,下面 3 种情况差集均相等,这个时候 GIOU Loss就退化为了IOU Loss,GIOU Loss 也无法反映 3 种情况的好坏。

在这里插入图片描述

DIOU 的提出

为了解决GIOU遇到的问题,DIOU就诞生了。
DIOU作者认为好的目标框回归函数应该考虑3个重要几何因素:重叠面积、中心点距离,长宽比。
针对 IOU 和 GIOU 存在的问题,DIOU作者从两个方面进行考虑
   1. 如何最小化预测框和目标框之间的归一化距离?
   2. 如何在预测框和目标框重叠时,回归的更准确?
针对第一个问题,提出了 DIOU Loss(Distance IOU Loss),DIOU Loss 考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量 2 个框的距离,因此 DIOU Loss 收敛的更快。
在这里插入图片描述
DIOU 的问题:
如下图所示的3种状态预测框和真实目标框的中心点距离是相同的,DIOU Loss 也退化成了 IOU Loss。如上面提到的目标检测回归函数需要考虑到的3种因素,DIOU Loss 没有引入长宽比的衡量。针对这个问题,CIOU Loss 被提出来。

在这里插入图片描述
YOLOv4 采用 CIoU Loss 做 Bounding Box 的回归损失函数,而分类损失和目标损失都使用的是交叉熵损失。
对于回归损失,其数学表达式如下:在这里插入图片描述

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

不损失精度,提升计算速度的操作?
要降低计算量?
要增加计算效率?

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

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

相关文章

9月前三大海外“债主”分别减持美债,”美债还完全吗?

KlipC报道:当地时间11月16日,美国财政部公布了2023年9月的国际资本流动报告(TIC),日本在今年9月继续位居美国国债的最大海外持有国,但所持美国国债环比减少285亿美元,为四个月里首度减持美债,中国大陆仍为美…

OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域

文章目录 前言一、绘制图形1. 绘制直线2. 绘制圆3. 绘制矩形4. 绘制椭圆5. 绘制多边形6. 绘制文字7. 可选参数8. 手工绘制OpenCV的logo 二、图像金字塔1. 高斯金字塔2. 拉普拉斯金字塔 三、感兴趣区域(ROI)数组切片方式OpenCV截取方式 总结 前言 OpenCV…

【powershell】入门和示例

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ 简介用途IDE解决此系统上禁止运行脚本 2️⃣ 语法3️⃣ 实战数据库备份执行循环拷贝文件夹 🛬 文章小结📖 参考资料 🛫 导读 开发环境 版本号描述文章日期2023-11-17操作系统Win10 - 22H21904…

设计模式-备忘录模式-笔记

动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节…

ubuntu20.04在docker下运行ros-noetic

经常折腾虚拟机各双系统 , 想着不如把docker利用起来,下面算是一个初学者使用docker运行ros的记录: 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

openRPA开源项目源码编译

最近接触到了一个新的领域——RPA,RPA全称Robotic Process Automation,中文名为机器人流程自动化。RPA可以视作一个数字机器人,它可以通过程序来模拟人与软件系统的交互过程,代替人工将大量重复、有规则的计算机操作自动化&#x…

【Vue配置项】 computed计算属性 | watch侦听属性

目录 前言 computed计算属性 什么是计算属性? Vue的原有属性是什么? 得到的全新的属性是什么? 计算属性怎么用? 计算属性的作用是什么? 为什么说代码执行率高了? computed计算属性中的this指向 co…

CTFd-Web题目动态flag

CTFd-Web题目动态flag 1. dockerhub注册2. dockerfile编写3. 上传到docker仓库4. 靶场配置5. 动态flag实现 1. dockerhub注册 想要把我们的web题目容器上传到docker仓库中,我们需要dockerhub官网注册一个账号,网址如下 https://hub.docker.com/2. dock…

Android Glide加载transform CenterCrop, CircleCrop ShapeableImageView圆形图并描边,Kotlin

Android Glide加载transform CenterCrop, CircleCrop ShapeableImageView圆形图并描边,Kotlin import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.…

基于ssm+vue设备配件检修管理系统

摘要 随着工业设备的日益复杂和多样化,设备配件的检修管理成为保障生产运行和设备寿命的关键环节。本研究基于SSM框架(Spring Spring MVC MyBatis),致力于设计和实现一套全面、高效的设备配件检修管理系统。该系统不仅能够提高设…

从0开始学习数据结构 C语言实现 1.前篇及二分查找算法

一、前篇 1、什么是数据结构? 数据结构是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系 2、时间复杂度与空间复杂度 大O符号是用于描述函数渐进行为的数学符号 常用函数的增长表 阶乘O(n!) > 指数…

常见面试题-MySQL软删除以及索引结构

为什么 mysql 删了行记录,反而磁盘空间没有减少? 答: 在 mysql 中,当使用 delete 删除数据时,mysql 会将删除的数据标记为已删除,但是并不去磁盘上真正进行删除,而是在需要使用这片存储空间时…

【原创】java+swing+mysql校园活动管理系统设计与实现

前言: 本文介绍了一个校园活动管理系统的设计与实现。该系统基于JavaSwing技术,采用C/S架构,使用Java语言开发,以MySQL作为数据库。系统实现了活动发布、活动报名、活动列表查看等功能,方便了校园活动的发布和管理&am…

如何合理估算 Java 线程池大小

前 言 Java 中的线程创建会产生显著的成本。创建线程会消耗时间,增加请求处理的延迟,并且涉及 JVM 和操作系统的大量工作。为了减轻这些开销,线程池发挥了作用。 在本文中,我们将深入研究确定理想线程池大小的艺术。经过微调的线…

【数据结构】栈与队列的实现

栈与队列是数据结构中重要的结构, 可以用于解决一些题目 模拟实现时可以增加对于这些结构的理解,也可以巩固我们的语言水平,解决某些题目也会有很好的效果 话不多说 目录 栈的实现结构体的定义:初始化栈:压栈:出栈&am…

leetcode栈和队列三剑客

用队列实现栈 队列是先进先出的,而栈是只能在栈顶进行出栈和入栈,那我们这道题要用队列来实现栈的话,这里给的思路是两个队列,因为两个队列的话就可以相互导数据,比如我们来实现这个题目的push函数,我们的栈…

面试其他注意事项

面试其他注意事项 一、面试反问 这个岗位的日常工作和主要职责是什么?咱们这边主要负责什么业务,用到了哪些技术呢?对于我们校招生有没有培养体系呢?脱产培训,还是边工作边熟悉?会有导师带嘛?…

飞书开发学习笔记(八)-开发飞书小程序Demo

飞书开发学习笔记(八)-开发飞书小程序Demo 一.小程序开发概述 1.1 小程序开发概述 飞书开发文档中查看:小程序开发概述 飞书小程序是指可以运行在飞书客户端中的小程序,小程序的一套代码可以适配 Android、iOS、PC 多平台,且用户体验与飞书…

计算机多媒体

1,媒体、多媒体 2,体系结构 3,采样、编码

公寓水电管理系统

springbootmybatisthymeleaf 这次练习是尝试将layer与系统结合起来,将新增、修改、删除都和弹窗结合起来。 一、需求分析 二、数据库 三、模块 1、登录页面 哈哈哈,之前做的登录页面都好丑,这是目前做的最好看的一次了。 超级管理员&…