感知算法工程师面试===目标检测===YOLO V4(改)

news2024/11/24 16:06:56

感觉V3 到V4,YOLO的整体架构并没有重大的改进,只是增加了很多的trick

先展示一下V4的整体网络结构
在这里插入图片描述
↑ \uparrow 这个是对比V3的

如图可见,V4的结构依然是主干网络+金字塔+头部检测器,所有的改进都是为了更好更快的检测目标。

在这里插入图片描述
↑ \uparrow 这个是另一种风格的
在这里插入图片描述

↑ \uparrow 这个卷积块的角度看

然后,是V4的改进:

  • 主干网络:DarkNet-53 改为CSPDarkNet-53
  • 激活函数:LeakyReLU改为Mish
  • 金字塔:FPN改为PAN
  • SPP
  • DropBlock正则化
  • 数据增强:CutMix、马赛克(Mosaic)、
  • 自对抗训练
  • 标签平滑
  • 学习率:余弦退火衰减
  • 损失函数:IoU 改为 CIoU

首先,V5在训练之前加入了mosaic数据增强方法,提高小目标的检测性能,放上美女图。。。
在这里插入图片描述
mosaic数据增强方法仅仅是使用,并没有在进一步优化。这种方法在BN层计算特征的时候,会同时计算四张图片的数据,极大丰富了检测物体的背景。

1)CSPDarkNet作为主干网络,相比于DarkNet,虽然增加了大量卷积模块,但网络的推算算法却没有降低。首先,CSP全称Cross Stage Partial Network,翻译过来是跨阶段部分网络,意味着这种网络结构中存在一种可以跨越很多层传递特征的结构。

在这里插入图片描述
如上图所示,这里的Res指带的不是单个的残差块,而是YOLO中的堆叠残差结构
在这里插入图片描述
这种结构,会有大量的卷积运算,并且为了更好的提高模型对图像特征的提取能力,CSPDarknet-53还参考了DenseNet的密集链接,进一步加大了计算量也提高了性能。于是,为了提高速度,通过CSP结构,这种将Feature作为大残差边的方式,将输入Feature的拆成两份,一部分直接跨层传递,极大的减少了计算量。

这么做的合理性在于卷积网络中的feature map往往具有很大的冗余性,不同通道的特征图可能包含的信息是相似的。因此,无需处理全部的channel,只需处理一部分即可。

2)Mish激活函数
YOLOv4还将LeakyReLU全部换成了Mish
在这里插入图片描述
Mish是一种平滑的,非单调的激活函数,可以定义为:

Mish(x) = x・tanh(softmax(x)) ;其中softmax= ln(1 + e ^ x)

相比于LeakyReLU,Mish在(-oo,0)这个区间可以更好的保持较小的负值,使大多数深层神经元能得到有效更新,不过这个函数的计算时间要高于LeakyReLU,但是在性能上表现出了比他们都要好的效果,应用在CSPDarknet中确实提升了大幅性能,并且感谢CSP的跨层结构,Mish函数对整体的计算量负担不大。

3)SPP池化
SPP池化主要作用在于不增加下采样数量的条件下,扩大YOLO检测器的感受野。比如,一张512X512的图像,原始V3中13X13特征图对应的感受野为512x512,而加入了SPP后提高到725x725。它借鉴了SPPnet的结构,但也不是完全相同.具体结构如下图
在这里插入图片描述
这个结构由何凯明提出,用于物体的多分类任务。由于COCO数据集中,输入图像的尺寸总是改变,而分类网络,在网络最后一定有全连接层,这就需要所有图像转换到相同的尺寸。但这会扭曲原始的图像中的物体,因此为了很好的解决这样的问题, SPPNet使得任意大小的特征图都能够转换成固定大小的特征向量,送入全连接层。

但这个思路是针对于分类任务的,对于进行目标检测任务的YOLO v4而言,不需要在SPP这里设定全连接层进行分类,而是选取了SPP中,池化(下采样)部分来提取不同感受野的特征。
在这里插入图片描述
如图,通过3个并行池化模块,分别对特征图按照不同步长进行计算。这样,网络可以增大感受野,使模型更改好的检测大目标和小目标。
在这里插入图片描述

