YOLOv4网络详解

2023-10-26

0前言

在YOLOv4论文中,作者其实就是把当年所有的常用技术罗列了一遍,然后做了一堆消融实验。

1.YOLOV4的网络改进部分

1、主干特征提取网络:DarkNet53 => CSPDarkNet53、使用Mish激活函数

2、特征金字塔:SPP结构,PAN结构

1.1 主干特征提取网络CSPDarkNet53

1.1.1 CSP结构

在YOLOv3中使用的是Darknet53,而在YOLOv4中引入了CSP结构

CSP结构的作用:能够增强CNN的学习能力、移除计算瓶颈、降低显存的使用、加快网络的推理速度
在这里插入图片描述
CSPnet结构将原来的残差块的堆叠进行了一个拆分,拆成左右两部分:
主干部分继续进行原来的残差块的堆叠;
另一部分则像一个残差边一样,经过少量处理直接连接到最后。

残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。
在这里插入图片描述
在YOLOv4中的CSP模块之前对进行下采样,然后将其输出以此通过两个1x1的卷积层进行降维,在Part1分支上再接上一系列的ResBlock、再通过一个1x1卷积层(即Transition),然后通过concat拼接,最后通过1x1卷积层进行升维

1.1.2 Mish激活函数

YOLOv4将DarknetConv2D的激活函数由LeakyReLU修改成了Mish,卷积块由DarknetConv2D_BN_Leaky变成了DarknetConv2D_BN_Mish。

Mish是光滑的非单调激活函数,可定义为:

f(x) = x・tanh(ς(x))其中, ς(x) = ln(1+e^x),是一个softmax激活函数和。
在这里插入图片描述
在YOLOv4中使用Mish函数的原因是它的低成本和它的平滑、非单调、上无界、有下界等特点,与其他常用函数如ReLU和Swish相比,提高了它的性能。

1.1.3 CSPDarknet53网络结构

在这里插入图片描述

1.2 特征金字塔结构

1.2.1 SPP结构

在这里插入图片描述
对于输入的特征层,依次通过5x5、9x9、13x13的最大池化下采样层,将这三个分支的输出和原输入的分支进行concat拼接,组成SPP结构

SPP结构能够极大地增加感受野,分离出最显著的上下文特征。

1.2.1 PAN结构

在这里插入图片描述
PANet一种实例分割算法,能够进行特征的反复提取:

最左则部分为网络的backbone,进行提取特征;
中间部分则在提取的特征层上构建特征金字塔结构(FPN模块),将高层的语义信息融合到底层特征层;
最右侧部分则于FPN相反,将底层的语义信息融合到高层。
中间与右侧共同构成了PANet。

在PANet原论文中,特征层与特征层融合部分采用的是add方法
在YOLOv4中采样的是concat方法,将特征层在深度方向进行拼接,主要是在三个有效特征层上使用了PANet结构。

2.YOLOv4的训练技巧

2.1 Mosaic数据增强

mosaic利用四张图片,分别对四张图片进行翻转、缩放、色域变化等,并且按照四个方向位置摆好,进行图片的组合和框的组合。
在这里插入图片描述Mosaic数据增强能够扩充样本多样性,且在BN计算的时候能够同时计算四张图片的数据。

2.2 CIoU

IoU是比值的概念,对目标物体的scale是不敏感的。然而常用的BBox的回归损失优化和IoU优化不是完全等价的,寻常的IoU无法直接优化没有重叠的部分。

CIOU将目标与anchor之间的距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。

2.3 学习率余弦退火衰减

余弦退火衰减法,学习率会先上升再下降,这是退火优化法的思想。

上升的时候使用线性上升,下降的时候模拟cos函数下降。执行多次。

3.YOLOv4的网络结构

在这里插入图片描述
YOLOv4网络结构可以分为三部分:CSPDarkNet53特征提取网络、SPP和PANet组成的加强特征提取网络、将提取到的特征转化为预测结果的Yolo Head

主干网络对图片进行特征提取:假设特征提取网络的输入为416x416x3,首先进行Darknet卷积,然后进行四个Resblock_body(本质上是由一系列残差网络构成的大卷积块),特征层的高和宽被不断的被压缩、通道数被扩张,最终只使用最后三个shape的特征层进行下一步的操作,因为其具有更高的语义信息;

SPP和PANet组成的加强特征提取网络:对13x13x1024的特征层进行三次卷积操作,然后接SPP结构(SPP有四个分支,利用不同大小的最大池化核对输入进来的特征层进行最大池化,池化后的结果进行堆叠),再进行三次卷积;

PANet:对三次卷积后的特征层进行上采样(2倍上采样),将上采样后的26x26特征层与在主干网络获取的26x26x512的特征层进行堆叠,然后再进行上采样与52x52x256的特征层进行堆叠,即完成特征金字塔的结构;后面操作与前同理;完成PANet结构后就提取到了很多有效的特征信息。

Yolo Head利用提取到的特征进行结果预测(与yolov3相同)。

