YOLO算法原理详解系列 第001期-YOLOv1 算法原理详解 - 实践

news/2025/10/31 18:57:30/文章来源:https://www.cnblogs.com/gccbuaa/p/19181010

文章目录

  • YOLOv1 算法原理详解
    • 一、核心设计理念:从“两阶段”到“单阶段”的跨越
    • 二、网络结构:基于 GoogLeNet 的定制化设计
      • 网络分层拆解(共 24 层卷积 + 2 层全连接)
      • 关键设计细节
    • 三、目标检测流程:网格划分与预测解析
      • 1. 输入预处理
      • 2. 网络预测:7×7×30 输出的含义
        • 各预测值的详细解释
      • 3. 后处理:从预测结果到最终检测框
        • 步骤 1:计算最终检测框的类别置信度
        • 步骤 2:置信度阈值过滤
        • 步骤 3:非极大值抑制(NMS)
        • 步骤 4:坐标映射
    • 四、损失函数:平衡分类与回归的误差
      • 各部分损失的详细计算
      • 关键设计:如何选择“负责预测的边界框”
    • 五、YOLOv1 的优缺点
      • 优点
      • 缺点
    • 总结

YOLOv1 算法原理详解

由 Joseph Redmon 等人于 2016 年提出的就是YOLO(You Only Look Once)单阶段目标检测算法,其核心突破是摒弃了传统目标检测“先候选框、后分类”的两阶段流程,将目标检测任务转化为单一的端到端回归问题,实现了检测速度与精度的早期平衡。YOLOv1 作为该系列的开山之作,奠定了后续版本的核心思想,其原理可从“核心设计理念”“网络结构”“目标检测流程”“损失函数”“优缺点”五个维度展开。

一、核心设计理念:从“两阶段”到“单阶段”的跨越

传统目标检测算法(如 R-CNN 系列)需分两步:

  1. 生成候选区域(如 Selective Search):从图像中筛选出可能囊括目标的区域(约 2000 个);
  2. 分类与回归:对每个候选区域单独进行“是否为目标”的分类和“目标位置修正”。

YOLOv1 彻底改变这一流程,核心理念是:

二、网络结构:基于 GoogLeNet 的定制化设计

YOLOv1 的网络结构以GoogLeNet(Inception v1)为基础,去除了部分 Inception 模块,增加了全连接层,以适配“回归预测”的需求。网络输入固定为448×448×3(RGB 图像),输出为 7×7×30 的特征图(具体维度含义见下文)。

网络分层拆解(共 24 层卷积 + 2 层全连接)

网络阶段层数与类型核心作用输出特征图尺寸
前端特征提取20 层卷积(含 1×1 降维卷积)提取图像的低级(边缘、纹理)到高级(目标部件、轮廓)特征从 448×448 逐步下采样至 7×7
后端预测头4 层卷积 + 2 层全连接将高级特征映射为“目标位置+类别”的预测结果7×7×30(最终输出)

关键设计细节

  • 下采样方式:通过卷积层(步长=2)替代池化层,在减少特征图尺寸的同时保留更多细节;
  • 1×1 卷积的作用:在不改变特征图尺寸的前提下,降低通道数(减少计算量),并融合跨通道信息;
  • 全连接层的作用:将 7×7×1024 的卷积特征(最终一层卷积输出)转化为 1×1×4096 的向量,再映射为 7×7×30 的最终预测结果。

三、目标检测流程:网格划分与预测解析

YOLOv1 的检测流程可分为“输入预处理→网络预测→后处理”三步,核心是对7×7 网格的预测结果进行解析。

1. 输入预处理

  • 将任意尺寸的输入图像resize 到 448×448×3(固定输入尺寸,适配网络结构);
  • 对像素值进行归一化(如除以 255,将数值范围压缩到 [0,1]),加速模型训练。

2. 网络预测:7×7×30 输出的含义

网络最终输出为7×7×30的张量,可拆解为“每个网格的预测内容”——每个 7×7 网格中的每个单元格,对应 30 个预测值,具体分为三类:

