【YOLO学习】YOLOv2详解

news2024/11/26 22:23:02

文章目录

  • 1. 概述
  • 2. Better
    • 2.1 Batch Normalization(批归一化)
    • 2.2 High Resolution Classifier(高分辨率分类器)
    • 2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)
    • 2.4 Dimension Clusters(维度聚类)
    • 2.5 Direct location prediction(直接的位置预测)
    • 2.6 Fine-Grained Features(细粒度的特征)
    • 2.7 Multi-Scale Training(多尺度的训练)
  • 3. Faster
  • 4. YOLOV2训练


原论文:YOLO9000: Better, Faster, Stronger
作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了大量改进,提出了 YOLOv2 和 YOLO9000,重点解决 YOLOv1 召回率和定位精度方面的不足。

1. 概述

 YOLOv1 虽然检测速度快,但在定位方面不够准确,并且召回率较低。为了提升定位准确度,改善召回率,YOLOv2 在 YOLOv1 的基础上提出了几种改进策略,如下图所示,一些改进方法能有效提高模型的 mAP。

在这里插入图片描述

2. Better

2.1 Batch Normalization(批归一化)

 1. YOLOv2 中在每个卷积层后加 Batch Normalization(BN)层,去掉了 dropout 层。 Batch
Normalization 层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。YOLOv2 通过使用 BN 层使得 mAP 提高了2%。

 2. Batch Normalization 通常放置在激活函数之前,即在卷积层或全连接层的输出之后进行归一化操作。Batch Normalization 的过程主要包括以下几个步骤:
 (1) 计算小批量的均值和方差:对于一个 mini-batch B = [ x 1 , x 2 , . . . , x m ] B=[x_1,x_2,...,x_m] B=[x1,x2,...,xm] 首先计算该小批量的均值 μ B μ_B μB 和方差 σ 2 B {σ^2}_B σ2B

在这里插入图片描述

 (2) 归一化:使用计算得到的均值和方差对每个输入数据进行归一化处理,得到新的输入。其中, ϵ ϵ ϵ 是一个很小的常数,用于防止分母为零。

在这里插入图片描述

 (3) 归一化后的数据可能会破坏原始数据的表达能力,因此通过引入可学习的参数 γ γ γ β β β,对归一化后的数据进行缩放和平移,以恢复数据的表达能力。

在这里插入图片描述

2.2 High Resolution Classifier(高分辨率分类器)

 1. 所有最先进的检测方法都使用在 ImageNet 上预训练的分类器。从AlexNet开始,大多数分类器在小于 256×256 的输入图像上运行。最初的 YOLO 在 224×224 的情况下预训练分类器网络,并将分辨率提高到 448 以进行检测训练。这意味着网络在切换到检测学习时还必须调整到新的输入分辨率。

:YOLOv1 在预训练阶段,输入尺寸是 224×224;而在检测阶段,输入尺寸则变为 448×448。这种变化是为了满足不同阶段和任务的需求,并实现更好的性能表现。

 2. 对于 YOLOv2,我们首先在 ImageNet 上以 448×448 的完整分辨率对分类网络进行微调,并进行 10 个 epoch 的预训练。这让网络有时间调整其滤波器,以便在更高的分辨率输入下更好地工作。然后,我们再对检测网络的结果微调。这个高分辨率的分类网络使我们的 mAP 增加了近 4%。

:YOLOv2 直接在预训练中输入的就是 448×448 的尺寸,微调的时候也是 448 × 448。

