计算机视觉---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×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=λcoordi=0S2j=0B1i,jobj[(xixi^)2+(yiyi^)2]+λcoordi=0S2j=0B1i,jobj[(wi wi^ )2+(hi hi^ )2]+i=0S2j=0B1i,jobj(CiCi^)2+λnoobji=0S2j=0B1i,jnoobj(CiCi^)2+i=0S21iobjcclasses(pi(c)pi^(c))2

各部分解析

  1. 坐标误差(前两行)

    • 权重 λ 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最大)。
  2. 置信度误差(中间两行)

    • 有目标的框 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降低负(背景)样本的置信度损失,因负样本数量远多于正样本)。
  3. 类别误差(最后一行)

    • 权重:默认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的倍数),迫使模型适应不同尺度的目标,增强泛化能力。
五、推理过程
  1. 边界框解码

    • 网格 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
  2. 置信度过滤与NMS

    • 对每个边界框,计算 类别置信度 = 类别概率 × 置信度,过滤低于阈值(如0.2)的框。
    • 对同一类别,使用NMS去除重叠框,保留高置信度的框。
六、优缺点分析
优点
  1. 速度快:端到端检测,45 FPS(GPU),可实时处理视频流。
  2. 结构简单:单网络完成特征提取和预测,无需候选区域生成,训练和部署便捷。
  3. 全局视野:直接从全图预测,不易漏检背景中的目标(两阶段模型可能因候选区域局限漏检)。
缺点
  1. 小目标检测差

    • 7×7网格分辨率低,小目标在特征图中占比小,信息不足。
    • 每个网格仅预测2个框,小目标可能因重叠导致IOU低而被抑制。
  2. 边界框预测不准

    • 无锚框先验,全靠网络学习宽高比例,对非常规比例目标(如狭长物体)泛化能力弱
    • 直接回归宽高,缺乏尺度不变性(YOLOv2通过锚框和对数空间回归改进)。
  3. 密集目标漏检

    • 同一网格内多个目标(如人群)仅能输出2个框,易漏检。
  4. 类别不平衡

    • 无目标的网格(负样本)占多数,虽通过权重缓解,但仍影响置信度学习。
七、YOLOv1的影响与后续改进
  • 对检测领域的贡献

    • 开创单阶段检测范式,推动实时检测发展(如YOLO系列、SSD、RetinaNet)。
    • 证明“全局特征建模”在检测中的有效性,启发后续模型融合上下文信息。
  • 后续YOLO版本的改进方向

    • YOLOv2(2017):引入锚框、批归一化、多尺度训练,使用Darknet-19,精度和速度提升。
    • YOLOv3(2018):多尺度预测(FPN结构)、Darknet-53、二元交叉熵损失(适用于多标签分类)。
    • YOLOv4/YOLOv5(2020年后):集成数据增强、注意力机制、模型轻量化等技术,进一步提升性能。
八、与两阶段检测的对比
维度YOLOv1Faster R-CNN
检测流程单阶段(直接回归框和类别)两阶段(先候选区域,再分类/回归)
速度快(45 FPS)慢(~7 FPS)
精度(mAP)较低(VOC 2007: ~63.4%)较高(VOC 2007: ~78.8%)
设计哲学速度优先,适合实时场景精度优先,适合高要求场景
九、总结

YOLOv1以其颠覆性的单阶段设计,重新定义了目标检测的速度与实时性标准。尽管存在小目标检测弱、框预测不准等缺陷,但其开创的“端到端回归”思路为后续检测模型奠定了基础。通过理解YOLOv1的核心原理(网格划分、损失函数设计、训练策略),可深入把握单阶段检测的本质,并更好地理解后续YOLO版本的改进逻辑。

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

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

相关文章

前端学习笔记element-Plus

【element-plus菜单】参数说明: active-text-color"#ffd04b"——激活颜色 background-color"#232323"——背景颜色(29,160,176) :default-active"$route.path"——配置默认高亮的菜单项 text-color"#f…

【Django DRF】一篇文章总结Django DRF框架

第一章 DRF框架基础 1.1 DRF简介 1.1.1 DRF定义与作用 1. 定义 DRF 即 Django REST framework,它是一个建立在 Django 基础之上的强大且灵活的工具包,用于构建 Web API(应用程序编程接口)😎。简单来说,…

如何解决 Python 项目安装依赖报错:ERROR: Failed to build installable wheels for some pyproject.toml based project

如何解决 Python 项目安装依赖报错:ERROR: Failed to build installable wheels for some pyproject.toml based projects 在使用 pip 安装 Python 项目的依赖时,遇到类似如下的报错信息: ERROR: Failed to build installable wheels for s…

使用f5-tts训练自己的模型笔记

摘要 服务器都有了,这不得练练丹,有点说不过去啊。所以尝试了从头开始训练一个模型,结果由于推理页面好像有bug,不知道是不是失败了,然后又尝试微调一下模型。本篇文章主要记录了三流调包侠尝试炼丹过程中学习到的一些…