各预测值的详细解释
预测值定义与计算方式物理意义
x, y相对于当前网格左上角的偏移量,且经过 sigmoid 函数归一化到 [0,1]目标中心在网格内的相对位置(如 x=0.5 表示中心在网格水平方向正中间)
w, h相对于整个输入图像的尺寸比例,且经过开方(√)处理目标的宽度和高度(如 w=0.2 表示目标宽度为输入图像宽度的 20%)
confidence(置信度)公式:Pr(Object) × IoU,经过 sigmoid 归一化到 [0,1]- 若网格内无目标:Pr(Object)=0,置信度≈0;
- 若网格内有目标:Pr(Object)=1,置信度≈边界框与真实框(Ground Truth)的 IoU(交并比)
类别概率(Pr(ClassObject))每个类别对应的概率,经过 softmax 归一化(所有类别概率和为 1)

3. 后处理:从预测结果到最终检测框

网络输出的 7×7×30 张量包含大量冗余信息(如无目标网格的低置信度框),需借助后处理筛选出准确的检测结果,核心步骤为置信度阈值过滤非极大值抑制(NMS)

步骤 1:计算最终检测框的类别置信度

每个边界框的“类别置信度”= 该网格的“类别概率” × 边界框的“置信度”,公式为:
Pr(Class|Object) × Pr(Object) × IoU = Pr(Class) × IoU
含义:该边界框检测到“某类别目标”的可信度(同时包含“类别正确性”和“位置准确性”)。

步骤 2:置信度阈值过滤

设定一个置信度阈值(如 0.2),过滤掉“类别置信度 < 阈值”的边界框——这些框要么无目标,要么位置/类别不准确。

步骤 3:非极大值抑制(NMS)

同一目标可能被多个网格或同一网格的多个边界框预测,导致重复检测。NMS 的作用是保留“最准确的框”,删除“重叠度高的冗余框”,流程如下:

  1. 对某一类别(如“人”)的所有候选框,按“类别置信度”从高到低排序;
  2. 取置信度最高的框作为“基准框”,计算其他框与基准框的 IoU;
  3. 若 IoU > 阈值(如 0.5),则删除该“冗余框”;
  4. 对剩余框重复步骤 2-3,直到无冗余框,最终得到该类别的检测结果。
步骤 4:坐标映射

将预测的“相对坐标(x,y,w,h)”映射为“图像绝对坐标”,得到最终检测框的左上角(x1,y1)和右下角(x2,y2):

四、损失函数:平衡分类与回归的误差

YOLOv1 的损失函数设计核心是统一“分类误差”和“回归误差”,并通过权重调整,解决“正负样本不平衡”(多数网格无目标)和“小目标检测误差敏感”的问题。

损失函数总公式(按预测内容拆解):

Loss = Loss_xy(中心坐标误差) + Loss_wh(宽高误差) + Loss_conf_obj(有目标置信度误差) + Loss_conf_noobj(无目标置信度误差) + Loss_class(类别误差)

各部分损失的详细计算

损失类型公式设计目的
中心坐标误差(Loss_xy)λ_coord × Σ( (x̂ - x)^2 + (ŷ - y)^2 )对“有目标的边界框”的 x、y 预测误差加权,λ_coord=5(提升坐标预测精度)
宽高误差(Loss_wh)λ_coord × Σ( (√ŵ - √w)^2 + (√ĥ - √h)^2 )1. 对宽高开方:缩小大目标宽高误差的权重(避免大目标误差主导损失);
2. 仅对“有目标的边界框”计算,λ_coord=5
有目标置信度误差(Loss_conf_obj)Σ( (ĉ - c)^2 )对“有目标的边界框”的置信度误差计算(c 为真实 IoU,ĉ 为预测置信度)
无目标置信度误差(Loss_conf_noobj)λ_noobj × Σ( (ĉ - 0)^2 )1. 对“无目标的边界框”的置信度误差加权,λ_noobj=0.5(降低无目标样本对损失的影响,缓解正负样本不平衡);
2. 真实置信度为 0(因无目标)
类别误差(Loss_class)Σ( (p̂_i - p_i)^2 )对“有目标的网格”的类别概率误差计算(p_i 为真实类别标签,p̂_i 为预测概率)

关键设计:如何选择“负责预测的边界框”

