yolov1:背景介绍与算法精讲

在这里插入图片描述

目录

  • 一、背景介绍
    • 1.1 yolo发展历史
    • 1.2 作者介绍
  • 二、算法精讲
    • 2.1 预测阶段
    • 2.2 训练阶段
  • 三、论文细节

一、背景介绍

  其实在写这篇博客的时候yolov1~yolov8的所有网络结构以及算法思想和源码都已经研究很久了,回过头继续读v1会发现有很多细节是自己没有留意的,也算是对自己的学习进行总结了。

1.1 yolo发展历史

  yolo最开始是在2015年提出的,该论文发表在cvpr2016上,至今为止已经更新迭代到了v8版本,如果想要真正理解yolo算法思想,还是需要仔细阅读yolov1论文。论文链接:yolov1

在这里插入图片描述
yolo主页:
有兴趣的朋友可以直接到yolo官网参观一下yolo的主页:https://pjreddie.com/
在这里插入图片描述

1.2 作者介绍

  yolo的作者是Joseph Redmon,可以通过谷歌学术了解该作者的相关信息,虽然目前yolo系列已经更新到了v8,但是只有前三个版本是该作者提出的,从谷歌学术上面可以看的,目前yolov1、yolov3和yolo9000的引用率达到了上万条,因为担心人工智能会更多的用于军事方面,从而导致人类的毁灭,所以在v3版本提出之后,该作者就宣布推出yolo系列的更新,所以之后的所有系列都是其他科学研究人员进行更新迭代。
在这里插入图片描述
作者简历:
  其实最有意思的是Joseph Redmon的简历,从简历可以看出作者是一个非常有个性的人,他介绍了他在计算机科学系当了两年的助教。他喜欢把自己的知识传授给每一匹对计算机科学感到兴奋的小马!在右边紫色栏中介绍了他的主修课程已经成绩分数等信息。
在这里插入图片描述

二、算法精讲

2.1 预测阶段

  yolov1的检测网络有24个卷积层和2个全连接层。交替使用1x1个卷积层减少了前一层的特征空间。我们在ImageNet分类任务上以一半的分辨率(224x224输入图像)对卷积层进行预处理,然后将分辨率提高一倍进行检测,也就是将图片尺寸提高448x448。输入图片shape为448x448x3,在经过卷积层以及4096和1470两个全连接层之后,输出7x7x30的特征图。
在这里插入图片描述


  为什么会输出7x7x30的特征图? 因为我们的图片被划分为SxS的个网格(grid cell),每个网格又生成两个预测框(bounding box),这两个预测框的中心点都落在网格里面,每个预测框是由预测框中心点坐标、宽、高、物体置信度(x,y,w,h,c),组成,下图中黑色框线的粗细代表置信度confidence大小;假设在有物体置信度的情况下,每一个网格生成某一个物体类别的概率,也就是下图中彩色格子图片,把每一个bounding box的置信度与类别的条件概率相乘,就能得到每一个bounding box的类别概率,也就是下图中的最后一个带预测框的图片。

  grid cell的条件概率指的是在当前置信度存在的情况下,预测的20个类别概率最高的类别,所以每个grid cell只能预测出一个物体,7x7=49个grid cell最多只能预测49个类别,下面浅蓝色区域表示是狗的类别,这也是yolov1无法精准预测密集目标和小目标的原因
在这里插入图片描述
在这里插入图片描述


   每一个bounding box的置信度与类别的条件概率结合得到如下预测框,一共是49x2=98个框,每个预测框都有置信度与类别,这98个框再经过一系列后处理,比如说过滤掉低置信度的候选框,再进行nms非极大值抑制处理过滤掉重复的候选框,最后每个物体只保留一个检测框,得到了我们最终的目标检测图像。
在这里插入图片描述
后处理—置信度过滤和NMS
1、置信度过滤
首先需要了解一下什么事条件概率;条件概率是指在已知一些相关信息或事件发生的条件下,另一个事件发生的概率。简而言之,条件概率是指在给定某个条件下,另一个事件发生的可能性。

条件概率可以用P(A|B)表示,其中A和B是两个事件。P(A|B)代表在事件B已经发生的情况下,事件A发生的概率。

计算条件概率时,可以使用以下公式:
P(A|B) = P(A∩B) / P(B)

其中,P(A∩B)表示事件A和事件B同时发生的概率,P(B)表示事件B发生的概率。

下图中每一个黄色的束状条表示该bounding box的置信度与该grid cell 20个类别条件概率的乘积的到的全概率,每个bounding box会得到两个竖条,一共是98个。
在这里插入图片描述

