yolov1 论文精读 - You Only Look Once

news2024/10/5 21:25:43

YOLOv1

Introduction

作者将目标检测进行重构并看作为单一的回归问题,直接从图像到边界框坐标和类别概率。使用我们的系统,您只需要在图像上看一次(you only look once, YOLO),以预测出现的目标和位置。

系统将输入图像分成 S×S 的网格。如果一个目标的中心落入一个网格单元中,该网格单元负责检测该目标。每个网格单元预测这些box的 B 个边界框,每个边界框包含 5 个预测:x、y、w、h 和置信度(一般用交并比)。

每个网格单元还预测 C 个条件类别概率,不管边界框的的数量 B 是多少,每个网格单元只预测的一组类别概率。

在测试时,我们乘以条件类概率和单个盒子的置信度预测值
在这里插入图片描述

这些分数表示该类出现在框中的概率以及预测框拟合目标的程度。

Network Design

为了在 VOC 上评估 YOLO,使用 S=7,B=2。VOC 有 20 个标注类,所以 C=20。所以最终的预测是 7×7×30(30=2*5+20) 的张量。
在这里插入图片描述
使用卷积层从图像中提取特征,全连接层预测输出概率和坐标。

检测网络受GoogleNet影响,有 24 个卷积层,其次是 2 个全连接层

先将ImageNet图像分辨率转为224x224,输入网络进行预训练,然后转换模型进行检测任务。

yolov1在训练时输入的图像分辨率为224×224,在预测时使用的图像为 448×448。

最后一层预测类别概率和边界框坐标。通过图像的宽高来归一化边界框的宽度和高度及x,y,使它们落在 0 和 1 之间。

我们对最后一层使用线性激活函数,所有其它层使用下面的leaky ReLU 激活函数

我们使用平方和误差是因为它很容易进行优化,但是它并不完全符合最大化平均精度的目标。

分类误差与定位误差的权重是一样的,这可能并不理想。

另外,在每张图像中,许多网格单元不包含任何对象。这将导致这些单元格的“置信度”为零,这可能导致模型不稳定。为了改善这一点,我们增加了边界框坐标预测的损失,并减少了不包含目标边界框的置信度预测的损失

平方和误差也可以在大box和小box中同样加权误差。我们的误差指标应该反映出,大box中 小偏差的重要性不如小box中小偏差的重要性。为了部分解决这个问题,我们直接预测边界框宽度和高度的平方根,而不是宽度和高度。

YOLO 每个网格单元预测多个边界框。在训练时,每个目标我们只需要一个边界框预测器来负责。我们根据哪个预测器的预测值与真实值之间具有当前最高的 IOU 来指定哪个预测器“负责”预测该目标。

这导致边界框预测器之间的专一化。每个预测器可以更好地预测特定大小、长宽比或目标的类别,从而改善整体召回率。

如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类误差。如果预测器“负责”真实边界框(即该网格单元中具有最高 IOU 的预测器),则它也仅惩罚边界框坐标误差

为了避免过度拟合,我们使用 dropout 和大量的数据增强。

Inference

与训练时一样,预测测试图像的检测只需要一次网络评估。在VOC 上,每张图像上网络预测 98 个边界框(图像被划分成 7*7 的格子,每个格子预测两个边界框,总共 98 个边界框)和每个框的类别概率。YOLO 在测试时非常快,因为它只需要运行一次网络评估.

网格强化了边界框预测中的空间多样性。然而,一些大的目标或靠近多个网格单元边界的目标可以被多个网格单元很好地定位。非极大值抑制(NMS)可以用来修正这些多重检测。

在得到推理结果后,如何获取我们真正想要的信息呢?

