YOLOv2小白精讲

YOLOv2是一个集成了分类检测任务的神经网络,它将目标检测和分类任务统一在一个单一的网络中进行处理。
本文在yolov1的基础上,对yolov2的网络结构和改进部分进行讲解。yolov1的知识点可以看我另外一篇博客(yolov1基础精讲-CSDN博客)。

目录

一、yolov1存在的不足

二、yolov2针对上述问题做了哪些改进

三、网络结构及改进点详解

1. 网络架构

2. Batch Normalization(批归一化)

3. High Resolution Classifier(高分辨率分类器)

4. Anchor(锚点)

5. Dimension Cluster(维度聚类)

6. Direct location prediction(直接位置预测,损失函数解析)

7. yolov2的损失函数

8. Fine-Grained Features(细粒度特征)

9. Multi-Scale-Training(多尺度训练)


一、yolov1存在的不足

  1. 检测小目标和密集目标的效果差
  2. 对于重叠在一起的物体检测不准
  3. yolov1的定位不准
  4. 召回率较低
  5. map较低

二、yolov2针对上述问题做了哪些改进

在原论文的Better章节提到以下7个改进部分:

  1. Batch Normalization(批归一化)
  2. High Resolution Classifier(高分辨率分类器)
  3. Anchor(锚点)
  4. Dimension Cluster(维度聚类)
  5. Direct location prediction(直接位置预测)
  6. Fine-Grained Features(细粒度特征)
  7. Multi-Scale-Training(多尺度训练)

三、网络结构及改进点详解

1. 网络架构

YOLOv2使用了一个新的19层深度卷积神经网络Darknet-19作为其基础特征提取器。Darknet-19包含有19个卷积层和5个MaxPooling层,是一个完全卷积的网络,没有全连接层

与复杂计算量大的VGG-16相比,Darknet-19大大的减少了计算量,同时保持了精度,提高了模型的速度。

YOLOv2的网络结构在处理分类和检测任务时,有一些区别。

上图是yolov2的图像分类网络结构图。利用很多1*1卷积不停的降维和升维,所以参数量比较少。最后通过一个全局平均池化将得到的7*7*1000的数据变成1*1*1000的数据(即1000个分类结果)。

上图是yolov2的图像检测网络结构图。yolov2删除最后一个卷积层,将其换成了三个3 × 3的卷积层,每个3 × 3的卷积层有1024个卷积核,最后一个由1 × 1的卷积层来得到13*13* [(5+20)*5] 的数据。网络结构会在后面部分解释。

2. Batch Normalization(批归一化)

Batch Normalization(BN)简单来说就是将神经元的输出减去均值再除以差,使输出变为以0为均值,标准差为1的分布。因为很多激活函数在0附近是非饱和区,远离0是饱和区,如果输出的数据太大或太小会陷入饱和区,造成梯度消失,难以训练。所以用BN层将数据集中到0附近的非饱和区。
Batch Normalization的详细讲解可以看我另一篇博客(批量归一化(BN)和层归一化(LN)的区别)。

在每层卷积层的后面都加入 batch normalization 层,不再使用dropout,使得模型在 mAP 上提升了2.4%。

3. High Resolution Classifier(高分辨率分类器)

yolov1中,是用224*224的图像进行训练,用448*448的图像进行推理。模型在推理时适应这种分辨率的差异,所以性能会降低。
所以yolov2先在224*224的分类数据集上训练一会儿,再在448*448的分类数据集上训练10个epoch,最后在448*448的检测数据集上进行微调训练。这样就能适应大分辨率的输出,这个改进提升了3.5%的map

4. Anchor(锚点)

YOLOv1直接回归边界框的坐标和尺寸,可能在定位上不够准确,因为并没有对bounding box作尺度上的约束,可能会导致某个grid cell上的bounding box非常大。
YOLOv2引入了锚点(Anchors)的概念来改善目标检测的准确性和召回率,尤其是在小目标和密集目标的检测上。锚点是一组预定义的边界框形状,代表了数据集中常见物体的尺寸和比例

为什么需要预定义的边界框形状呢,因为大部分的物体的检测框有其固有的特征。
 

