YOLOv1深入解析与实战:目标检测算法原理
参考:
https://zhuanlan.zhihu.com/p/667046384
https://blog.csdn.net/weixin_41424926/article/details/105383064
https://arxiv.org/pdf/1506.02640
1. 算法介绍
学习目标检测算法,yolov1是必看内容,不同于生成模型,没有特别多的理论,关键在于模型结构的构造。
先直接从作者给的图,来解释yolo到底干了一件什么事情,为什么速度那么快。



我们重点分析这几张图,搞明白图就明白了算法核心。
从图中,我们要明确以下几点:
- 输入:输入是一张完整的图片,不是说把一张图片分成S*S个网络
- 输出: S × S × ( B ∗ 5 + C ) S\times S \times (B*5 +C) S×S×(B∗5+C)的矩阵:
S × S S\times S S×S相当于把原图分成 S × S S\times S S×S个grid cell,这里是7x7;
( B ∗ 5 + C ) (B*5 +C) (B∗5+C)表示每个gird cell需要预测东西,B表示需要预测多少个检测框也就是经常提到的bounding box,5表示预测的检测框属性是什么,这里是(x,y,w,h,confidence)也就是需要预测这5个值,C表示预测的类别,原文中要预测两个检测框B=2,预测20个类别C=20,也就是最终预测矩阵为7x7x30。 - 标签:检测框大小和位置对应预测(x,y,w,h);类别对应预测C。那还有一个confidence呢,别忘了我们的confidence是和预测的检测框绑定在一起的,那自然就是:这个检测框是我们要预测的为1,不是我们要预测的为0。那该怎么处理呢,别着急,我们先看后面损失函数,自然就明白了。
其实搞清楚我们输入输出和目标就自然而然明白了yolo是在做什么。但是仍有需要注意的地方:
- 每一个grid cell只能预测一个目标,也就是我们最后输出的7x7x30最多只能预测7x7个目标
- 预测的x,y是相对于当前grid cell 中的相对坐标,什么意思呢?预测结果每一个30维度向量都是和原图7x7个grid cell是一一对应的,其预测值也是在对应grid cell 中,比如预测的x=0.5,y=0.5,那么预测的就是对应这个grid cell的中心。
- 预测的w,h测是相对于原图W,H归一化后的结果,也就是除以W和H后的结果。
2 损失设计

我们依然看论文中原式:
看这个式子,有一点非常重要,也就是损失计算的前提:gronud truth,也就是我们给定的标签,中心点是否在我们预测的grid cell中,不在就为0,只计算在的,也就是我们不需要傻傻的把所有的预测的框都要去计算损失,也没法计算,也不需要计算,因为我们检测的是目标,标签给的也是目标的标签。看一下loss中几个符号含义,非常重要:
1 i o b j 1_{i}^{obj} 1iobj:第i个grid cell 是否预测了物体,也就是gronud truth的中心点是否在grid cell中,在为1,不在为0;
1 i j o b j 1_{ij}^{obj} 1ijobj:第i个grid cell 是预测了物体前提下,也就是 1 i o b j = 1 1_{i}^{obj}=1 1iobj=1的前提,第j个预测框是否预测物体,预测为1,不预测为0
1 i j n o o b j 1_{ij}^{noobj} 1ijnoobj:第i个grid cell 是预测了物体前提下,也就是 1 i o b j = 1 1_{i}^{obj}=1 1iobj=1的前提,第j个预测框是否预测物体,预测为0,不预测为1
那么问题来了,我该如何判断我这j个检测框,哪一个是才是预测了物体呢,很简单,把每一个检测框和groud truth求IOU,IOU最大的那个是预测了物体,其他没预测物体。预测物体的置信度标签 C i ^ = 1 \hat{C_i}=1 Ci^=1,否则为0。也就是:
第1、2、3排的损失是计算了第i个grid cell 是预测了物体前提下,第j个预测框是预测了物体的检测框的损失,
第4排,自然是剩下没有B-1个没有预测物体检测框的置信度损失,标签为0,
第5排,这个不用说了,当前grid cell预测的类别。
从损失来看,所有损失计算都是在ground truth 中心点在预测的grid cell中,也就是这个grid cell是来预测物体的这个前提,非常重要,不明白这一点相当于yolo白看,压根就没看懂。
至于w,h为什么带根号,很简单,有的检测框大有的小,为了让尺度尽量一致,开根号处理了以下。
3 网络结构

