目标检测算法 - YOLOv2

news2024/11/24 3:35:11

文章目录

    • 1. Batch Normalization
    • 2. High Resolution Classifier
    • 3. Anchor、Dimension Cluster、Direct location prediction
    • 4. Loss Function
    • 5. Fine-Grained Features
    • 6. Multi-Scale Training
    • 7. Faster
    • 8. Stronger

在这里插入图片描述
Better,Faster,Stronger。

2017年,提出了yolov2和yolo9000,yolo9000能够实时检测超过9000种物体,主要检测网络还是yolov2。yolov2的整体网络架构和基本思想没有变化,重点解决yolov1召回率和定位精度方面的不足。相比其它的检测器,速度更快、精度更高、可以适应多种尺寸的图像输入。

yolov1是利用全连接层直接预测Bounding Box的坐标。而yolov2借鉴了Faster R-CNN的思想,引入Anchor机制;利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率;同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测。

YOLOv1缺点:

  • 准确率较低
  • 定位性能较差
  • Recall较低
  • 检测小目标和密集目标的能力比较差

YOLOv2在YOLOv1基础上进行改进:

  • Batch Normalization
  • High Resolution Classifier
  • Anchor
  • Dimension Cluster
  • Direct location prediction
  • Fine-Grained Features
  • Multi-Scale Training

在这里插入图片描述


1. Batch Normalization

BN层一般放在线性层的后面,激活函数的前面。BN层可以加快收敛,改善梯度,远离饱和区,可以使用大的学习率来训练网络,使网络对初始化不那么敏感,起到了正则化的作用,防止过拟合,甚至可以取代DropOut层。

注意:

训练和测试时的BN层是不同的。

BN和DropOut同时使用时,性能会降低!!

在这里插入图片描述

为什么需要进行Batch Normalization操作呢?

  • 很多的激活函数,比如sigmod激活函数,Tanh激活函数,在0附近为非饱和区,最容易训练。如果输出太大或者太小则陷入了激活函数的饱和区,饱和区意味着梯度消失,难以训练,所以使用Batch Normalization强行把神经元的输出集中到0附近。

训练阶段

例如,batch size为32,某层的某个神经元会输出32个响应值。

对这32个相应求均值、标准差,再做归一化。

把归一化后的响应值乘 γ \gamma γ再加上 β \beta β

测试阶段

测试阶段均值、方差、 γ \gamma γ β \beta β都用训练阶段全局求出的。

Batch Normalization相当于做线性变换。

μ t e s t = E ( μ b a t c h ) \mu_{test}=\mathbb{E}(\mu_{batch}) μtest=E(μbatch) σ t e s t 2 = m m − 1 E ( σ b a t c h 2 ) \sigma^2_{test}=\frac{m}{m-1}\mathbb{E}(\sigma^2_{batch}) σtest2=m1mE(σbatch2)
B N ( X t e s t ) = γ ⋅ X t e s t − μ t e s t σ t e s t 2 + ϵ + β BN(X_{test})=\gamma · \frac{X_{test}-\mu_{test}}{\sqrt{\sigma^2_{test}+\epsilon}}+\beta BN(Xtest)=γσtest2+ϵ Xtestμtest+β


2. High Resolution Classifier

高分辨率的分类器。

YOLOv2先在224*224的图像分类数据集上训练,然后再448*448的图像分类数据集上训练了10个epoch。最后在448*448的目标检测数据集上进行微调。这样网络就能适应大分辨率的输入。

在这里插入图片描述


3. Anchor、Dimension Cluster、Direct location prediction

anchor是YOLOv2的核心。YOLOv3,YOLOv4,YOLOv5也是用anchor机制。在YOLOv1里面没有使用anchor机制,直接使用两个bounding box,谁跟ground truth的IoU大,谁负责去拟合这个ground truth。这个时候可能会遇到一个问题,这两个bounding box是不受任何约束的,想怎么变怎么变,想多大就多大,想多宽就多宽,不受约束。没有给他一个限定范围,完全让他俩任意生长,这样做显然是不好的。

