YOLO物体检测-系列教程2:YOLOV2整体解读

🎈🎈🎈YOLO 系列教程 总目录

YOLOV1整体解读
YOLOV2整体解读

YOLOV2提出论文:YOLO9000: Better, Faster, Stronger

1、YOLOV1

  • 优点:快速,简单!
  • 问题1:每个Cell只预测一个类别,如果重叠无法解决
  • 问题2:小物体检测效果一般,长宽比可选的但单一

YOLOV2更快!更强!

YOLOYOLOV2
batch norm
hi-res classifier
convolutional
anchor boxes
new network
dimension priors
location prediction
passthrough
multi-scale
hi-res detecttor
VOC2007 mAP63.465.869.569.269.674.475.476.878.6

V2版本整体上没有太多改变,主要在网络上、实现上的细节上有一些改进,如表格中的mAP值是有明显的上升的。看这个表格,v2版本的mAP值有一个很明显的上升,接下来我会根据表格内容依次介绍v2版本在哪些方面有改进。

2、Batch Normalization

  • V2版本舍弃Dropout,卷积后全部加入Batch Normalization
  • 网络的每一层的输入都做了归一化,收敛相对更容易
  • 经过Batch Normalization处理后的网络会提升2%的mAP
  • 从现在的角度来看,Batch Normalization已经成网络必备处理

Batch Normalization:顾名思义,批量归一化处理,分别对一列特征进行进行归一化操作,具体为当前值减去均值再除以方差。
Dropout:随机杀死一些神经元,即被杀死的神经元部分的特征权重为0,避免过拟合,在全连接层最常使用。

在v2版本,首先就全面剔除Dropout,在每一次卷积后都进行了Batch Normalization,能够避免网络往不好的方向训练,能够使得收敛更快,由于这个地方的改动,YOLOv2的mAP提升了约2%。

3、更大的分辨率

  • V1训练时用的是224224,测试时使用448448
  • 可能导致模型水土不服,V2训练时额外又进行了10次448*448 的微调
  • 使用高分辨率分类器后,YOLOv2的mAP提升了约4%

这个实际上就是V1和V2都是使用(224,224)的图像训练,然后都是用(448,448 )的图像测试。只不过V2版本,在训练的时候加了10个epoch,这10个epoch都是用(448,448 )的图像进行训练,因为10个epoch比较个数比较少,所以实际上是对模型进行微调。

这是因为用(224,224)的图像训练,然后用(448,448 )的图像测试会让模型无法适应,增加了10个epoch用(448,448 )的图像进行训练对模型进行微调有一个适应的过程,就是因为这个适应的过程使得YOLOv2的mAP提升了约4%

4、网络结构

  1. DarkNet,实际输入为416*416
  2. 没有FC层,5次降采样,(13*13)
  3. 1*1卷积节省了很多参数

在这里插入图片描述
YOLOV2借助了ResNet和VGG的一些思想:

  1. 所有的全连接层都不见了,全连接层容易过拟合,收敛慢,参数多,最后的输出是(7,7,30)这个用卷积也同样能够做到
  2. 5次降采样操作,maxpooling,(224,224)变成(112,112),最终输出(7,7)
  3. 输入输出进行了改变,输入改成了(416,416)输出为(13,13)
  4. darknet,具体为darknet19,一共有19个卷积层,每次经过卷积的时候特征图的个数会翻倍,这里用了(1,1)的一维卷积降低了卷积核的个数

5、YOLO-V2聚类提取先验框

  • faster-rcnn系列选择的先验比例都是常规的,但是不一定完全适合数据集
  • K-means聚类中的距离: d ( b o x , c e n t r o i d s ) = 1 − I O U ( b o x , c e n t r o i d s ) d(box,centroids) = 1-IOU(box,centroids) d(box,centroids)=1IOU(box,centroids)

5.1 YOLOV1先验框

在YOLOV1中,有两个预选框可供选择,但是实际中物体可能远不止两种,并且有长的宽的,多个物体重叠在一起或者一个物体有多个标签,可能就会出现问题。

5.2 Fast-RCNN先验框

在当时Fast-RCNN用了9种先验框,但是它的做法是有三种scale不同大小,每种大小三种比例的先验框有1:1、1:2、2:1这3种比例,但是这种做法对实际的数据集可能无法完全适配。

5.3 YOLO-V2聚类提取先验框

比如在coco数据集中,有很多标注数据,假如说在标注的数据中标注了100万个框,对这100万个框使用kmeans进行聚类,加入k=5,就会将先验框的大小、长宽比例、中心坐标点等特征分成5类,而这5类也是专门针对当前数据集的个性化分类。那先验框就会有5种确定的大小比例,这就会和最终的实际任务会比较接近。
而kmeans的距离计算公式用LOU来实现。
作者通过实验发现,k=5可以获得比较好的IOU值。