4)PANet
YOLOv4的第二处改进便是参考了PANet(Path Aggregation Network)论文的结构。原先的YOLOv3仅使用了top-down结构的FPN,而PAN是在此基础上加了bottom-up的结构。
在这里插入图片描述
假设输入图像为416X416像素,则C5是末端13X13的特征图,C4是26X26的,C3是52X52的特征图。可见,第一步,通过将特征上下融合,使得C3和C4特征图包含了更多的深层语义信息;第二步,再次下上融合,使得C5和C4特征图包含了更多的浅层纹理信息,提升了网络的检测性能。

5) 损失函数
Loss这里改动有3个,一个是定位,微调了中心点(x,y)的回归公式,另一个是置信度的判定由IoU改进为CIoU,再有一个就是Multi anchor策略

1))
在这里插入图片描述

在YOLOv3中,边界框的中心点回归公式如下:

c x = g r i d x + σ ( t x ) c_x =grid_x+\sigma(t_x) cx=gridx+σ(tx)
c y = g r i d y + σ ( t y ) c_y =grid_y+\sigma(t_y) cy=gridy+σ(ty)

简洁明了,但是这里存在一个隐患,那就是当物体的中心点恰好落在网格的右边界时,那么就需要 σ ( t x ) \sigma(t_x) σ(tx)输出为1。
但对于sigmoid函数,当且仅当输入为正无穷的时候,输出才是1,但显然让网络学一个这种正无穷是不现实的。同样,当物体中的中心恰好落在网格的左边界时,就需要 σ ( t x ) \sigma(t_x) σ(tx)输出为0,而sigmoid函数只有输入负无穷时,才会得到0的输出,这显然也是不合适的。这一问题就被称为“grid sensitive”,问题的核心就在于目标的中心点可能会落在网格的边界上。

为了解决这一问题,YOLOv4便在 σ ( t x ) \sigma(t_x) σ(tx)函数前面乘以一个大于1的系数:

当中心点处在右边界的时候, s ∗ σ ( t x ) s*\sigma(t_x) sσ(tx)输出为1,那么仅需 σ ( t x ) \sigma(t_x) σ(tx)输出为 1 / s < 1 1/s<1 1/s<1,从而避免正无穷的问题。但是,这种做法并不会解决 s ∗ σ ( t x ) s*\sigma(t_x) sσ(tx)输出0的问题,仍旧有负无穷的问题存在。于是,增加了常数项 ( s − 1 ) / 2 (s-1)/2 (s1)/2解决了中心点落到左边界的问题。

c x = g r i d x + ( s ∗ σ ( t x ) + ( s − 1 ) / 2 ) c_x =grid_x+(s*\sigma(t_x)+(s-1)/2) cx=gridx+(sσ(tx)+(s1)/2)
c y = g r i d y + ( s ∗ σ ( t y ) + ( s − 1 ) / 2 ) c_y =grid_y+(s*\sigma(t_y)+(s-1)/2) cy=gridy+(sσ(ty)+(s1)/2)

在这里插入图片描述
2))CIoU

IOU Loss:考虑检测框和目标框重叠面积。
GIOU Loss:在IOU的基础上,解决边界框不重合时的问题。
DIOU Loss:在IOU的基础上,考虑边界框中心距离的信息。
CIOU Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

因此,CIoU可以说考虑到了各种情况,嗯。。。很完美,可以说V4,使用CIoU提高了网络对于正样本的学习数量,并优化了对小目标的检测能力。
在这里插入图片描述
注意一点
V4的损失函数中, L o s s l o c Loss_{loc} Lossloc的计算方式不同于V3直接使用xywh计算,而是使用了CIoU来计算,也就是说需要通过xywh反算出整个包围框之后在于真实的标签框计算CIoU,然后带入 L o s s l o c Loss_{loc} Lossloc
在这里插入图片描述
在这里插入图片描述

3))Multi anchor策略
V3中正样本的判定机制是:当预测中心点与存在真正有物体中心点,处于同一网格中时,进行IoU的计算,并且当IoU>0.7时的最大的那个(三个检测器同时算的,每个网络2个框,共6个,是6选1)才算正样本,并为了更进一步提高正样本的权重,V3通过加入系数 λ c o o r d \lambda_{coord} λcoord,这种固定的方式强行提高,比如当网格中有真实物体,这里的 λ c o o r d = 5.0 \lambda_{coord}=5.0 λcoord=5.0,负样本的 λ c o o r d = 0.5 \lambda_{coord}=0.5 λcoord=0.5