设置阈值,进行概率筛选,每个竖条同维度概率值与阈值进行比较,假设第一个维度都是狗的概率,阈值设置为0.5,如果概率低于0.5的都设置为0,并且放到靠后的位置,这样我们过滤掉概率较低的值,经过置信度过滤之后就需要进行NMS非极大值抑制处理。
在这里插入图片描述


2、NMS非极大值抑制
经过置信度过滤之后得到如下概率图,按照类别概率高低进行排序,将每一个概率值都与最大概率值进行对比,我们设置IOU交并比阈值,如果两个概率的IOU交并比大于这个阈值,就可以看做两个bounding box重叠,舍弃掉概率值低的bounding box;
在这里插入图片描述

2.2 训练阶段

目标检测任务是一个典型的监督学习问题;

在监督学习中,我们使用已有的带有标签(或者称为标记)的数据集,通过训练模型来学习输入与输出之间的映射关系,通过梯度下降等方法对神经元的权重进行微调,使得损失函数最小化的过程,从而能够对新的未标记数据进行预测或分类。

监督学习的基本概念可以通过以下几个要素来描述:

  • 输入数据(特征):监督学习中的输入数据通常被称为特征,表示为X。这可以是一组数值、图像、文本等形式的数据。
  • 输出数据(标签):与每个输入数据对应的目标输出,通常被称为标签,表示为Y。标签可以是类别,也可以是数值。
  • 训练数据集:由带有标签的输入数据和相应的输出数据组成。这个数据集被用于训练模型,模型通过学习训练数据中的特征与标签之间的关系。
  • 模型:监督学习中的模型是一个函数,通过输入数据来预测输出数据。模型的选择可以根据具体的问题来进行,例如线性回归、决策树、支持向量机、神经网络等。
  • 损失函数:用来衡量模型预测结果与实际标签之间的差异。监督学习的目标是最小化损失函数,使模型的预测结果尽可能接近真实标签。
  • 预测:经过训练后的模型可以用于预测新的未标记数据的输出。通过输入数据,模型可以根据学到的映射关系,得出预测的结果。

在训练过程中我们希望bounding box尽量逼近我们真实框(ground truth),每个grid cell会生成两个预测框(黄色),我们比较两个预测框与真实框(红色) 的IOU值,保留IOU值最大的框,也就是下图中较大的黄色框,剩下的小的黄色框会在损失函数计算过程中给它一个非常小的权值进行忽略。我们训练过程中需要较大的黄色框尽量逼近我们已经打好标签的红色框。

注意!如果我们的预测框和真实框的中心点不落在同一个grid cell里面,会将这两个预测框都进行忽略,因为每个grid cell会预测一个类别。
在这里插入图片描述


损失函数
在yolov1目标检测过程中一共需要计算5个误差:

  1. 负责检测物体bbox中心点定位误差。
  2. 负责检测物体bbox宽高定位误差。
  3. 负责检测物体bbox置信度confidence误差
  4. 不负责检测物体bbox置信度confidence误差
  5. 负责检测物体的grid cell分类误差
    在这里插入图片描述

1、负责检测物体bbox中心点定位误差
在这里插入图片描述
2、负责检测物体bbox宽高定位误差
这里求根号的原因是使小框对误差更敏感。
在这里插入图片描述
3、confidence回归误差
注意:绿色框中不负责检测物体的boxx有两类,一类是中心点落在grid cell中但是与真实框IOU值太小而被淘汰的框,另外一类是中心点没和真实框落在同一个grid cell中两个框全被淘汰。
在这里插入图片描述

4、负责检测物体的grid cell分类误差
在这里插入图片描述

损失函数细节
在这里插入图片描述

三、论文细节

数据集

yolov1使用的数据集是voc2007, PASCAL VOC(Visual Object Classes)数据集是一个用于目标检测和图像分割任务的常用数据集之一。它包含一系列的图像,每个图像都标注了其中物体的位置和类别。以下是关于PASCAL VOC数据集的详细信息:

1、版本:

  • PASCAL VOC 数据集有多个版本,例如 VOC2007、VOC2012 等。每个版本都包含了不同数量的图像和标注。

2、任务:

  • VOC 数据集通常用于目标检测和图像分割任务。目标检测任务要求模型检测图像中的物体,并给出它们的位置和类别。图像分割任务要求模型对图像中的每个像素进行分类,将图像分割成不同的区域。

3、类别:

  • VOC 数据集包含了20个不同的物体类别,如人、车辆、动物、家具等。每个类别都有相应的标签。

