YOLOv3简介

news2024/11/16 12:40:41

YOLOv3

  1. 预测部分

    1. Darknet-53

      1

      YOLOv3的主干提取网络为Darknet-53,相比于YOLOv2时期的Darknet-19,其加深了网络层数且引入了Residual残差结构。其通过不断的1X1卷积和3X3卷积以及残差边的叠加,大幅度的加深了网络。残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。

      如图,一个Conv层包含一个二维卷积层,一个BatchNormalization层和一个LeakyReLU激活函数层。

      BN层:

      BN层解决的问题:随着神经网络深度的增加,训练越来越困难,收敛越来越慢。BN就是通过一定的规范化手段,把每层神经网络的神经元的输入值的分布强行拉回到均值为0方差为1的标准正态分布。简单理解就是把越来越偏的分布强制拉回比较标准的分布,这样神经元的输出就不会很大,并且使得激活函数的输入落在比较敏感的区域,可以得到比较大的梯度,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

      从形式上来说,用 x ∈ B \mathbf{x} \in \mathcal{B} xB表示一个来自小批量 B \mathcal{B} B的输入,批量规范化 B N \mathrm{BN} BN根据以下表达式转换 x \mathbf{x} x
      B N ( x ) = γ ⊙ x − μ ^ B σ ^ B + β . \mathrm{BN}(\mathbf{x}) = \boldsymbol{\gamma} \odot \frac{\mathbf{x} - \hat{\boldsymbol{\mu}}_\mathcal{B}}{\hat{\boldsymbol{\sigma}}_\mathcal{B}} + \boldsymbol{\beta}. BN(x)=γσ^Bxμ^B+β.
      其中: μ ^ B \hat{\boldsymbol{\mu}}_\mathcal{B} μ^B是小批量 B \mathcal{B} B的样本均值, σ ^ B \hat{\boldsymbol{\sigma}}_\mathcal{B} σ^B是小批量 B \mathcal{B} B的样本标准差。由于单位方差是一个主观的选择,因此通常包含拉伸参数(scale) γ \boldsymbol{\gamma} γ偏移参数(shift) β \boldsymbol{\beta} β,它们的形状与 x \mathbf{x} x相同。

      请注意, γ \boldsymbol{\gamma} γ β \boldsymbol{\beta} β是需要与其他模型参数一起学习的参数。 μ ^ B \hat{\boldsymbol{\mu}}_\mathcal{B} μ^B σ ^ B {\hat{\boldsymbol{\sigma}}_\mathcal{B}} σ^B,如下所示:
      μ ^ B = 1 ∣ B ∣ ∑ x ∈ B x , σ ^ B 2 = 1 ∣ B ∣ ∑ x ∈ B ( x − μ ^ B ) 2 + ϵ . \begin{aligned} \hat{\boldsymbol{\mu}}_\mathcal{B} &= \frac{1}{|\mathcal{B}|} \sum_{\mathbf{x} \in \mathcal{B}} \mathbf{x},\\ \hat{\boldsymbol{\sigma}}_\mathcal{B}^2 &= \frac{1}{|\mathcal{B}|} \sum_{\mathbf{x} \in \mathcal{B}} (\mathbf{x} - \hat{\boldsymbol{\mu}}_{\mathcal{B}})^2 + \epsilon.\end{aligned} μ^Bσ^B2=B1xBx,=B1xB(xμ^B)2+ϵ.
      在方差估计值中添加一个小的常量 ϵ > 0 \epsilon > 0 ϵ>0,以确保永远不会除以零,即使在经验方差估计值可能消失的情况下也是如此。估计值 μ ^ B \hat{\boldsymbol{\mu}}_\mathcal{B} μ^B σ ^ B {\hat{\boldsymbol{\sigma}}_\mathcal{B}} σ^B通过使用平均值和方差的噪声(noise)估计来抵消缩放问题。

      LeakyReLU:

      LeakyReLU与ReLU类似,区别是ReLU在值小于零为0而LeakyReLU在值为负时仍有较小的梯度。
      1

    2. FPN:

      1

      YOLOv3使用FPN特征金字塔进行特征提取,在此可以获得三个尺寸的加强特征。分别为 ( 13 , 13 , 1024 ) (13, 13, 1024) (13,13,1024) ( 26 , 26 , 256 ) (26, 26, 256) (26,26,256) ( 52 , 52 , 128 ) (52, 52, 128) (52,52,128)。其中第一个特征图下采样8倍,第二个特征图下采样16倍,第三个特征图下采样32倍。之后将这三个加强特征传入YOLO Head中获得预测结果。

      Up2D即上采样层,作用是将小尺寸的特征图通过插值等方法生成大尺寸的特征图来进行特征融合。

      concat操作来源于DenseNet网络的设计思路,其直接将特征图按通道数进行拼接。如图,concat层的最后一维通道数是水平箭头左面和竖直箭头下面最后一维通道数的和,与而加和操作 y = f ( x ) + x y=f(x)+x y=f(x)+x是完全不同的。

      FPN特征金字塔使用小尺寸特征图检测大物体,大尺寸特征图检测小物体(可以理解为尺寸越小,网络的深度越深,看到的图像的面积越大,检测的物体也就越大)。

      特征金字塔可以将不同shape的特征层进行特征融合,有利于提取出更好的特征。

    3. 预测结果解码

      YOLO head本质为一个 3 × 3 3 \times 3 3×3卷积与 1 × 1 1 \times 1 1×1卷积。前者进行特征提取,后者调整通道数为75。其中 75 = 3 × ( 1 + 4 + 20 ) 75=3 \times(1+4+20) 75=3×(1+4+20) 3 3 3代表每个位置包含三个锚框, 1 1 1代表该锚框是否包含物体, 4 4 4代表锚框的调整参数, 20 20 20代表voc数据集的类别数。(假设YOLOv3的训练数据集为VOC数据集)

      在经过YOLO Head后得到三个加强特征层的预测结果,如:

      • ( b a t c h _ s i e , 13 , 13 , 75 ) (batch\_sie, 13, 13, 75) (batch_sie,13,13,75)
      • ( b a t c h _ s i e , 26 , 26 , 75 ) (batch\_sie, 26, 26, 75) (batch_sie,26,26,75)
      • ( b a t c h _ s i e , 52 , 52 , 75 ) (batch\_sie, 52, 52, 75) (batch_sie,52,52,75)

      其中,每个特征层将预测图片分成与其大小对应的网格,如$ (13, 13, 75)$就是将原图片分为 13 × 13 13 \times 13 13×13的网格,然后从网格中建立3个锚框,这些框是网络预先设定好的框,网络的预测结果会判断这些框内是否包含物体,以及这个物体的种类。因此上述结果可以reshape为:

      • ( b a t c h _ s i e , 13 , 13 , 3 , 25 ) (batch\_sie, 13, 13, 3, 25) (batch_sie,13,13,3,25)
      • ( b a t c h _ s i e , 26 , 26 , 3 , 25 ) (batch\_sie, 26, 26, 3, 25) (batch_sie,26,26,3,25)
      • ( b a t c h _ s i e , 52 , 52 , 3 , 25 ) (batch\_sie, 52, 52, 3, 25) (batch_sie,52,52,3,25)

      其中,25分别代表x_offset、y_offset、h、w、置信度和20个分类结果。

      但是这个预测值并不是最终的预测结果,还需要进行解码。

      锚框解码

      1. 每个网格点加上其对应的x_offset和y_offset,结果就是预测框的中心。
      2. 之后利用锚框和h、w结合计算出预测框的宽高,这样就得到整个预测框的位置。
        如图, σ ( t x ) \sigma(t_x) σ(tx) σ ( t y ) \sigma(t_y) σ(ty)是基于矩形框中心点左上角格点坐标的偏移量。 σ \sigma σ是sigmoid激活函数。 p w p_w pw p h p_h ph是锚框的宽和高。
        1

      置信度解码

      置信度25维中占固定一位,使用sigmoid进行映射,使结果在[0, 1]之间。

      类别解码

      类别数在25维中占20维,每一维独立代表一个类别。

      1. 使用sigmoid替代softmax取消类别之间的互斥,使网络更加的灵活。

      2. 三个特征图一共可以解码出 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个box以及相应的类别、置信度。这4032个box,在训练和推理时,使用方法不一样:

        1. 训练时4032个box全部送入打标签函数,进行后一步的标签以及损失函数的计算。

        2. 预测时,选取一个置信度阈值,过滤掉低阈值box,再经过nms(非极大值抑制),就可以输出整个网络的预测结果了。

          非极大抑制的简单理解就是:当有许多锚框时,可能会输出许多相似的具有明显重叠的预测边界框,都围绕着同一目标。为了简化输出,可以使用非极大值抑制(non-maximum suppression,NMS)合并属于同一目标的类似的预测边界框。

      解码后就可以得到最终的预测框位置与类别并将其绘制在原图中。

  2. 训练部分

    1. 训练策略:

      1. 预测框一共分为三种情况:正例(positive)、负例(negative)和忽略样例(ignore)。

      2. 正例:任取一个ground truth(标签),与4032个框全部计算IOU,IOU最大的预测框,即为正例。并且一个预测框,只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框,那么下一个ground truth,就在余下的4031个检测框中,寻找IOU最大的检测框作为正例。ground truth的先后顺序可忽略。正例产生置信度loss、检测框loss、类别loss。预测框为对应的ground truth box标签(需要反向编码,使用真实的x、y、w、h计算出 t x . t y , t w , t h t_x. t_y, t_w, t_h tx.ty,tw,th);类别标签对应类别为1,其余为0;置信度标签为1。

      3. 忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生loss。

        作用:由于Yolov3使用了多尺度特征图,不同尺度的特征图之间会有重合检测部分。比如有一个真实物体,在训练时被分配到的检测框是特征图1的第三个box,IOU达0.98,此时恰好特征图2的第一个box与该ground truth的IOU达0.95,也检测到了该ground truth,如果此时给其置信度强行打0的标签,网络学习效果会不理想。

      4. 负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例。负例只有置信度产生loss,置信度标签为0。

    2. Loss函数

      最终损失由三个部分组成:

      1. 正例,编码后的长宽与x、y轴偏移量与预测框的差值。
      2. 正例,预测结果置信度的值与1的对比;负例,预测结果置信度的值与0对比。
      3. 实际存在的框,种类预测结果与实际结果的对比。

      最终的Loss为以上三个Loss相加。

      其中,x、y、w和h使用MSE(或smooth L1 Loss)作为损失函数;置信度、类别标签由于是0、1二分类使用交叉熵作为损失函数。

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

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

