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.mzph.cn/web/47651.shtml

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

相关文章

设计模式-抽象工厂

抽象工厂属于创建型模式。 抽象工厂和工厂设计模式的区别&#xff1a; 工厂模式的是设计模式中最简单的一种设计模式&#xff0c;主要设计思想是&#xff0c;分离对象的创建和使用&#xff0c;在Java中&#xff0c;如果需要使用一个对象时&#xff0c;需要new Class()&#xff…

RAG-LLM Survey

大模型虽然厉害&#xff0c;但是存在着幻觉、知识陈旧等问题。检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;可以通过挂载外部知识库&#xff0c;来提升生成内容的准确性和可信度。了解一个研究方向的最快的方法&#xff0c;就是阅读相关的综述。今…

Python数据可视化------动态柱状图

一、基础柱状图 # 基础柱状图 # 导包 from pyecharts.charts import Bar from pyecharts.options import *# 构建柱状图 bar Bar() # 添加数据&#xff08;列表&#xff09; x_list ["张三", "李四", "王五", "赵六"] y_list [50,…

你的生产车间有个好“布局”吗?

对于生产车间而言&#xff0c;科学合理的布局设计便是这“成功的一半”。在现代制造环境中&#xff0c;高效的物流动线、合理的设备配置、以及人性化的工作环境&#xff0c;是提升生产效率、保障产品质量的关键。 一个好布局的生产车间需具备以下几个关键特征&#xff0c;以确保…

【ADRC笔记】LESO-Wb

公式推导(bilibili) 一阶ESO 二阶ESO 二阶自抗扰控制器基本原理 选取状态变量 观测器收敛性推导 wo 观测器带宽

数据结构(下)复习

一丶数据结构概述 1.数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的关系和运算等的学科。 2.基本数据结构&#xff0c;从逻辑上可分为线性结构和非线性结构&#xff0c;大体上可分成表结构、树结构、图结构 和散结构4大类 表结构用于表示结点的…

科普文:百度交易中台之订单系统架构浅析

百度交易中台作为集团移动生态战略的基础设施&#xff0c;面向收银交易与清分结算场景&#xff0c;为赋能业务提供高效交易生态搭建。目前支持百度体系内多个产品线&#xff0c;主要包含&#xff1a;小程序&#xff0c;地图打车&#xff0c;百家号&#xff0c;招财猫&#xff0…

算法题目整合

文章目录 121. 小红的区间翻转142. 两个字符串的最小 ASCII 删除总和143. 最长同值路径139.完美数140. 可爱串141. 好二叉树 121. 小红的区间翻转 小红拿到了两个长度为 n 的数组 a 和 b&#xff0c;她仅可以执行一次以下翻转操作&#xff1a;选择a数组中的一个区间[i, j]&…

企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充(Vue项目版)。。。

引子 关于企业微信PC版应用跳转到默认浏览器&#xff0c;我之前写过一篇文章&#xff1a;企业微信PC版应用跳转到默认浏览器&#xff0c;避坑指南&#xff0c;欢迎补充。。。 以前的文章里用的前后端一体的Jsp项目&#xff0c;这次我使用的是前后端分离的Vue项目&#xff0c;…

C语言 通讯录管理 完整代码

这份代码&#xff0c;是我从网上找的。目前是能运行。我正在读。有些不懂的地方&#xff0c;等下再记录下来。 有些地方的命名&#xff0c;还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为&#xff1a; Perso…

使用SpringCloud搭建分布式配置中心

在现代的分布式系统中&#xff0c;配置管理是一个非常重要的组成部分。传统的做法是将配置文件放在每个服务的本地进行配置&#xff0c;这样的做法在规模较小的系统中还能够接受&#xff0c;但是当系统规模逐渐扩大时&#xff0c;配置管理将变得非常困难&#xff0c;容易出错。…

QT--文件操作和文件读写

文件操作和文件读写 QFile 类用于对文件进行操作&#xff0c;它继承自 QIODevice&#xff0c;可以进行读写操作。主要用于打开、关闭、读取、写入和管理文件。 1. 首先要指定文件路径 QFile fn(“文件路径”);也可以通过文件对话框来选择文件getOpenFileName 函数原型 QStr…

【大数据面试题】37 Doris 是怎么保证性能的?

一步一个脚印&#xff0c;一天一道大数据面试题 博主希望能够得到大家的点赞收藏支持&#xff01;非常感谢 点赞&#xff0c;收藏是情分&#xff0c;不点是本分。祝你身体健康&#xff0c;事事顺心&#xff01; Doris 是当下大热的 MPP 数据库&#xff0c;下面来聊聊它如何保证…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习…

【博主推荐】HTML5实现简洁的实用的个人网站、个人主页七个页面源码

文章目录 1.设计来源1.1 个人主页界面1.2 关于我界面1.3 我的技能界面1.4 我的经验界面1.5 我的教育界面1.6 我的项目界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;…

ipsec协议簇(详解)

IPSEC协议簇 IPSEC协议簇 --- 基于网络层的&#xff0c;应用密码学的安全通信协议组 IPV6中&#xff0c;IPSEC是要求强制使用的&#xff0c;但是&#xff0c;IPV4中作为可选项使用 IPSEC可以提供的安全服务 机密性 --- 数据加密 完整性 --- 防篡改可用性 数据源鉴别 -- 身份…

长效代理IP如何选用及代理服务分析

在这个数据为王、信息瞬息万变的时代&#xff0c;长效代理IP成为了众多开发者、数据科学家乃至普通网民手中的一把利器。它不仅能帮助我们解决地域管理&#xff0c;还能在保护隐私的同时&#xff0c;确保数据传输的稳定与安全。但面对市面上琳琅满目的代理服务&#xff0c;如何…

IVI(In-Vehicle Infotainment,智能座舱的信息娱乐系统)

IVI能够实现包括三维导航、实时路况、辅助驾驶等在线娱乐功能。 IVI人机交互形式&#xff08;三板斧&#xff09;&#xff1a;声音、图像、文字 IVI人机交互媒介I&#xff08;四件套&#xff09;&#xff1a;中控屏幕&#xff08;显示、触控&#xff09;、仪表显示、语言、方…

目标检测 | YOLO v1、YOLO v2、YOLO v3与YOLO v3 SPP理论讲解

☀️教程&#xff1a;霹雳吧啦Wz ☀️链接&#xff1a;https://www.bilibili.com/video/BV1yi4y1g7ro?p1&vd_sourcec7e390079ff3e10b79e23fb333bea49d 一、YOLO v1 针对于two-stage目标检测算法普遍存在的运算速度慢的缺点&#xff0c;YOLO创造性的提出了one-stage目标检测…

2024-07-20 Unity插件 Odin Serializer2 —— 序列化教程

文章目录 1 由根对象决定序列化2 实现 Odin 序列化器2.1 继承已有序列化类2.2 自定义序列化类 3 避免 Unity 无限深度警告4 指定序列化秘钥4.1 External String Reference Resolver4.2 External GUID Reference Resolver4.3 External Index Reference Resolver 4 功能与限制4.1…