4、图像:

  • VOC 数据集的图像来自不同的场景,包括室内和室外。图像的分辨率和质量也有所不同。

6、标注:

  • 每个图像都有相应的 XML 文件,包含了物体的边界框坐标、类别标签以及其他相关信息。对于图像分割任务,还可能包含每个像素的分割标签。

7、训练集和测试集:

  • VOC 数据集通常划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。

8、评估指标:

  • 在目标检测任务中,常用的评估指标包括精确度(Precision)、召回率(Recall)和平均精确度(mAP)。mAP 是种综合考虑所有类别的评估指标。

9、使用领域:

  • VOC 数据集被广泛用于评估目标检测和图像分割算法的性能。许多研究论文和竞赛采用了这个数据集作为基准。
    在这里插入图片描述

与其他方法比较
与其他实时算法相比,在实时目标检测算法中yolo是最准的。
与其他非实时目标检测算法相比,yolo的精度居中,但是速度最快,每秒中可以检测45张图片。
在这里插入图片描述


yolo与fast r-cnn错误比较
在背景background误差上面我们能看到,fast r-cnn的误差更大,因为fast r-cnn是两阶段模型,它并不能识别全图的信息,只是把候选区域的一小块进行分析,缺乏全局性,所以会将很多背景误判为目标。

yolo是把整个图片放到模型当中,所以区分背景和物体的能力比较强,能够区分背景和前景的关系。

yolo的定位能力比较弱,一方面由于输入的图片像素比较小,其次整个网络把目标检测所有的事情全部都做完了,没法实现高精度定位。

在这里插入图片描述


与其它网络融合
这也是我们改网络过程中经常会用到的方法,将两个网络进行融合,弥补互相的缺陷,将fast与其他模型进行融合发现性能提升的比较小,但是与yolo模型进行融合之后,性能提升到了75。
在这里插入图片描述
在这里插入图片描述


泛化能力强
其实很多模型在实际训练集已经验证集上的测试效果非常好,但是如果应用到一些艺术品上面,检测效果就会下降,在这一方面,yolo的表现非常的好,通过现实数据集训练的模型,即使放在艺术品的检测上已经拥有较好的性能。

左图是在毕加索数据集的召回精度曲线。右图是在VOC 2007, Picasso和People-Art数据集的定量结果。毕加索数据集评估AP和最佳F1得分。
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows10解决大小核调度问题

文章目录 1.开启高性能模式2.下载安装PowerSettingsExplorer3.修改配置生效的异类策略异类线程调度策略异类短时间线程调度策略 4.你的电源策略5.CPU展示 该教程是给笔记本电脑用的,经过我实践是成功的。 1.开启高性能模式 使用管理员模式的PowerShell输入下列指令 …

Mantle: A Programmable Metadata Load Balancer for the Ceph File System——论文泛读

SC 2015 Paper 元数据论文阅读汇总 问题 优化Ceph的元数据局部性和负载平衡。 现有方法 提高元数据服务性能的最常见技术是在专用的元数据服务器(MDS)节点之间平衡负载 [16, 25, 26, 21, 28]。常见的方法是鼓励独立增长并减少通信,使用诸…

HuiYong.Online 私有化博客系统

HuiYong.Online 私有化博客系统 一站式支持MarkDown、Drawio、XMind 免费、简单、强大... 用思维导图、流程图、写文章、做笔记、记录生活;搭建自己 / 组织 / 公司的知识储备系统;这里就是你所寻找的。 链接 官网:https://huiyong.onlineGithub:http…

【iOS】数据存储方式总结(持久化)沙盒结构

在iOS开发中,我们经常性地需要存储一些状态和数据,比如用户对于App的相关设置、需要在本地缓存的数据等等,本篇文章将介绍六个主要的数据存储方式 iOS中数据存储方式(数据持久化) 根据要存储的数据大小、存储数据以及…

基于Pytorch的身份证及其他证件检测矫正模型应用

前言 在做身份证和其他证件识别的时候,图片基本都不是摆正的状态,此时在进行OCR文字识别的提取文字信息的时候会出现很多误差,如何将证件摆正,再进行OCR文字识别就可以大大提高准确率。 准备工作 1、Python环境,在P…

【Docker】CentOS stream 上安装 Docker 环境详细指南

文章目录 1. 定义2. 优势3. 安装1)Linux 上安装(强烈推荐)2)Windows 和 MAC 上安装 4. 验证1)查看版本2)运行 Hello World 总结 Docker 是一种轻量级的容器化技术,提供了一种在不同环境中快速、…