如上图所示,人的检测框是瘦高的,车的检测框是矮胖的。

yolov2中将图片分为13*13个grid cell,每个grid cell有5个锚框,每个锚框对应一个预测框。预测框预测出相对于这个锚框的偏移量,而不像yolov1中没有尺寸和位置限制造成的野蛮生成。并且每个预测框都可以预测不同的物体,在YOLOv1中,由于类别概率分布是整个grid cell共享的,因此一个grid cell不能预测不同的类别。然而在YOLOv2中,由于每个bounding box有自己独立的类别概率分布,因此一个grid cell能够预测不同的类别

与yolov1类似
训练阶段,对于每个网格单元,只有那些与真实边界框具有最高IoU(交并比)的锚点才会被标记为“负责”预测该物体。这意味着在训练中,每个真实边界框只会与一个最适合它的锚点进行匹配,而其他锚点则被视为“负例”,即它们不包含任何物体,从而学习到不预测物体的情况。
推断阶段,每个网格单元的5个锚点都会产生预测,但是NMS过程会去除那些重叠的低置信度预测,只保留最可能的检测结果。

YOLOv1输出结构

  • 每个grid cell输出以下信息:
    • 2个bounding boxes,每个bounding box包含:
      • 4个坐标值(x, y, w, h)
      • 1个置信度分数
    • 共享的20个类别概率分布
      YOLOv1每个grid cell输出:2 * (4 + 1) + 20 = 30个值

YOLOv2输出结构

  • 每个grid cell输出以下信息:
    • K个bounding boxes(K通常为5),每个bounding box包含:
      • 4个坐标值(x, y, w, h)
      • 1个置信度分数
      • 20个类别概率分布

        YOLOv2每个grid cell输出:5* (4 + 1 + 20) =125个值

5. Dimension Cluster(维度聚类)

那anchor怎么得到的呢?
锚点是通过对训练集中的真实边界框进行K-means聚类分析得到的。具体步骤如下:

  • 数据准备: 收集所有训练图像中真实边界框的宽高比。

  • 初始化锚点: 选择一个锚点数量k,随机选择k个边界框尺寸作为初始的锚点。

  • 分配边界框对于数据集中的每一个真实边界框,计算其与每个锚点之间的IoU(交并比)。将每个边界框分配给IoU最大的锚点,形成k个聚类。

  • 更新锚点: 对于每个聚类,计算所有分配给该聚类的边界框的平均尺寸,用这个平均尺寸更新该聚类的锚点。

  • 迭代优化: 重复步骤3和4,直到锚点的更新变化小于某个阈值或达到预定的迭代次数。这个过程类似于传统的K-means算法,但目标是最大化锚点和它们所代表的边界框之间的平均IoU。

  • 评估和选择锚点: 评估不同数量的锚点(k值,yolov2设置为5)对模型性能的影响。通常,锚点数量越多,模型的召回率越高,但也会增加计算成本。通过实验,选择一个在性能和效率之间平衡的锚点集合。

anchor数量k为5时兼顾了性能与效率。

6. Direct location prediction(直接位置预测)

yolov1中直接回归预测框可能全图乱跑。但是目前yolov2根据锚框不加以限制来预测相对锚框的偏移量也会导致乱窜,如上图所示。所以要加上限制。