2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)

 1. 锚框(anchor box) / 先验框(prior bounding box):在众多经典的目标检测模型中,均有先验框的说法,有的 paper(如Faster RCNN)中称之为 anchor(锚点),有的 paper (如SSD)称之为 prior bounding box(先验框),实际上是一个概念,特此说明。

 2. 对于一个 224×224 的图片,假设每个位置设置 3 个不同尺寸的先验框,那么就有 224×224×3=150528 个锚框,这个数量太大了。所以,更好的处理方式是先对原图进行下采样处理,得到 feature map,在 feature map 中生成锚框。以 vgg16 的 backbone 为例,把 224×224 的输入图片下采样了 5 次,得到 7×7 的 feature map,那就只需要得到 7×7×3=147 个先验锚框,这样的设置大大减少了先验框的数量,同时也能覆盖大多数情况。

 3. 如先前所述,一般会在同一位置生成不同形状和大小的多个锚框来增加预测的成功率。形状和大小分别用尺度(scale)和宽高比(ratio)来描述。由于Anchor Box 通常是以 CNN 提取到的 Feature Map 的点为中心位置,生成边框,所以一个 Anchor Box 不需要指定中心位置。

  • 尺度:描述基准锚框的大小信息。若尺度为 a a a,那么基准锚框由原图的宽和高分别缩小 a a a 倍所得。(注意,若宽高缩小为 a a a 倍,面积缩小 a 2 a^2 a2 倍)
  • 宽高比:生成锚框的形状信息,即最终生成锚框的宽和长的比。在改变宽高比时,应维持最终生成的锚框和基准锚框的面积恒定。

在这里插入图片描述

 4. 之前 YOLOv1:使用全连接层来直接预测边界框(x,y,w,h,c)其中边界框的坐标是相对于 cell 的,宽与高是相对于整张图片。由于各个图片中存在不同尺度和长宽比的物体,YOLOv1 在训练过程中学习适应不同物体的形状是比较困难的,这也导致 YOLOv1 在精确定位方面表现较差。

 5. 相较于 YOLOv1,使用 Anchor,模型的 mAP 值从 69.5 降到了 69.2,下降了一丢丢,而召回率却从 81% 提高到了 88%。

关于精度和召回率的介绍可以参考这篇文章:https://blog.csdn.net/m0_62881487/article/details/133722683

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

在这里插入图片描述

 7. 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 个值

2.4 Dimension Clusters(维度聚类)

 1. 在 Faster R-CNN 和 SSD 中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2 采用 k-means 聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,到聚类中心的距离越小越好,但 IOU 值是越大越好,所以使用 1-IOU,这样就保证距离越小,IOU 值越大,所以聚类分析时选用 box 与聚类中心 box 之间的 IOU 值作为距离指标:

在这里插入图片描述

 2. 边界框聚类步骤:

在这里插入图片描述

 3. 如下图,选取不同的 k 值(聚类的个数)运行 K-means算法,并画出平均 IOU 和 K 值的曲线图。当 k = 5 时,可以很好的权衡模型复杂性和高召回率。与手工挑选的相比,K-means 算法挑选的检测框形状多为瘦高型。

在这里插入图片描述

2.5 Direct location prediction(直接的位置预测)

 1. 传统 RPN 网络的位置预测:(1) 方法: 预测相对于 Anchor Box 的坐标的偏移,和相对于Anchor Box 的高宽的偏移。 (2) 计算公式: 预测框中心坐标 = 输出的偏移量 × Anchor 宽高 + Anchor 中心坐标。 (3) 不足: 这个公式是不受约束的,因此任何锚框可以出现在图像中的任何位置。在随机初始化的情况下,模型需要很长时间才能稳定到预测合理的偏移量。

在这里插入图片描述
 2. YOLOv2 的改进:(1) 方法:预测边界框中心点相对于对应 cell 左上角位置的相对偏移值。将网格归一化为 1×1,坐标控制在每个网格内,同时配合 Sigmod 函数将预测值转换到 0~1 之间的办法,做到每一个 Anchor 只负责检测周围正负一个单位以内的目标 box。 (2) 计算公式:一个网格相对于图片左上角的偏移量是 cx,cy。先验框的宽度和高度分别是 pw 和 ph,则预测的边界框相对于特征图的中心坐标 (bx,by) 和宽高 bw、bh。 (3) 效果:使模型更容易稳定训练,mAP 值提升了约 5%。

在这里插入图片描述

