【YOLO系列】--YOLOv4超详细解读/总结

news2024/11/28 12:49:24

YOLOv4(YOLOv4: Optimal Speed and Accuracy of Object Detection)(原文+解读/总结+翻译)

系列文章:

YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客

YOLOv2论文解读/总结_耿鬼喝椰汁的博客-CSDN博客

YOLOv3论文解读/总结_耿鬼喝椰汁的博客-CSDN博客


论文链接:https://arxiv.org/abs/2004.10934

源码链接:https://github.com/AlexeyAB/darknet

论文翻译:YOLOv4论文翻译(已校正)_耿鬼喝椰汁的博客-CSDN博客


前言

Yolov4相较于Yolov3改进的地方:

YOLOv4网络结构改进:

1.输入端创新

1.1 Mosaic数据增强

1.2 Self-Adversarial Training--自对抗训练

2.主干网络创新(Backbone)

2.1 CSPDarknet53

2.2 Mish激活函数

 2.3 Dropblock

3.颈部网络(Neck)创新

3.1 SPP模块

3.2 FPN+PAN


前言

       上一篇文章我们讨论了yolov3,yolov3在速度与精度上达到了一个较好的平衡,堪称经典之作,可惜在yolov3之后的原作者Joseph Redmon因为yolo的军事应用和对他人个人隐私风险而退出了yolo系列的研究,从此cv界痛失一员大将,大家都以为yolo系列已经终结的时候,Yolov4横空出世,虽然作者已经大换血,但论文中给出的测试结果依然保留yolo系列的血统:保持相对较高的mAP的同时,大大降低计算量,可谓是学术成果在工业应用的典范,至于实际使用如何,还需要时间的进一步检验,期望v4能够如v3一般强大。
          整体而言,YOLOv4几乎没有像前几代YOLO一样提出一些创新性的东西,而是大量列举了近几年以来关于目标检测的一些最新技术和成果,并对这些方法进行了大量的人工试验,可以认为是一种人工NAS,用试验的方式来选择一系列新的方法来对YOLOv3从网络结构、训练、数据增强等多个层面进行相应的增强,从而达到更好的效果。虽说没有提出令人惊艳的理论创新,但单单是用工作量如此巨大的人工搜索,了解并实践了如此多的最新研究成果,并将其中较优的方法应用于YOLO这样一个工业化如此优秀的检测器中,就已经足够令人感到赞叹了。


Yolov4相较于Yolov3改进的地方:

(1)主干特征由DarkNet53改为CSPDarkNet53,主要在残差块进行了改进,引入了大残差块;

(2)加入了SPP和PANNnet网络,用来增加图像的特征提取量,反复提取特征,并且SPP网络也可以增大感受野。

(3)在激活函数方面:从Yolov3的Leaky_relu函数,在Yolov4使用新的Mish激活函数(Mish激活函数是一种自正则的非单调神经激活函数,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。论文中提出,相比Swish有0.494%的提升,相比ReLU有1.671%的提升;该方法也在yolov4中得到了验证;)。

      除了以上改进的地方,Yolov4还采用Mosaic数据增强,CIOU,学习率余弦退火衰减、标签平滑防止过拟合等操作。

       速度改进后与其他模型对比如下(YOLOv4和其他最先进的物体探测器的比较。YOLOv4的运行速度是EfficientDet的两倍,性能相当。将YOLOv3的AP和FPS分别提高10%和12%。):


YOLOv4网络结构改进:

YOLOv4 网络的结构可分为四部分:输入端、主干网络(Backbone)-主干特征提取网络、颈部网络(Neck)-加强特征提取网络和头部网络(Head)--用来预测(Prediction)下图为 YOLOv4 算法的网络框架示意图。

以下是对这四个结构进行的改进: 

  • 1.输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练
  • 2.主干网络(Backbone)-主干特征提取网络将各种新的方式结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock
  • 3.颈部网络(Neck)-加强特征提取网络目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块FPN+PAN结构
  • 4.头部网络(Head)--用来预测输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms

