【YOLO学习】YOLOv2详解

文章目录

  • 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:] 为类别预测值。

在这里插入图片描述

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

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

相关文章

二分查找算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 目录 二分查找算法的介绍 704. 二分查找 34. 在排序数组中查找元素的第一个和 最后一个位置 35. 搜索插入位置 69. x的平…

力扣题解 983

大家好,欢迎来到无限大的判断,祝大家国庆假期愉快 题目描述(中等) 最低票价 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出…

Charles(青花瓷)抓取https请求

文章目录 前言Charles(青花瓷)抓取https请求 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话&…

kafka下载配置

下载安装 参开kafka社区 zookeeperkafka消息队列群集部署https://apache.csdn.net/66c958fb10164416336632c3.html 下载 kafka_2.12-3.2.0安装包快速下载地址分享 官网下载链接地址: 官网下载地址:https://kafka.apache.org/downloads 官网呢下载慢…

2024/10/2 408 20题

c d d b b a b c b b a d c d a c

java基础 day1

学习视频链接 人机交互的小故事 微软和乔布斯借鉴了施乐实现了如今的图形化界面 图形化界面对于用户来说,操作更加容易上手,但是也存在一些问题。使用图形化界面需要加载许多图片,所以消耗内存;此外运行的速度没有命令行快 Wi…

【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修

一、OSPF介绍 开放式最短路径优先协议OSPF(Open Shortest Path First),IPv4使用的OSPFv2,针对IPv6使用OSPFv3协议。 二、为什么需要OSPF OSPF出现之前,网络广泛使用RIP路由协议,RIP由于最大16跳数限制无法适应大型网络,RIP是基于距离矢量算法的路由协议,应用在大型网…

过去8年,编程语言的流行度发生了哪些变化?PHP下降,Objective-C已过时

前天有一个汇总9个不同排名数据的“地表最强”编程语言排行榜,为了更好地理解语言流行度的变化,作者将2016年的类似调查结果与2024年的数据进行了比较。 虽然2016年的调查只包含6个排名,但它仍然提供了宝贵的参考数据。 我们来看看详细的情…

JSON的C实现(上)

JSON的C实现(上) JSON的C实现(上)前言JSON简介JSON的C实现思路小结 JSON的C实现(上) 前言 JSON是众多项目中较为常见的数据交换格式,为不同项目、系统间的信息交换提供了一个规范化标准。JSON…

Unity八股总结

这里写目录标题 OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?动态加载资源的方式?Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。物理更新一般放在哪个系统函数里…

查找与排序-插入排序

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序…

Arduino UNO R3自学笔记15 之 Arduino如何驱动数码管?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:学习使用数码管。 1.数码管介绍 数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数…

L0-Linux-关卡材料提交

SSH全称Secure Shell,中文翻译为安全外壳,它是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。SSH 协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。 SSH 是(C/S…

QSqlDatabase在多线程中的使用

Qt中多线程使用数据库_qt数据库管理类支持多数据库,多线程-CSDN博客 1. 代码&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError>…

【深度学习】05-Rnn循环神经网络-01- 自然语言处理概述/词嵌入层/循环网络/文本生成案例精讲

循环神经网络&#xff08;RNN&#xff09;主要用于自然语言处理的。 循环神经网络&#xff08;RNN&#xff09;、卷积神经网络&#xff08;CNN&#xff09;和全连接神经网络&#xff08;FCN&#xff09;是三种常见的神经网络类型&#xff0c;各自擅长处理不同类型的数据。下面…

RabbitMQ应用

RabbitMQ 共提供了7种⼯作模式, 进⾏消息传递 一、七种模式的概述 1、Simple(简单模式) P:生产者,就是发送消息的程序 C:消费者,就是接收消息的程序 Queue:消息队列,类似⼀个邮箱, 可以缓存消息; ⽣产者向其中投递消息, 消费者从其中取出消息 特点: ⼀个⽣产者P,⼀…

负载均衡--相关面试题(六)

在负载均衡的面试中&#xff0c;可能会遇到一系列涉及概念、原理、实践应用以及技术细节的问题。以下是一些常见的负载均衡面试题及其详细解答&#xff1a; 一、什么是负载均衡&#xff1f; 回答&#xff1a;负载均衡是一种将网络请求或数据传输工作分配给多个服务器或网络资源…

SpringSession微服务

一.在linux中确保启动起来redis和nacos 依赖记得别放<dependencyManagement></dependencyManagement>这个标签去了 1.首先查看已经启动的服务 docker ps 查看有没有安装redis和nacos 2.启动redis和nacos 发现没有启动redis和nacos,我们先来启动它。&#xff0c;…

计算机视觉学习路线:从基础到进阶

计算机视觉学习路线&#xff1a;从基础到进阶 计算机视觉&#xff08;Computer Vision&#xff09;是人工智能和机器学习领域中重要的分支&#xff0c;致力于让计算机能够理解和分析图像、视频等视觉信息。随着深度学习的发展&#xff0c;计算机视觉的应用变得越来越广泛&…

音视频入门基础:FLV专题(7)——Tag header简介

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;3&#xff09;——FLV header简介》中可以知道&#xff0c; 在FLV header之后&#xff0c;FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 FLV header PreviousTagSize0 Tag1 PreviousTagSize1 Ta…