相关文章

【Unity VR开发】结合VRTK4.0:将浮点数从交互器传递到可交互对象

语录: 愿你熬得过万丈孤独,藏得下星辰大海。 前言: 默认情况下,交互器只能将单个布尔操作传递给可交互对象,后者控制可交互对象上的抓取操作。在其他时候,交互器中的其他操作可能希望传递给可交互对象&…

leaflet 设置marker,并可以任意拖动每一个marker(071)

第071个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中通过L.marker来添加marker,通过设置其属性,可以让marker在地图上任意的拖动。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共76行)相关API参…

实体店店铺管理软件怎么挑?看了排名就知道!

很多实体店店主在选择店铺管理软件时,不知道怎么选择,其实这个不难。一般根据市场上的排名也选择就ok了,因为一款被大家都认证过好用的软件,怎么都比盲选的或者名不见经传的软件好。选择一款适合的实体店店铺管理软件可以省很多事。而截止现在管理软件排…

linux将新加磁盘绑挂载到指定目录

查看当前挂载情况df -l此时可以看到sda和sdb两块磁盘已经被挂载,但实际上还有更多块磁盘未被挂载(磁盘名称sda,结尾字母安顺递增)查看一安装的所有磁盘fdisk -l此时我们可以看到还有很多未进行分区磁盘为磁盘添加分区fdisk /dev/s…

