YOLOv4 学习记录

文章目录

  • 整体概况
  • 数据增强
    • 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 个重要几何因素都考虑进去了:重叠面积、中心点距离、长宽比。
对于分类损失和目标损失,其数学表达式如下:
在这里插入图片描述

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

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

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

相关文章

力扣hot100 两数之和 哈希表

&#x1f468;‍&#x1f3eb; 力扣 两数之和 &#x1f60b; 思路 在一个数组中如何快速找到某一个数的互补数&#xff1a;哈希表 O(1)实现⭐ AC code class Solution {public int[] twoSum(int[] nums, int target){HashMap<Integer, Integer> map new HashMap<&g…

STM32CubeMX学习笔记(2)--DSP库的使用

1.DSP库简介 STM32的DSP库是为了支持数字信号处理应用而设计的&#xff0c;它包含了一系列优化的数学函数和算法&#xff0c;能够在STM32微控制器上高效地执行数字信号处理任务。 DSP库通常包括以下主要特性&#xff1a; 1.数学函数库&#xff1a; 包括各种基本的数学运算函数…

STM32电源名词解析

先来简单了解一下各种电源端口的命名 VCC&#xff1a;Ccircuit 表示电路的意思, 即接入电路的电压 VDD&#xff1a;Ddevice 表示器件的意思, 即器件内部的工作电压。 VSS&#xff1a;Sseries 表示公共连接的意思&#xff0c;通常指电路公共接地端电压。 GND&#xff1a;在电…

设计模式——责任链模式

文章目录 责任链模式的定义场景示例责任链模式实现方案责任链模式扩展责任链模式的优缺点责任链模式在框架源码中的应用 责任链模式的定义 责任链模式又称职责链模式&#xff0c;是一种行为型设计模式。官方描述&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请…

Python 如何实现职责链设计模式?什么是职责链设计模式?Python 职责链设计模式示例代码

什么是职责链&#xff08;Chain of Responsibility&#xff09;设计模式&#xff1f; 职责链&#xff08;Chain of Responsibility&#xff09;设计模式是一种行为型设计模式&#xff0c;旨在构建一个对象链&#xff0c;每个对象都有机会处理请求&#xff0c;并且可以将请求传…

C++初阶 | [三] 类和对象(中)

摘要&#xff1a;类的6个默认成员函数&#xff0c;日期类 如果一个类中什么成员都没有&#xff0c;简称为空类。然而&#xff0c;空类并不是什么成员都没有&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成6个默认成员函数。默认成员函数&#xff1a;用户没有显式…

python中列表的基础解释

列表&#xff1a; 一种可以存放多种类型数据的数据结构 列表的创建&#xff1a; 1.用【】创建列表 #创建一个空列表 list1[] #创建一个非空列表 list2 [zhang,li,ying,1,2,3] #输出内容及类型 print(list1,type(list1)) print(list2,type(list2))结果&#xff1a; 2.使用list…

《视觉SLAM十四讲》-- 回环检测

文章目录 10 回环检测10.1 概述10.1.1 回环检测的意义10.1.2 回环检测的方法10.1.3 准确率和召回率 10.2 词袋模型10.3 字典10.3.1 字典的结构10.3.2 实践&#xff1a;创建字典 10.4 相似度计算10.4.1 理论部分10.4.2 实践&#xff1a;相似度的计算 10.5 实验分析与评述 10 回环…

股票价格预测 | Python实现基于CNN卷积神经网络的股票预测模型(keras,Conv1D)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 股票价格预测 | Python实现基于CNN卷积神经网络的股票预测模型(keras) 源码设计 import quandl import datetimedf = quandl

FreeRTOS(教程非常详细)

概述&#xff1a; 之前写了关于FreeRTOS的部分内容&#xff0c;为了方便阅读&#xff0c;现在给汇总到一起了。全部学习完后&#xff0c;恭喜你对FreeRTOS有了更深的认知。 第一章 FreeRTOS移植到STM32 第二章 FreeRTOS创建任务 第三章 FreeRTOS任务管理 第四章 FreeRTOS消…

LeetCode【12】整数转罗马数字

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/m0_71120708/article/details/128769894 代码&#xff1a; public String intToRoman(int num) {String[] thousands new String[] {"", "M", "MM", "MMM"};String[] hun…

【自然语言处理】【大模型】赋予大模型使用工具的能力:Toolformer与ART

赋予大模型使用工具的能力&#xff1a;Toolformer与ART ​ 本文介绍两种赋予大模型使用外部工具能力的方法&#xff1a;Toolformer和ART。 Toolformer论文地址&#xff1a;https://arxiv.org/pdf/2302.04761.pdf ART论文地址&#xff1a;https://arxiv.org/pdf/2303.09014.pd…

【网络奇遇记】那年我与计算机网络的浅相知

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 计算机网络的定义1.1 计算机早期的一个最简单的定义1.2 现阶段计算机网络的一个较好的定义 二. …

【IPC】消息队列

1、IPC对象 除了最原始的进程间通信方式信号、无名管道和有名管道外&#xff0c;还有三种进程间通信方式&#xff0c;这 三种方式称之为IPC对象 IPC对象分类&#xff1a;消息队列、共享内存、信号量(信号灯集) IPC对象也是在内核空间开辟区域&#xff0c;每一种IPC对象创建好…

【汇编】处理字符问题

文章目录 前言一、处理字符问题1.1 汇编语言如何处理字符1.2 asciiascii码是什么&#xff1f;ascii码表是什么&#xff1f; 1.3 汇编语言字符示例代码 二、大小写转换2.1 问题&#xff1a;对datasg中的字符串2.2 逻辑与和逻辑或2.3 程序&#xff1a;解决大小写转换的问题一个新…

「项目阅读系列」go-gin-example star 6.5k!(1)

文章目录 准备工作适宜人群项目信息 项目结构代码阅读主要模块代码主函数模块router 路由模块auth 授权模块数据库 修改文章请求分析其他依赖 总结 准备工作 适宜人群 初学 go 语法&#xff0c;希望了解 go 项目的构建过程和方式。 项目信息 go-gin-example 项目是使用 gin…

qt-C++笔记之两个窗口ui的交互

qt-C笔记之两个窗口ui的交互 code review! 文章目录 qt-C笔记之两个窗口ui的交互0.运行1.文件结构2.先创建widget项目&#xff0c;搞一个窗口ui出来3.项目添加第二个widget窗口出来4.补充代码4.1.qt_widget_interaction.pro4.2.main.cpp4.3.widget.h4.4.widget.cpp4.5.second…

JAVA for 循环训练 Pattern

import java.util.Scanner;public class Pattern {public static void main(String[] args) {int[] arr {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0};Scanner in new Scanner(System.in);System.out.print("请输入n:");int n in.nextInt();in.close();for …

LeetCode27.移除元素(暴力法、快慢指针法)

每日一题&#xff1a;LeetCode27.移除元素 1.问题描述2.解题思路3.代码 1.问题描述 问题描述&#xff1a;给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必…

Linux(Ubuntu)安装JDK环境

系统环境 Ubuntu20.04 下载JDK压缩包 前往Oracle官网进行后续下载或单击下载JDK压缩包 下拉找到JDK8&#xff0c;在Linux板块下选择适配系统架构的压缩包文件(后缀为tar.gz)&#xff0c;系统架构可通过uname -m命令查看 安装JDK 安装环境通常放在/usr/local下&#xff0c;进入…