【目标检测】YOLO系列-YOLOv1 理论基础 通俗易懂

news2024/11/23 13:03:28

       为方便大家理解YOLO的原理,这里将YOLOv1的部分内容基础内容进行用比较直白的话和例子进行阐述,为后续大家学习YOLO作为铺垫。

1、模型所干的活

       工作中,大家经常将 Word 文档 上传到某转换器,然后转换输出为PDF文档。目标检测中我们想做的事也类似,就是输入一张图,输出一张带有框(标注对应的物体)的图片 。如下图所示:

问题:这个框是如何还出来的呢?通过模型画出来的,这模型就相当于 word到pdf的转换器。 如下图:

进一步理解,需要不断调试,不断计算损失,看看在哪个位置画框最合适。

这个模型其实就是经常所说的网络的模型。如下图:

2、相关概念

      在网络中,一切都是以数据形式存在的,更具体是以“数组”的形式存在。 

      在目标检测学习过程中,我们提到“物体”落在某个“格子”中 ,就由那个格子负责,这里的物体指的是什么,格子指的又是什么?

     下图是算是“经典”示例图了,
      当我们看到图中物体“狗”时,我们说的时“狗这个区域”如何如何,是为了便于直观的理解。但是反映在程序中,这张图片是一个多维数组(三维,长度、宽度和通道),所以在程序中,狗这个区域是用三维数组中的数值体现的。而这里所说的区域,是另一类任务即分割

         在目标检测中,我们谈“物体”又是什么呢?就是目标框,如下图所示,我们说到物体,本质还在说这个框,因为我们需要的也正是这个框。而这个框反映在程序中,是这框的四个顶点(坐标),在程序中我们由四个顶点也就确定了这个框。或者用这个框的另一种表示: (x, y, w, h),x和y表示这个框的中心点坐标,w和h表示图片的宽高。

        所以,当我们谈物体的时候,是在谈框(包围物体的框即包围框),换句话说就是在谈四个顶点,**(x, y, w, h)**

       当我们提到“格子”的时候,先了解一下下面内容。假设下面的图片是我们用来训练的图片,即图片已经提前人工进行标记好中心点和图片宽高,人工标记好的图片中心点是(85,176),宽高是(115,232),我们的图片大小是256*256,即像素点是25*256个像素点。

        现在将每个像素点作为一个中心点画一个框,然后让这个中心点所在的框和人工标记的中心点所在的框进行计算,判断是不是人工标记的中心点所在的框,因此需要遍历并计算和判断256*256次。目前我们判断的只是一个物体(即人工标记的中心点所在的框)就需要256*256次。

       刚刚我们判断的只是一个物体(即人工标记的中心点所在的框),而实际过程中则一个图片中可能有多个物体(即人工标记的中心点所在的框),如下图所示,有3个物体(即人工标记的中心点所在的框),我们就需要3*256*256次。如果有n个物体,则需要判断 n*256*256。

       此时我们是 为每个像素点画一个框,就这么多的计算,如果每个像素点画多个框(假如是3个框,则需要3*3*256*256),计算量会直线上升。同时在实际中图片往往会更大,如2560*1440,此时计算量非常庞大。

        上面这种方式,就类似于我们在成都内找一个人一样,一个坐标一个坐标的找,花费的时间就很多。

        为减少找人时间,我们可以将成都按区划分,例如高新区、开发区、武侯区、青羊区、锦江区、温江区、金堂县、双流区、金牛区、成华区等不同区,通过这个区,也就知道一个人的大概位置了。

        同理,为了减少计算量,我们将图片进行分区,我们将图片分成 7*7=49个区。这些就是我们所说的格子。我们将每个格子做为一个中心点画框,然后再和人工标记好的图片中心点(85,176)所在的格子所在的框进行计算,因此需要遍历并计算和判断7*7,如果是多个物体 n,则需要遍历n*7*7次。

3、数据的表示方式

      前面提到在网络中,一切都是以数据形式存在的,更具体是以“数组”的形式存在。

      那么 “狗”  即中心点所在的框如何用数据表示呢?

      在YOLO的论文中,作者将分类分为了20类,例如人、猫、狗、车、自行车等等,并且为每个分类给一个标记分别记作1、2、3、4、5......20,如下面所示:

自行车......
1234520

        对于上图的狗,我们知道狗即中心点所在的框“落”在其中一个格子(区域)中,那么我们这里也就确定了狗在哪了。比如下图,我们给狗所在的格子赋值为它的类别3,也就是说狗和3这个值一一对应,其他物体再赋一个别的值,自然实现了区分。(为什么要赋值?因为在程序中一切都是数据,我们用3表示狗,回头预测的时候,在把3还原成“狗”这个汉字,也就好了)

       那么狗(中心点)所在的格子我们如何用数据表示呢?

      我们用长度为20的向量表示类别,而狗即中心点所在的框是人为标记的,表示属于狗这个类别,那么在狗所在的类别3的位置上记作为1,其他记0,即物体类别的one-hot编码,如下图中的蓝色部分。同时增加中心点坐标和宽高以及置信度p(表示这个是狗的概率)五个数据。

       因此狗(即中心点所在的框)的数据,可以用上图方式表示,向量长度为25。 在论文中,作者会预测两个框(即2个中心点),每个框和真值计算IoU,结果大的代表我们预测的物体。两个框的数据长度是30,形式如下:

4、损失函数

       现在我们知道了目标图片即人工标记的图片和标签所对应的形式(x,y,w,h,p,x,y,w,h,p,0,0,1,0,....,0),假如下图中标签的真实值是:(85,176,232,115,1,84,172,230,156,1,0,0,1,0,....,0),此处的红色 表示有物体,如果是0表示无物体。

       现在我们把需要检测的图片输入给模型,模型则会输出预测的值,蓝色和绿色分别代表两个预测的框:(84,175,234,116,0.98,83,173,231,154,0.94,0,0,1,0,....,0),此处的0.98和0.94表示的是两个框有物体(即包含中心点所在的格子)的概率。

       我们用这个预测值和真实值进行计算点坐标的差距(损失),长宽差距(损失),还有预测的概率,以及类型的差距(损失)。

        对于标签,我们将数据组织如下形式,没有物体,所有值为0,有物体值为对应的值。如下图所示 :

       对于有物体来说,我们需要计算中心点坐标的差距(损失),长宽差距(损失),还有预测的概率,以及类型的差距(损失)。
       我们这里的计算单元是格子,即每个格子中是否物体。作者论文中将图片划分成S×S的格子,S为7。因为格子分为有物体(即格子中有目标值的中心点)和没有物体两种情况,所以损失也分为两种情况

       一张图片一般含有少数的物体。如上图的狗图片,含有狗、自行车、汽车三种物体。而我们的格子有49个。所以对于有物体和没有物体损失的权重不一样的。没有物体设置一个小的权重有物体设置一个大一点的权重。如图:


格子有物体的损失

       有物体的损失需要将坐标损失、长宽损失、置信度损失、类别损失四项相加:

格子没有物体的损失

       没有物体我们只需要计算置信度损失即可。

5、数据处理

     通过前面的讲解,我们大概知道了整体的思路和相关概念,那么我们你在训练模型的时候,为了方便数据计算,常将数据进行归一化。

图片对应的数据归一化:我们可以简单粗暴的将值除以255,缩放到0-1之间。

标签归一化:对于类别,我们采用one-hot编码归一化,对于置信度(或者说概率)采用0或1归一化,物体(中心点所在框)的x,y,w,h中,w,h除以图片的长宽即可。对于x,y同样可以除以图片的长宽。但是一般采取更巧妙的办法即局部坐标变换与缩放:原始的xy是相对于原点(图片左上角),我们将其变换到相对于所在格子的左上角(可以理解为坐标变换),然后除以格子的长宽即可。

6、部分说明

       这里的p只是一个数字的表示,例如在在人工标记阶段,p=1包含物体,或p=0不包含物体。举个例子如标签的真实值(85,176,232,115,1,84,172,230,156,1,0,0,1,0,....,0)中p=1。而预测值中p表示包含物体的概率如(84,175,234,116,0.98,83,173,231,154,0.94,0,0,1,0,....,0)中p=0.98 或p0.94。如下图:

 

      置信度则是:  C=(1-0.98)**2  * IOU

    

深入学习通道:https://blog.csdn.net/qq_41946216/article/details/132733387

参考:https://blog.csdn.net/weixin_39190382/article/details/130336487?spm=1001.2014.3001.5502

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

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

相关文章

认识rust中闻风丧胆生的命周期,不用过于担心,它对于所有人都是平等的

生命周期&#xff0c;简而言之就是引用的有效作用域。在大多数时候&#xff0c;我们无需手动的声明生命周期&#xff0c;因为编译器可以自动进行推导&#xff0c;用类型来类比下&#xff1a; 就像编译器大部分时候可以自动推导类型 <-> 一样&#xff0c;编译器大多数时候…

Rust Tracing 入门

Tracing 是一个强大的工具&#xff0c;开发人员可以使用它来了解代码的行为、识别性能瓶颈和调试问题。 Rust 是一种以其性能和安全保证而闻名的语言&#xff0c;在它的世界中&#xff0c;跟踪在确保应用程序平稳高效运行方面发挥着至关重要的作用。 在本文中探讨Tracing 的概…

4K Video Downloader v4.30.0.5644 一款专业级的4K视频下载器

4K Video Downloader 中文破姐版 本站所有素材均来自于互联网&#xff0c;版权属原著所有&#xff0c;如有需要请购买正版。如有侵权&#xff0c;请联系我们立即删除。

Multiscale Vision Transformers

1、引言 论文链接&#xff1a;https://arxiv.org/abs/2104.11227 Haoqi Fan[1] 等通过在 ViT[2] 中引入多尺度特征层次结构&#xff0c;提出了一种用于视频和图像识别的 Multiscale Vision Transformers(MViT)[1]。在视频识别任务中&#xff0c;它优于依赖大规模外部预训练的视…

