首页 > 其他分享 >YOLOv2小白精讲

YOLOv2小白精讲

时间:2024-07-21 23:55:05浏览次数:8  
标签:YOLOv2 卷积 精讲 cell 小白 grid 锚点 yolov2

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

标签:YOLOv2,卷积,精讲,cell,小白,grid,锚点,yolov2
From: https://blog.csdn.net/weixin_44115575/article/details/140593645

相关文章

  • 【普及动规】dp例题精讲+强化练习
    本篇给大家带来一些好的dp题,大家可以学习一下。找找感觉。dp这种东西主要还是靠分类总结+感觉。多练习永远不错。T1.害羞的xxx题面:(由于某些原因无法公开原题,请见谅)题目背景保护好xxx,因为他随时会害羞。题目描述众所周知,xxx非常害羞。可是学校最近在选拔芭蕾舞演员......
  • 算法设计与数据结构系列【超详细、超全面、小白可入,期末复习】持续更新中...
    算法设计与数据结构系列【超详细、超全面、小白可入,期末复习】持续更新中…24.07.21代码采用语言:Java1、位运算(BitwiseOperation)常见操作:与(&)、或(I)、非(~)、异或(^)移位运算:>>和<<分别为左移和右移>>>运算符:用0填充高位,>>用符号位填充高位,没有<<<运算符真值表ab~a~b......
  • JAVA零基础小白自学日志——第二十天
    文章目录1.为什么我们需要抽象类2.抽象类3.我们一起来抽象(有病,象也没招你)[1].抽象方法[2].为什么我们先说抽象方法呢?[3].需要明确的4.关于Object的题外话今日提要:抽象类你以为这几天看的内容都是多态?你太小看Java了,咱们来看看真正多态的入门1.为什么我们需要抽......
  • JAVA零基础小白自学日志——第十九天
    文章目录1.private(私有)2.static(静态)3.final(最终)[1].fianl修饰变量[2].fianl修饰方法[3].fianl修饰类[4].为什么需要fianl关键字修饰类和方法4.private\static\final的共同点5.同名变量6.方法重载和方法重写今日提要:private\static\final修饰词;同名变量;方法重载和方法......
  • html -- 总结 3 (小白)
    css引入方式<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</tit......
  • 牛客小白月赛98补题
    D一道很典型的区间DP//区间DP典题#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=520;lln,L,R;strings;llsum0[N],sum1[N];llf[N][N];voidsolve(){cin>>n>>L>>R>>s;s='......
  • 【C语言】实现一个通讯录,一步一步详细讲解,小白也能看!!!
    目录设计思路代码实现 代码仓库 设计思路1.通讯录存放的信息这个通讯录保存的信息包括:名字,年龄,性别,电话,住址。2.通讯录的功能1.通讯录可以存放100个人的信息。2.增加联系人3.删除联系人4.修改联系人5.查询联系人6.显示所有人3.文件规划我们准......
  • JAVA小白学习日记Day6
    1.List集合:把具有相同属性的东西放在一起,也可以是容器,把有关的东西都放进去。List:List是位于java.util下的一个接口,有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。之前学过的容器......
  • 小白新手搭建个人网盘
    小白新手搭建个人网盘序云服务器ECS重置密码远程连接ECS实例安装OwnCloud安装Apache服务PHP运行环境NAS挂载挂载验证操作体验序阿里云文件存储NAS(ApsaraFileStorageNAS)是一个可大规模共享访问,弹性扩展的分布式文件系统。本文主要是介绍基于ECS挂载NAS实现个人网......
  • Python小白菜鸟从入门到精通
    前言Python由荷兰国家数学与计算机科学研究中心的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版......