2.6 Fine-Grained Features(细粒度的特征)

 1. 为什么使用细粒特征:这个修改后的 YOLO 在 13×13 特征图上进行检测。虽然这对于大型对象来说已经足够了,但是对于较小的对象来说,更细粒度的特性可能会使得检测效果更好。使用后最终提升了 1% 的 mAP

 2. 使用细粒度特征
 (1) Faster R-CNN 和 SSD:使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。
 (2) YOLOv2:不同的方法,为网络简单地添加一个直通层(passthrough layer),获取前层 26×26 分辨率特征。

 3. 直通层( passthrough layer)
 (1) 将相邻的特征叠加到不同的通道来,将高分辨率的特征与低分辨率的特征连接起来。
 (2) 将前层 26×26×512 的特征图转换为 13×13×2048 的特征图,并与原最后层特征图进行拼接。

 4. 具体过程:

  • YOLOv2 提取 Darknet-19 最后一个 maxpooling 层的输入,得到 26×26×512 的特征图。经过 1×1×64 的卷积以降低特征图的维度,得到 26×26×64 的特征图,然后经过 pass through 层的处理变成 13×13×256 的特征图(抽取原特征图每个 2×2 的局部区域组成新的 channel,即原特征图大小降低 4 倍,channel 增加 4 倍),再与 13×13×1024 大小的特征图连接,变成 13×13×1280 的特征图,最后在这些特征图上做预测。
  • 具体操作:一个 feature map,也就是在最后的池化之前,分成两路:一路是做拆分,分成四块,四块拼成一个长条,另一个是做正常的池化卷积操作,最后两个长条进行拼接叠加输出。

在这里插入图片描述

如何拆分成四块的:并不是简单的 “两刀切 4 块”,而是在每个 2×2 的小区域上都选择左上角块,具体看下图。
在这里插入图片描述

2.7 Multi-Scale Training(多尺度的训练)

 1. YOLOv1:(1) 方法: 使用448×448的固定分辨率输入。

 2. YOLOv2 的改进:
 (1) 原理:YOLOv2 模型只使用了卷积和池化层,所以可以动态调整输入大小。每隔几次迭代就改变网络,而不是固定输入图像的大小。
 (2) 做法:网络每 10 批训练后随机选择一个新的图像尺寸大小。由于模型下采样了 32 倍,从以下 32 的倍数 {320,352,…,608} 作为图像维度的选择。将网络输入调整到那个维度,并继续训练。
 (3) 作用:这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在输入 size 较大时,训练速度较慢,在输入 size 较小时,训练速度较快,而 multi-scale training 又可以提高准确率,因此算是准确率和速度都取得一个不错的平衡。

 3. YOLOv2 和其他网络成绩对比:
 在小尺寸图片检测中,YOLOv2 成绩很好,输入为 228×228 的时候,帧率达到 90FPS,mAP 几乎和 Faster R-CNN 的水准相同。使得其在低性能 GPU、高帧率视频、多路视频场景中更加适用。在大尺寸图片检测中,YOLOv2 达到了先进水平,VOC2007 上 mAP 为 78.6%,仍然高于平均水准。

在这里插入图片描述

在这里插入图片描述

3. Faster

 1. (1) 通常目标检测框架:大多数检测框架依赖于 VGG-16 作为基本的特征提取器。VGG-16 是一个强大、精确的分类网络,但是它计算复杂。
 (2) YOLO 框架:使用基于 GoogLeNet 架构的自定义网络。虽说整体 mAP 表现较 VGG-16 差一些,但是却换来更快速、更少的预测运算。
 (3) YOLOv2 框架:使用的是一个全新的架构:Darknet-19。

 2. Darknet-19 细节:有 19 个卷积层和 5 个 maxpooling 层。(v1 的 GooLeNet 是 4 个卷积层和 2 个全连接层)

在这里插入图片描述