于是在YOLOv2里面就引入了anchor机制,不让这两个bounding box随机生长了,给他们一个限制,加个紧箍咒,给他们一个参考,这个参考就是anchor,又叫做先验框。如上图所示以两个anchor为例,一个瘦高,一个矮胖分别负责预测不同形状的物体。这样的话bounding box就不会随机生长了,就会有了自己的使命了,知道自己应该预测什么样的物体了。所以这个时候每个预测框只需要预测出它相较于这个anchor的偏移量就行了。

在这里插入图片描述

在YOLOv2中,将一张图片划为了13*13的grid cell,每个grid cell预测5个anchor,即共13*13*5=845个anchor。

事先指定了5种,长宽大小尺度不同的先验框,每个anchor对应一个预测框,而这个预测框只需要去预测输出相对于它所在的anchor的偏移量。

在这里插入图片描述

模型输出结构:

在这里插入图片描述

在YOLOv2中,类别归于anchor管理,在YOLOv1种,类别归于grid cell管。

在YOLOv2中,每个grid cell产生5个anchor。每个anchor包含4个定位参数、1个置信度参数和20个条件类别概率,即每个anchor会产生25个数。即每个grid cell会产生 25 ∗ 5 = 125 25*5=125 255=125个数。
在这里插入图片描述

YOLOv2使用的是Darknet-19作为骨干网络,输入图像为416*416,YOLOv2将其划分为13*13的网格,对应输出为13*13的feature map。

在这里插入图片描述

定义anchor的个数为5个,并不是手动去选择的。

在Faster RCNN和SSD里面,anchor的长宽大小尺度是人们手动去选择的。

为了解决这个问题,作者对整个voc和coco数据集进行了长宽比的聚类,不同的聚类中心个数对应着不同的IoU。聚类中心越多,anchor能覆盖的IoU就越大,但是anchor越多,模型会变的越复杂。则取了anchor数为5。如下图,黑框表示Pascal Voc2007数据集中的anchor长宽比,蓝框表示coco目标检测数据集中的anchor长宽比。
在这里插入图片描述

加入anchor后,输出相较于所在anchor的偏移量,这个偏移量仍然是可以全图随便偏移的,会导致模型非常不稳定。

为了限制预测框的位置,作者加了一个限制。YOLOv2加了一个sigmoid函数,无论输入的偏移是负无穷到正无穷的什么数,最后的输出总是在0~1之间。通过sigmoid函数,将预测框的中心点限制在了它所在的grid cell里面。

在这里插入图片描述

最终的 b b b就为预测框。

在这里插入图片描述


4. Loss Function

在这里插入图片描述


5. Fine-Grained Features

细粒度特征。

浅层的网络预测出特征图后分为两路,一路进行正常的卷积、下采样操作,一路将这个feature map拆分为4份,将两路的结果进行叠加,拼成一个更大的结果。这个结果包括底层的细粒度的信息以及经过卷积和下采样后高层的信息。整合了不同尺度的特征,有利于小目标的检测。

在这里插入图片描述

拆分方法:

在这里插入图片描述


6. Multi-Scale Training

同一个模型,每10步就会重新选取输入图像的大小。也就是说,在模型训练期间,把不同大小的图像输入到模型中,就强迫了模型必须能兼容、能覆盖所有尺度输入大小的图像。

在这里插入图片描述

模型的权重没有改变,模型的结构也没有改变。模型结构没有改变,那么为什么能够输入不同尺度的图像呢?因为Darknet19有一个全局平均池化层,它把输出通道的每一个feature map求平均来替代全连接层。

如果输入的是一个高分辨率的大图片,YOLO会预测的比较慢,但是会预测很准。如果输入的是低分辨率的小图片,YOLO会预测的非常快,但是精度没有那么高。因此,我们可以选择不同输入图像的尺度来达到速度和精度的权衡。

在这里插入图片描述


7. Faster

使用Darknet-19作为骨干网络。使用Darknet19使网络变得更快。

YOLOv2采用了一个新的基础模型(特征提取器),称为Darknet-19,包括19个卷积层和5个maxpooling层。

Darknet-19与VGG16模型设计原则是一致的,主要采用 3 × 3 3\times 3 3×3卷积,采用 2 × 2 2\times 2 2×2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。