这种匹配机制导致正样本过少,产生正负样本不均匀的问题。毕竟网格比较少,尤其是小目标的情况。于是,V4将单个网格的范围从[0,1]图上绿色框阔大到了[-0.5,1.5]红色框,这样即便预测框的中心点处于另一个网格中,也会计算IoU,提高了正样本的数量,并且设定一个阈值,只要预测框的iou大于这个阈值则判定为正样本(三个检测器同时算每个网络2个框,共6个,有可能6个全要)。
在这里插入图片描述

6)标签平滑
为了防止分类过拟合,使用了标签平滑Label Smoothing的技巧。
在这里插入图片描述
在分类任务中,某个样本的one-hot(二进制串)标签为

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0]

二分类,认为样本为正样本,标注为1,过于绝对,容易过拟合;好比一个人,过于自信,就是自负,一旦自负,迟早判断失误!将上述的(0, 1)定义为(0.05, 0.95),这样标签变得平滑,有种将离散变量转为连续变量的意思,类似于“像素插值”。

在训练过程中,模型习惯于对其预测结果“过于自信”,这会增加过拟合风险。另外,数据集中可能包含标注错误的数据,所以模型在训练过程中需要对标签持有怀疑态度。为此,可以在训练中引入一种标签平滑方法,将hard标签转换为soft标签(即1 → 1 - 平滑因子),来降低模型对标签的信心。

在这里插入图片描述

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

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

相关文章

02-SpringBoot基础

一、回顾 二、知识目标 SpringBoot概述【了解】 SpringBoot快速入门【掌握】 SpringBoot启动原理【重点】 SpringBoot配置文件【掌握】 SpringBoot属性注入【掌握】 三、为什么使用SpringBoot&#xff1f; -SSM开发有哪些痛点&#xff1f; 1、在早期我们都是使用的是SSM来…

web前端期末大作业:美食网站设计与实现——HTML+CSS+JavaScript休闲美食餐饮公司网站静态模板(6个页面)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

POI在指定excel插入行java

我想在第三行&#xff0c;插入数据库的数据&#xff0c;这里假如数据库有10条&#xff0c;并且继承第二行的格式 数据库数据 {"clark",25}&#xff0c;我写个json对象&#xff0c;10条这个 造数据代码 JSONArray jsonArray new JSONArray();for (int i 0; i <…

Mac 安装mysql8.0

1. 确认下载的版本 并下载dmg文件 官网下载dmg安装文件 &#xff0c;查看自己电脑用的是什么芯片 选择对应版本的安装包&#xff0c;终端命令&#xff1a; uname -a 参考&#xff1a;http://www.yaotu.net/biancheng/13817.html 系统偏好设置里是 英特尔的i7处理器 并且查询…

可观测性-Metrics-Tomcat连接数、线程数理解以及压测记录

文章目录背景原理压测5个并发压测10个并发压测60个并发压测61个并发压测背景 为了搞懂Tomat的连接线程模型&#xff0c;搞清楚每个配置参数的作用&#xff0c;实际压测看一下是否与预期一致。 Tomcat配置如下&#xff1a; server:# tomcat配置tomcat:# 允许最大连接数,默认8…

磁盘和文件系统管理(一)

检测并确认新硬盘 fdisk命令 查看或管理磁盘分区 fdisk -l [磁盘设备] 或 fdisk [磁盘设备] 交互模式中的常用指令 m、p、n、d、t、w、q d delete a partition * 删除分区 g create a new empty GPT partition table 创建一个新的空的GPT分区表(可以对大于2T磁盘进行分区) l…

Java - Object#finalize在JDK9中被标记废弃了!

Java - Object#finalize在JDK9中被标记废弃了&#xff01; 时间&#xff1a;2022年12月6日01:34:10 目录&#xff1a; ① 为什么要废弃&#xff1f; ② 废弃后&#xff0c;使用什么方式主动监测对象是否被回收&#xff1f; 一、为什么要废弃&#xff1f; ⚡注意&#xff1a;废…

ChatGPT成精了!

最近几天&#xff0c;朋友圈、公众号都被 ChatGPT 刷屏了。 更有不少标题党吹嘘 “谷歌要完&#xff0c;百度也危了”。 那么它到底有没有网上吹的这么神奇呢&#xff1f; 我亲测了一把&#xff0c;感觉确实非常惊艳&#xff01; 例如&#xff1a; 看着还不错&#xff0c;每…

20221206英语学习

今日新词&#xff1a; outwards adv.向外, 朝外 outrage n.义愤&#xff0c;愤慨&#xff1b;暴行&#xff0c;骇人听闻的事件 drown v.淹没, 溺死, 浸透, 浸泡 visit n.访问, 参观, 看望, 游览 setting n.环境, 背景, &#xff08;戏剧、小说等的&#xff09;情节背景&am…