基于深度学习的现在目标检测算法中主要有三个组件:Backbone、Neck和Head
 

  • Backbone:骨干网络,主要指用于特征提取的,已在大型数据集(例如ImageNet|COCO等)上完成预训练,拥有预训练参数的卷积神经网络,例如:ResNet-50、Darknet53等
  • Head:检测头/头部网络,主要用于预测目标的种类和位置(bounding boxes)
  • Neck:颈部网络,在Backone和Head之间,会添加一些用于收集不同阶段中特征图的网络层。

基于深度学习的目标检测模型的结构是这样的:输入->主干->脖子->头->输出。主干网络提取特征,脖子提取一些更复杂的特征,然后头部计算预测输出。

1.输入端创新

1.1 Mosaic数据增强

       Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。

1.为什么要进行Mosaic数据增强呢?

      解决在整体的数据集中,小、中、大目标的占比并不均衡。-在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。针对这种状况,Yolov4的作者采用了Mosaic数据增强的方式,使大、中、小目标分配更加均匀。

小、中、大目标的定义:
2019年发布的论文《Augmentation for small object detection》对此进行了区分:

2.进行Mosaic数据增强的优点

  • 丰富数据集: 随机使用4张图像,随机缩放后随机拼接,增加很多小目标,大大增加了数据多样性。
  • 增强模型鲁棒性: 混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。
  • 加强批归一化(Batch Normalization)的效果: 当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好。
  • 有利于提升小目标检测性能: Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力。

1.2 Self-Adversarial Training--自对抗训练

自对抗训练也是一种新的数据增强方法,可以一定程度上抵抗对抗攻击。其包括两个阶段,每个阶段进行一次前向传播和一次反向传播。

  • 第一阶段,CNN通过反向传播改变图片信息,而不是改变网络权值。通过这种方式,CNN可以进行对抗性攻击,改变原始图像,造成图像上没有目标的假象。
  • 第二阶段,对修改后的图像进行正常的目标检测。

2.主干网络创新(Backbone)

2.1 CSPDarknet53

     CSPDarknet53是在Yolov3主干网络Darknet53的基础上,借鉴2019年CSPNet的经验,产生的Backbone结构,其中包含了5个CSP模块。

1.为什么采用CSP模块?

       CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。因此Yolov4在主干网络Backbone采用CSPDarknet53网络结构

2.使用CSP模块优点

1.增强CNN的学习能力,使得在轻量化的同时保持准确性。

2.:降低计算瓶颈

3.降低内存成本

2.2 Mish激活函数

Mish激活函数是2019年下半年提出的激活函数,其函数图像如下:

Yolov4的Backbone中都使用了Mish激活函数,而后面的网络则还是使用leaky_relu函数.

1.为什么采用Mish激活函数

        作者实验测试时,使用CSPDarknet53网络在ImageNet数据集上做图像分类任务,发现使用了Mish激活函数的TOP-1TOP-5的精度比没有使用时都略高一些。

 2.3 Dropblock

      Yolov4中使用的2018年提出的Dropblock,其实和常见网络中的Dropout功能类似,也是缓解过拟合的一种正则化方式,对网络的正则化过程进行了全面的升级改进。

传统的Dropout:随机删除减少神经元的数量,使网络变得更简单。而Dropblock和Dropout相似。

3.颈部网络(Neck)创新

Yolov4的Neck结构主要采用了SPP模块FPN+PAN的方式。   

3.1 SPP模块

       SPP模块,其实在Yolov3中已经存在了,在Yolov4的C++代码文件夹有一个Yolov3_spp版本,但有的同学估计从来没有使用过,在Yolov4中,SPP模块仍然是在Backbone主干网络之后。Yolov4的作者在使用608*608大小的图像进行测试时发现,在COCO目标检测任务中,以0.5%的额外计算代价将AP50增加了2.7%,因此Yolov4中也采用了SPP模块

