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

       为方便大家理解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.mfbz.cn/a/559584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单点登录实现:一次登录,到处运行

单点登录:一次登录,到处运行 举个场景,假设我们的系统被切割为N个部分:商城、论坛、直播、社交…… 如果用户每访问一个模块都要登录一次,那么用户将会疯掉, 为了优化用户体验,我们急需一套机制…

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr 主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。 特征&#xff1a;图标识别 端口&#xff1a;8393 CVE-2019-0193&#xff08;远程命令执行漏洞&#xff09; 漏洞版本&#xff1a;Apache Solr < 8.2.0 利用条件&#xff1a; Apache Solr 的 DataImportHandler 启…

23-代码随想录第202题快乐数

202. 快乐数 简单 相关标签 相关企业 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

【C语言】指针详解(五)

目录 1.字符指针 1.1常量字符串 2.指针数组 3.数组指针 1.字符指针 字符指针就是指向字符的指针&#xff0c;字符指针可以存储字符变量的地址。 举例如下&#xff1a; 定义指针变量pa存a的地址&#xff0c;改变*pa的值&#xff0c;a也会随之改变 。 1.1常量字符串 &#x1f…

电机控制专题(一)——最大转矩电流比MTPA控制

文章目录 电机控制专题(一)——最大转矩电流比MTPA控制前言理论推导仿真验证轻载1Nm重载30Nm 总结 电机控制专题(一)——最大转矩电流比MTPA控制 前言 MTPA全称为Max Torque Per Ampere&#xff0c;从字面意思就可以知道MTPA算法的目的是一个寻优最值问题&#xff0c;可以从以…

PTA L2-047 锦标赛

题目 解析 把每一场比赛看作满二叉树的一个节点&#xff0c;父节点递归遍历子节点的结果&#xff0c;进行试填。 代码 #include <bits/stdc.h>using i64 long long;struct Node {int win, lose; };void solve() {int k;std::cin >> k;int siz (1 << k);…

Llama 3王者归来,可与GPT-4分庭抗礼,开源模型即将追上闭源模型了?

“有史以来最强大的开源大模型”Llama 3引爆AI圈&#xff0c;马斯克点赞&#xff0c;英伟达高级科学家Jim Fan直言&#xff0c;Llama 3将成为AI大模型发展历程的“分水岭”&#xff0c;AI顶尖专家吴恩达称Llama3是他收到的最好的礼物。 4月18日&#xff0c;AI圈再迎重磅消息&a…

一例Mozi僵尸网络的挖矿蠕虫分析(workminer)

概述 这是一个Linux平台的挖矿蠕虫&#xff0c;使用了go和C混合编译而成&#xff0c;主要通过爆破SSH口令进行传播&#xff0c;属于Mozi僵尸网络。其中GO代码负责SSH相关的爆破传播&#xff0c;以及对Config的处理&#xff0c;C代码则负责处理加入Mozi P2P网络&#xff0c;拉取…

【游戏专区】贪吃蛇

1&#xff0c;游戏背景 贪吃蛇&#xff08;Snake&#xff09;是一款经典的电子游戏&#xff0c;最初在1976年由 Gremlin 公司开发。它的游戏背景相对简单&#xff0c;但具有高度的成瘾性。 1. **游戏场景**&#xff1a;通常在一个有界的矩形区域内进行&#xff0c;可以是一个…

设计模式—门面模式

定义: 门面模式,也称为外观模式&#xff0c;是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口&#xff0c;从而简化客户端与复杂子系统之间的交互。 在门面模式中&#xff0c;一个门面类充当中介&#xff0c;为客户端提供一个简化了的访问方式&…

【Gradio】Could not create share link

【Gradio】Could not create share link 写在最前面在服务器端一直运行一个Python脚本解决&#xff1a;下载frpc_linux_amd64文件&#xff0c;并添加权限原理 完整过程&#xff1a;先找gradio库位置&#xff0c;然后发现缺失文件1. 打开终端2. 使用 find 命令查找 gradio 目录3…

Codigger GT模块:GUI融合Terminal,重塑开发体验

在信息技术日新月异的今天&#xff0c;开发者与计算机系统进行交互的界面&#xff0c;其体验的优化与升级显得尤为关键。Codigger G&T正是应这一需求而生&#xff0c;它巧妙地将现代图形用户界面&#xff08;GUI&#xff09;的优势融入传统的Terminal中&#xff0c;为开发者…

基于Java SpringBoot+Vue的体育用品库存管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

链路加密技术:保护数据传输的盾牌

在数字时代&#xff0c;数据安全已经成为我们日常生活和工作中的重要议题。随着网络技术的飞速发展和信息量的爆炸式增长&#xff0c;数据的安全传输变得尤为重要。链路加密技术作为一种重要的网络安全措施&#xff0c;为数据的传输提供了强有力的保障。本文将深入探讨链路加密…

2024第十五届蓝桥杯 Java B组 填空题

声明&#xff1a;博主比较菜&#xff0c;以下均为个人想法。解决方法仅供参考。欢迎大家一起讨论交流&#xff01; 编程题在文末链接 第一题&#xff1a; 题目&#xff1a; &#xff08;简洁版&#xff09;从小到大排列是20或24倍数的正整数&#xff0c;前10个数依次是&…

C语言结课实战项目_贪吃蛇小游戏

目录 最终实现效果&#xff1a; 实现基本的功能&#xff1a; 根据游戏进程解释代码&#xff1a; 游戏初始化&#xff1a; 首先进入游戏&#xff0c;我们应该将窗口名称改为 “贪吃蛇” 并将光标隐藏掉。再在中间打印游戏信息。 之后我们要把地图打印出来&#xff1a; 然后…

【动态规划】C++简单多状态dp问题(打家劫舍、粉刷房子、买卖股票的最佳时机...)

文章目录 前言1. 前言 - 理解动态规划算法2. 关于 简单多状态的dp问题2.5 例题按摩师/打家劫舍 3. 算法题3.1_打家劫舍II3.2_删除并获得点数3.3_粉刷房子3.4_买卖股票的最佳时机含冷冻期3.5_买卖股票的最佳时机含手续费3.6_买卖股票的最佳时机III3.7_买卖股票的最佳时机IV 前言…

开源模型应用落地-chatglm3-6b-gradio-入门篇(七)

一、前言 早前的文章&#xff0c;我们都是通过输入命令的方式来使用Chatglm3-6b模型。现在&#xff0c;我们可以通过使用gradio&#xff0c;通过一个界面与模型进行交互。这样做可以减少重复加载模型和修改代码的麻烦&#xff0c; 让我们更方便地体验模型的效果。 二、术语 2.…

oracle 清空回收站

参考官方文档 select * from user_recyclebin; select * from dba_recyclebin; ---清除回收站中当前用户下的对象 purge recyclebin; ---清除回收站中所有的对象 purge dba_recyclebin; ---清除回收站中指定用户的表 PURGE TABLE owner.table_name; ---清除回收站中指…

精通MongoDB聚合操作API:深入探索高级技巧与实践

MongoDB 聚合操作API提供了强大的数据处理能力&#xff0c;能够对数据进行筛选、变换、分组、统计等复杂操作。本文介绍了MongoDB的基本用法和高级用法&#xff0c;高级用法涵盖了setWindowFields、merge、facet、expr、accumulator窗口函数、结果合并、多面聚合、查询表达式在…
最新文章