Darknet-19最终采用global avgpooling做预测,并且在 3 × 3 3\times 3 3×3卷积之前使用 1 × 1 1\times 1 1×1卷积来压缩特征图channles以降低模型计算量和参数。

Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。

使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

在这里插入图片描述

在这里插入图片描述


8. Stronger

使检测类别变的更多。

yolov2说是可以检测出9000种类别的物体。

在这里插入图片描述

作者将coco目标检测数据集和ImageNet图像分类数据集联合训练。

coco数据集并不是很细粒度,而ImageNet图像分类数据集有几万个类别,但是它只有分类的标签,并没有目标检测定位的标签。

因此,作者将这两个数据集结合在一起,让模型既能学目标检测,也能学图像分类,而且能学细粒度的目标检测,能够检测出在ImageNet中的物体。

如果强行的将两个数据集合并在一起是很难的。因为我们在普通的图像分类中使用的softmax,是假设所有的类别是互斥的。

在这里插入图片描述

因此,不能简单的把检测数据集和分类数据集强行的弄成这种扁平的分类结构。

ImageNet的分类体系是WORDNET(普林斯顿大学提出的一个语言学数据库),是一种错综复杂的有向图结构。

YOLO9000将这种错综复杂的有向图结构简化成了层次分明的树状结构。

作者提出了一种层级分类方法(Hierarchical classification),主要思路是根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的WordTree如下图所示:

在这里插入图片描述

WordTree中的根节点为"physical object",每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个path,然后计算path上各个节点的概率之积。

在这里插入图片描述

在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是 P r ( p h y s i c a l o b j e c t ) Pr(physical object) Pr(physicalobject),同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。

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

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

相关文章

使用 request 和 cheerio 库来发送 HTTP 请求

首先,我们需要导入所需的库。在这个例子中,我们将使用 request 和 cheerio 库来发送 HTTP 请求和解析 HTML。 import request from request; import cheerio from cheerio;然后,我们需要定义一个函数来发送请求并解析响应。 function getHt…

『MySQL快速上手』-⑧-内置函数

文章目录 1.日期函数1.1 获得年月日1.2 获得时分秒1.3 获得时间戳1.4 在日期的基础上加日期1.5 在日期的基础上减去时间1.6 计算两个日期之间相差多少天案例1案例22.字符串函数案例3.数学函数4.其他函数1.日期函数 1.1 获得年月日

【极客时间-系列教程】Vim 实用技巧必知必会-基本概念和基础命令:应对简单的编辑任务

vim很强大,但它的入门确实是比较高,对于初学者来说,怎么退出都是一件很难的事情, 不管你有没有遇到过,反正我是遇到过退出比较难的问题 首先介绍几个常用的命令和按键 :q! 退出不保存:w 写入不退出:r 读文件:wq 写入…

The 8th China Open Source Conference Successfully Concludes

由开源社主办的第八届中国开源年会(COSCon23)于 2023年10月29日在成都圆满收官。本次大会,为期两天,线下参会报名逾千人次,在线直播观看人数总计 168610 人,直播观看次数达 248725 次,官网累计浏…

屏幕录制为什么没有声音?让我来告诉你答案

在日常生活和工作中,屏幕录制是一项非常有用的技能,无论是为了记录教程、演示软件,还是分享游戏经验。然而,有时您可能会遇到一个常见的问题,录制的视频没有声音。本文将深入解析屏幕录制为什么没有声音,并…

合众汽车选用风河Wind River Linux系统

导读合众新能源汽车股份有限公司近日选择了Wind River Linux 用于开发合众智能安全汽车平台。 合众智能安全汽车平台(Hozon Automo-tive Intelligent Security Vehicle Plat-form)是一个面向高性能服务网关及车辆控制调度的硬件与软件框架,将于2024年中开始投入量产…

JCJC错别字检测系统安装部署手册

本手册是针对 Ubuntu 服务器环境的安装使用说明。CentOS安装手册,请参考连接: JCJC错别字系统部署-腾讯云开发者社区-腾讯云 。 安装步骤: 第一步:安装 docker 离线方式在Ubuntu 18.04 上安装Docker ,参考连接&am…

TypeError: Can‘t parse ‘center‘. Sequence item with index 0 has a wrong type