react 基础学习笔记一

1、jsx语法过程 jsx使用react构造组件&#xff0c;通过bable进行编译成js对象&#xff0c;在用ReactDom.render()渲染成DOM元素&#xff0c;最后再插入页面的过程。 2、创建组件 组件的定义&#xff1a;将公用的代码组装成一个独立的文件&#xff0c;保持代码独立性&#xff0…

【QT学习】9.绘图,三种贴图,贴图的转换

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

使用VPN后,浏览器访问不了国内地址解决办法

winR输入regedit 打开注册表 找到路径 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings删除两个proxy代理

【Android】 四大组件详解之广播接收器、内容提供器

目录 前言广播机制简介系统广播动态注册实现监听网络变化静态注册实现开机自启动 自定义广播发送标准广播发送有序广播 本地广播 内容提供器简介运行时权限访问其他程序中的数据ContentResolver的基本用法读取系统联系人 创建自己的内容提供器创建内容提供器的步骤 跨程序数据共…

JavaSE:抽象

一&#xff0c;抽象是什么&#xff0c;抽象和面向对象有什么关系 抽象&#xff0c;个人理解&#xff0c;就是抽象的意思 我们都知道面向对象的四大特征&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;抽象 为什么抽象是面向对象的特征之一&#xff0c;抽象和面…

Aigtek功率放大器电路的主要作用是什么

功率放大器是电子电路中的一个重要组成部分&#xff0c;它的主要作用是将输入信号的能量放大到更大的幅度&#xff0c;以便驱动负载或传输信号。功率放大器广泛应用于各种领域&#xff0c;如音频放大器、射频放大器、通信设备、无线电设备等。下面我们将详细介绍功率放大器电路…

【NOI】C++算法设计入门之深度优先搜索

文章目录 前言一、深度优先搜索1.引入2.概念3.迷宫问题中的DFS算法步骤4.特点5.时间、空间复杂度5.1 时间复杂度 (Time Complexity)5.2 空间复杂度 (Space Complexity)5.3 小结 二、例题讲解1.问题&#xff1a;1586 - 扫地机器人问题&#xff1a;1430 - 迷宫出口 三、总结四、感…

Rust 使用结构体组织相关联的数据

目录 结构体的定义和实例化 使用字段初始化简写语法使用结构体更新语法从其他实例创建实例使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体结构体示例程序 通过派生 trait 增加实用功能方法语法 定义方法带有更多参数的方法关联函数多个 impl 块本文有…

日志

日志服务管理 在现实生活中&#xff0c;记录日志也非常重要&#xff0c;比如银行的转账记录&#xff0c;飞机上的黑盒子&#xff0c;那么将系统和应用发生的事件记录至日志中&#xff0c;以助于排错和分析使用日志记录的内容包括&#xff1a; 历史事件&#xff1a;时间&#…

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程&#xff0c;涉及多个方面和阶段。以下是一些关键步骤和考虑因素&#xff0c;帮助你制定一个有效的产品运营规划&#xff1a; 1、明确产品定位和目标用户&#xff1a; 确定产品的核心功能、特点和优势&#xff0c;明确产品在市…

向量的点积和叉积的几何意义

1. 点积 点积(dot product)&#xff0c;又称标量积&#xff08;scalar product&#xff09;。结果等于。 可用于 判断的是否垂直求投影长度求向量是抑制作用还是促进作用计算两个向量的夹角 2. 叉积 叉积(cross product)&#xff0c;又称为向量积(vector product)。模长等…

【C++类和对象】日期类的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

【深度学习实战(21)】使用thop.profile计算模型的FLOPs和Params

一、 含义 FLOPs&#xff08;计算量&#xff09;&#xff1a;注意s小写&#xff0c;是floating point operations的缩写&#xff08;这里的小s则表示复数&#xff09;&#xff0c;表示浮点运算数&#xff0c;理解为计算量。可以用来衡量算法/模型的复杂度。 Params&#xff08…

Dubbo应用可观测性升级指南与踩坑记录

应用从dubbo-3.1.*升级到dubbo-*:3.2.*最新稳定版本&#xff0c;提升应用的可观测性和度量数据准确性。 1. dubbo版本发布说明(可不关注) dubbo版本发布 https://github.com/apache/dubbo/releases 【升级兼容性】3.1 升级到 3.2 2. 应用修改点 应用一般只需要升级dubbo-s…

第53篇:算法的硬件实现<四>

Q&#xff1a;本期我们在DE2-115开发板上实现二进制搜索算法电路&#xff0c;查找数据A在数组中的位置。 A&#xff1a;使用SW[9]设定开始查找信号&#xff0c;数据A由SW[7:0]设定&#xff0c;KEY[0]设定为复位信号&#xff0c;板载50MHz时钟作为电路的时钟输入&#xff0c;确…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…