YOLO系列基础(六)YOLOv1原理详解,清晰明了!
系列文章地址
YOLO系列基础(一)卷积神经网络原理详解与基础层级结构说明-CSDN博客
YOLO系列基础(二)Bottleneck瓶颈层原理详解-CSDN博客
YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客
YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客
YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客
YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客
目录
系列文章地址
背景
YOLOv1的网络结构
YOLOv1原理的高层级理解
YOLO算法流程
YOLOv1原理详解
YOLOv1网格详解
针对每一个grid_cell
输出结构内容详解
YOLOv1损失函数详解
第一行损失函数详解
第二行损失函数详解
第三、四行损失函数详解
第五行损失函数详解
背景
随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚,本系列旨在从小白出发,给大家讲解清楚视觉检测算法的前世今生,并讲清楚YOLOv11版本算法的所有模块功能!
经过前面几个栏目的学习与掌握,我们已经具备理解和掌握YOLOv1的基本能力。今天,我们来精讲YOLOv1的原理!
YOLOv1的网络结构
YOLOv1网络结构图
YOLOv1的网络结构图很简单,主要的需要注意的点如下:
- 输入图像大小为448*448。
- 经过若干个卷积层与池化(具体是24个卷积层和4个最大池化层),变为7*7*1024张量(图一中倒数第三个立方体)。
- 最后经过两层全连接层,输出张量维度为7*7*30。
- 在第一个连接层之后,还有一层dropout层,其丢弃率设置为0.5。
- 除了最后一层使用了线性激活函数外,其余层的激活函数为 Leaky ReLU 。
这就是Yolo v1的整个神经网络结构。没有BN层等后续复杂的层级结构,在那个年代,神经网络还很清晰单纯……
下图为整个结构图的说明解释,官方给的图有点容易让人混淆了,特别是上面的立方体和下面的层不对应……也是有点无语了……
YOLOv1原理的高层级理解
如果一上来就把原理揉碎了开始长篇大论,个人感觉效果会很不好,听者也会云里雾里。所以我们先从YOLOv1的高层级理解开始,先给自己一个大致的感觉~
YOLOv1网络将输入的图片resize成480*480之后,再把这个图片分割为7*7的格网(也称grid_cell),如下图所示。想必大家都已经看腻下面的图片了吧(笑)。在代码中,下图的 S = 7。
在该图片中,假设我们需要检测狗、自行车、和白车。我人工标注了一下三个检测框和中心点。白色框框选狗,白色小圆圈标记框的中心点,以此类推……
YOLO算法流程
- 首先获取每一个检测框的中心点,也就是上图中的白色、红色、蓝色圆圈坐标。
- 获取到坐标之后,该坐标点对应的grid_cell(也就是对应的格子)就需要负责该类别的检测,一共需要获取三个内容(中心点坐标、检测框坐标、类别ID)
- YOLO的训练策略为:非中心点所在的cell需要极力让自己格子内检测框的置信度C降低,中心点所在的cell则需要让自己的检测框的置信度上升、中心点的坐标和检测框的IoU要极力去拟合,当然还有类别的概率。
也就是说,无论是检测中心点还是检测框,都是由中心点所在的cell来预测的,和其他的cell没有任何关系。但是每个cell都需要进行中心点、检测框、类别的预测,然后在训练过程中,将预测置信度不断提高(有物体) or 降低(无物体)!
显然,以cell为检测单位,导致每一个cell仅能针对一个类别进行预测,若两个类别的中心点位同一个cell,那么YOLOv1就会直接开摆~
有了上诉的一些概念,我们进行原理详解与论文精读
YOLOv1原理详解
传统的视觉识别算法分两步走:
- 检测中心和检测框的回归问题
- 目标对象的分类问题
在YOLO中,我们把对象的分类问题也看成回归问题去解决,使得整个网络大为精简(端到端直接全部输出类别、检测框……)
YOLOv1网格详解
我们已知YOLO会将输入图像分成S×S(其中S=7)的网格,如果一个物体的中心点落入到一个cell中,那么该cell就要负责预测该物体,一个格子只能预测一个物体,并生成B个检测框(其中B=2,意味着每次检测都会尝试两次)。
针对每一个grid_cell
- 我们会输出B个(B=2)检测框,大小、高度都无所谓,但是检测框的中心点坐标一定是落于该cell内的
- 我们针对每一个检测框,都会输出检测框的置信度,代表该处存在物体的可能性以及IoU
注意,每一个检测框的置信度是由该处存在物体的可能性和检测框的IoU决定的,公式如下:
:表示预测框内存在物体的概率
:表示预测框与真实框之间的交并比。
- 所以每个检测框包含5个元素(x,y,w,h,c)分别代表中心点坐标(x,y),检测框大小(w,h)以及置信度。每个格子一共两个检测框,所以一共有10个值输出。
图例如下
注意,上面的x,y,w,h均是归一化到(0,1)的值,和整个图像大小之间进行归一化。有的博主认为中心点坐标xy是和网格cell之间的偏移量进行归一化,但是私以为,应该还是和原图像进行的归一化。
(若有错漏请指正
输出结构内容详解
我们已知YOLOv1的输出结构为7*7*30,这里的7*7指的是输出特征的大小,是由原图像(480*480)通过4层最大池化层和一层卷积层(步长均为2)来进行缩减的,也就是说每一个格子,对应64*64的原像素区域。
在YOLOv1的官方示例中,官方采用了20种标签来进行训练。由于YOLOv1采用回归的方式解决分类问题,所以输出的结果还有该网格中所有类别的分类置信度(一共20个)。
所以输出结构就很清晰了:
- 7*7代表7*7的格子
- 30代表两个检测框的(x,y,w,h,c)和20个类别的分类置信度
举个例子,以下就是30的含义:
第一个检测框 | 第二个检测框 | 所有类别的置信度 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x1 | y1 | w1 | h1 | c1 | x2 | y2 | w2 | h2 | c2 | cls1 | cls2 | …… | cls19 | cls20 |
至此,YOLOv1的输出结构已经说明完毕。
到此为止,YOLOv1的网络结构都已经解构完成,我们只缺损失值的计算。
YOLOv1损失函数详解
直接先给出YOLOv1损失函数!
看着头晕晕?没关系,其实很简单!我们一行行来:
第一行损失函数详解
这一行主要是针对中心点进行差距损失的计算。
- 其中
(等于5)是一个参数,暂时没啥特别的(后面详解)
用以遍历所有的格子
用以遍历每一个格子中的检测框
以我们普遍的理念看来,假设我们需要针对中心点进行拟合,我们能想出来的损失函数应当如下所示:
这是我们好理解的,可是剩下的 是个什么东西??
- 这表明在第 i 个格子存在待测物体的中心点。
- 且单元i中的第j个边界框预测器“负责”该预测。
这个部分最重要的就是确保该检测框正确召回了物体!也就是说确保该检测框检测出了待测物体,尽管可能IOU不高、类别不精准。
大家可以想象,若没有这个条件约束,后面的计算就毫无意义。
第二行损失函数详解
简单,和第一行一样,这次计算的是检测框宽和高的损失。
第三、四行损失函数详解
此为检测框置信度的损失值计算,但是这里出现了 和
这是为什么呢?实际上,
和上面的
含义刚好相反,
表示该检测框成功召回了物体,
则表示该检测框没有召回物体。显然这里的损失函数的两面的:
- 针对成功召回的检测框,我们需要计算检测框和目标检测框的IOU之间的差距来表示损失值。
- 针对没有召回的检测框,此时的目标置信度为0,我们需要将这些失败的检测框的置信度下降。
第五行损失函数详解
显然,这里的意思就是:
遍历所有的检测框,如果检测框内存在目标物体的中心点,则针对该检测框内的分类结果对所有的类别的目标进行损失的计算并求和。
至此YOLOv1的全部内容详解完毕!
总结
YOLOv1虽然已经是将近10年前的算法了,但是作为目标检测之王的初代版本,依旧有很多可以学习和借鉴的内容,实际上,博主光是准备此篇博客就花费了整整两天的时间。恳请广大读者不要吝啬手中的点赞哦!
相关文章:
YOLO系列基础(六)YOLOv1原理详解,清晰明了!
系列文章地址 YOLO系列基础(一)卷积神经网络原理详解与基础层级结构说明-CSDN博客 YOLO系列基础(二)Bottleneck瓶颈层原理详解-CSDN博客 YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客 YOLO系列基础…...

LeetCode100之环形链表(141)--Java
1.问题描述 给你一个链表的头节点 head ,判断链表中是否有环 示例1 输入:head [3,2,0,-4], pos 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点 示例2 输入:head [1,2], pos 0 输出…...

【ict基础软件赛道】真题-50%openEuler
以下哪个命令可用于查看当前shell的后台任务在openeuler中哪个符号用于创建后台执行进程在openeuler中使用哪个命令查看软件包的详细信息在openeuler中如果想要查看本机的主机名可以使用下面哪个命令在openeuler中使用的包管理器是在openeuler系统中要配置防火墙以允许ssh连接应…...

<AI 学习> 下载 Stable Diffusions via Windows OS
注意: 不能使用 网络路径 不再支持 HTTPS 登录,需要 Token 1. 获得合法的授权 Stability AI License — Stability AI 上面的链接打开,去申请 许可 2. 拥有 HuggingFace 账号 注册:https://huggingface.co/ 3. 配置 Tok…...

计算机图形学在游戏开发中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机图形学在游戏开发中的应用 计算机图形学在游戏开发中的应用 计算机图形学在游戏开发中的应用 引言 计算机图形学的基本概念…...

【CubeMX-HAL库】STM32H743II——SDRAM配置所遇问题
推荐的博客和视频: 1、【CubeMX-HAL库】STM32H743—FMC配置SDRAM_stm32h743 sdram 速度-CSDN博客 2、【【STM32CubeMX教程】STM32全外设原理、配置和常用HAL、LL库API使用详解】 3、在百度网盘里有STM32H743的例程:【通过网盘分享的文件:S…...

mac上使用docker搭建gitlab
在 Mac 上搭建 GitLab 可以使用 Docker 来简化安装过程 一、安装详细步骤 1. 安装 Docker 如果你尚未安装 Docker,可以通过以下步骤安装: 下载并安装 Docker Desktop for Mac.安装完成后,启动 Docker Desktop,确保 Docker 运行…...

二维数组操作
代码结构 main.c #include <stdio.h> #include <stdlib.h>#define LEN 100int main() {//通过指针引用多维数组# if 1//定义多维数组int a[3][5] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};int row sizeof(a) /sizeof(a[0]);int colum sizeof(a[0]) / sizeof(a[0…...

uniapp设置tabBar高斯模糊并设置tabBar高度占位
1、设置tabBar高斯模糊 2、设置tabBar高度占位 (1)需要先在App.vue中获取一下 uni.getSystemInfoSync().windowBottom; //返回值是tabBar的高度(2)在app.vue中定义一个全局样式 3、在需要的页面底部,加上一个view&…...

上市公司代理成本数据大全(第一类和第二类代理成本均有)1991-2023年
一、计算方式: (1) 第一类代理成本 AC1:经营费用率,参考顶刊《管理世界》李文贵和余明桂(2015)老师的研究构建代理成本 AC2:管理费用率,参考C刊《经济管理》彭雅哲和汪昌云(2021) 老师的研究构建代理成本 AC3:资产周转…...

CA-Markov模型概述及其MATLAB实现
CA-Markov模型概述及其MATLAB实现 1 Markov模型2 CA-Markov模型2.1 元胞自动机(Cellular Aumatomata, 简称CA)2.1.1 构成2.2 准确度评估(Accuracy assessment)2.2.1 Kappa coefficient参考1.参考文献2.其它参考资料1 Markov模型 Markov模型是一种数学模型,用于描述系统在不…...

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人
课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符,使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…...

HCIP-HarmonyOS Application Developer 习题(二十二)
1、用户将手机导航迁移至智能手表之后,智能手表如果需要获取手机传过来的数据,从下列哪个方法中获取? A、onCompleteContinuation() B、onStartContinuation() C、onRestoreData() D、onSaveData() 答案:C 分析:FA发起迁移后&am…...

c++原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 原型模式是一种创建型设计模式,它允许你通过复制现有对象来创建新的对象,而不是通过类实例化来创建对象。这种模式在开发时需要大量类似对象的情况下非常有用。原型模式的核心是一个具有克隆方法的接…...

联通大数据面试题及参考答案
Flink 是怎么使用的? Flink 是一个分布式流批一体的开源平台,以下是其一般使用步骤及相关要点: 环境搭建 首先要根据需求选择合适的部署模式,比如本地模式用于开发测试,集群模式(如 Standalone、YARN、Kubernetes 等)用于生产环境。安装相应的 JDK 版本(Flink 基于 Ja…...

MySQL数据库:SQL语言入门 【3】(学习笔记)
目录 5,TCL —— 事务控制语言(Transaction Control Language) (1)事务的概念作用 (2)事务的特性 【1】原子性 【2】一致性 【3】隔离性 【4】持久性 (3)并发事务带来…...

uniapp 实现tabbar分类导航及滚动联动效果
思路:使用两个scroll-view,tabbar分类导航使用scrollleft移动,内容联动使用页面滚动onPageScroll监听滚动高度 效果图 <template><view class"content" ><view :class"[isSticky ? tab-sticky: ]">…...

华为数字化转型的本质为何是管理变革
随着全球经济的加速数字化转型,企业纷纷进入了数字化时代的大潮。华为作为数字化转型的领军者,已经成功实践了从传统企业向数字化企业的蜕变。对于企业而言,数字化转型不仅仅是新技术的应用,更是一场管理变革。在这场变革的背后&a…...

【数据库】深入解析慢 SQL 的识别与优化策略
文章目录 什么是慢 SQL?慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析:600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…...

Linux从入门到精通
远程连接linux操作系统 Linux的图形化界面并不稳定,因此往往使用命令行去接触Linux操作系统 远程连接到Linux操作系统需要借助一个叫做finalshell的软件,官方地址如下: finalshell官方下载 在linux的terminal终端中输入指令 ifconfig就可以…...

代码随想录算法训练营第四十四天|Day44 动态规划
1143.最长公共子序列 视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQ https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 #define max(a, b) ((a) > (b) ? (a) : (b)) int longestCommonSu…...

C++初阶——优先队列
一、什么是优先队列 优先队列是一个容器适配器,存储于优先队列中的元素按照某种优先级自动排序。优先队列类似于堆,元素可以随时插入,但是只能弹出优先级最高的元素。默认是一个大根堆,也就是元素越大,优先级越高。 二…...

10月月报 | Apache DolphinScheduler进展总结
各位热爱 Apache DolphinScheduler 的小伙伴们,社区10月份月报更新啦!这里将记录 DolphinScheduler 社区每月的重要更新,欢迎关注! 月度Merge之星 感谢以下小伙伴10月份为 Apache DolphinScheduler 所做的精彩贡献(排…...

WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统
安装WSL命令 管理员打开PowerShell或Windows命令提示符,输入wsl --install,然后回车 注意:此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意:默认安装最新的Ubuntu发行版。 注意:默认安装路径是…...

《AI 之影》
《AI 之影》 城市的喧嚣如同一幅永不停息的画卷,在钢筋水泥的丛林中,人们匆忙地穿梭,追逐着各自的梦想与欲望。而在这看似平凡的都市之中,一场悄然的变革正在酝酿。 他叫佑介,一个孤独的城市漫步者。每天,他…...

QT5.14*解决QSslSocket::connectToHostEncrypted: TLS initialization faile
qDebug()<<"QSslSocket"<<QSslSocket::sslLibraryBuildVersionString();通过上述代码在QT控制台查看对应需要的SSL版本,QT5.14.*输出的内容为: OpenSSL 1.1.1d 10 Sep 2019从官方下载openssl安装包即可,在官网找了很…...

高效分支管理规范
一、目的 通过标准化的流程和最佳实践,确保代码组织清晰、版本控制高效、变更管理有序,从而提高软件开发的质量、效率和可维护性,支持团队协作和持续集成/持续部署流程,最终实现项目的长期成功和发展 二、分支命名规范 简洁明了…...

跟我学C++中级篇——RAII
一、什么是RAII Resource Acquisition Is Initialization,资源获取即初始化。C/C的开发者都知道,在这类语言的开发中,内存需要手动来控制。也就是说,释放和回收内存得开发者亲历亲为。从某种角度看,能够把控内存的细节…...

C语言第九周课——经典算法
目录 一、冒泡法排序 1.1原理 1.2代码实现(以升序排序为例) 1.3逻辑 1.4分析 二、二分法查找 2.1原理 2.2代码实现 2.3逻辑 2.4算法效率分析 三、素数判断 3.1原理 3.2代码实现 3.3逻辑 3.4分析 一、冒泡法排序 1.1原理 冒泡排序&…...

【Pikachu】XML外部实体注入实战
若天下不定,吾往;若世道不平,不回! 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…...