4. YOLOV2训练

 YOLOv2 训练分为三个阶段:

 第一阶段:第一阶段就是先在 ImageNet 分类数据集上预训练 Darknet-19,此时模型输入为 224×224,共训练 160 个 epochs。

 第二阶段:将网络的输入调整为 448x448,继续在 ImageNet 数据集上 finetune 分类模型,训练 10 个 epochs,此时分类模型的 top-1 准确度为 76.5%,而 top-5 准确度为 93.3%。

 第三阶段:修改 Darknet-19 分类模型为检测模型,并在检测数据集上继续 finetune 网络。网络修改包括:移除最后一个卷积层、global avgpooling 层以及 softmax 层,并且新增了三个 3×3×1024卷积层,同时增加了一个 passthrough 层,最后使用 1×1 卷积层输出预测结果,输出的 channels 数为:num_anchors × (5 + num_classes),和训练采用的数据集有关系。

 由于 anchors 数为 5,对于 VOC 数据集输出的 channels 数就是 125,而对于 COCO 数据集则为 425。这里以 VOC 数据集为例,最终的预测矩阵为 T(shape为(batch_size, 13, 13, 125)),可以 reshape 到(batch_size, 13, 13, 5, 25),其中 T[:, :, :, :,0:4] 为预测框的位置和大小,T[:, :, :, :,5] 为预测框的置信度,T[:, :, :, :,5:] 为类别预测值。

在这里插入图片描述

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

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

相关文章

每日一题|1928. 规定时间内到达终点的最小花费|动态规划、最小路径

本题需要使用动态规划进行解决。 分析: 求解最小值而且每一次的状态是由上一次的状态推导出来的,用动态规划。 难点:dp数组的定义和更新。 1、dp数组的定义 在时刻t,位置i处,此时的花费可以表示为如下的形式&#…

CNN卷积神经网络算法原理

全连接神经网络概述 输入层在左点自外,相应的输出层在右点之外, 这就像一个函数,yf(x),x即输入,f即隐藏层,y即输出,或者是ymodel(x) 全连接神经网络的结构单元 主要是从单元到整体&#xff0c…

杀疯啦!yolov11+strongsort的目标跟踪实现

目录 yolov11介绍——实时端到端物体检测 概述 主要特征 支持的任务和模式 性能指标 总结 strongsort介绍 指标图 系统定位 效果展示 训练与预测 UI设计 界面其他功能展示 完整代码实现UI界面 yolov11介绍——实时端到端物体检测 概述 YOLO11 是 Ultralytics Y…

基于yolov5 无人机检测包含:数据集➕训练好的代码模型训练了300轮 效果看下图 map97%以上

基于yolov5 无人机检测包含:数据集➕训练好的代码模型训练了300轮 效果看下图 map97%以上 基于YOLOv5的无人机检测项目 项目名称 基于YOLOv5的无人机检测 (Drone Detection with YOLOv5) 项目概述 该项目使用YOLOv5模型进行无人机目标检测。数据集包含大量带有标注的无人机…

wsl中安装ubuntu,vscode访问这个ubuntu

WSL1升级为WSL2 wsl --set-default-version 2 wsl --set-version Ubuntu-22.04 2在windows商店中也可以安装ubuntu,在这个ubuntu中windows的c盘在/mnt/c中

国庆刷题(day2)

C语言刷题: C刷题:

数据结构与算法——Java实现 27.双端队列

