计算机视觉---YOLOv1
YOLOv1深度解析:单阶段目标检测的开山之作
一、YOLOv1概述
提出背景:
2016年由Joseph Redmon等人提出,全称"You Only Look Once",首次将目标检测视为回归问题,开创单阶段(One-Stage)检测范式。相比两阶段检测(如Faster R-CNN),YOLOv1无需生成候选区域(Region Proposal),直接通过卷积网络回归边界框和类别,速度极快(45 FPS),适合实时场景(如视频监控、自动驾驶)。
核心思想:
将输入图像划分为 S×S网格(Grid),每个网格负责检测中心落在该网格内的目标。每个网格输出 B个边界框(Bounding Box) 和 C个类别概率,最终通过非极大值抑制(NMS)生成检测结果。
二、网络架构与输入输出
1. 输入
- 固定尺寸:448×448×3(RGB图像),经缩放预处理后输入。
- 目的:扩大感受野,提升小目标检测能力(尽管YOLOv1对小目标效果仍有限)。
2. 网格划分(S×S)
-
经典配置:S=7,即7×7网格,共49个网格单元。
-
每个网格输出:
- B个边界框(Bounding Box):每个框包含5个参数 → (x, y, w, h, confidence)
- (x, y):边界框中心坐标,相对于网格左上角,归一化到[0,1]。
- (w, h):边界框宽高,相对于整幅图像,归一化到[0,1]。
- confidence:置信度 = Pr(Object) × IOUpredtruth,即“包含目标的概率”与“预测框与真实框的交并比”的乘积。
- C个类别概率:Pr(Class_i | Object),即网格内存在目标时,属于各类别的条件概率,网格共享一组类别概率(非每个框独立预测)。
- B个边界框(Bounding Box):每个框包含5个参数 → (x, y, w, h, confidence)
-
参数总量:
每个网格输出 → B×5 + C 个参数。
若取 B=2(YOLOv1默认),C=20(VOC数据集类别数),则总输出为:
7×7×(2×5 + 20) = 7×7×30 = 1470维向量。
3. 网络结构
基于 GoogLeNet 改进,包含 24个卷积层 和 2个全连接层,架构如下:
输入 (448×448)
→ 卷积层:7×7×64,步长2×2, padding=3 → 输出224×224×64(最大池化2×2,步长2)
→ 卷积层:3×3×192,步长1×1, padding=1 → 输出112×112×192(最大池化2×2,步长2)
→ 卷积层:1×1×128, 3×3×256, 1×1×256, 3×3×512(重复4次)→ 输出28×28×512(最大池化2×2,步长2)
→ 卷积层:1×1×512, 3×3×1024(重复2次)→ 输出14×14×1024(最大池化2×2,步长2)
→ 卷积层:3×3×1024,步长1×1, padding=1 → 输出7×7×1024
→ 全连接层: flatten后接4096维全连接 → 再接7×7×30维全连接 → 输出预测结果
- 特点:
- 卷积层主导特征提取,全连接层负责坐标和类别的回归。
- 大量使用 1×1卷积 降维,减少计算量(如从192→128通道)。
- 无锚框(Anchor Box)设计,边界框尺寸直接通过网络学习(后续YOLOv2引入锚框)。
三、损失函数设计
YOLOv1采用 均方误差(MSE) 作为损失函数,但针对不同任务(坐标、置信度、类别)设计了加权因子,以解决样本不平衡和尺度敏感问题。损失函数公式如下:
L l o s s = λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j [ ( x i − x i ^ ) 2 + ( y i − y i ^ ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j [ ( w i − w i ^ ) 2 + ( h i − h i ^ ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i , j o b j ( C i − C i ^ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i , j n o o b j ( C i − C i ^ ) 2 + ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p i ^ ( c ) ) 2 L_{loss} = \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{i,j}^{obj} \left[ (x_i - \hat{x_i})^2 + (y_i - \hat{y_i})^2 \right] + \\ \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{i,j}^{obj} \left[ (\sqrt{w_i} - \sqrt{\hat{w_i}})^2 + (\sqrt{h_i} - \sqrt{\hat{h_i}})^2 \right] + \\ \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{i,j}^{obj} (C_i - \hat{C_i})^2 + \lambda_{noobj} \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{i,j}^{noobj} (C_i - \hat{C_i})^2 + \\ \sum_{i=0}^{S^2} 1_i^{obj} \sum_{c \in classes} (p_i(c) - \hat{p_i}(c))^2 Lloss=λcoord∑i=0S2∑j=0B1i,jobj[(xi−xi^)2+(yi−yi^)2]+λcoord∑i=0S2∑j=0B1i,jobj[(wi−wi^)2+(hi−hi^)2]+∑i=0S2∑j=0B1i,jobj(Ci−Ci^)2+λnoobj∑i=0S2∑j=0B1i,jnoobj(Ci−Ci^)2+∑i=0S21iobj∑c∈classes(pi(c)−pi^(c))2
各部分解析:
-
坐标误差(前两行):
- 权重: λ c o o r d = 5 \lambda_{coord}=5 λcoord=5(增大坐标回归的权重,因边界框位置是检测的核心指标)。
- 宽高平方根: w , h \sqrt{w}, \sqrt{h} w,h 替代直接回归 w , h w, h w,h,缓解大框和小框的误差不平衡(小框的绝对误差对IOU影响更大)。
- 掩码: 1 i , j o b j 1_{i,j}^{obj} 1i,jobj 表示第 i i i个网格的第 j j j个框是否负责真实目标(即该框与真实框的IOU最大)。
-
置信度误差(中间两行):
- 有目标的框: 1 i , j o b j 1_{i,j}^{obj} 1i,jobj 对应权重为1,直接监督置信度与真实IOU的接近程度。
- 无目标的框: 1 i , j n o o b j 1_{i,j}^{noobj} 1i,jnoobj 对应权重为 λ n o o b j = 0.5 \lambda_{noobj}=0.5 λnoobj=0.5(降低负(背景)样本的置信度损失,因负样本数量远多于正样本)。
-
类别误差(最后一行):
- 权重:默认1,仅在网格 i i i包含真实目标时( 1 i o b j = 1 1_i^{obj}=1 1iobj=1)计算类别损失。
四、训练策略
1. 预训练与微调
- 预训练:在ImageNet分类数据集上训练前20个卷积层+1个全连接层,输入尺寸224×224,学习目标为1000类分类。
- 微调:
- 新增4个卷积层和2个全连接层,输入尺寸扩大至448×448。
- 冻结前20层卷积层,训练新增层;后期解冻所有层,整体微调。
2. 数据增强
- 随机翻转、裁剪、缩放(尺度因子0.5~1.5)。
- 颜色抖动(调整亮度、对比度、饱和度)。
- 高斯噪声注入,提升模型鲁棒性。
3. 多尺度训练
- 每隔一定迭代次数(如10 batches),随机将输入图像尺寸调整为{320, 352, …, 608}(32的倍数),迫使模型适应不同尺度的目标,增强泛化能力。
五、推理过程
-
边界框解码:
- 网格 i , j i,j i,j的左上角坐标为 ( i , j ) (i, j) (i,j)(假设网格尺寸为1×1,实际需根据图像尺寸缩放)。
- 预测的 ( x , y ) (x, y) (x,y)是相对于网格的偏移量,真实坐标为:
x p r e d = ( i + x ) × W S , y p r e d = ( j + y ) × H S x_{pred} = (i + x) \times \frac{W}{S}, \quad y_{pred} = (j + y) \times \frac{H}{S} xpred=(i+x)×SW,ypred=(j+y)×SH
其中 W , H W, H W,H为输入图像宽高, S = 7 S=7 S=7。 - 宽高 ( w , h ) (w, h) (w,h)直接乘以图像宽高:
w p r e d = w × W , h p r e d = h × H w_{pred} = w \times W, \quad h_{pred} = h \times H wpred=w×W,hpred=h×H
-
置信度过滤与NMS:
- 对每个边界框,计算 类别置信度 = 类别概率 × 置信度,过滤低于阈值(如0.2)的框。
- 对同一类别,使用NMS去除重叠框,保留高置信度的框。
六、优缺点分析
优点
- 速度快:端到端检测,45 FPS(GPU),可实时处理视频流。
- 结构简单:单网络完成特征提取和预测,无需候选区域生成,训练和部署便捷。
- 全局视野:直接从全图预测,不易漏检背景中的目标(两阶段模型可能因候选区域局限漏检)。
缺点
-
小目标检测差:
- 7×7网格分辨率低,小目标在特征图中占比小,信息不足。
- 每个网格仅预测2个框,小目标可能因重叠导致IOU低而被抑制。
-
边界框预测不准:
- 无锚框先验,全靠网络学习宽高比例,对非常规比例目标(如狭长物体)泛化能力弱。
- 直接回归宽高,缺乏尺度不变性(YOLOv2通过锚框和对数空间回归改进)。
-
密集目标漏检:
- 同一网格内多个目标(如人群)仅能输出2个框,易漏检。
-
类别不平衡:
- 无目标的网格(负样本)占多数,虽通过权重缓解,但仍影响置信度学习。
七、YOLOv1的影响与后续改进
-
对检测领域的贡献:
- 开创单阶段检测范式,推动实时检测发展(如YOLO系列、SSD、RetinaNet)。
- 证明“全局特征建模”在检测中的有效性,启发后续模型融合上下文信息。
-
后续YOLO版本的改进方向:
- YOLOv2(2017):引入锚框、批归一化、多尺度训练,使用Darknet-19,精度和速度提升。
- YOLOv3(2018):多尺度预测(FPN结构)、Darknet-53、二元交叉熵损失(适用于多标签分类)。
- YOLOv4/YOLOv5(2020年后):集成数据增强、注意力机制、模型轻量化等技术,进一步提升性能。
八、与两阶段检测的对比
维度 | YOLOv1 | Faster R-CNN |
---|---|---|
检测流程 | 单阶段(直接回归框和类别) | 两阶段(先候选区域,再分类/回归) |
速度 | 快(45 FPS) | 慢(~7 FPS) |
精度(mAP) | 较低(VOC 2007: ~63.4%) | 较高(VOC 2007: ~78.8%) |
设计哲学 | 速度优先,适合实时场景 | 精度优先,适合高要求场景 |
九、总结
YOLOv1以其颠覆性的单阶段设计,重新定义了目标检测的速度与实时性标准。尽管存在小目标检测弱、框预测不准等缺陷,但其开创的“端到端回归”思路为后续检测模型奠定了基础。通过理解YOLOv1的核心原理(网格划分、损失函数设计、训练策略),可深入把握单阶段检测的本质,并更好地理解后续YOLO版本的改进逻辑。
相关文章:

计算机视觉---YOLOv1
YOLOv1深度解析:单阶段目标检测的开山之作 一、YOLOv1概述 提出背景: 2016年由Joseph Redmon等人提出,全称"You Only Look Once",首次将目标检测视为回归问题,开创单阶段(One-Stage)…...
无法同步书签,火狐浏览器修改使用国内的账号服务器
自动更新版本后,变为国际服版本的了,点击右上角无法登录firefox,也无法同步书签,现在国际服的火狐浏览器修改使用国内的账号服务器,需要先在搜索框输入 about:config 中改变三项配置,然后重启浏览器,才能正常使用国内的火狐账号服务器 ident…...
动态防御体系实战:AI如何重构DDoS攻防逻辑
1. 传统高防IP的静态瓶颈 传统高防IP依赖预定义规则库,面对SYN Flood、CC攻击等常见威胁时,常因规则更新滞后导致误封合法流量。例如,某电商平台遭遇HTTP慢速攻击时,静态阈值过滤无法区分正常用户与攻击者,导致订单接…...
Kotlin Native与C/C++高效互操作:技术原理与性能优化指南
一、互操作基础与性能瓶颈分析 1.1 Kotlin Native调用原理 Kotlin Native通过LLVM编译器生成机器码,与C/C++的互操作基于以下核心机制: CInterop工具:解析C头文件生成Kotlin/Native绑定(.klib),自动生成类型映射和包装函数双向调用约定: Kotlin调用C:直接通过生成的绑…...

爬虫核心概念与工作原理详解
爬虫核心概念与工作原理详解 1. 什么是网络爬虫? 网络爬虫(Web Crawler)是一种按照特定规则自动抓取互联网信息的程序或脚本,本质是模拟人类浏览器行为,通过HTTP请求获取网页数据并解析处理。 形象比喻:如…...
Flink架构概览,Flink DataStream API 的使用,FlinkCDC的使用
一、Flink与其他组件的协同 Flink 是一个分布式、高性能、始终可用、准确一次(Exactly-Once)语义的流处理引擎,广泛应用于大数据实时处理场景中。它与 Hadoop 生态系统中的组件可以深度集成,形成完整的大数据处理链路。下面我们从…...

vue3前端后端地址可配置方案
在开发vue3项目过程中,需要切换不同的服务器部署,代码中配置的服务需要可灵活配置,不随着run npm build把网址打包到代码资源中,不然每次切换都需要重新run npm build。需要一个配置文件可以修改服务地址,而打包的代码…...
Es6中怎么使用class实现面向对象编程
在 JavaScript 中,面向对象的类可以通过 class 关键字来定义。以下是一个简单的示例,展示了如何定义一个类、创建对象以及添加方法: 基础类定义 // 定义一个类 class MyClass { // 构造函数,用于初始化对象的属性 constructor(pa…...

digitalworld.local: FALL靶场
digitalworld.local: FALL 来自 <digitalworld.local: FALL ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.4 3&…...

MySQL---库操作
mysql> create database if not exists kuku3; 1.库操作的语法 create database [if not exists] db_name [create_specification [, create_specification] ...] create_specification: [default] character set charset_name [default] collate collation_name详细解释…...

动态规划算法:字符串类问题(2)公共串
0 前言 上节课我们已经讲述了使用动态规划求取回文串长度与数量的方法(和本节课关系不大,感兴趣可以去看字符串类问题(1)回文串),这节课我们继续探索字符串问题中的动态规划问题。 进入本篇文章前&#x…...
uni-app(5):Vue3语法基础上
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统,只关注视图层,…...

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧
深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧 一、分包核心价值与基本原理 1.1 为什么需要分包 首屏加载优化:减少主包体积,提升TTI(Time to Interactive)缓存利用率提升&am…...
ubuntu下docker安装mongodb-支持单副本集
1.mogodb支持事务的前提 1) MongoDB 版本:确保 MongoDB 版本大于或等于 4.0,因为事务支持是在 4.0 版本中引入的。 2) 副本集配置:MongoDB 必须以副本集(Replica Set)模式运行,即使是单节点副本集&#x…...

spring-boot-starter-data-redis应用详解
一、依赖引入与基础配置 添加依赖 在 pom.xml 中引入 Spring Data Redis 的 Starter 依赖,默认使用 Lettuce 客户端: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis<…...

5060显卡驱动PyCUDA开发环境搭建
5060显卡驱动PyCUDA开发环境搭建 本文手把手讲解了RTX5060ti显卡从上手尝试折腾,到在最新Ubuntu LTS版本上CUDA开发环境搭建成功的详细流程。 1.1 开机后Ubuntu2404LTS不识别显卡 1.1.1 显卡硬件规格要求 笔者下单的铭瑄电竞之心,安装规格是PCIe …...

redis搭建最小的集群,3主3从
create.sh脚本用于快速部署一个Docker化的Redis集群。首先,脚本创建了一个自定义的Docker网络redis-net,并指定了子网以防止IP变动。接着,脚本设置了宿主机的公网IP,并生成了六个Redis节点的配置文件,每个配置文件都启…...
《帝国时代1》游戏秘籍
资源类 PEPPERONI PIZZA:获得 1000 食物。COINAGE:获得 1000 金。WOODSTOCK:获得 1000 木头。QUARRY:获得 1000 石头。 建筑与生产类 STEROIDS:快速建筑。 地图类 REVEAL MAP:显示所有地图。NO FOG…...

【sylar-webserver】10 HTTP模块
HTTP 解析 这里使用 nodejs/http-parser 提供的 HTTP 解析器。 HTTP 常量定义 HttpMethod HttpStatus /* Request Methods */ #define HTTP_METHOD_MAP(XX) \XX(0, DELETE, DELETE) \XX(1, GET, GET) \XX(2, HEAD, HEAD) …...
攻略生成模块
攻略生成模块 这个模块实现了一个旅行行程规划服务,主要流程如下: 核心思路是通过前端传来的城市和出游天数信息,先在本地数据库中查找是否已存有相应的旅游数据(例如景点、美食等),如果没有就自动检索和…...

海康NVR录像回放SDK原始流转FLV视频流:基于Java的流媒体转码(无需安装第三方插件ffmpeg)
wlinker-video-monitor 代码地址:https://gitee.com/wlinker/wlinker-video-monitor 背景与需求 在安防监控、智能楼宇等场景中,海康威视设备作为行业主流硬件,常需要将录像回放功能集成到Web系统中。然而,海康设备的原始视频流…...
深入理解设计模式:工厂模式、单例模式
深入理解设计模式:工厂模式、单例模式 设计模式是软件开发中解决常见问题的可复用方案。本文将详细介绍两种种重要的创建型设计模式:工厂模式、单例模式,并提供Java实现示例。 一、工厂模式 工厂模式是一种创建对象的设计模式,…...

运维Linux之Ansible详解学习(更新中)
什么是Ansible Ansible 是一款新出现的自动化运维工具,基于 Python 开发。以下是对它的详细介绍: 功能特点:集合了众多运维工具的优点,能实现批量系统配置、批量程序部署、批量运行命令等功能。它是基于模块工作的,本…...

深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核
第三篇:Verilog实现I2C Master核 副标题 :从零构建工业级I2C控制器——代码逐行解析与仿真实战 1. 架构设计 1.1 模块分层设计 三层架构 : 层级功能描述关键信号PHY层物理信号驱动与采样sda_oe, scl_oe控制层协议状态机与数据流控制state…...
网络世界的“变色龙“:动态IP如何重构你的数据旅程?
在深秋的下午调试代码时,我偶然发现服务器日志中出现异常登录记录——IP地址显示为某个境外数据中心。更有趣的是,当我切换到公司VPN后,这个"可疑IP"竟自动消失在了防火墙监控列表中。这个瞬间让我意识到:现代网络架构中…...
进阶-自定义类型(结构体、位段、枚举、联合)
自定义类型:结构体,枚举,联合 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段(位段的填充&可移植性) 枚举 枚举类型的定义 枚举的优点 枚举的使用 联合 联合类型的定义 联…...
5G 网络全场景注册方式深度解析:从信令交互到报文分析
摘要 本文全面梳理 5G 网络包含的初始注册、移动性注册更新、紧急注册、周期性注册更新、服务请求触发注册、切换触发注册、基于策略的注册更新等多种注册方式。详细阐述每种注册方式的触发条件、信令流程、关键报文结构,结合对比分析与实际案例,助力读者深入理解 5G 网络接…...

ARM笔记-嵌入式系统基础
第一章 嵌入式系统基础 1.1嵌入式系统简介 1.1.1嵌入式系统定义 嵌入式系统定义: 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统 ------Any devic…...
一文讲透golang channel 的特点、原理及使用场景
在 Go 语言中,通道(Channel) 是实现并发编程的核心机制之一,基于 CSP(Communicating Sequential Processes) 模型设计。它不仅用于协程(Goroutine)之间的数据传递,还通过…...

upload-labs通关笔记-第19关文件上传之条件竞争
系列目录 upload-labs通关笔记-第1关 文件上传之前端绕过(3种渗透方法) upload-labs通关笔记-第2关 文件上传之MIME绕过-CSDN博客 upload-labs通关笔记-第3关 文件上传之黑名单绕过-CSDN博客 upload-labs通关笔记-第4关 文件上传之.htacess绕过-CSDN…...