Android Framework | AOSP源码下载及编译指南(基于Android13)

Android Framework | AOSP源码下载及编译指南(基于Android13) 引言 AOSP(Android Open Source Project)是Android操作系统的开源项目,通过下载和编译AOSP源码,您可以获得原始的Android系统,并进行定制和开发。本教程…

压缩编码之不同缩放参数对重建图像质量的影响的python实现——JPEG变换编码不同压缩率的模拟

原理 JPEG(Joint Photographic Experts Group)是一种常用的图像压缩标准,它通过采用离散余弦变换(DCT)和量化来实现图像的压缩。 离散余弦变换(DCT): JPEG首先将图像分割成8x8的块…

【Unity实战100例】Unity对Ini格式的配置文件管理和读写

目录 一.编写ini格式配置文件 二.读取解析ini文件 三.调用属性 INI 文件以文本形式存储,易于阅读和编辑。这种人可读的格式使得调整配置参数变得更加直观,不需要专门的工具。 INI 文件是一种轻量级的配置文件格式,不需要复杂的解析器或库。它的结构相对简单,适用于小到

LLM论文:ALCE (Enabling Large Language Models to Generate Text with Citations)

这是一篇RAG领域的文章,原文在这:https://aclanthology.org/2023.emnlp-main.398.pdf 时间[Submitted on 24 May 2023 (v1), last revised 31 Oct 2023 (this version, v2)]背景LLM在信息搜索、生成带引用的文本时存在幻觉问题,即事实准确性…

03 顺序表

目录 线性表顺序表练习 线性表(Linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串。。。 线性表在逻辑上时线性结构,是连续的一条直线。但在物理结…

前端框架前置课Node.js学习(1) fs,path,模块化,CommonJS标准,ECMAScript标准,包

目录 什么是Node.js 定义 作用: 什么是前端工程化 Node.js为何能执行Js fs模块-读写文件 模块 语法: 1.加载fs模块对象 2.写入文件内容 3.读取文件内容 Path模块-路径处理 为什么要使用path模块 语法 URL中的端口号 http模块-创建Web服务 需求 步骤: 案例:浏…

Detection-friendly dehazing: object detection in real-world hazy scenes

Detection-friendly dehazing: object detection in real-world hazy scenes 摘要 提出了一种联合架构BAD-Net,将去雾模块和检测模块连接成一个端到端的方法。另外,设计了了两个分支结构,用注意力融合模块来充分结合有雾和去雾特征&#xf…

【python】11.文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景,而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词,可能需要先科普一下关于文件系统的知识,但是这里我们并不浪费笔墨介绍这个概念,请大…

Python展示 RGB立方体的二维切面视图

代码实现 import numpy as np import matplotlib.pyplot as plt# 生成 24-bit 全彩 RGB 立方体 def generate_rgb_cube():# 初始化一个 256x256x256 的三维数组rgb_cube np.zeros((256, 256, 256, 3), dtypenp.uint8)# 填充立方体for r in range(256):for g in range(256):fo…

kubectl与 jq的另外一些用法

背景: 在日常运维工作中,我们需要管理和操作大量的配置文件,这在使用 Kubernetes 集群管理应用时尤为常见。Kubernetes 提供了一个名为 ConfigMap 的资源对象,它用于存储应用的配置信息。有时,我们需要查找哪些 Confi…

【WPF.NET开发】OpenType字体

本文内容 OpenType 字体格式变量大写字母连字花体备用项数字样式版式类 本主题概述了 Windows Presentation Foundation (WPF) 中 OpenType 字体技术的一些主要功能。 1、OpenType 字体格式 OpenType 字体格式是 TrueType 字体格式的扩展,增加了对 PostScript 字…

Linux-ARM裸机(十一)-UART串口通信

无论单片机开发还是嵌入式 Linux 开发,串口都是最常用到的外设。可通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序。还有很多的模块,比如蓝牙、GPS、 GPRS 等都使用的串口来与主控进行通信的,在嵌入式 Linux…

java如何修改windows计算机本地日期和时间?

本文教程,主要介绍,在java中如何修改windows计算机本地日期和时间。 目录 一、程序代码 二、运行结果 一、程序代码 package com;import java.io.IOException;/**** Roc-xb*/ public class ChangeSystemDate {public static void main(String[] args)…

compose 实验

cd /opt mkdir compose_nginx cd compose_nginx mkdir nginx cd nginx/ 此时顺便将nginx安装包拖进来 vim Dockerfile mkdir /opt/compose_nginx/wwwroot echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html docker netw…