安全可控的AI底座:灯塔大模型应用开发平台全面实现国产信创兼容适配认证

国产信创产品兼容适配认证是为了支持和推动国产信息技术产品和服务的发展而设立的一种质量标准和管理体系。适配认证旨在确保相关产品在安全性、可靠性、兼容性等方面达到一定的标准,以满足政府和关键行业对信息安全和自主可控的需求。 北京中烟创新科技有限公司&a…

初识Vue【1】

1.什么是Vue: Vue (读音 /vjuː/,类似于 **view**) 是一套用于构建用户界面的**渐进式框架**。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或…

Jest入门

快速入门 Jest中文文档 | Jest中文网 1.下载:npm install --save-dev jest 2.创建 sum.js 文件: function sum(a, b) { return a b; } module.exports sum; 3.创建sum.test.js 的文件 const sum require(./sum); test(adds 1 2 to equal 3,…

Spring Boot企业级开发五大核心功能与高级扩展实战

前言 在企业级应用开发中,Spring Boot已成为事实上的Java开发标准。本文将从企业实际需求出发,深入剖析Spring Boot五大必用核心功能,并扩展讲解三项高级开发技能,帮助开发者掌握构建健壮、高效、易维护的企业级应用的必备技术。…

2025电工杯数学建模B题思路数模AI提示词工程

我发布的智能体链接:数模AI扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力,扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体,并发布到豆包、飞书等各个平台。https://www.coze.cn/search/n…

LabVIEW开发FPGA磁声发射应力检测系统

工业级磁声发射应力检测系统,针对传统设备参数固定、灵活性不足的痛点,采用 Xilinx FPGA 与 LabVIEW 构建核心架构,实现激励信号可调、多维度数据采集与实时分析。系统适用于铁磁性材料应力检测场景,具备高集成度、抗干扰性强、检…

Java IO流学习指南:从小白到入门

Java的IO(Input/Output)流是处理数据输入和输出的基础。无论是读取文件、写入文件,还是通过网络传输数据,IO流都无处不在。对于刚接触Java的新手,理解IO流可能会有些困惑,但别担心,今天我们将一…

【后端高阶面经:微服务篇】1、微服务架构核心:服务注册与发现之AP vs CP选型全攻略

一、CAP理论在服务注册与发现中的落地实践 1.1 CAP三要素的技术权衡 要素AP模型实现CP模型实现一致性最终一致性(Eureka通过异步复制实现)强一致性(ZooKeeper通过ZAB协议保证)可用性服务节点可独立响应(支持分区存活…

QNAP NEXTCLOUD 域名访问

我是用docker compose方式安装的,虽然不知道是不是这么个叫法,废话不多说。 背景:威联通container station安装了nextcloud和lucky,lucky进行的域名解析和反代 先在想安装的路径、数据存储路径、数据库路径等新建文件夹。再新建…

高级SQL技巧:窗口函数与复杂查询优化实战

高级SQL技巧:窗口函数与复杂查询优化实战 开篇:数据库开发中的挑战 在现代企业级应用中,数据库不仅是存储数据的核心组件,更是处理复杂业务逻辑的重要工具。然而,随着数据量和并发请求的不断增长,传统的S…

《STL--list的使用及其底层实现》

引言: 上次我们学习了容器vector的使用及其底层实现,今天我们再来学习一个容器list, 这里的list可以参考我们之前实现的单链表,但是这里的list是双向循环带头链表,下面我们就开始list的学习了。 一:list的…

docker中使用openresty

1.为什么要使用openresty 我这边是因为要使用1Panel,第一个最大的原因,就是图方便,比较可以一键安装。但以前一直都是直接安装nginx。所以需要一个过度。 2.如何查看openResty使用了nginx哪个版本 /usr/local/openresty/nginx/sbin/nginx …

vscode包含工程文件路径

在 VSCode 中配置 includePath 以自动识别并包含上层目录及其所有子文件夹,需结合通配符和相对/绝对路径实现。以下是具体操作步骤及原理说明: 1. 使用通配符 ** 递归包含所有子目录 在 c_cpp_properties.json 的 includePath 中,${workspac…

【排序算法】典型排序算法 Java实现

以下是典型的排序算法分类及对应的 Java 实现,包含时间复杂度、稳定性说明和核心代码示例: 一、比较类排序(通过元素比较) 1. 交换排序 ① 冒泡排序 时间复杂度:O(n)(优化后最优O(n)) 稳定性&…

多模态大语言模型arxiv论文略读(八十七)

MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文标题:MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文作者:Xiangyu Zhao, Xiangtai Li, Haodong Duan, Haian Huang, Yining Li, Kai Chen, Hua Ya…

塔能节能平板灯:点亮苏州某零售工厂节能之路

在苏州某零售工厂的运营成本中,照明能耗占据着一定比例。为降低成本、提升能源利用效率,该工厂与塔能科技携手,引入塔能节能平板灯,开启了精准节能之旅,并取得了令人瞩目的成效。 一、工厂照明能耗困境 苏州该零售工厂…