深度学习目标检测_YOLOV3超详细解读

news2024/10/5 13:53:59

文章目录

  • YOLO V3概述
  • 网络结构
    • backbone:darknet-53
  • 特征细化(多scale)
  • 残差连接
    • 残差网络的发家史
  • 先验框
  • softmax改进

YOLO V3概述

yolo v3论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf
先说说yolo v3的效果:
yolo v3把自己放到了第二象限,将自己与其他的模型区分开来,可见速度之快。(注意,横坐标原点并不是0,而是50),当然mAP值也有提高。
在这里插入图片描述
接下来看看yolo v3在yolov2,yolo v1上做了哪些保留和改进,先看看yolo_v3上保留的东西:

  • “分而治之”,从yolo_v1开始,yolo算法就是通过划分单元格来做检测,只是划分的数量不一样。
  • 采用"leaky ReLU"作为激活函数。
  • 端到端进行训练。一个loss function搞定训练,只需关注输入端和输出端。
  • 从yolo_v2开始,yolo就用batch normalization作为正则化、加速收敛和避免过拟合的方法,把BN层和leaky relu层接到每一层卷积层之后。
  • 多尺度训练。在速度和准确率之间tradeoff。想速度快点,可以牺牲准确率;想准确率高点儿,可以牺牲一点速度。
  • yolo每一代的提升很大一部分决定于backbone网络的提升,从v2的darknet-19到v3的darknet-53。yolo_v3还提供替换backbone——tiny darknet。要想性能牛叉,backbone可以用Darknet-53,要想轻量高速,可以用tiny-darknet。总之,yolo就是天生“灵活”,所以特别适合作为工程算法。
  • 当然,yolo_v3在之前的算法上保留的点不可能只有上述几点。其他的可以自己探索一下面进入正题,看看yolo v3的改进。

网络结构

这里借个图
在这里插入图片描述
DBL:代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。
resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。不懂resnet请戳这儿
concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。
为了达到更好的分类效果,作者自己设计训练了darknet-53。作者在ImageNet上实验发现这个darknet-53,的确很强,相对于ResNet-152和ResNet-101,darknet-53不仅在分类精度上差不多,计算速度还比ResNet-152和ResNet-101强多了,网络层数也比他们少。
我们可以借鉴netron来分析网络层,整个yolo_v3_body包含252层,组成如下:
在这里插入图片描述
根据表0可以得出,对于代码层面的layers数量一共有252层,包括add层23层(主要用于res_block的构成,每个res_unit需要一个add层,一共有1+2+8+8+4=23层)。除此之外,BN层和LeakyReLU层数量完全一样(72层),在网络结构中的表现为: 每一层BN后面都会接一层LeakyReLU。卷积层一共有75层,其中有72层后面都会接BN+LeakyReLU的组合构成基本组件DBL。看结构图,可以发现上采样和concat都有2次,和表格分析中对应上。每个res_block都会用上一个零填充,一共有5个res_block。

backbone:darknet-53

整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的1 / 2 5 1/2^51/2
5
,即1/32。输入为416x416,则输出为13x13(416/32=13)。
yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。所以,通常都要求输入图片是32的倍数。可以对比v2和v3的backbone看看:(DarkNet-19 与 DarkNet-53)
在这里插入图片描述
yolo_v2中对于前向过程中张量尺寸变换,都是通过 最大池化来进行,一共有5次。而v3是通过卷积核 增大步长来进行,也是5次。(darknet-53最后面有一个全局平均池化,在yolo-v3里面没有这一层,所以张量维度变化只考虑前面那5次)。
也可以看这个图,更清楚
在这里插入图片描述
也就是52个卷积层(Residual是残差模块,下面会讲到)加1个全连接层构成了主干网络。
这也是416x416输入得到13x13输出的原因。从图2可以看出,darknet-19是不存在残差结构(resblock,从resnet上借鉴过来)的,和VGG是同类型的backbone(属于上一代CNN结构),而darknet-53是可以和resnet-152正面刚的backbone,看下表:
在这里插入图片描述
从上表也可以看出,darknet-19在速度上仍然占据很大的优势。其实在其他细节也可以看出(比如bounding box prior采用k=9), yolo_v3并没有那么追求速度,而是在保证实时性(fps>36)的基础上追求performance。不过前面也说了,你要想更快,还有一个 tiny-darknet作为backbone可以替代darknet-53,在官方代码里用一行代码就可以实现切换backbone。搭用tiny-darknet的yolo,也就是tiny-yolo在轻量和高速两个特点上,显然是state of the art级别,tiny-darknet是和squeezeNet正面刚的网络,详情可以看下表:
在这里插入图片描述
所以,有了yolo v3,就真的用不着yolo v2了,更用不着yolo v1了。这也是yolo官方网站,在v3出来以后,就没提供v1和v2代码下载链接的原因了。