YOLOV1 = 772 = 98
YOLOV2 = 13135 = 845
YOLOV2在先验框的数量上大幅度提升,V1是98个,V2则为845个

6、偏移量计算方法

6.1 anchor boxes

  • 通过引入anchor boxes(锚框,即先验框),使得预测的box数量更多(1313n)
  • 跟faster-rcnn系列不同的是先验框并不是直接按照长宽固定比给定
without anchor69.5mAP81%recall
with anchor69.2mAP88%recall

在第5节提到增加了先验框,但是如表格所示,并没有增加mAP值,但是recall是明显增加的,recall描述了被标记物体全部被检测的可能性。

YOLOV1:使用全连接层来预测边界框的坐标
Faster R-CNN:使用手工挑选的先验因素来预测边界框,Faster R-CNN中的区域生成网络(RPN)只使用卷积层来预测锚框的偏移量和置信度。由于预测层是卷积,RPN预测了特征图中每个位置的偏移量。

Anchor Box的构成:

  • 使用CNN提取的Feature Map的点,来定位目标的位置
  • 使用Anchor Box的Scale来表示目标的大小
  • 使用Anchor Box的Aspect Ratio来表示目标的形状。

6.2 YOLO-V2-Directed Location Prediction

直接的位置预测改为相对位置预测策略

  1. bbox:中心为 ( x p , y p ) (x_p,y_p) (xp,yp),宽和高为 ( w p , h p ) (w_p,h_p) (wp,hp),则: x = x p + w p ∗ t x x = x_p+w_p*t_x x=xp+wptx y = y p + h p ∗ t y y = y_p+h_p*t_y y=yp+hpty
  2. t x t_x tx=1,则将bbox在x轴向右移动 w p w_p wp t x t_x tx=−1则将其向左移动 w p w_p wp
  3. 这样会导致收敛问题,模型不稳定,尤其是刚开始进行训练的时候
  4. V2中并没有直接使用偏移量,而是选择相对grid cell的偏移量

解析:

  1. 得到先验框有4个参数 ( x p , y p , h p , w p ) (x_p,y_p,h_p,w_p) xpyphpwp,这是kmeans聚类预测出来的
  2. 预测出4个偏移量 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) txtytwth,新的框为 ( x , y , h , w ) (x,y,h,w) xyhw,其中 x = x p + t x x = x_p+t_x x=xp+tx,y、h、w同理
  3. 但是这样存在一个问题,网络初期的时候效果不好(网络啥也不会),预测出的offset偏移量可能导致得到的框会错误的很离谱,V2对此做出改进
  4. 具体改进为中心点x、y的偏移量的预测结果,加上sigmoid的,这样保证了中心点不会离开原来的grid cell格子,还要加上单元格与图像左上角的偏移量为 ( c x , c y ) (cx,cy) cxcy,h和w的预测策略不变。

具体公式为:
b x = σ ( t x ) + c x b_x = σ(t_x)+c_x bx=σ(tx)+cx
b y = σ ( t y ) + c y b_y = σ(t_y)+c_y by=σ(ty)+cy
b w = p w e t w b_w = p_we^{t_w} bw=pwetw
b h = p h e t h b_h = p_he^{t_h} bh=pheth

加入预测值为 ( σ t x , σ t y , t w , t h ) (σt_x,σt_y,t_w,t_h) σtxσtytwth = (0.2,0.1,0.2,0.32)
anchor框为: p w = 3.19275 , p h = 4.00944 p_w = 3.19275,p_h = 4.00944 pw=3.19275ph=4.00944
在特征图位置:
b x = 0.2 + 1 = 1.2 b_x = 0.2+1 = 1.2 bx=0.2+1=1.2
b y = 0.1 + 1 = 1.1 b_y = 0.1+1 = 1.1 by=0.1+1=1.1
b w = 3.19275 ∗ e 0.2 = 3.89963 b_w = 3.19275*e^{0.2} = 3.89963 bw=3.19275e0.2=3.89963
b h = 4.00944 ∗ e 0.32 = 5.52153 b_h = 4.00944*e^{0.32} = 5.52153 bh=4.00944e0.32=5.52153
在原位置:
b x = 1.2 ∗ 32 = 38.4 b_x = 1.2*32=38.4 bx=1.232=38.4
b y = 1.1 ∗ 32 = 35.2 b_y = 1.1*32=35.2 by=1.132=35.2
b w = 3.89963 ∗ 32 = 124.78 b_w = 3.89963*32=124.78 bw=3.8996332=124.78
b h = 5.52153 ∗ 32 = 176.68 b_h = 5.52153*32=176.68 bh=5.5215332=176.68

7、YOLO-V2的感受野