很多人觉得做一件事付出了10分的努力,却只得到5分的汇报。 其实剩下的五分,是在填补你过往的懒惰。 只有将过往的懒惰填满, 努力才会有正向结果 —— 24.10.3 一、概述 双端队列、队列、栈对比: 队列 一端删除(头&am…

计算机毕业设计 基于Python的个性化旅游线路推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

C++基础补充(02)C++其他控制语句break continue goto等

文章目录 1. break2. continue 语句3. goto 语句goto的存在 4. 跳出多重循环4.1 goto 直接跳转4.2 C11及其后版本的 return 语句4.3 使用标志变量 在C中,控制语句用于管理程序的执行流程。常见有 break、continue 和 goto。 1. break break语句主要用于在循环或者s…

【GEE学习第一期】GEE介绍、注册及基本使用

【GEE学习第一期】GEE介绍、注册及基本使用 GEE基本介绍GEE架构编辑语言:JavaScript GEE注册GEE平台界面GEE编辑器API区详解 GEE环境配置本地Python环境配置在线Python环境配置 参考 GEE基本介绍 地球引擎代码编辑器(Google Earth Engine, GEE&#xff…

oauth2授权码模式单点登录

文章目录 前言一、单点登录是什么?二、oauth2授权码模式单点登录流程1.流程图2. 代码相关2. 验证流程 总结 前言 oauth2 有四种模式,常用的为密码和授权码,剩下两种几乎不用 密码模式,很好理解,就是根据输入的用户名/密码进行登录认证的,最终返回一个合法token授权…

Coze:如何使用主页对话框?

你好,我是三桥君 我们今天要介绍的功能模块是“主页对话框”。 目录 访问官网 登录首页 基本功能 主页对话框 第一个功能:如何与自己收藏的机器人进行对话? 第二个功能:如何请求主页对话框的机器人帮助创建一个新的机器人&#x…

C++11 异步操作 std::future类

阅读导航 引言一、异步的概念二、应用场景1. 异步任务处理2. 并发控制3. 结果获取 三、使用示例1. 使用std::async关联异步任务💻示例代码说明 2. 使用std::packaged_task和std::future配合(1)定义std::packaged_task(2&#xff0…

游戏修改器Cheat Engine CE v7.5修改版下载安装详细方法

Cheat Engine是一个专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。它还附带了调试器、反汇编器、汇编器、变速器、作弊器生成、Direct3D操作工具、系统检查工具等。 具体安装方法如下: 地址:Cheat Engine 7.5.zip 解压文件…

Prompt 初级版:构建高效对话的基础指南

Prompt 初级版:构建高效对话的基础指南 文章目录 Prompt 初级版:构建高效对话的基础指南一 “标准”提示二 角色提示三 多范例提示四 组合提示五 规范化提示 本文介绍了提示词的基础概念与不同类型,帮助用户更好地理解如何在对话中构建有效的…

Java 计算器项目

更多有趣请关注公众号 计算器项目 代码仓库:https://gitee.com/wengxiulin/vs_code 项目图片 项目简介 这是一个用 Java 编写的简单计算器应用程序,具有基本的数学运算功能。该计算器支持加、减、乘、除等运算,并提供用户友好的图形界面…

CSP-J模拟赛三补题报告

前言 挂了110pts( ⇑ \Uparrow ⇑ \hspace{14em} 有史以来最大傻逼 T1: 100 p t s \color{green}100pts 100pts T2: 100 p t s → 80 p t s \color{green}100pts\color{yellow}\rightarrow\color{red}80pts 100pts→80pts T3: 100 p t s → 10 p t s \color{gre…

java 的三种IO模型(BIO、NIO、AIO)

java 的三种IO模型(BIO、NIO、AIO) 一、BIO 阻塞式 IO(Blocking IO)1.1、BIO 工作机制1.2、BIO 实现单发单收1.3、BIO 实现多发多收1.4、BIO 实现客户端服务端多对一1.5、BIO 模式下的端口转发思想 二、NIO 同步非阻塞式 IO&#…

【Godot4.3】模拟平面图形绕轴或点在空间旋转

概述 平面图形,除了常规的线性变换:平移、缩放、旋转、斜切之外。还可以模仿在三维空间旋转、透视等等。 矩形绕纵对称轴旋转实点的轨迹 绕对称旋转是个特殊情况,轨迹是圆也是为了便于理解。更实际的情况应该是椭圆。非对称轴旋转的情况轨…

Java 之深入理解 String、StringBuilder、StringBuffer

前言 由于发现 String、StringBuilder、StringBuffer 面试的时候会经常问到,这里就顺便总结一下:本文重点会以这三个字符串类的性能、线程安全、存储结构这三个方面进行分析 ✨上期回顾:Java 哈希表 ✨目录 前言 String 介绍 String 的不可变…