YOLO-V4经典物体检测算法介绍
在前文我们介绍了YOLO-V1~V3版本都做了哪些事,本文我们继续介绍YOLO-V4版本。
YOLO的作者在发表完V3之后,发现YOLO产品被美国军方应用到了很多军事战争当中,这是他所不希望看见的,因此宣布不再继续研究。
但历史和科技总是随时间不断发展,一个人的力量总是渺小的,后来的学者们“前赴后继”,继往圣之绝学,续写、补全着YOLO这本功法。
一、YOLO-V4
YOLO-V4的贡献:
亲民,单GPU就能训练的非常好,接下来很多小模块都是这个出发点
两大核心方法,从数据层面和网络设计层面来进行改善
消融实验,感觉能做的都让他给做了(凝当年百家之长),工作量不轻
全部实验都是单GPU完成,不用太担心设备了

1.1 Bag of freebies(BOF)
只增加训练成本,但是能显著提高精度,并不影响推理速度
数据增强:调整亮度、对比度、色调、随机缩放、剪切、翻转、旋转
网络正则化的方法:Dropout、Dropblock等
类别不平衡,损失函数设计
1.1.1 数据增强
Mosaic data augmentation方法
一种数据增强的方法,参考CutMix然后四张图像拼接成一张进行训练;
所参考的CutMix:

上图展示CutMix中提到的融合、裁剪、裁剪拼接
V4作者参考该方法,将四张图像拼接成一张进行训练

具有以下优点
丰富一张图上的信息
增强后一张图上包含四张图的信息,减少了对大batch_size的依赖
通常小目标的检测效果要比大目标差,将四张图放到一张图中,相当于变相扩充了数据集中小目标的样本数量。
当然在数据增强时还用了一些其它方法,如
用随机值或训练集的平均像素值替换图像的区域
根据概率设置随机隐藏一些补丁
引入噪音点等


1.1.2 DropBlock与标签平滑方法
DropBlock
之前的dropout是随机选择点去掉(随机杀死一些神经元),如下图b

现在是直接去掉整个区域,dropblock。

这样做就好比去掉了图片中狗的眼睛/耳朵/鼻子或者是大半个头。
显然相比去掉一些点提升了更大的难度让计算机去好好学。
标签平滑 Label Smoothing
神经网络最大的缺点就是容易过拟合,以猫狗分类0/1标签为例,这里进行平滑处理:
其中0.1为自己指定,2为类别个数

效果:右图,使用后簇内更加紧密,簇间更加分离(过拟合的话就会很近)

1.1.3 CIOU损失函数定义
IOU损失:从之前的学习中我们得知IOU是干嘛的,即真实框和预测框的重叠程度,一般IOU损失计算时直接1-IOU,有时也会使用下图右下角公式

但是使用IOU损失会面临一些问题
如果两框没有相交则IOU=0无法梯度计算,
相同的IOU却反映不出实际情况到底咋样,如以下三图IOU相同,但重叠情况却不同。

GIOU损失
引入了最小封闭形状C(C可以把A、B包含在内,即下图C把两框都框起来了。)
这样在在不重叠情况下能让预测框尽可能朝着真实框前进(以真实框为准,C越接近真实框越好)。

但是重叠的话又完了,以下情况结果是相同的。

DIOU损失
其中分子计算预测框与真实框的中心点欧式距离d
分母是能覆盖预测框与真实框的最小BOX的对角线长度c
直接优化距离,速度更快,并解决GIOU问题

CIOU损失
损失函数必须考虑三个几何因素:重叠面积,中心点距离,长宽比,其中α可以当做权重参数 。
1.1.4 NMS细节改进
(其实这个并不属于BOF,而是属于后面BOS,因为涉及到计算了肯定会影响速度。这里为了知识点的连贯性放在一起说。)
DIOU-NMS
之前使用NMS来决定是否删除一个框,现在改用DIOU-NMS
不仅考虑了IoU的值,还考虑了两个Box中心点之间的距离
其中M表示高置信度候选框,Bi就是遍历各个框跟置信度高的重合情况
SOTF-NMS
"做人留一面日好相见",柔和一点的NMS,更改分数而且直接剔除

意思是之前高度重叠的,就要置信度最大的,别的都剔除。
上图中红色绿色框重叠了,但实际框起来的是两匹马,不应该去掉。
这里选用的方法就是降低置信度,如绿框是0.8,给它降低0.3分,然后通过阈值去筛选。
1.2 Bag of specials(BOS)
增加稍许推断代价,但可以提高模型精度的方法
网络细节部分加入了很多改进,引入了各种能让特征提取更好的方法
注意力机制,网络细节设计,特征金字塔等,你能想到的全有
读这一篇相当于把当年来部分优秀的论文又过了一遍
1.2.1 SPP与CSP网络结构
SPPNet(Spatial Pyramid Pooling)
V3中为了更好满足不同输入大小,训练的时候要改变输入数据的大小
SPP其实就是用最大池化控制大小,来满足最终输入特征一致即可。