【另辟蹊径】Table 单元格内容过多之省略展示方案,设置Element table的 showOverflowTooltip 属性无效后的替代方案

一、问题背景 设置了element table的组件 <el-table-column>属性showOverflowTooltip无效&#xff0c;如图所示。 PS&#xff1a;注意不是不起作用&#xff0c;是有作用但是内容过多展示占据了整个界面&#xff0c;影响美观和用户体验。 有的博主解决方法是全局样式文件…

一眼万年的 Keychron 无线机械键盘

一眼万年的 Keychron 无线机械键盘 一款好的键盘对于程序员或者喜欢码字的人来说是非常重要的&#xff0c;而最近博主入手了自己的第一款机械键盘——Keychron 无线机械键盘。 机械键盘特点 有独立轴体&#xff0c;通过两个簧接触&#xff0c;来触发信号&#xff0c;价格相对贵…

大文件上传如何做断点续传?

一、是什么 不管怎样简单的需求&#xff0c;在量级达到一定层次时&#xff0c;都会变得异常复杂 文件上传简单&#xff0c;文件变大就复杂 上传大文件时&#xff0c;以下几个变量会影响我们的用户体验 服务器处理数据的能力请求超时 网络波动 上传时间会变长&#xff0c;高…

缓存穿透-总结

目录 缓存穿透-总结 出现场景&#xff1a; 解决方法&#xff1a; 方法1.缓存空对象&#xff1a; 方法2.加一个布隆过滤器&#xff1a; 总结&#xff1a; 缓存穿透-总结 出现场景&#xff1a; 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓…