3.2 FPN+PAN

        Yolov4中Neck这部分除了使用FPN外,还在此基础上使用了PAN结构。和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔,其中包含两个PAN结构。

       FPN+PAN借鉴的是18年CVPR的PANetPAN其具体结构由反复提升特征的意思。当时主要应用于图像分割领域,但Alexey将其拆分应用到Yolov4中,进一步提高特征提取的能力。

在这里插入图片描述

      上图为原始的PANet的结构,可以看出来其具有一个非常重要的特点就是特征的反复提取
在(a)里面是传统的特征金字塔结构,在完成特征金字塔从下到上的特征提取后,还需要实现(b)中从上到下的特征提取。

而在YOLOV4当中,其主要是在三个有效特征层上使用了PANet结构。

在这里插入图片描述


这篇论文的学习和总结到这里就结束啦,如果有什么问题可以在评论区留言呀~

如果帮助到大家,可以一键三连支持下~


参考文献:

Yolov4论文翻译与解析(一)_m米咔00的博客-CSDN博客

(1 封私信 / 2 条消息) yolov4详解 - 搜索结果 - 知乎 (zhihu.com)

(5条消息) 睿智的目标检测30——Pytorch搭建YoloV4目标检测平台_睿智的yolov4_Bubbliiiing的博客-CSDN博客

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

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

相关文章

[免疫学]抗原递呈详解

目录 🧫1. 抗原递呈是什么 🧫1.1 MHCⅠ类分子 🧫1.2 MHCⅡ类分子 🧫1.3 MHCⅠ类分子 分子介导的抗原递呈 🧫1.4 MHCⅡ类分子 分子介导的抗原递呈 🧫1.5 抗原递呈细胞 🧫1.5.1 激活的树突状…

初识Linux篇:第三篇

初识Linux篇:第三篇 初识Linux篇:第三篇1.Linux中常见的通配符1.1*号通配符1.2 ?通配符1.3[ ]通配符1.4{ }通配符 2.man指令3.cp指令4.mv指令5.alias指令6. echo指令7.cat指令8.more指令9.less指令10.head与tail指令11.在Linux中写代码 总结 …

DHCP中继负载均衡使用原理

DHCP常用四种报文 基于UDP67服务端, 68端口客户端 discover 广播 offer 单播 rquest 广播 ack 单播 DHCP 50%时间续租时request报文为单播报文 DHCP 87.5%时间请求重新绑定IP时request报文为广播报文 DHCP的另类配置方案: 负载均衡: ip re…

【Python_Pandas】reset_index() 函数解析