报错代码 import sys sys.path.append(rD:\文档\Temp\WX-FIles\data) # sys.path.append(rD:\文档\Temp\WX-FIles\data)p11 [125, 195] p12 [200, 275] # and the corresponding two points on the second image are:p21 [120, 190] p22 [200, 280] # TODO: write your ow…

Shiro快速入门之三

一、前言 接Shiro快速入门之二,上篇侧重于介绍认证,这篇介绍一下Shiro的授权,先初始化5张表的数据。 注:创建三条权限记录,一个admin角色分配查询和添加用户权限,一个账户qingcai18036授予管理员角色。 二…

用递归解饮料换购

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账。 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始…

phpstudy 开启目录浏览功能

(1)在该目录下: (2)选择对应网站的配置文件; (3)修改: # Options FollowSymLinks ExecCGI Options Indexes FollowSymLinks ExecCGI

python 文本纠错库pycorrector的使用(API变更,许多介绍文章已不可用)

pycorrector是一个nice的中文检测库,在最新的版本API变更,导致许多之前的介绍文章不可用。 现将新API粘贴如下。

pytorch-gpu(Anaconda3+cuda+cudnn)

文章目录 下载Anaconda3安装,看着点next就行比较懒所以自动添加path测试 cuda安装的时候不能改路径如果出现报错,关闭杀毒软件一直下一步就好取消勾选“CUDA”中的“Visual Studio Intergration”一直下一步即可测试安装成功 cudnn解压后将这三个文件夹复…

Peoeasy机器人:原点无法重置问题

机械手在伺服关闭的模式下,插入定位插销,进入机构设定重置原点,发现PUU值没有变化 问题原因 台达软件版本比较多,每个版本重置原点的模式和马达偏差角的默认值是有一定差异的。再重置原点之前尽可能先确认一下重置原点的模式和马…

手写ThreadPoolExecutor线程池

很多人不推荐造轮子,我偏不。我造轮子又不是为了上生产环境,而是为了加深理解,有何不可?私以为造轮子几乎是最好的学习方式,甚至没有之一。因为造轮子需要至少做足以下两点: 了解设计思想(设计…

【vue2】vue2 实现手风琴效果,复制粘贴直接使用

【vue2】vue2 实现手风琴效果&#xff0c;复制粘贴直接使用 效果 代码 <template><divclass"about-index":style"{ backgroundImage: url( lisData.img ) }"><div class"container"><div class"fine-grained"…

振南技术干货集:深入浅出的Bootloader(2)

注解目录 1、烧录方式的更新迭代 1.1 古老的烧录方式 (怀旧一下&#xff0c;单片机高压烧录器。) 1.2 ISP 与ICP 烧录方式 (还记得当年我们玩过的 AT89S51?) 1.3 更方便的 ISP 烧录方式 1.3.1串口 ISP &#xff08;是 STC 单片机成就了我们&#xff0c;还是我们成就了…

【SpringBoot】序列化和反序列化介绍

一、认识序列化和反序列化 Serialization&#xff08;序列化&#xff09;是一种将对象以一连串的字节描述的过程&#xff1b;deserialization&#xff08;反序列化&#xff09;是一种将这些字节重建成一个对象的过程。将程序中的对象&#xff0c;放入文件中保存就是序列化&…

驱动程序编进内核或则编成模块

驱动程序可以编进内核或则编成模块 驱动程序编成模块 打开/home/book/100ask_imx6ull-sdk/Linux-4.9.88/drivers/char/Kconfig文件&#xff0c;添加以下信息。 在/home/book/100ask_imx6ull-sdk/Linux-4.9.88在目录下使用make memuconfig命令查看配置菜单。 可以按/&#…

escape, encodeURI, encodeURIComponent 有什么区别以及作用?

目录 前言 全部内容 1. 注释 2. 写法 3. 代码 4. 事件 5. 总结 6. 理论 7. 用法 8. 结论 9. API 10. 优缺点 escape: encodeURI: encodeURIComponent: 11. 方法 总结 &#x1f642;博主&#xff1a;冰海恋雨. &#x1f642;文章核心&#xff1a;escape, encod…