CSPNet(Cross Stage Partial Network)
每一个block按照特征图的channel维度拆分成两部分
一份正常走网络,另一份直接concat到这个block的输出

意思是把输入的特征图切成两份,一份继续按照之前的路走(去卷积、block等),另一份直接拿过去和前面那份走完之后的结果进行concat。
这样算是减少特征图的深度(实际上并没有影响到精度),加快计算速度。
1.2.2 SAM注意力机制模块
注意力机制:
简单来说就是比如这里这句话:“小明今天开心地踢了一个绿色的皮球”,这句话的关键词/重要的部分是 "小明踢球",其他的次要,次次要。我们把注意力放在这些重要的上面,即分配一些权重。
这是语言/NLP中,图片中也是一样的,比如猫狗识别,我记得猫有胡须狗没有,可以把注意力放在胡须上。又或者说图片有前景和背景,我们应该把注意力放在更重要的前景里。
所参考的CBAM介绍

比如我们得到32*32*512的256个特征图,那就给这256个特征图经过操作得到它们的重要程度/分配权重(channel attention),之后再把权重乘到原始特征图中去。

此外除了看哪个特征图重要,还要看特征图里的哪个点/哪部分重要(spatial attention),即给每个特征图每个位置/像素点/grid cell分配权重,乘进去。
V4中参考CBAM,不过V4中用的是SAM,只有spatial attention也就是空间的注意力机制。
YOLOV4中的Spatial attention module

在原始SAM(a)做了点修改(b),之前是最大池化和平均池化后拼在一起然后后再卷积,这里直接卷积,更快。
1.2.3 PAN模块
下图是FAN,它是一种自顶向下的模式,将高层特征传下来,各层间进行特征融合、3*3卷积得到P2、P3、P4、P5等特征。

但这样好像只有一条路(特征只从高层向底层传递),能不能来个双向的呢?
于是,PAN登场
PAN(Path Aggregation Network)
引入了自底向上的路径,使得底层信息更容易传到顶部
并且还是一个捷径,红色的线没准走个100层(走的Resnet层数),绿色的线几层(橙色那几层,走的P后面延申的路)就到了。

YOLO-V4中在PAN上做了点修改,PAN中融合特征时使用的是加法(矩阵+矩阵),而YOLO-V4中则是拼接。虽然特征多了一些但是会提升一些精度。

1.2.4 激活函数
YOLO-V4中并非使用的是ReLU,而是Mish。
Mish

不一棒子全给"打死",给个改过自新的机会。
Relu有点太绝对了,Mish更符合实际
虽然计算量确实增加了,效果会提升一点
在网络的初期,因为一开始是高斯随机的数,特征值在前面有负的可以理解,ReLU直接就去掉了,而Mish给了点机会,当然只挽留一定范围内的。
1.2.5 eliminate grid sensitivity
最终预测回归值的时候,还不是它真正的坐标,而是相对这个网格的位置,坐标回归值的预测都在0-1之间,但此时在grid边界怎么办?

此时我们想要取到0或1,就需要无穷大的数
为了缓解这种情况可以在激活函数前乘上 一个系数(大于1的),即放大结果。
1.3 整体网络架构
架构图如下:

输入、卷积、BN、Mish;然后SPP进行最大池化控制大小,来满足最终输入特征一致;
右边是PAN,特征图高底层特征双向拼接。
最右边的Yolo Head和V3一样。不同尺度的特征检测器。
相关文章:

YOLO-V4经典物体检测算法介绍
在前文我们介绍了YOLO-V1~V3版本都做了哪些事,本文我们继续介绍YOLO-V4版本。YOLO的作者在发表完V3之后,发现YOLO产品被美国军方应用到了很多军事战争当中,这是他所不希望看见的,因此宣布不再继续研究。但历史和科技总是随时间不断…...

angular相关知识点总结
创建 angualr 组件和传值 angular组件其实就是个xxx.component.ts,本质还是ts文件一个html文件 1.创建组件:在Angular中,可以使用命令行工具ng generate component创建一个新组件。例如: ng generate component my-component这将创建一个名…...

大坝安全监测系统:水库“守坝人”!
一、项目背景 随着社会经济的迅速发展,我国水资源利用率越来越高,各类水利水电工规模进一步扩大。在抗洪救灾、水利发电等方面带来巨大的经济和社会效益。但受多种因素影响,大坝的安全问题日益严重。大量工程实践证明,为保证大坝…...

CentOS7安装配置OpenVNP连接远端服务器
在项目当中需要访问一个三方接口及数据库,但是需要在CentOS7服务器上先配置OpenVPN,然后才能连接,现将整体配置过程记录如下。 安装 yum -y install epel-release yum -y install openvpn 查看版本 openvpn --version 配置客户端证书 打开…...