特征细化(多scale)

在这里插入图片描述
yolo v3输出了3个不同尺度的feature map,如上图所示的Scale 1, Scale 2, Scale 3。这也是v3论文中提到的为数不多的改进点:predictions across scales。
还是感受野的问题,随着网络层数的加深,一个grid cell所包含的信息也就越多,越适合预测大物体,看下面的来理解:
yolo v2的做法是将3层的特征融合到一起,就好像一个人擅长攻击,另一个人擅长防守,把两个人的特征融合在一起就变成2个都会点但是并不是很精通了。所以yolo v3采用了多scale的方法,也就是大中小物体分开来检测。
在这里插入图片描述
至于分开预测的方式我们先看看下面这张图的图像金字塔思想可以吗?
首先解释一下图像金字塔和单一的输出:

  • 图像金字塔:就是可以通过改变图片分辨率的方式,使得每一张图像经过DarkNet52网络层后输出相应大小的特征。
  • 单一的输出:yolo v1的做法
    这种做法显然是不可以的,因为这样训练速度会大打折扣,yolo本来就是拼速度的。
    在这里插入图片描述
    那是不是下面图一的做法呢,其实并不是简单的图一做法。而是图二的做法,在预测2626特征的时候会把1313的特征做一下upsample,也就变成了2626,再和原来的2626特征融合;在预测5252特征的时候会把特征融合过的2626的特征做一下upsample,也就变成了5252,再和原来的5252特征融合,类似FPN的upsample和融合做法。这样做的好处就好像是有一个见多识广的前辈给一些指点。
    在这里插入图片描述
    下面这张图解释的更清楚一些:
    在这里插入图片描述

残差连接

从今天来看,几乎所有的网络都用上了残差连接的方法。
V3也用了resnet的方法,堆叠更多的层来进行特征提取。

残差网络的发家史

首先在14年的时候VGG网络特别的火,我们都觉得网络层数越多效果越好,但是VGG在做到19层的时候就不行了,后面的结果都比19层的差。就好像下面这张图,56层的网络还没有20层的网络效果好。也是在那个年头,resnet思想横空出世,救活了神经网络,目前各种主流算法都是基于resnet去做的。
那么什么叫resnet呢?
通俗解释一下,比如我做到19层做不下去了,那不可能每一层都做不好吧,比如20层、21层做不好,就沿着20层、21层继续做,同时再把19层的网络映射过来(1*1的卷积),也就是把19层和21层的特征做一个融合,做到“至少不比原来差”。
在这里插入图片描述

更详细的讲解可以看这篇文章:深度学习——ResNet超详细讲解,详解层数计算、各层维度计算

先验框

这张图帮助理解,没啥难度。
在这里插入图片描述
yolo v2中选了5个先验框,而yolo v3更狠一点,选了9个先验框,并且将聚类出来的9个先验框分了3类,分别对应1313,2626,52*52的特征图。
在这里插入图片描述

softmax改进