下面对上面的图中的公式进行解释。(先将网格大小归一化,即令grid cell的宽高都为1

7. yolov2的损失函数

图中对损失函数解析的比较明确,如果有兴趣可以看哔站大佬的讲解(【精读AI论文】YOLO V2目标检测算法_哔哩哔哩_bilibili)。

这里的W和H表示图像的宽和高,论文中为13,而A指的是Anchor个数,也代表预测框的个数,论文中是5,λ代表损失函数中不同部分的权重系数。
损失函数可以分为3部分:
第一项:

这一项代表了无对象损失,用于惩罚实际不包含物体的边界框。
将每个预测框的中心坐标与GT对齐(只关注形状,不关注位置),计算每个grid cell中各个预测框和GT之间的IOU值,并且取最大值记作MaxIOU。如果该值小于阈值(文中为0.6),那么这个预测框就标记为background,\lambda_{noobj}代表没有物体时为1,否则为0。
所以当MaxIOU<0.6,并且该预测框内没有物体时,令其置信度(IOU)越小越好,对其惩罚。

第二项:

这一项是在前12800次迭代中计算Anchor boxes和预测框的坐标误差。
这个损失项鼓励模型依据先验信息学习到更准确的边界框位置和尺寸,以便更好地匹配真实边界框。

第三项:

这一部分计算的是和GT匹配的预测框各部分的损失总和,包括坐标损失置信度损失以及分类损失。这里具体的损失很简单,不过多介绍了。
yolov2中仅有与GT的IOU最大的那个预测框来进行预测(只关注形状,不关注位置)。第一项是置信度小于0.6时才有效,第三项关注的是最大的IOU才有效,至于IOU大于0.6但是不是最大的那些预测框就不关注了。

8. Fine-Grained Features(细粒度特征)

YOLOv2中引入了PassThrough Layer,它将前面的卷积层的特征图与后面的层进行融合,从而将高分辨率的特征信息传递给最终的检测层。这种做法相当于跳过了一些中间层,直接将更早期、分辨率更高的特征图的信息整合到最终的检测中,增强了模型对小目标的敏感度

网络过程中的操作如上图。

PassThrough Layer的操作如上图,能将图像的宽高减半,通道变为原来的4倍

9. Multi-Scale-Training(多尺度训练)

YOLOv2使用了多尺度训练,即在训练过程中改变输入图像的大小。这样做的好处是网络可以学习到不同尺度的特征,从而在测试时能够更好地适应不同大小的目标。

如图所示,就是在训练的过程中每间隔一定的 iterations 后改变输入的图片大小

由于yolov2没有采用全连接层,最后是用全局平均池化来得到分类,所以不用调整网络结构就可以输入不同分辨率的图像而得到相同的输出维度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【从零开始实现stm32无刷电机FOC】【实践】【6/7 CMSIS-DSP】

目录 导入CMSIS-DSP库使用CMSIS-DSP 点击查看本文开源的完整FOC工程 CMSIS-DSP库是ARM开源的、对ARM处理器优化的数学库&#xff0c;本文使用了其提供的三角函数、反park变换函数、park变换函数、clarke变换函数、PID控制器。 CMSIS-DSP原始代码仓库是https://github.com/ARM-s…

mongodb数据导出与导入

一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本&#xff0c;直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件&#xff08;适用于 Linux 系统&#xff09;&am…

【ARM】SMMU系统虚拟化整理

目录 1.MMU的基本介绍 1.1 特点梳理 2.功能 DVM interface PTW interface 2.1 操作流程 2.1.1 StreamID 2.1.2 安全状态&#xff1a; 2.1.3 HUM 2.1.4 可配置的操作特性 Outstanding transactions per TBU QoS 仲裁 2.2 Cache结构 2.2.1 Micro TLB 2.2.2 Macro…

昇思25天学习打卡营第23天|ResNet50图像分类

课程打卡凭证 ResNet网络 ResNet&#xff08;Residual Networks&#xff0c;残差网络&#xff09;是一种深度神经网络结构&#xff0c;它的核心思想是引入了“残差学习”来解决深度网络中的退化问题。在深度神经网络中&#xff0c;当网络层数增加到一定程度时&#xff0c;网络…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

什么是单例模式,有哪些应用?

目录 一、定义 二、应用场景 三、6种实现方式 1、懒汉式&#xff0c;线程不安全。 2、懒汉式&#xff0c;线程安全 3、双检锁/双重校验锁&#xff08;DCL&#xff0c;即 double-checked locking&#xff09; 4、静态内部类方式-------只适用于静态域 5、饿汉式 6、枚举…

Linux系统编程基础

Linux操作系统 Linux不是一个具体的操作系统&#xff0c;而是一类操作系统的总称&#xff0c;具体版本成为发行版。 Red Hat&#xff1a;目前被IBM收购&#xff0c;收费版&#xff0c;目前最大的Linux供应商CentOS&#xff1a; Red Hat退出的免费版Ubuntu&#xff1a;界面比较友…

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁&#x1f44a; 【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&…

【C语言】动态内存管理(上)

文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例&#xff08;malloc和free&#xff09; 3. calloc3.1 calloc例子 前言 本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要&#xff0c;为…

科技赋能,智慧粮仓视频综合管理方案助力粮食安全

一、背景需求 随着科技的快速发展&#xff0c;智慧化、智能化管理已成为各行各业的重要发展方向。粮食仓储作为国家粮食安全战略的重要组成部分&#xff0c;其管理的科学性和智能化水平直接关系到粮食的存储安全、品质保障和运营效率。 因此&#xff0c;TSINGSEE青犀提出一套…

GaussDB常见调优指南

文章目录 GaussDB常见调优指南一. Analyze 统计信息解析二. Explain 分布式计划解析三. 性能调优总体策略详解四. 性能调优之坏味道 SQL 识别五. 性能调优之好味道表定义六. 性能调优之 SQL 改写七. 性能调优之路径干预八. 性能调优之 Plan hint 运用九. 性能调优之 GUC 参数调…

Linux 12:多线程2

1. 生产者消费者模型 生产者消费者模型有三种关系&#xff0c;两个角色&#xff0c;一个交易场所。 三种关系&#xff1a; 生产者之间是什么关系?竞争 - 互斥 消费者和消费者之间?竞争 - 互斥 消费者和消费者之间?互斥和同步 两个角色&#xff1a; 生产者和消费者 一个交…

git 提交的进阶操作

cherry-pick cherry-pick 是 Git 中的一种操作,允许你从一个分支中选择特定的 commit,并将其应用到另一个分支。它的主要用途是将特定的更改引入到其他分支,而无需合并整个分支历史。这在修复 bug 或者移植某些功能时特别有用。 cherry-pick 的使用场景 Bug 修复: 例如,你…

安卓手机怎么格式化?格式化后数据如何恢复?1篇文章全搞定

随着时间的推移&#xff0c;手机中的数据越积越多&#xff0c;有时候我们可能需要对其进行一次彻底的大扫除——格式化。它就像一把双刃剑&#xff0c;一方面能够清除手机中的冗余数据&#xff0c;提升手机的运行效率&#xff1b;另一方面&#xff0c;如果不慎操作&#xff0c;…

Postman导出excel文件

0 写在前面 在我们后端写接口的时候&#xff0c;前端页面还没有出来&#xff0c;我们就得先接口测试&#xff0c;在此记录下如何使用postman测试导出excel接口。 如果不会使用接口传参可以看我这篇博客如何使用Postman 1 方法一 2 方法二 3 写在末尾 虽然在代码中写入文件名…

Apache BookKeeper 一致性协议解析

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制&#xff08;GEO replication&#xff09;、快速扩容、灵活容错等特性。Pulsar 存储层依托于 BookKeeper 组件&#xff0c;所以本文简单探讨一下 BookK…

QXlsx读写excel

QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API&#xff0c;可以…

react 快速入门思维导图

在掌握了react中一下的几个步骤和语法&#xff0c;基本上就可以熟练的使用react了。 1、组件的使用。react创建组件主要是类组件和函数式组件&#xff0c;类组件有生命周期&#xff0c;而函数式组件没有。 2、jsx语法。react主要使用jsx语法&#xff0c;需要使用babel和webpa…

由delete引起的锁扩大

这句话意思是&#xff1a;假设delete语句物理删除数据&#xff0c;那么delete事务会持有gap lock&#xff0c;那么会造成锁扩大&#xff0c;而实际上delete操作会转为update操作&#xff0c;最终delete事务持有的gap lock退化为record lock&#xff0c;不会造成锁扩大 下面用SQ…

FPGA:频闪灯设计

1、需求 若在FPGA上实现LED灯一秒闪烁一次&#xff0c;先进行计算&#xff0c;1秒闪烁一次&#xff0c;即周期为1秒&#xff0c;开发板XC7A35TFFG-2的基本时钟输入由板载 50MHz 有源晶振提供&#xff0c;即频率为f 50MHz 。 则一个周期为 T 1 f 1 50 M H z 20 n s T\frac{…