04- Matplotlib数据可视化详解 (数据库)
Matplotlib的亮点: import matplotlib.pyplot as plt # 导包plt.figure(figsize (9, 6) , 设置图片大小plt. plot(x, y), 画图绘制网格线: 线型, 颜色, 透明度plt.grid(linestyle --, color green, alpha0.75) # linestyle: 样式, color: 颜色, alpha: 透明度plt.axis(…...

高性能MySQL -- 查询性能优化
一般来说一个好的程序:查询优化,索引优化,库表结构要同时进行优化。今天我们来讲一下查询优化。 我们需要对MySQL的架构有基本认知,所以这里贴一张图大家看看: 图片来自于《小林coding》 为什么从查询会慢࿱…...

Android Binder机制之一(简介)
目录 前言 一、Android 进程间通信方式 二、Binder架构图 三、Binder涉及角色 3.1 Binder驱动 3.2 Binder实体 3.3 Binder引用 3.4 远程服务 3.5 ServiceManager守护进程 四、涉及源码 前言 这是本人第N次看Binder 相关知识了,其实每次看都有新的收获&…...

《SOC芯片研究框架》深度科普,发展趋势、技术特点、产业链一文看懂
片上系统SoC(System on Chip),即在一块芯片上集成一整个信息处理系统,简单来说 SoC芯片是在中央处理器CPU的基础上扩展音视频功能和专用接口的超大规模集成电路,是智能设备的“大脑”。随着半导体工艺的发展࿰…...
WebRTC中的ICE
ICE简介 ICE是用于UDP媒体传输的NAT穿透协议(适当扩展也可以支持TCP),它需要利用STUN和TURN协议来完成工作。 STUN协议提供了获取一个内网地址对应的公网地址映射关系(NAT Binding)的机制,并且提供了它们…...

了解webpack
文章目录一、webpack是什么?二、为什么要使用webpack三、webpack的五个核心概念四、安装webpack提示:以下是本篇文章正文内容,下面案例可供参考 一、webpack是什么? 本质上,webpack 是一个用于现代 JavaScript 应用程…...

NoSQL数据库详细介绍
一、NoSQL发展历史 NoSQL 一词最早出现于 1998 年,是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 功能的关系数据库。 2009 年,Last.fm 的 Johan Oskarsson 发起了一次关于分布式开源数据库的讨论,来自 Rackspace 的 Eric Evans 再次…...
【2023】华为OD机试真题Java-题目0210-优秀学员统计
优秀学员统计 题目描述 公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。 每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。 请你实现代码帮助统计出打卡次数top5的员…...
2023备战金三银四,Python自动化软件测试面试宝典合集
马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试,一个程序员成长之路永恒绕…...
2023年实体店做什么比较好赚钱?
2023年实体店做什么比较好赚钱?未来实体店真正能赚的模型是什么?#百收#狂潮老师#千行#干货分享#商业思维 2023年实体店做什么比较好赚钱?...

SpringSecurity前后端分离(一篇就够了)
SpringSecurity前后端分离 从上至下操作,直接上手SpringSecurity 文章目录SpringSecurity前后端分离1、项目环境maven依赖数据库表2、自定义UserService接口3、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑1、表…...

Allegro如何用Label Tune功能自动调整丝印到器件中心
Allegro如何用Label Tune功能自动调整丝印到器件中心 在做PCB设计的时候,调整丝印是比较费时的工作,如果需要把整板的丝印位号调整到器件的中心做装配图使用,Allegro的Label Tune功能支持快速把丝印位号居中到器件中心。 以下图为例,快速把所有丝印位号居中 调整前 调整后…...

Linux(十)线程安全 上
目录 一、概念 二、互斥锁实现互斥 三、条件变量实现同步 银行家算法 生产者与消费者模型 一、概念 概念:在多线程程序中,如果涉及到了对共享资源的操作,则有可能会导致数据二义性,而线程安全就指的是,就算对共享…...

CRM系统能给企业带来什么? CRM系统推荐
什么是CRM系统? CRM系统(又称客户关系管理系统)是一个以客户为核心的管理软件,能有效改善企业与现有客户的关系,且帮助企业寻找新的潜在客户,并赢回以前老客户。 CRM系统能给企业带来什么? C…...

ESP32设备驱动-LED控制器生成PWM信号
LED控制器生成PWM信号 文章目录 LED控制器生成PWM信号1、LED控制器介绍2、软件准备3、硬件准备4、代码实现PWM 是一种在数字引脚上获取类似模拟信号的方法。PWM实际上是一个在高电平和低电平之间切换的方波信号,在 0V 和 3.3V 之间。 当信号为 HIGH 和 LOW 时,这种连续的 HIG…...

秒杀项目之网关服务限流熔断降级分布式事务
目录一、网关服务限流熔断降级二、Seata--分布式事务2.1 分布式事务基础2.1.1 事务2.1.2 本地事务2.1.3 分布式事务2.1.4 分布式事务场景2.2 分布式事务解决方案2.2.1 全局事务可靠消息服务2.2.2 最大努力通知2.2.3 TCC事事务三、Seata介绍四、 Seata实现分布式事务控制4.1 案例…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...