7.1 感受野

在这里插入图片描述
从原始图像数据中,经过特征提取,得到一个Feature Map特征图,特征图的一个点可能代表原始图像中一个区域,这个区域就是这个点的感受野。越大的感受野越能感受一个整体。

7.2 卷积核对应参数

在这里插入图片描述
如图有一个(5,5)的图像数据(或者特征图),经过一个(3,3)的卷积核,步长为1,得到的输出就是一个(3,3)的特征图,再经过一个一次卷积就能得到(1,1)的输出,如果直接用5*5的卷积核就能得到一个(1,1)的输出,一步能得到的结果为什么要用两步呢?但是实际中却都是在用小的卷积核没有用大的。实际上用多步小的卷积核,用到的参数更少。

假设输入大小都是(H,W,C),并且都使用c个卷积核(得到c个特征图),可以计算一下各自所需参数:
1个(7,7)卷积核所需参数:
= C • ( 7 • 7 • c ) = 49 c 2 =C • (7 • 7 • c) = 49c^2 =C(7•7•c)=49c2
3个(3,3)卷积核所需参数:
= 3 • c • ( 3 • 3 • c ) = 27 c 2 =3•c•(3•3•c) = 27c^2 =3•c(3•3•c)=27c2

7.3 Fine-Grained Features

  • 最后一层时感受野太大了,小目标可能丢失了,需融合之前的特征

在这里插入图片描述
yolo算法,在一次次的卷积过程中,越往后的感受野越大,(224,224)的图像经过处理最后得到的Feature Map特征图是(7,7),实际上这个感受野太大了,容易忽视一下小物体,比较容易检测到大的物体。

yolov2在最后得到的特征图是(13,13,1024)将其拆分为(1,13,13,1024),倒数第二个特征图为(26,26,512)拆分为(4,13,13,512),再拆分为(2,13,13,1024),将其拼接为(3,13,13,1024),reshape成(13,13,3072)

8、多尺度检测

  • YOLO-V2-Multi-Scale
  • 都是卷积操作可没人能限制我了!一定iterations之后改变输入图片大小

实际中得到的图像大小是不一样的的,全部resize成相同大小,会影响检测效果。
不同输入大小能不能做,肯定能的,卷积和输入大小没有关系啊。
最小的尺寸为(320,320),最大的为(608,608)
原始的YOLO使用448×448的输入分辨率。通过添加锚框,我们将分辨率改为416×416。然而,由于我们的模型只使用卷积层和池化层,因此可以实时调整大小。我们希望YOLOv2能够鲁棒地运行在不同尺寸的图像上,所以我们将多尺度训练应用到模型中。

我们不需要修改输入图像的大小,而是每隔几个迭代就改变网络。每10个批次,我们的网络就会随机选择一个新的图像尺寸。由于我们的模型缩减了32倍,我们从以下32的倍数中抽取:{320, 352, …, 608}。因此,最小的选项是320 × 320,最大的是608 × 608。我们将调整网络的尺寸,然后继续训练。

这种制度迫使网络学会在各种输入维度上进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测结果。网络在较小的尺寸下运行得更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。

在低分辨率下,YOLOv2作为一个廉价、相当准确的检测器运行。在288×288时,它以超过90 FPS的速度运行,其mAP几乎与Faster R-CNN一样好。这使它成为较小的GPU、高帧率视频或多个视频流的理想选择。

在高分辨率下,YOLOv2是一个最先进的检测器,在VOC 2007上的mAP为78.6,而运行速度仍高于实时速度。

YOLOV1整体解读
YOLOV2整体解读

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

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

相关文章

ros----发布者和订阅者模型

话题模型&#xff1a; 如何自定义话题消息 1.定义msg文件 2.在package.xml中添加功能包依赖 <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>3.在CMakeList.txt文件中添加编译选项 4.编译生成语言的相…

医院安全不良事件报告系统源码 PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发

不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…

JWT安全及案例实战

文章目录 JWT 安全1. Cookie2. Session3. Token4. JWT4.1 JWT概述4.1.1 JWT头4.1.2 有效载荷4.1.3 签名哈希4.1.4 通信流程 4.2 JWT 漏洞描述4.3 JWT 漏洞原理4.4 JWT 安全防御 5. WebGoat 靶场实验5.1 第四关5.2 第五关5.3 第七关 越权与逻辑漏洞 Web漏洞点只有一个入口&#…

12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917

testerSunshine/12306 Stars: 31.4k License: MIT 12306 购票小助手是一个使用 Python 编写的项目&#xff0c;主要功能包括自动打码、自动登录、准点预售和捡漏、智能候补以及邮件通知等。该项目具有以下核心优势&#xff1a; 支持多个版本的 Python提供验证码本地识别功能可…

企业架构LNMP学习笔记46

