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行业的老程序猿,我见证了电脑技术的飞速发展,也亲身体验了科技给生活带来的翻天覆地的变化。然而,在这个日新月异的数字时代,我意识到,与孩子…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
Android Framework预装traceroute执行文件到system/bin下
文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数(使用 ICMP Echo 请求)-T 参数(使用 TCP SYN 包) 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11,在/s…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...
