YOLOv2小白精讲

news2024/9/20 21:47:43

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

一、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)。

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

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

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

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

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

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

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

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

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

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

相关文章

MySQL的索引、事务

MySQL的索引 索引的概念 索引是一个排序的列表,在列表当中存储索引的值以及索引值对应数据所在的物理行。 索引值和数据是一一映射的关系。 索引的作用 使用索引之后就不需要扫描全表来定位某行的数据 加快数据库查询的速度。 索引可以是表中的一列也可以是多…

Dify中接入GPT-4o mini模型

GPT-4o mini模型自己承认是基于GPT-3.5架构的模型,有图有真相: 一.GPT-4o mini官网简介 GPT-4o mini(“o"代表"omni”)是小型型号类别中最先进的型号,也是OpenAI迄今为止最便宜的型号。它是多模态的&#x…

C++11: auto 关键字

目录 **前言****1. 推导规则****2. 不能使用 auto 的场景****3. 常见的使用场景** 前言 在 C11 以前,auto 关键字的语义继承自 C 语言,表示 进入块后,自动分配内存,即分配堆栈内存。也就是说 auto 只能用于函数内,然而…

昇思25天学习打卡营第14天|基于MindNLP+MusicGen生成自己的个性化音乐

MusicGen是由Meta AI的团队开发出的一种音乐生成模型,它用一个语言模型来根据文本描述或音频提示制作音乐。这个模型分三步工作:首先,把用户给的文本转换成一系列状态;然后,用这些状态来预测音乐的音频token&#xff1…

[HTML]一文掌握

背景知识 主流浏览器 浏览器是展示和运行网页的平台, 常见的五大浏览器有 IE浏览器、火狐浏览器(Firefox)、谷歌浏览器(Chrome)、Safari浏览器、欧朋浏览器(Opera) 渲染引擎 浏览器解析代码渲…

【Linux 15】进程间通信的方式 - 管道

文章目录 🌈 一、管道介绍🌈 二、匿名管道⭐ 1. 匿名管道的概念⭐ 2. 匿名管道的创建⭐ 3. 匿名管道的本质⭐ 4. 匿名管道的使用⭐ 5. 匿名管道的特点⭐ 6. 匿名管道的大小 🌈 三、命名管道⭐ 1. 命名管道的概念⭐ 2. 命名管道的创建⭐ 3. 命…

USB转多路UART - USB 基础

一、 前言 断断续续做了不少USB相关开发,但是没有系统去了解过,遇到问题就很被动了。做这个USB转UART的项目就是,于是专门花了一天的时间学习USB及CDC相关,到写这文章时估计也忘得差不多了,趁项目收尾阶段记录一下&am…

OLAP引擎之Kylin

Apache Kylin 是一个开源的分布式分析引擎,设计用于在大数据环境中实现极快的在线分析处理 (OLAP) 查询。它主要用于解决大数据分析中的性能问题,并为大规模数据提供交互式的查询体验。Kylin 是由 eBay 于 2014 年开源的,现由 Apache 基金会管…

某直聘每日算法变更分析

带大家分析一下每日算法的变更情况如何破解: 1. 找到算法起始点 前面都是字符串的拼接,可以不用管,重点我们看数组的操作 af0d473b.js:11950 S: 191 e: 3 : af0d473b.js:11326 gl: 1 G: 1 : af0d473b.js:11950 S: 60 e: 3 : af0d473b.js:113…

Java 写一个可以持续发送消息的socket服务端

前言 最近在学习flink, 为了模仿一个持续的无界的数据源, 所以需要一个可以持续发送消息的socket服务端. 先上效果图 效果图 socket服务端可以持续的发送消息, flink端是一个统计单词出现总数的消费端,效果图如下 源代码 flink的消费端就不展示了, 需要引入一些依赖和版本…

多态性概念 OOPS

大家好!今天,我们将探讨面向对象编程 (OOP) 中的一个基本概念 - 多态性。具体来说,我们将重点介绍其三种主要形式:方法重载、方法覆盖和方法隐藏。对于任何使用 OOP 语言(例如 C#)的程序员来说,…

嵌入式人工智能(17-基于树莓派4B的电机控制-伺服电机SG90)

伺服电机主要适用于角度需要不断变化且可以保持的控制系统,常见的机械臂、多足机器人、遥 控船、摄像头云台等都可以使用伺服电机来实现。 1、简介 伺服电动机又被称为执行电动机、舵机,如图9.4所示,是由直流电机、减速齿轮组、电位器和控制…

C语言 | Leetcode C语言题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; int nthUglyNumber(int n) {int dp[n 1];dp[1] 1;int p2 1, p3 1, p5 1;for (int i 2; i < n; i) {int num2 dp[p2] * 2, num3 dp[p3] * 3, num5 dp[p5] * 5;dp[i] fmin(fmin(num2, num3), num5);if (dp[i] num2) {p2;}if (d…

Fastgpt接入ChatTTS本地AI语音合成模型实现语音实时朗读

前言 FastGPT 默认使用了 OpenAI 的 LLM 模型和语音合成模型,如果想要私有化部署的话,可以使用开源TTS项目f封装成兼容open ai的协议兼容的API接口。参考文章 《ChatTTS-一款适用于日常对话的AI生成式语音模型》 FastGPT接入本地AI语音TTS Base Url为你部署本地语音识别web…

Shell程序设计

各位看官&#xff0c;从今天开始&#xff0c;我们进入新的专栏Shell学习&#xff0c;Shell 是操作系统的命令行界面&#xff0c;它允许用户通过输入命令与操作系统交互。常见的 Shell 有 Bash 和 Zsh&#xff0c;它们可以执行用户输入的命令或运行脚本文件。Shell 广泛应用于系…

Google AI加速代码迁移

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

知名的GPU算力租用平台,适合进行大规模深度学习训练

目录 引言 GPU算力租用的重要性 当前市场趋势 选择GPU算力平台的关键因素 知名的GPU算力租用平台&#xff0c;适合进行大规模深度学习训练 引言 在数字时代&#xff0c;计算能力是推动科技创新的核心驱动力&#xff0c;尤其是在人工智能&#xff08;AI&#xff09;、机器学…

【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…

交叉编译ethtool(ubuntu 2018)

参考文章&#xff1a;https://www.cnblogs.com/nazhen/p/16800427.html https://blog.csdn.net/weixin_43128044/article/details/137953913 1、下载相关安装包 //ethtool依赖libmul git clone http://git.netfilter.org/libmnl //ethtool源码 git clone http://git.kernel.or…

go语言Gin框架的学习路线(七)

GORM入门(基于七米老师) 目录 GORM入门 安装 连接数据库 连接MySQL 连接PostgreSQL 连接Sqlite3 连接SQL Server 我们搞一个连接MySQL的例子 创建数据库 GORM操作MySQL GORM是一个流行的Go语言ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种方…