作者给的网络结构是早期的darknet网络,就是一直在用CNN做卷积提取特征。
4 推理
NMS非极大值抑制,很好理解:对于一个目标,我们只需要一个检侧框,主要解决的是一个目标被多次检测的问题,意义主要在于在一个区域里交叠的很多框选一个最优的。
这里推荐看https://blog.csdn.net/qq_41498261/article/details/121983012
简单来说就是排序问题:
(1)找出某个类别所有的框,最多98个,因为 7 ∗ 7 ∗ 2 7*7*2 7∗7∗2(懂的都懂),假设预测dog的最终有10个框,找出这10个框,按照置信度排序从大到小排序,如1 2 3 4 5 6 7 8 9 10
(2)按照顺序第2-9和第1个计算IOU,假如设定一个阈值为0.7,IOU超过0.7从序列中排除,假如第567超过了0.7,则剔除,则新的排序为1 2 3 4 5 8 9 10
(3)按照(2)方式,计算3 4 5 8 9 10和2的结果IOU,以此类推,假如最终结果为1,2,5,则1,2,5在这个检测框是我们要的,理想情况下三个检测框检测到3条狗。
(4)进行第二个类别NMS,按照(1)(2)(3)以此类推,完成所有类别检测
备注
YOLO提供了一个端到端的检测任务,不需要分两次训练,一步完成,这也是它速度快的原因,学习v1版本会让我们更快学习后面的版本。接下来,我们会介绍v3版本,而不是v2,v3相比v2更好理解,不必非要介绍v2才可以学习v3,不必浪费时间学习v2。代码的话,低版本代码没有什么值得学习的,也不必要学习,只要学习更加先进的东西即可。
相关文章:
YOLOv1深入解析与实战:目标检测算法原理
参考: https://zhuanlan.zhihu.com/p/667046384 https://blog.csdn.net/weixin_41424926/article/details/105383064 https://arxiv.org/pdf/1506.02640 1. 算法介绍 学习目标检测算法,yolov1是必看内容,不同于生成模型,没有特别…...
Apache Calcite - 自定义标量函数
前言 上一篇文章中我们介绍了calcite中内置函数的使用。实际需求中会遇到一些场景标准内置函数无法满足需求,这时候就需要用到自定义函数。在 Apache Calcite 中添加自定义函数,以便在 SQL 查询中使用自定义的逻辑。这对于执行特定的数据处理或分析任务…...
STM32作业实现(四)光敏传感器
目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...
HTML+CSS 文本动画卡片
效果演示 实现了一个图片叠加文本动画效果的卡片(Card)布局。当鼠标悬停在卡片上时,卡片上的图片会变为半透明,同时显示隐藏在图片上的文本内容,并且文本内容有一个从左到右的渐显动画效果,伴随着一个白色渐…...
MongoDB CRUD操作: 在本地实例进行文本搜索查询
MongoDB CRUD操作: 在本地实例进行文本搜索查询 文章目录 MongoDB CRUD操作: 在本地实例进行文本搜索查询举例创建集合创建文本索引精准搜索排除短语结果排序 在本地实例运行文本搜索查询前,必须先在集合上建立文本索引。MongoDB提供文本索引…...
文档智能开源软件
文档智能介绍: 文档智能通常指的是利用人工智能技术来处理和分析文档内容,以实现自动化、智能化的文档管理。文档智能的应用领域非常广泛,包括但不限于: 1. **文档识别**:使用OCR(光学字符识别࿰…...
[C][可变参数列表]详细讲解
目录 1.宏含义及使用2.宏原理分析1.原理2.宏理解 1.宏含义及使用 依赖库stdarg.hva_list 其实就是char*类型,方便后续按照字节进行指针移动 va_start(arg, num) 使arg指向可变参数部分(num后面) va_arg(arg, int) 先让arg指向下个元素,然后使用相对位置…...
54. 螺旋矩阵【rust题解】
题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 示例 1 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2 输入:matrix [[1,2,3,4],[5,6,…...
学习笔记——网络参考模型——TCP/IP模型(传输层)
四、TCP/IP模型-传输层 一、TCP 1、TCP定义 TCP(Transmission Control Protocol,传输控制协议)∶为应用程序提供可靠的面向连接的通信服务。目前,许多流行的应用程序都使用TCP。 连接:正式发送数据之前,提前建立好一种虚拟的&…...
Java中的Instant
在Java中,Instant 是 java.time 包中的一个类,用于表示时间轴上的一个瞬时点,通常以纳秒精度表示。它通常用于表示机器可读的时间戳,而不是人类可读的时间表示(如日期和时间)。 Instant 主要用于时间计算和…...
PostgreSQL的锁介绍
PostgreSQL的锁介绍 PostgreSQL 中的锁机制是一种用于控制数据并发访问的手段,确保数据库的完整性和一致性。在实际应用中,合理使用锁可以避免数据不一致和减少死锁的发生。 锁类型 PostgreSQL 提供了多种锁类型,以下是一些常见的锁&#…...
4分之1外螺纹怎么编程:挑战与策略解析
4分之1外螺纹怎么编程:挑战与策略解析 在机械制造领域,螺纹编程是一项至关重要的技术任务。当面对如4分之1外螺纹这样的具体需求时,编程人员需要综合运用专业知识与编程技巧,以确保螺纹的精确度和生产效率。本文将围绕四个方面、…...
运用selenium爬取京东商品数据储存到MySQL数据库中
使用Selenium爬取京东商品数据并存储到MySQL数据库中的过程可以分为几个步骤: 1. 准备工作 安装所需库 确保你已经安装了Python环境以及以下库: selenium:用于自动化浏览器操作。pymysql 或 mysql-connector-python:用于连接M…...
K8S SWCK SkyWalking全链路跟踪工具安装
官方参考:如何使用java探针注入器? 配置两个demo,建立调用关系, 首先创建一个基础镜像dockerfile from centos 先安装java 参考: linux rpm方式安装java JAVA_HOME/usr/java/jdk1.8.0-x64 CLASSPATH.:$JAVA_HOME/lib/tools.jar PATH…...
Apache Omid Idea Debug 环境搭建
IDEA 搭建 Apache Omid 源码 DEBUG 环境 Apache Omid 在 Apache HBase 之上提供了多行分布式事务的能力,支持全局 MVCC 功能。简单介绍编译过程。 1.下载 HBase2 并启动 https://dlcdn.apache.org/hbase/ 配置环境变量 export HBASE_HOME/xxx/hbase-2.4.18 exp…...
【面试宝藏】Go并发编程面试题
深入Go语言并发编程 Go语言以其简洁、高效的并发处理能力而闻名。在Go中,通过各种同步机制和原子操作,可以轻松地实现高性能并发编程。本文将深入探讨Go语言中的并发编程,包括Mutex、RWMutex、Cond、WaitGroup、原子操作等内容。 1. Mutex几…...
④单细胞学习-cellchat细胞间通讯
目录 1,原理基础 流程 受体配体概念 方法比较 计算原理 2,数据 3,代码运行 1,原理基础 原文学习Inference and analysis of cell-cell communication using CellChat - PMC (nih.gov) GitHub - sqjin/CellChat: R toolk…...
即时通讯平台及门户系统WorkPlus打造移动应用管理平台
在全球化和数字化时代,企业管理和沟通的方式正发生着巨大的变化。为了实现高效的协作和资源共享,企业越来越倾向于使用即时通讯及门户系统。这两种系统结合起来,可以提供一套完整的沟通和信息发布平台,促进内部协作和信息管理。 …...
React@16.x(12)ref 转发-forwardRef
目录 1,介绍2,类组件如何使用4,应用场景-高阶组件HOC 1,介绍 上篇文章中提到,ref 只能对类组件使用,不能对函数组件使用。 而 ref 转发可以对函数组件实现类似的功能。 使用举例: import Re…...
电脑世界的大冒险:用人体比喻让孩子轻松理解电脑20240603
电脑世界的大冒险:用人体比喻让孩子轻松理解电脑 作为一名在IT行业的老程序猿,我见证了电脑技术的飞速发展,也亲身体验了科技给生活带来的翻天覆地的变化。然而,在这个日新月异的数字时代,我意识到,与孩子…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