每个有目标的网格有 2 个边界框,但仅选择与真实框 IoU 更大的边界框作为“负责预测的框”,仅对该框计算 Loss_xyLoss_whLoss_conf_obj,另一个框仅计算 Loss_conf_noobj——此举可避免同一目标的两个框重复计算误差,提升训练稳定性。

五、YOLOv1 的优缺点

YOLOv1 作为单阶段检测的开创性工作,其设计思路影响深远,但受限于时代技术,也存在明显不足。

优点

  1. 检测速度快:端到端流程无需候选框生成,在 GPU 上可达到 45 FPS(实时检测),简化版(Fast YOLO)甚至可达 155 FPS,远超同期两阶段算法(如 R-CNN 约 5 FPS);
  2. 全局视野预测:基于整幅图像的特征进行预测,相比基于候选框的局部预测,对“背景误检”的抵抗能力更强(如不易将背景中的杂物误判为目标);
  3. 泛化能力强:在自然场景图像上训练后,可较好地迁移到其他领域(如艺术画、卫星图像),鲁棒性优于同期算法。

缺点

  1. 小目标检测精度低:每个网格仅预测 2 个边界框,若图像中存在大量密集小目标(如一群鸟),易出现“漏检”;且宽高误差的开方处理,对小目标的位置偏差更敏感;
  2. 边界框预测粗糙:仅通过全连接层回归边界框坐标,缺乏对目标形状的精细建模,对“非标准比例目标”(如细长的物体)的检测精度较低;
  3. 网格划分限制:目标中心必须落在对应网格内才能被检测,若目标跨网格且中心偏移,易出现“检测框不准确”;
  4. 类别不平衡影响:尽管通过 λ_noobj 降低无目标样本的权重,但大量无目标网格仍会轻微主导损失,影响训练收敛速度。

总结

YOLOv1 是目标检测领域的里程碑算法,其“单阶段端到端检测”的核心思想彻底改变了传统检测的范式。尽管存在小目标检测、边界框精度等问题,但后续的 YOLOv2、YOLOv3 等版本均基于其框架进行改进(如增加锚点框、多尺度预测、优化损失函数),逐步弥补了缺陷,使 YOLO 系列成为工业界最常用的目标检测算法之一。理解 YOLOv1 的原理,是掌握后续进阶版本的关键基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

revit api structure type判断

