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 案例…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