YOLOv3对类别预测的激活函数进行了修改,但是没有使用softmax。首先说明一下为什么不用softmax,原来分类网络中的softmax层都是假设一张图像或一个object只属于一个类别,但是在一些复杂场景下,一个object可能属于多个类,比如你的类别中woman和person这两个类,那么如果一张图像中有一个woman,那么你检测的结果中类别标签就要包含woman和person两个类,这就是多标签分类。

所以YOLOv3用逻辑回归层来对每个类别做二分类。逻辑回归层主要用到sigmoid函数,该函数可以将输出约束在0到1的范围内,因此当一张图像经过特征提取后的某一类输出经过sigmoid函数约束后如果大于0.5,就代表属于该类,这样一个框就可以预测多个类别。代价函数用的是sigmoid的交叉熵。
softmax是多分类,把所有类别概率统一,求出一个最大的概率,也就是最后只有一个类别,无法多标签。
sigmoid把每个类别做二分类,大于某个阈值则是次类,每个输出的分类值不和其他比较,只确定自己是否是某个类别
在这里插入图片描述
再通俗的讲一下softmax和sigmoid函数吧,还可以点这里看更详细的讲解。
softmax就好像是单一的数除以总数得到的概率,最终每个数的概率和为1。
sigmoid是把每个数都放到下面图像中,映射出它自身的概率,与图像函数式有关,与其他数值无关。
在这里插入图片描述

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

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

相关文章

字节青训营Go语言学习第二天-Go语言进阶与依赖管理

文章目录并行VS并发GoroutineCSPChannel并发安全LockWithGroupGo依赖管理GoPathGo VendorGo Module依赖分发-回源并行VS并发 并发指的是多线程在一个CPU上运行,而并行是直利用多核来实现多线程。 内核是系统里比较昂贵的系统资源,它的创建、切换停止都是…

K8s可视化界面Kubernetes DashboardKuboard

目录一、简介二、Kubernetes Dashboard2.1 部署dashboard2.2 访问UI2.3 创建访问账号三、Kuboard3.1 部署2.2 访问UI一、简介 本文给大家介绍两个K8s集群的可视化工具 Kubernetes Dashboard 和 Kuboard 二、Kubernetes Dashboard 2.1 部署dashboard dashboard Github地址&a…

【算法基础(2)】二分查找和斐波那契数列

二分查找 二分查找高效的前提是数据结构是有序的 思路: 1.排序 2.将数组折半,分成左右两个数组。 3.判断要查找的数和中间位置数值的大小,来判断要查找的数实在哪一半。 4.之后继续折半查找,直至找到这个数。 图解: 首…

SpringMVC看这一篇文章就够了

第一章 SpringMVC的简介 Spring框架版本 4.3.29.RELEASE SpringMVC是什么 1 2 3 4 5 61. Spring家族的一个部分 2. 是JavaWeb三层架构中控制器层的解决方案 3. 是基于MVC思想的框架-- Model-- View-- ControllerSpringMVC知识点大纲SpringMVC功能简述 1 2 3 4 5 6 7 8 9 101. 作…

WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)

文章目录一、为什么要使用docker二、Windows10/11系统安装Docker Desktop三、如何判断电脑已经安装好docker四、docker前端应用实战:将vue项目打包为docker镜像运行1、将vue的项目进行构建,输出dist2、准备镜像内容3、制作镜像4、启动镜像五、如何发布镜…

【Leetcode】面试题 01.02. 判定是否互为字符重排、面试题 01.04. 回文排列

作者:一个喜欢猫咪的的程序员 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 面试题 01.02. 判定是否互为字符重排 面试题 01.04. 回文排列 面试题 …

水果店做微信活动推荐_分享水果店微信小程序制作步骤

试试做个小程序拯救你的店!让你做出有效果的活动,每笔钱都花在刀刃上!编辑第一,提升水果销量,降低损耗用水果店小程序做拼团、砍价、秒杀活动,并讲原本卖不完的水果,做成果盘吸引客人注册会员。…

点成分享|关于Grant水浴的一些FAQ