【Python_Pandas】reset_index函数解析 文章目录 【Python_Pandas】reset_index函数解析1. 介绍2. 示例2.1 参数drop2.2 参数inplace2.3 参数level2.4 参数col_level2.5 参数col_fill 参考 1. 介绍 pandas.DataFrame.reset_index reset_index(levelNone, dropFalse, inplaceF…

【AI大模型智慧办公】用《文心一言》1分钟写一篇博客简直yyds

文章目录 前言文心一言是什么文心一言可以做什么文心一言写博客申请体验写在最后 前言 当今社会,博客已成为了许多人分享观点、知识和经验的重要平台。用文心一言写博客是将自己的思考、想法和经验以文字的形式呈现出来,让更多人了解自己。通过写博客&a…

【Python入门】Python循环语句(while循环的基础语法)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

【计网】第三章 数据链路层(4)局域网、以太网、无线局域网、VLAN

文章目录 3.6-1 局域网基本概念和体系结构一、局域网二、局域网基本概念和体系结构三、局域网传输介质四、局域网介质控制方法五、局域网分类六、IEEE 802 标准七、MAC 子层和 LLC 子层总结: 3.6-2 以太网一、以太网概述二、以太网提供无连接、不可靠的服务三、以太…

RabbitMQ启动失败

首先,你得先确认的你得Erlang的版本和RabbitMQ的版本是否能相互兼容,如果不能,请先下载对应的Erlang版本或者RabbitMQ版本。 1. 在Java中使用了RabbitMQ发现不停的尝试连接,却连不上的问题 先在cmd下输入erl,看一下E…

EXCEL比较麻烦零碎的日期数据的处理,数字转日期,日期转数字

1 有时候想输入日期,但会被EXCEL自动识别为数字 原因是 有的EXCEL版本会处理,有的则不会自动处理为日期。也可能,单元格因为各种原因被提前设置了格式,比如常规等。还有的原因是因为EXCEL从xml等其他文件里导入的日期时间等数据本…

大数据Doris(二十):Doris的Bitmap索引介绍

文章目录 Doris的Bitmap索引介绍 一、Bitmap位图索引原理 二、Bitmap位图索引语法 三、注意事项 Doris的Bitmap索引介绍 一、Bitmap位图索引原理 bitmap,位图,是一种数据结构,即bit的集合,每一个bit记录0或者1,代…

EPLAN2022 3D宏文件创建

我们经常使用导入3D模型文件创建宏文件。但有时候导入的3D文件缺少了一些细节或者变形,因此在导入3D文件之前,需要设置一下细节清晰度。 1. 设置导入3D图的清晰度 选择菜单栏中的【文件】➡【设置】 选择设置的项目【新项目(4)】…

【Linux内核解析-linux-5.14.10-内核源码注释】信号量semaphore机制

信号量实现方法 信号量机制是一种用于控制并发访问的同步机制,常用于多进程或多线程之间的协调。在Linux内核中,信号量机制是通过struct semaphore结构体来实现的。 每个semaphore结构体包含一个计数器和一个等待队列,它们用于跟踪当前可用…

【Promptulate】一个强大的LLM Prompt Layer框架,构建更强悍的GPT应用

本文节选自笔者博客: https://www.blog.zeeland.cn/archives/promptulate666 项目地址:https://github.com/Undertone0809/promptulate 💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。📝…

2023.5.14 第五十三次周报

目录 前言 文献阅读:基于BO-EMD-LSTM模型预测教室长期二氧化碳浓度 背景 思路 BO-EMD-LSTM 混合模型 EMD 算法 与其他模型的比较 结论 论文代码 总结 前言 This week, I studied an article that uses LSTM to predict gas concentration.This study wa…

Netty中NioEventLoopGroup介绍

一、Netty基本介绍 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 Netty 是一…

cpuinfo库: 使用Python生成C++接口

文章目录 1. 目的2. 设计3. 生成器: Python 代码4. 结果: C++ 代码1. 目的 背景: cpuinfo 库提供了 CPU 信息的查询, 涵盖了 x86 和 arm 等常见的指令集架构, 可以提供自行实现的 CPU 基础功能函数的正确性验证。自行实现 CPU 基础功能则是为了简化功能、同时提供原汁原味…

详细介绍如何将博客图片从github/gitee批量转移到阿里云图床

背景介绍 我为什么想把博客文章中存储在github种的图片转移到阿里云呢? 存储在github中的图片有时会不稳定,破坏写文章过程中的思路和心流体验。写着写着就发现图片上传又出现问题了,很影响心情,阿里云是付费图床,在国…

【更新中】苹果自家的as汇编器的特色风格(与wasm的不同)

as汇编器是苹果的汇编器,Xcode 生成的代码也是as风格的,而as风格与大部分人在大学里所学的微软的masm风格大相径庭,所以本文会列出二者的不同。不过由于细节太多,没法一次性写出所有的不同,所以会持续更新。 你可能会…

linux常用系统工作命令

前言: 最近又重新抓起linux开始学习起来了,以前干过一段时间的菜鸟运维,对linux操作系统有点浅显的认识,中间又因为工作关系渐渐的又接触不到了,最近的博文算是回忆也当作笔记用,重新开始学习linux系统。 …

MYSQL主从复制和读写分离.1

1、什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、删、改操作(insert、update、delete),而从数据库处理select查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、为什…