PHP测试连接代码&#xff1a; php代码测试使用memcached&#xff1a; 示例代码&#xff1a; <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…

AUTOSAR通信篇 - CAN网络通信(五:ComM)

文章目录 模块交互EcuM交互BswM交互NvM交互CanSM交互NM交互 ComM功能Paritial Network Cluster 管理Partial Network Cluster 管理功能ComM PNC状态机在主状态COMM_PNC_NO_COMMUNICATION中PNC的行为PNC网关相关的要求 从断电进入PNC主状态COMM_PNC_NO_COMMUNICATION时在主状态C…

深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数

在MySQL数据库中&#xff0c;JSON格式的数据处理已经变得越来越常见。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它可以用来存储和表示结构化的数据。MySQL提供了一些功能强大的JSON函数&#xff0c;其中两个关键的函数是…

SpringBoot实战(二十四)集成 LoadBalancer

目录 一、简介1.定义2.取代 Ribbon3.主要特点与功能4.LoadBalancer 和 OpenFeign 的关系 二、使用场景一&#xff1a;Eureka LoadBalancer服务A&#xff1a;loadbalancer-consumer 消费者1.Maven依赖2.application.yml配置3.RestTemplateConfig.java4.DemoController.java 服务…

笔记01:第一行Python

NameError 名字不含特殊符号&#xff08;只能是英文、数字、下划线、中文等&#xff09;名字区分大小写名字先定义后使用 SyntaxError 不符合Python语法书写规范除了语法成分中的保留拼写错误输出中文符号if、for、def等语句末尾忘记冒号 IdentationError 缩进错误&#x…

C# Onnx Yolov8 Detect 物体检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

开源即时通讯(IM)项目OpenIM源码部署流程

由于OpenIM依赖的组件较多&#xff0c;开发者需求不一&#xff0c;导致OpenIM部署一直被人诟病&#xff0c;经过几次迭代优化&#xff0c;包括依赖的组件compose的一键部署&#xff0c;环境变量设置一次&#xff0c;全局生效&#xff0c;以及脚本重构&#xff0c;目前OpenIM部署…

2023CSP游寄

初赛 DAY -2 才刚考开学测就来初赛。 复赛之后就是月测&#xff0c;这就是初三吗。 初中最后一次 CSP&#xff0c;如果 S 没一等就得摆烂了。希望别因为各种原因爆炸。 中午下午借着刷初赛题的名义摆烂&#xff0c;半道题都没写。 CSP2023RP 初赛 DAY -1 看我发现了什么。…

SpringBoot 集成 SpringSecurity 从入门到深入理解

完整的目录 介绍 SpringSecurity简述 SpringSecuritySpringSecurity 的主要功能说明 项目源码入门案例项目工程路径第一步&#xff1a;加载依赖第二步&#xff1a;创建核心的配置类第三步&#xff1a;增加controller第三步&#xff1a;启动程序小结界面跳转说明密码生成说明 重…

使用Python来写模拟Xshell实现远程命令执行与交互

一、模块 这里使用的是 paramiko带三方库 pip install paramiko二、效果图 三、代码实现&#xff08;这里的IP&#xff0c;用户名&#xff0c;密码修改为自己对应服务器的&#xff09; import paramiko import timeclass Linux(object):# 参数初始化def __init__(self, ip, us…

python 使用requests爬取百度图片并显示

爬取百度图片并显示 引言一、图片显示二、代码详解2.1 得到网页内容2.2 提取图片url2.3 图片显示 三、完整代码 引言 爬虫&#xff08;Spider&#xff09;&#xff0c;又称网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;是一种自动化程序&#xff0c;可以自动地浏览…

【前端知识】Three 学习日志(四)—— 相机控件

Three 学习日志&#xff08;四&#xff09;—— 相机控件 一、引入相机控件 <!-- 引入相机控件 --> <script type"importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "../…

C#,数值计算——Hashtable的计算方法与源程序

1 文本格式 using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer { public abstract class Hashtable<K> { private int nhash { get; set; } private int nmax { get; set; } pr…

Vue3记录

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/releas…

Vue3搭配Element Plus 实现候选搜索框效果

直接上代码 <el-col :span"14" class"ipt-col"><el-input v-model"projectName" class"w-50 m-2" input"inputChange" focus"inputFocusFn" blur"inputBlurFn" placeholder"请输入项目名…

同样的UWB,为什么定位精度差很多?

纵观以UWB技术为核心的应用与电厂、化工厂等工业企业人员定位系统&#xff0c;在定位精度上都声称能够达到厘米级精准&#xff0c;然而实际应用上却总是差了些许意思。任何产品都有理论值与实际值&#xff0c;例如某些新能源汽车号称标准续航300公里&#xff0c;但实际上可能连…