revit api structure type判断通过StructuralType区分结构柱,结构梁,结构支撑和独立基础public void GetStructuralType(FamilyInstance familyInstance) {string message = "";switch (familyInstance.St…

读《代码大全2》第二部分有感

《代码大全2》的第二部分“高质量的代码”,宛如一位严苛的工匠在传授“打磨技艺”的精髓。如果说第一部分是为软件构建“打地基”,那这部分便是教我们如何用精准的手法,将“砖块”(代码)砌成坚固且美观的“墙体”…

读《代码大全2》第一部分有感

翻开《代码大全2》,第一部分“奠定基础”便像一把精准的钥匙,打开了我对软件构建认知的新大门。这部分没有陷入复杂的代码细节,而是从宏观视角切入,将软件开发的底层逻辑与核心原则娓娓道来,让我对“如何做好软件…

Modbus协议存储区学习笔记

于我而言,风光无限是你,跌落尘埃也是你,重要的是你,而不是怎样的你。——《天官赐福》1️⃣ 核心思想:通信 = 数据交互 首先,我们要明白一个最基本的道理:所有通信的本质,都是在交换数据!在Modbus协议里,设备…

CF1168C And Reachability

比较唐的思路是相同位上相邻为 \(1\) 的数连边,看能否从 \(x\) 走到 \(y\) 即可。 你发现这样不太好做,我们写个 DP,设 \(f_{i, j}\) 表示能到 \(i\) 这个点且 \(< i\) 第 \(j\) 位为 \(1\) 的数是哪一个(最大的…

分布式专题——32 BIO、NIO编程与直接内存、零拷贝深入辨析 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

LuatOS GNSS定位调试步骤解析:一步步实现精准定位

精准的GNSS定位是众多物联网项目的基础。本文将对LuatOS GNSS定位调试的各个步骤进行深度解析,帮助开发者系统性地掌握调试流程,让您的项目能够快速、稳定地实现精准定位需求。 一、GPS 工作原理简介 1.1 GPS 技术的…

AI元人文:从分野到纠缠——一种基于值动力学的统一视角

AI元人文:从分野到纠缠——一种基于值动力学的统一视角 一、 导言:超越分野,探寻谱系 我们习惯于用“模型”来框定理解世界的范式,无论是“主客二值”还是“三值纠缠”,这种命名本身已然暗示了一种分野。然而,智…

《代码大全》读后感:以构建为核心,搭建团队协作的桥梁

从团队管理视角阅读《代码大全 2》第一章,我收获的是 “如何通过规范构建流程提升团队效率” 的启发。书中指出 “软件构建是团队协作的核心环节”,不同角色的工作最终都会汇聚到构建阶段,这让我意识到,团队协作的…

AI大模型提示词攻击防御全景指南 2025:从OWASP Top 10到企业级防护体系

AI大模型提示词攻击防御全景指南 2025:从OWASP Top 10到企业级防护体系一、提示词攻击的威胁升级:从单点攻击到系统性风险 在OWASP大模型安全漏洞排名中,提示词注入攻击(Prompt Injection Attack)已经排到了首位。OWAS…

mul 与 reduce_sum 的优化实例

一、基础介绍 什么是 mul 与 reduce_sum? mul 通常指元素级乘法(Element-wise Multiplication),它将两个形状相同的张量中对应位置的元素相乘,返回一个与原张量形状相同的新张量。 reduce_sum 是一种规约操作(Re…

《代码大全》读后感:从 “功能实现者” 到 “责任承担者” 的思维跃迁

对于拥有 5 年开发经验的我来说,《代码大全 2》第一章更像是一次 “实践复盘”,让我对 “软件构建的责任” 有了更深的体悟。书中提到 “构建阶段决定了软件的质量上限”,这句话精准概括了我过往项目中的教训:曾参…

企业网站建设服务商:2025年最佳选择指南与行业洞察

摘要 企业网站建设行业在2025年持续快速发展,数字化转型推动中小企业对高效、性价比高的建站服务需求激增。本文基于行业数据和用户反馈,整理了2025年企业网站建设服务商排名前十的榜单,为中小企业提供参考。排名综…

2025年市场上微信小程序服务商:十大顶尖企业权威评测与选择指南

摘要 随着数字化转型加速,2025年微信小程序服务市场呈现爆发式增长,中小企业对高效、低成本互联网工具需求激增。本文基于行业数据和技术实力,深度评测十大微信小程序服务商,为您的企业选择提供权威参考。文末附有…

记录一下,关于前端控制并发的思路

看了前端很多文章我感觉并发不应该只是控制几个接口去发送,应该考虑到每个接口完成的时间是不同的,所以今天我试着写了一个如果并发中接口完成了请求就继续发送其他接口的js ,简单测试了一下感觉没问题,还请各位提…

Linux 交叉编译(toolchain) ARM 版 lib pcap.so 库

前言全局说明libpcap.so 编译一、说明 环境: CentOS Linux 7 (Core) Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux二、下载源码: 官网:…

Codeforces Pinely Round 5(div.1 + div.2) A~D题解

写在开头 有不足的地方各位佬多多指教呀! 持续更新(bushi) A 题面 给定李华的初始rating \(R\) ,div.2的计分上限 \(X\),李华每次rating的变化最大值 \(D\),以及cf比赛的次数 \(n\),问李华最多可以正式参加多少…

Linux 交叉编译(toolchain) ARM版 libc.so 库

前言全局说明编译 libc.so一、说明 环境: CentOS Linux 7 (Core) Kernel 3.10.0-1127.el7.x86_64 on an x86_64二、下载源码: 官网: http://ftp.gnu.org 源码下载: http://ftp.gnu.org/gnu/libc/ 历史版本: http://…

revit api事件

revit api事件DocumentOpened事件public class Application_DocumentOpened : IExternalApplication {public IExternalApplication.Result OnStartup(ControlledApplication application){try{//注册事件application.…