面试题: Hive-SQL查询连续活跃登录用户思路详解

文章目录创造数据登录日志去重一、思路一1.1、分组排序1.2、日期减去计数值得到结果, 用户连续登陆情况下&#xff0c;每次相减的结果都相同1.3、根据 user_id 和 dis 分组&#xff0c;得到用户的 开始、结束时间、连续登录天数1.4、连续登录超过两天用户二、思路二&#xff1a…

【Rust日报】2022-12-05 探索 docker 的 WASM 技术预览

探索 docker 的 WASM 技术预览docker于近日发布了支持 WASM 容器的预览版本,本文带你体验使用 Rust 编写代码,并且编译成 WASM 最终运行于 docker 的过程.原文链接: https://medium.com/shyamsundarb/exploring-docker-hubs-wasm-technical-preview-76de28c3b1b4使用 Rust 破解…

Matlab学习——变量与档案存取

一、变量 1. char和string MATLAB里面的字符和字符串都是用单引号括起来的。 % 示例&#xff1a;aI like China; n0; for n1:1:size(a,2)b(size(a,2)-n1)a(n); end disp(a); disp(b);% 输出&#xff1a;>> work I like China anihC ekil I >> % 示例&#xff…

Dockerfile的常用指令和构建案例

一、Dockerfile操作常用的指令 (1) FROM 镜像 指定新镜像所基于的基础镜像&#xff0c;第一条指令必须为FROM指令&#xff0c;每创建一个镜像就需要一条FROM指令 (2) MAINTAINER 名字 说明新镜像的维护人信息 (3) RUN命令 在所基于的镜像上执行命令&#xff0c;并提交到新的…

B2B商城交易平台搭建方案为专用设备行业注入新动力,加快产业数字化转型升级

专用设备是指设备的结构、性能专门针对某一种或一类对象&#xff0c;实现一项或几项功能的工业&#xff0c;包括工程机械、光伏设备、锂电设备、3C设备、半导体设备等。近年来&#xff0c;受市场对专用设备的应用需求不断扩大、产业技术升级趋势加快等影响&#xff0c;我国专用…

直播回顾:Coremail校园邮件安全防护交流会暨新技术应用分享

11月23日&#xff0c;Coremail校园邮件安全防护交流会暨新技术应用分享直播举办。 Coremail作为国内TOP级邮件系统厂商&#xff0c;服务上百家高校&#xff0c;特邀以下重磅嘉宾参与了本次圆桌讨论。 本次圆桌会主要探讨校园典型钓鱼邮件防范与新技术在校园邮件中的应用。 高校…

mysql 查询在一张表不在另外一张表的记录

SQL Join子句&#xff0c;主要用在select语句中&#xff0c;把两个或多个表的行结合起来&#xff0c;基于这些表之间的共同字段(往往是id字段)来查询&#xff0c;从多个表中返回满足条件的所有行。 常见join子句类型 常见join子句类型有INNER JOIN(同JOIN)、LEFT JOIN、RIGHT…

【Java学习Note】第8章 多线程

8. 多线程 文章目录8. 多线程8.1 程序、进程、线程8.2 线程的创建8.2.1 继承Thread类-创建线程方法之一8.2.2 Thread常用方法8.2.3 实现Runnable接口-创建线程方法之二8.2.4 两种多线程的区别8.3 线程得调度8.4 线程的生命周期8.5 线程的同步8.5.1 线程同步--Synchronized8.5.2…

html网页设计与制作:基于html设计整套招聘网站求职前端模板页面 静态网页HTML代码 学生网页课程设计期末作业下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

联通边缘AI:打造“职业技能”,助力行业高质量发展

内容来源&#xff1a;2022年11月12日&#xff0c;由边缘计算社区主办的全球边缘计算大会上海站圆满落幕。我们非常荣幸邀请到了联通数科首席AI科学家廉士国博士来分享&#xff0c;廉博士是中国图像图形学会三维视觉专委会委员、IEEE智能计算及多媒体通信委员会委员、国家工业互…

WSL VSCode运行C++项目

WSL VSCode运行C项目collect2: error: ld returned 1 exit statusboost库的链接安装并编译boost库&#xff1a;链接库(&#xff01;&#xff01;这一步有错误&#xff0c;下面会改正)/usr/include/boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No suc…