1、关于稳定性和均匀性 1)稳定性,是水浴中任何一点在达到恒温时不同时间下的温度规律性波动程度的描述,是通过浴槽中心点测定的,并表示为测量值的正负一半。系同点不同时的温度特性描述。 例如:SAP恒温水浴设定温度为…

unreal engine建模模式建模研究

Create PolyExt 挤出(需要闭合) image.pngPathExt 具有宽度挤出 (无需闭合) 如下图绘制一个形状后按鼠标左键确定绘制完成再移动鼠标控制厚度按鼠标左键确定后端后再移动鼠标确定高度 image.pngimage.pngPathRev Draw and revolve polypaths to create new objects 画和旋转pol…

企业级监控项目Skywalking详细介绍,来看看呀

一. Skywalking概述一个优秀的项目,除了具有高拓展的架构、高性能的方案、高质量的代码之外,还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多,Skywalking除了提供多维度、多粒度的监控之外,也提供了良好的图形…

Kotlin 元编程之 KSP 全面突破

什么是元编程 没想到吧,这世上除了元宇宙,还有元编程,如果没有接触过,可能会有点懵,不过没关系,简单的说就是用代码来生成代码。实现元编程的传统常见手段主要是使用 APT注解处理器 JavaPoet 组合拳&…

JAVA基础知识巩固训练

目录 1. 案例一:逢 7 跳过 2. 案例二:数组元素求和 3. 案例三:判断两个数组是否相同⭐ 4. 案例四:查找元素在数组中的索引 5. 案例五:数组元素反转 6. 案例六:评委打分 7. 案例七:随机产…

后端人眼中的Vue(五)

七、Vue生命周期 ​ Vue的生命周期指的是Vue实例在页面中创建到销毁整个过程。Vue提供了在各个生命周期的钩子,钩子也叫Vue生命周期函数。这些生命周期函数是伴随着Vue实例创建、销毁的过程中自动触发的(不需要人为手动触发)。Vue实例生命周期…

产业互联网:补齐互联网的「短板」,重启互联网的「进化」

尽管在互联网时代出现了诸多的乱象,但是,我们依然无法否认互联网时代给人们的生产和生活带来的影响和改变。即使如此,我们依然无法否认互联网本身其实是存在着诸多的问题和弊病的,这些问题和弊病所导致的一个最为直接的结果&#…

【opencv】二维面找角点/关键点 实现

every blog every motto: You can do more than you think. 0. 前言 二维面找角点/关键点 实现 1. 正文 1.1 前提 1.1.1 显示函数 def show(arr):plt.imshow(arr)plt.show()def cvshow(arr):cv2.namedWindow(a, 0)cv2.imshow(a, arr)cv2.waitKey(0)cv2.destroyAllWindows…

通关算法题之 ⌈链表⌋

链表 删除元素 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]c…

2022 IoTDB Summit:宝武智维徐少锋《Apache IoTDB 在宝武装备远程智能运维平台中的使用案例》...

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

01【Vector CP】- 详解PN局部网络管理

Partial Networking概述 Partial Networking适用的ECU类型: 总线上依然有通信ECU关闭通信堆栈ECU要求降低功耗 Note:Partial Networking功能及其所有子功能是可选的,必须进行配置。为了控制此类ECU的关断和唤醒,CAN NM提供了一种额外的算法: NM PDU 消息中的用户数据部分…

java命名规范

Java总体命名规范1、项目名全部小写2、包名全部小写3、类名首字母大写,其余组成词首字母依次大写,驼峰命名4、变量名,方法名首字母小写,如果名称由多个单词组成,除首字母外的每个单词的首字母都要大写,保证…

企业数字化转型的关键一步,建立数据意识

数字化给社会带来的巨大的科技革命和产业革命,让数字经济成为新的高速增长的国民经济支柱,让数据变为第五大生产要素,发挥巨大价值,成为企业重要资产。不仅如此,在数字化的影响下,数字化转型成为了个人、机…