yolo后处理就是模型的输出进行处理,得到我们想要的坐标框的 x y w h xywh xywh以及 c o n f i d e n c e confidence confidence
在这里插入图片描述
学习笔记

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdB1sYQ4-1670143551092)(https://gitee.com/lizheng0219/picgo_img/raw/master/img2/image-20221204163144547.png)]

这是yolov1的模型,他将图像划分成了7x7个网格,每个网格负责预测两个边界框,每个边界框都有5个信息$x、y、w、h、confidence $ ,(这个confidence是该区域有目标框的概率),共预测20个类,每个类都有一个置信度信息(这个confidence是这个框是猫是狗的概率),所以最终输出为 7 ∗ 7 ∗ 30 7*7*30 7730

在这里插入图片描述

然后每个边界框的confidence 乘以所有类别的confidence就是边界框的全概率

这样每个grid cell都能有两个20维向量,一共49个grid cell,所以共有98个向量


这些向量就组成如下的很多边界框
在这里插入图片描述
下一步就是筛选出真正的边界框

第一步:这张图片上并不是有20个类的,所以先有个阈值将大于这个阈值的类别筛选出来,比如筛选出了dog、bicycle、car
然后分别对这三个类处理,比如先对dog,从dog类的所有96个置信度进行从大到小排个序,设置一个阈值,confidence小于这个阈值的就被舍去了。

但确实还有真正包含某个物体的多个框,比如下面四个bbox的置信度都比较大,那怎么从这多个框中选择最合适的呢?

下面就是非极大抑制NMS
在这里插入图片描述
应该先将置信度最大的拿出来,然后后面的每一个都与第一个最大的作比较,如果IOU大于某个阈值,则认为两个识别了同一个物体,则把低置信度的那个抑制掉。比如bbox20和bbox47重合度较大,所以认为两个是同一物体。

如果IOU小于这个阈值,就说明两个框不是识别的同一个物体,保留。bb15和bb7与bb47的重合度较小,所以认为两个box不是同一个物体。
在这里插入图片描述

然后选取剩下的第二大置信度作为基box,其他框再与这个框比较,比如bb7和bb15重合度较大,认为这两个box内是同一个物体。
在这里插入图片描述

合适的阈值下可能只留下一个框,当然某些阈值下可能会保留更多的框,阈值的设置应该是根据目标任务设置的,越高的阈值(越不容易置零,即越宽容)会检测出越多的目标。

对其他类别也是同样操作,就得到了所有的目标框。

当然注意,在训练阶段是不需要剔除框的,所有框对我们反向传播参数更新都是有用的,只是在推理阶段需要这样做。

how to train

每个grid cell 预测两个bbox,但只负责预测一个物体,也就是整张图片最多预测49个物体,这也就是为什么yolov1对密集小目标检测效果不好的原因。
在这里插入图片描述

LOSS

在这里插入图片描述

在这里插入图片描述
yolov1的损失函数分为三部分

  • 第一部分是负责检测物体的bbox中心点定位误差以及宽高误差
  • 第二部分是负责检测物体的bbox的confidence误差和不负责检测物体的bbox的confidence误差
  • 第三部分是负责检测物体grid cell分类误差

Limitations

  • YOLO 对边界框预测强加空间约束,因为每个网格单元只预测两个框,只能有一个类别。这样就限制了模型可预测的邻近目标的数量。因此对物体较为密集的场景预测效果较差。

  • 模型学习从数据中预测边界框,因此它很难泛化到新的、不常见的长宽比或配置中的目标。

后面是模型比较,yolov1和其他模型比有什么优缺点就不说了

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

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

相关文章

SpringMVC(九):作用域传参

文章目录 作用域传参 一、传统方式传递数据 二、使用Model传递数据

PHP反序列化与SESSION

php存储session的三种模式php_serialize&#xff08;php>5.5.4&#xff09; 经过serialize()函数序列化数组 php 键名竖线经过seralize()序列处理的值 php_biary 键名的长度对应ASCII字符键名serialize()序列化的值 测试代码 <?php //ini_set("sessi…

cubeIDE开发,在LCD显示摄像头抓取的图片数据

一、摄像头相关资料信息 在LCD上显示当前camera的图像数据&#xff0c;类似我们前面提到的LCD显示图片数据&#xff0c;就是实时将摄像头抓取的视频数据帧&#xff08;图片&#xff09;转换成图片字码表&#xff0c;即LCD宽*LCD高像素大小的颜色点阵&#xff0c;然后推送到LCD接…

(三) Spring Security Oauth2.0 源码分析--认证中心全流程分析

一 引言 Spring Security Oauth2.0 的认证中心可以简单的理解为是对Spring Security的加强,也是通过FilterChainProxy(其原理可参考前面的Security源码分析)对客户端进行校验后在达到自定义token颁发站点,进行token的颁发,具体流程如下: 用户发起token申请请求(‘/oauth/to…

ARM异常处理(4):SVC和PendSV的作用详解

SVC(Supervisor Call)和PendSV(Pendable Service Call)是针对软件和操作系统的两个异常。 1 SVC SVC用于生成系统函数调用&#xff0c;例如&#xff0c;用户程序不允许直接访问硬件&#xff0c;操作系统可以通过SVC提供对硬件的访问。因此&#xff0c;当用户程序想要使用某些…

STC 51单片机56——摇摇棒

主要代码&#xff1a; //增减图像时&#xff0c;需要修改 switch_show&#xff08;&#xff09;和 H对应参数 //所用单片机&#xff1a;STC15W408S 内部Rc 11.0592MHz #include <STC15.H> #include <intrins.h> #define POSITIVE 0 #define OPPOSE 1 //sbi…

Vector-常用CAN工具 - CANoe入门到精通_02

​咱们话接上回&#xff0c;前面已经介绍了CANoe的基本信息和硬件环境搭建&#xff0c;下面我们就要打开CANoe&#xff0c;配置CANoe工程了&#xff0c;只有完成了CANoe工程配置才能真正的使用CANoe完成测试&#xff0c;本次主要介绍的是手工测试环境&#xff0c;至于自动化测试…

[附源码]Python计算机毕业设计SSM教师职称评定系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【OpenCV学习】第5课:图像模糊(均值滤波,高斯滤波)

参考文章链接:https://blog.csdn.net/qq_30460949/article/details/121990114 仅自学做笔记用,后续有错误会更改 理论 1.Smooth/blur是图像处理中最简单和常用的操作之一 2.使用该操作的原因之一就是为了给图像预处理的时候减低噪声 3.使用Smooth/Blur操作其背后是数学的卷积…

ContentProvider与ContentResolver

目录&#xff1a;一、什么是ContentProvider&#xff1a;二、如何使用ContentProvider&#xff1a;第一步.创建类继承ContentProvider&#xff1a;第二步.注册ContentProvider&#xff1a;三、URI&#xff1a;1.常用方法&#xff1a;2.解析URI&#xff1a;&#xff08;1&#x…

Android Gradle 学习笔记(二)环境安装

1. 官网安装 Gradle 安装地址&#xff1a;Gradle | Installation 最新的 Gradle 版本是 7.6&#xff0c; 需要 Java 8及以上的版本支持&#xff0c;官网有两种版本可下载&#xff1a; 二进制版本完全版本&#xff08;源码 文档&#xff09; 一般情况下&#xff0c;下载二进…

助力企业降本增效,「WorkPlus SE专业版」正式发布!

移动互联网时代&#xff0c;数字化成为了企业提质降本增效的价值路径。大中小型企业积极主动地借助各种在线办公产品&#xff0c;实现沟通协作和运营管理的优化升级。 随着企业规模的扩大和办公业态多样化发展&#xff0c;会面临着业务流程繁杂、数据利用率低、IT成本高、泄密…

RFID警用装备管理系统-公安警用装备管理可视化系统

一、方案背景 我国警用装备物资种类多、数量大、价值高&#xff0c;还包含枪支、弹药、爆炸物等需要重点监管的物资&#xff0c;在公安机关应对紧急情况、处理突发事件过程中发挥了极为重要的作用。但是&#xff0c;由于缺乏有效的信息化管理手段&#xff0c;还存在管理方式落后…

Tealium 分析

文章目录1.0 调用流程1.1 初始化流程1.2 发送数据流程2.0 Tealium 的设计2.1 总体设计2.1.1 Tealium Core2.1.2 Visitor2.1.3 Crash reporter2.1.4 Ad identifler2.1.5 Lifecycle2.1.6 Location2.1.7 InstallReferrer2.1.8 Hosteddatalayer2.1.8 Dispatcher2.2 网络设计2.3 本地…

黄菊华老师,Java Servlet毕业设计毕设辅导课(4):Servlet 实例

Servlet 实例 Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet&#xff0c;并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求。 Hello World 示例代码 下面是 Servl…

为什么工业设计公司价格这么高?

随着经济的不断增长&#xff0c;各种工业设计公司逐渐出现&#xff0c;但价格不同&#xff0c;有些价格高&#xff0c;有些价格低&#xff0c;让一些人到处比较价格&#xff0c;低价格压低别人的高价格。有些人会想&#xff0c;为什么工业设计公司在设计产品时价格这么高&#…

ORB-SLAM2 ---- Tracking::UpdateLastFrame函数

目录 1.函数作用 2.步骤 3.code 4.函数解释 4.1 利用参考关键帧更新上一帧在世界坐标系下的位姿 4.2 对于双目或rgbd相机&#xff0c;为上一帧生成新的临时地图点 1.函数作用 更新上一帧位姿&#xff0c;在上一帧中生成临时地图点。 单目情况&#xff1a;只计算了上一帧…

【富文本编辑器】简记功能:neditor上传操作时提交额外数据

目录 编辑器下载&#xff08;本文使用版本v2.1.19&#xff09; 功能需求 解决思路 相关代码 调用实例的html neditor.config.js&#xff08;搜索修改内容&#xff1a;/* 设置额外请求参数 */&#xff09; 完成&#xff0c;如有其它方法&#xff0c;欢迎一起讨论 编辑器下…

使用 Fluent Bit 实现云边统一可观测性

本文基于 KubeSphere 可观测性与边缘计算负责人霍秉杰在北美 KubeCon 的 Co-located event Open Observability Day 闪电演讲的内容进行整理。 整理人&#xff1a;米开朗基杨、大飞哥 Fluent Operator 简介 2019 年 1 月 21 日&#xff0c;KubeSphere 社区为了满足以云原生的方…

NX上配置TLD的环境---对opencv的版本没有要求

一、TLD工程编译及运行 1.1 源码下载 网上的TLD有两个版本&#xff0c;一个是Zdenek Kalal自己使用matlabvs混合编程实现的&#xff0c;另外一个是 arthurv利用c和opencv实现的。 我利用的是arthurv版本的Tracking-Learning-Detection 连接&#xff1a;https://github.com/al…