首页 > 其他分享 >yolov1基础精讲

yolov1基础精讲

时间:2024-07-09 09:28:42浏览次数:13  
标签:概率 yolov1 精讲 基础 cell grid bounding 物体

目标检测是理解图像内容的基础,它涉及识别图像中的一个或多个对象,并确定它们的位置。
YOLOv1将目标检测视为一个单一的回归问题。它将整个图像分割成一个个网格,每个网格负责预测中心点落在该网格内的目标对象。
YOLOv1的架构基于卷积神经网络(CNN),它通过一个单一的网络流程来预测多个边界框和类别概率。网络的输入是一张图片,输出是多个边界框的坐标、置信度以及类别概率。(yolov1的损失函数很重要)

目录

一. yolov1推理过程

1. 网络框架

2.输出结果分析

3.后处理

二、yolov1训练过程

1. grid cell存在物体与不存在物体

2. 损失函数

一. yolov1推理过程

1. 网络框架

YOLOv1的网络结构是一个24层(可以数一下,池化层不算)卷积层+2层全连接层的深度卷积神经网络。24层卷积层提取特征,2层全连接层回归得到7x7x30的tensor。
网络的输入是一个448x448x3(将彩色图片缩放成448x448)的图片,经过若干卷积核池化层,得到了一个7x7x1024的feature map。
将这个feature map拉平,输入到一个4096维的全连接层中,得到一个4096维的向量,再将这个向量输入到一个1470维的全连接层中,得到一个1470维的向量。经过reshape得到7x7x30。

YOLOv1的输出是一个7x7x30的张量,其中7x7表示输入图像被划分的网格数,每个网格负责预测该区域内的目标。每个网格输出30个预测值,包括边界框的坐标、置信度以及类别概率。如图所示:

2.输出结果分析

yolov1先将图片分成7x7的grid cell,每个grid cell生成两个预测框bounding boxes,两个预测框的中心点落在所属的grid cell中。每个预测框包含5个信息(该框中心点的坐标x,y 框高宽h,w 以及一个判断该框是否包含对象的置信度)。图中用框的粗细代表置信度大小。
每个grid cell还生成组条件类别概率,即假设包含对象的前提下是某个物体的概率。将每个框中的bounding box的置信度乘以条件类别概率(每个grid cell的bounding box共享这组类别概率)就得到了grid cell的各类别概率。

yolov1输出7x7x30的向量,也就是7x7x(2x5+20)。2代表每个grid cell生成两个预测框,5代表每个预测框包含五个信息。20代表20个类别。下图展示了每个grid cell条件概率最高的那些类别。
 

每个grid cell只能预测出1个物体,yolov1最多只能预测7x7=49个物体。这也是yolov1检测小目标和密集目标效果差的原因。

如图所示,yolov1的输出的通道内容为右边的长条。前面两个长度为5的线段是每个grid cell预测的两个bounding boxes,每个bounding box包含5个内容。后面的20为类别的概率。

每个bounding box的置信度乘以包含物体条件下各个物体类别(20个物体)的概率就是真正类别的概率。每个grid cell有两个bounding boxes,所以有7x7x2=98个20维的向量。

3.后处理

在之前的输出结果分析中已经知道了最终能得到7x7x2=98个bounding boxes,类似于中间的结果。那么怎么得到最后的检测结果呢,肯定是要进行一些后处理来去除重复和不必要的预测结果。

有98个20维的向量,假设第一维的类别是狗,首先设定一个阈值进行筛选,比如将阈值设为0.2,狗的概率中小于0.2的置0,然后将这98个向量按照狗的概率进行从大到小排序,此时0在最后面。

之后就要进行非极大值抑制了,如下图。

排序之后,第一个检测狗的概率值是最大的。此时计算后面每一个bounding box分别与第一个的IOU,设置一个阈值(比如0.5),如果大于这个阈值说明识别到的是同一个东西,就将概率小的那个概率置0,如果小于就保留其概率值。

之后开始下一轮比较,概率第二大的(原本是bb20,置0后变成bb25第二大)与后面的每一个的IOU进行进行比较,根据之前的阈值决定是否置零0.

所有的非0概率的IOU比较完之后,就得到了98个bounding box中检测到狗的非0概率的那些框。假如有两个非0(一般这样操作过后非0很少),那么说明检测到了两只狗。

之后对所有类别进行重复操作。
(注意只有推理过程中需要NMS非极大值抑制,训练过程不用!因为训练过程需要每一个bounding box的信息作损失)

二、yolov1训练过程

1. grid cell存在物体与不存在物体

yolov1每个grid cell产生两个bounding boxes。

当label的中心点落在该grid cell时(代表该grid cell检测到物体),训练中利用其中与label的IOU最大的那个bounding box进行拟合。如上图所示,产生两个框,利用与label的IOU最大的进行拟合(就是外面那个大框)。

当没有label的中心点落在该grid cell时,此时只需要让这两个框的置信度逼近0就好(损失函数会解释),如上图所示。