光量子领域新突破:有望打造芯片工厂!

将2D材料与氮化硅谐振器混合集成&#xff0c;使一系列单光子源与硅基光子按需精准结合。&#xff08;图片来源&#xff1a;网络&#xff09;量子光子学的著名专家、电气和计算机工程助理教授Galan Moody的实验室成功创造了一种在芯片上产生单光子的新方法。量子具有叠加态的特性…

飞桨特色产业级模型库,助力AI开发与落地更简单!

飞桨在长期的产业实践中发现&#xff0c;开发者使用开源模型项目落地普遍会遇到三大难题&#xff1a; 算法和模型繁多&#xff0c;做模型选择是个难题&#xff1b; 模型效果不错&#xff0c;但产业落地时容易遇到资源限制和部署的问题&#xff1b; 面对新场景无从下手&#x…

minio public桶禁止在直接访问桶位置时列出所有文件url

minio的public桶因为没有限制&#xff0c;所以在直接访问到桶地址的时候会列出桶内所有文件的url&#xff0c;这样很不安全&#xff0c;如何禁止这个功能&#xff0c;可以使用三种方法 1、如果是新版的可以直接设置桶的Access Policy为自定义就好 编辑custom的Policy&#xff…

五种情况下企业需要引进低代码开发平台

随着低代码开发平台的热度在上升&#xff0c;企业中也开始流行一种新的应用交付方式&#xff1a;业务部门基于低代码开发平台将所需要的功能&#xff08;或简单的可用版本&#xff09;自行搭建出来&#xff0c;当遇到较为复杂的需求时&#xff0c;则向IT部门请求支援。业务与IT…

【MFC】模拟采集系统——数据绘制(19)

完成界面设计后&#xff0c;数据绘制也可以按照对MFC类派生来完成&#xff0c;值得注意的是这里的数据绘制仅仅是通过随机产生的数据来显示&#xff0c;并且显示的方法也有很多。 数据绘制 在主对话框中添加两个 Picture Control 位置大小任意&#xff0c;可以设置一下外观&a…

Python3 数据结构实例及演示

本章节主要结合前面所学的知识点来介绍Python数据结构。 列表 Python中列表是可变的&#xff0c;这是它区别于字符串和元组的最重要的特点&#xff0c;1句话概括即&#xff1a;列表可以修改&#xff0c;而字符串和元组不能。 以下是 Python 中列表的方法&#xff1a; 下面示…

阿里云服务器部署前后端分离项目

阿里云服务器部署 【若依】 前后端分离项目 文章目录一、域名解析二、服务器操作系统置空三、部署方式四、需安装环境配置五、Linux服务器安装相应内容&#xff08;具体安装步骤&#xff09;&#xff08;一&#xff09;安装JDK&#xff08;3种方式&#xff09;使用Yum安装&…

Assignment写作各个部分怎么衔接完美?

Assignment格式很简单&#xff0c;就只有四个部分&#xff0c;按着通用的套路来&#xff0c;发现也没什么难度。不过这4个部分自己需要衔接完美&#xff0c;下面就给大家分享一下写Assignment最简单的方法。 如果没有目录可以放在第一页的开头&#xff0c;用“标题字体”加重显…

互联网大厂Java岗最全八股文面试1100道真题汇总,堪称2023年面试天花板

2023 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套 1100道的 Java 面试手册是行业内各大神联合总结出来的&#xff0c;上传到 Git 上目前 star 数达到了 30K 这套互…

POE指数积公式的简单matlab实现

参考现代机器人学 及机器人工程师进阶之路&#xff08;八&#xff09;指数积&#xff08;PoE&#xff09;建立机械臂模型及正运动 1.使用Robotics在matlab中建立一个简单的机械臂&#xff0c;方便验证后面的代码写的对不对 %Robotics 工具箱介绍&#xff1a; https://blog.csd…

【使用secureCRT管理Linux系统】

使用secureCRT管理Linux系统 进入secureCRT快速连接虚拟机 默认是SSH2类型&#xff0c;红线是虚拟机的ip地址&#xff0c;绿线是虚拟机的用户名称 如果之后的页面出现了需要输入用户密码&#xff0c;那就是成功了&#xff0c;如果出现了Connection timed out 可能原因是电脑…

Spring如何整合MyBatis框架?使用XML及java类的配置方式

前言 Spring文章链接: 从头到尾Spring概念&#xff0c;家族&#xff0c;核心技术使用&#xff0c;事务这一篇就够了&#xff01;&#xff01;&#xff01;_千小半的博客-CSDN博客_spring最新技术 mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小…