参考文献
YOLOv4网络详解
Pytorch搭建YoloV4目标检测平台

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLOv4网络详解 的相关文章

  • 在 PySpark 中展平动态嵌套结构(结构内的结构)

    我正在努力展平结构内有结构的 JSON 模式 问题是内部结构名称是动态的 因此我无法使用 轻松访问它们 概念 该架构类似于 root A string nullable true Plugins struct nullable true R
  • 使用sklearn宏f1-score作为tensorflow.keras中的指标

    我已经为tensorflow keras定义了自定义指标 以在每个时期之后计算宏f1分数 如下所示 from tensorflow import argmax as tf argmax from sklearn metric import
  • 使用 setup.py 编译 python 应用程序

    我已经指出了将 pygame 导出到可执行文件以进行分发的问题 我仍然有一个问题 当我运行 setup py 我使用 python 版本 3 7 0 并构建应用程序时 应用程序直接崩溃 我也无法打开 unix 可执行文件 这正是我到目前为止
  • 如何使用Vault在Ansible中运行playbook api

    我有一本带有Vault的剧本 我可以运行它 ansible playbook info yml ask vault pass 现在 我想在 Ansible 中运行我的 playbook api 答案在如何使用Vault在Ansible v2
  • 带权重的欧几里得距离

    我目前正在使用SciPy计算欧氏距离 dis scipy spatial distance euclidean A B 在哪里 A B是5维位向量 现在工作正常 但是如果我为每个维度添加权重 是否仍然可以使用 scipy 我现在拥有的 sq
  • Python 替换嵌套 JSON 中的 None 值

    我一直在尝试替换下面 JSON 字典中的 None 值 我将如何遍历这个 json 并将 None 值替换为空字符串 我很难理解如何遍历嵌套 json 如果有人能帮我解决这个问题 我会很高兴 下面的嵌套 json 示例 或者在 python
  • Python——“对象布局”

    有人可以描述以下异常吗 什么是 对象布局 以及它是如何定义的 谢谢 Traceback most recent call last File test gui py line 5 in
  • Python:在 Plotly 中的图形上方创建注释空间

    我想在图中创建额外的注释空间 请参阅附图中的绿色区域 目前 y 轴定义了绘图的高度 我可以将绘图推到超出 y max 限制 在某个点 在图像中标记为红色 之后隐藏 y 轴吗 我尝试避免轴到达 评论部分 绿色 谢谢你 在此输入图像描述 htt
  • 无法获取POST参数

    我正在使用 WebApp2 作为框架在 Python 中开发一个 Web 应用程序 我无法获取通过填写表单提交的http POST请求参数 这是我创建的表单的 HTML 代码
  • numpy.savetxt“元组索引超出范围”?

    我正在尝试将几行写入文本文件 这是我使用的代码 import numpy as np Generate some test data data np arange 0 0 1000 0 50 0 with file test txt w a
  • 如何使用 Apache Beam 从 Google Pub/Sub 访问消息 ID?

    我一直在 Python 2 7 16 上使用 2 13 0 SDK 测试 Apache Beam 以流模式从 Google Pub Sub 订阅中提取简单消息 并写入 Google Big Query 表 作为此操作的一部分 我尝试使用 P
  • 如何安装我的自定义 Python 包及其自定义依赖项?

    我想找到一种方法来安装我自己的 python 包 该包依赖于其他自定义 python 包 我按照本指南创建了我自己的 python 包 https python packaging readthedocs iao en latest htt
  • Python 元类有什么用?

    元类可以用其他方式做不到的事情做什么 Alex Martelli 表示 有些任务如果没有元类就无法完成Python 元类与类装饰器 https stackoverflow com questions 1779372 python metac
  • 为什么 django-rest-frameworks request.data 有时是不可变的?

    在我宁静的CreateAPIView我变异我的request data字典 有时我会收到测试未捕获的错误 This QueryDict instance is immutable 例如这 class CreateView CreateAPI
  • 我可以在 python 中获得没有 echo 的控制台输入吗?

    我可以在 python 中获取没有 echo 的控制台输入吗 Use getpass http docs python org library getpass html gt gt gt from getpass import getpas
  • 使用日期作为窗口函数实现 RANGE

    从 SQLAlchemy 1 4 25 开始 没有内置支持 所以我尝试使用该解决方案here https stackoverflow com a 69606048 11277108 这是我的复制 from datetime import d
  • 获取 QComboBox 的所有项目 - PyQt4 (Python)

    我有很多QComboBoxes 在某个时刻 我需要获取特定的每个项目QComboBox迭代 虽然我只能有一个与中的项目相对应的项目列表QComboBox 我宁愿直接从小部件本身获取它们 有大量的QComboBoxes每个都有很多项目 有没有
  • 如何将焦点设置到 django 表单元素的 CharField

    我的登录页面使用 Django 表单 I want to set focus to the first textField username when the page loads 我尝试使用 Jquery 如下 但没有得到结果 forms
  • set()是如何实现的?

    我见过有人这么说setpython 中的对象具有 O 1 成员资格检查 他们如何在内部实施以实现这一点 它使用什么类型的数据结构 该实施还有哪些其他影响 这里的每个答案都非常有启发性 但我只能接受一个 所以我将选择最接近我原来问题的答案 谢
  • 为调色板图像分配不同的调色板索引

    我正在用 Python 和 Pygame 编写游戏 为此 图形将采用旧视频游戏机 如 NES 的风格 因此 图形由具有 2 位 4 色 图像的单个图块集文件组成 我希望在加载这些图像时能够为这些图像分配任意 4 色调色板 我想要做的是使用

随机推荐