2. 损失函数

上图是别人批注好的yolov1损失函数,主要分为五个部分。

图中最左列已经将五项损失说的很清楚了,接下来介绍一下需要关注的细节。

  1. 首先是右上角的注释,红框中的项代表该bounding负责检测物体时为1,否则为0。而绿框中的项与其相反。通过选择性地计算损失,模型既能学习到哪些地方存在物体,也能学习到哪些地方不存在物体。并且不存在物体的权重较低,模型可以更专注于那些对于提高整体性能更关键的预测。
  2. 其次是第二项中的w和h都用了根号,这是因为当w和h很小时,根号可以让两者各自的差放大(比如0.16开根号后是0.4,变大了),可以让模型更关注。
  3. 第三项中的置信度标签值是预测框与标签框的IOU,每次都会变化代表这个框包含物体的概率。
  4. 最后是右上角的蓝框,代表是否包含物体。这样当grid cell中不包含物体时,不用计算这一项;包含物体时,两个bounding boxes的这一项是一样的。

标签:概率,yolov1,精讲,基础,cell,grid,bounding,物体
From: https://blog.csdn.net/weixin_44115575/article/details/140279202

相关文章

  • JAVA基础-----128陷阱
    一、何为128陷阱Java中Integer类型在使用==比较时的特殊行为------128陷阱,解释了当数值在-128到127范围内,由于valueOf方法的缓存机制导致地址相同,比较为真;超出这个范围则新分配内存,地址不同,比较为假。可以预测一下下面程序的输出结果:答案在最后后面!二、造成该现象的原因......
  • ip和端口基础知识
     TCP/IP体系结构-网络通信的基础 HTTP协议-网站访问的基础 其他协议-HTTPS、ARP、ICMP、DNS①什么是ip地址 <1>IP地址是电子设备在互联网上的唯一标识 <2>用来在互联网中寻找电脑②内网ip和公网ip <1>内网ip:路由以内的网络,可以连接互联网,但是互联网无法直接......
  • Stable diffsuion基础篇(补充)
    前言:补充一些前面没有记录的知识点,比较琐碎但是又算是基础的一部分。一、SDXL大模型1.sdxl和sd1.5的区别1.模型组合不同sd1.5的生成模型是一个,sdxl的生成模型是两个,可灵活结合出图基础模型:base模型(负责潜空间放大)精修模型:refiner模型(负责细化放大)2.训练参数不同1.1.5......
  • Scala的基础知识点
    scala特点Scala介绍Scala是把函数式编程思想和面向对象编程思想结合的一种编程语言大数据计算引擎Spark由Scala编写Scala特点多范式面向对象函数式编程兼容JAVA类库调用互操作语法简洁代码行短类型推断抽象控制静态类型化可检验安全重构支持并发......
  • 代码随想录刷题day 6 | 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交
    242.有效的字母异位词383.赎金信classSolution{//这里只给出了242的代码,赎金信的解法可以说是基本相同的publicbooleanisAnagram(Strings,Stringt){int[]map=newint[26];for(charc:s.toCharArray())map[c-'a']++;for(char......
  • Java [ 基础 ] Java 8以上新特性 ✨
    ✨探索Java基础Java8以上新特性✨Java8及以上的新特性Java8引入了一些重大更新和新特性,这些特性极大地增强了Java的功能和性能。随着Java9、10、11、12及以后的版本发布,Java持续引入更多的改进和新功能。本文将介绍Java8及以上版本的一些关键新特性。Java8新特......
  • docker基础
    Docker原理和概念镜像:类似于c++中的类,创建出一种具有独特属性的类容器:类似于c++中的实例化的对象仓库:储存镜像的地方,可以订阅别人创好的镜像,也可以上传自己的对象使用Client-Server架构模式,DockerClient和DockerDaemon之间,通过Socket或者RESTfulAPI进行通信安装配置......
  • 基础算法训练题单之排序(从入门到入土)——题解
    A.P1177【模板】排序三种方法:快速排序,归并排序,STL库的sort函数。法一、三:https://www.cnblogs.com/expect-999/p/17594345.html法二:https://www.cnblogs.com/expect-999/p/17599008.htmlB.P1923【深基9.例4】求第k小的数模板题目,直接对数组进行升序排序,如果数组从......
  • C++基础入门语法--代码基础框架
    文章内容概括:了解学习导入头文件、使用usingnamespacestd简化代码、创建程序基础框架、学习使用return(如需要直接复制请到文章最末尾)正文:1.学习导入头文件:    在Dev-C++编辑器中新建文件,在文件的第一行中输入:#include<iostream>    以上代码为C++导入......
  • 构建自己的docker基础镜像
    构建自己的docker基础镜像构建一个完全定制的基础镜像意味着您需要从一个非常小的镜像(例如scratch镜像)开始,然后逐步添加您需要的所有内容。scratch镜像是一个空白的基础镜像,可以用来创建高度定制的容器环境。创建一个基础镜像构建debian基础镜像准备根文件系统:要构......