目标检测算法:YOLO v1论文解读

目标检测算法:YOLO v1论文解读

前言

​ 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表达清楚而正确,我认为这是一种很好的锻炼,当然如果可以帮助到网友,也是很开心的事情。

说明

​ 如果有笔误或者写错误的地方请指出(勿喷),如果你有更好的见解也可以提出,我也会认真学习。

原始论文地址

​ 点击这里,或者复制链接

https://arxiv.org/abs/1506.02640

目录结构

文章目录

    • 目标检测算法:YOLO v1论文解读
      • 1. 文章内容概述:
      • 2. YOLO流程介绍:
      • 3. CNN架构:
      • 4. 损失函数:
      • 5. 注意点:
      • 6. 总结:

1. 文章内容概述:

​ 作者提出了一种新的目标检测方法,是一种单阶段检测方法,称其为YOLO,全称为You only look once。这个方法的主要特点是不再生成区域建议框,而是全部交给网络架构来实现,是真正的端到端结构(其实并不是严格意义上的端到端,因为还需要进行后处理操作)。

​ 正是因为没有了区域建议框的生成,其运行速度非常快,可以实现实时检测,但是同样的,其mAP和最先进的检测方法Faster-RCNN比还是较低。

2. YOLO流程介绍:

​ 如果你看了我之前的关于RCNN、Fast-RCNN、Faster-RCNN的解读,你马上就会感概,YOLO真的好简单。

​ 论文原图如下:

在这里插入图片描述

​ 对上图进行简单的说明:

  • 首先,将输入图片改变大小(一般是取大的分辨率,文中取得的是448*448)

问题:为什么要取大分辨率图像?

​ 因为检测问题需要更细致的信息,因此提高分辨率。

  • 然后,将该图片传输给CNN架构,然后产生输出(即预测框和类别预测信息)

3. CNN架构:

​ 这里作者自己设计了CNN架构,当然,对于读了这么多的CNN架构论文来说,小case(如果你是无基础直接看的话,当我没说,此时建议你可以先看看基础的)。

​ 论文原图如下:

在这里插入图片描述

​ 具体的网络架构就不谈了,只是要注意,其实网络架构中用到了激活函数,并且不是我们常规的ReLu激活函数,而是leaky relu(最后一层还是relu):

在这里插入图片描述

​ 另外,需要注意它的输出,**这是最重要的部分。**因为它的输出和我们平时的输出不一样,因为无论是图像分类的架构,还是之前的两阶段检测算法,输出就没有三维结构的。

​ 那么,7*7*30是什么意思?下面先分开解释,再结合一起解释。

解释:7*7含义

​ 作者将一张图像划分为S*S个网格,如下图(S=7):

在这里插入图片描述

​ 作者认为:

  • 如果某个物体对象中心落在某一网格中,那么该网格就负责该对象的检测
  • 每个单元格预测B个边界框和其对应的置信度分数,以及一组类概率(比如总共20个类别,则产生20个概率值)

​ 其中,置信度公式和概率公式分别如下,其中Pr(object)取{0,1},表示该网格有对象,则取值为1,否则取值为0。

在这里插入图片描述
在这里插入图片描述

解释:30含义

​ 30=(4+1)*2+20,其中4和1分别表示4个坐标值(x,y,w,h)和一个置信度分数;2表示每个单元格预测2个边界框,那么自然需要乘以2;20是因为数据集共20个类别。

解释:7*7*30怎么才能满足我们的要求?

​ 神经网络的神奇之处,就是在于我们可以让它去适应任意的任务。比如这里,我们需要它按照我们的想象输出7*7*30,并且这里的值必须为我们所想的(比如30里面为坐标值、概率值等)。想要让它输出和我们想得一样,就必须让它在训练的时候,告诉它,30里面的值我们要用来生成预测框和判断类别。而,这个控制它的过程,就是定义一个优秀的损失函数,让7*7*30的值各有所用。

4. 损失函数:

​ 原文中,给出的损失函数公式如下:

在这里插入图片描述

​ 下面进行一一解读:

1[上标:obj,下标:ij] 、 1[上标:noobj,下标:ij] 和 1[上标:obj,下标:i] 含义:

​ 1[上标:obj,下标:i],表示如果对象在单元格i中,则取值为1,否则取值为0。

​ 1[上标:obj,下标:ij],表示如果对象在单元格i的第j个边界框中,则取值为1,否则取值为0。

​ 1[上标:noobj,下标:ij],与上面恰好相反,即如果对象没有出现在单元格i的第j个边界框中,则取值为1,否则取值为0。

S和B 含义:

​ S就是一张图片划分为多少个单元格,文中为7*7。

​ B就是一个单元格有B个边界框预测,文中为2。

xi、yi、wi、hi、Ci、pi© 含义:

​ xi、yi、wi、hi就是中心点坐标值和预测框的宽高。

​ Ci是预测框的置信度分数,公式上面已经给过了。

​ pi© (小写c)是一个边框的一组概率值(向量)。

​ 在这些变量上加上*号,表示为真实值。

λcoord,λnoobj 含义:

​ 这两个值是超参数,主要是平衡值。因为,不包含对象的预测框肯定是多数,这会导致计算损失时,值失衡。因此一般会让λcoord值取得比较大,比如5,λnoobj取得比较小,比如0.5。

各行表达式的含义:

​ 第一行+第二行 = 预测框(有对象的预测框)的回归损失,可以看出采取的时类似于MSE的损失,准确来说,后面所有的损失都采取的类似MSE的损失(这是一个缺点,分类损失还是用交叉熵好一点)。

​ 第三行+第四行 = 分别为有无对象的预测框的置信度损失值。

​ 第五行 = 分类损失值。

5. 注意点:

​ 在上面写的时候,有一句”如果某对象的中心落在某单元格,则这个单元格负责该对象的检测“。而在后面中,经常会有”如果某对象落在第i个单元格中“,这里对象落在某单元格就是指的是对象中心落在单元格中。

​ 另外,一个单元格有多个框,是否所有框都负责对象?不是的,而是IOU最大的负责预测,这样可以让不同的框产生不同的作用,有利于提高召回率。

6. 总结:

​ YOLO的特殊之处在于损失函数的构建和网络输出的利用。不过YOLO v1仍然有许多的缺点,比如预测框太少(7*7*2=98个)、损失函数中分类没有交叉熵损失等等。

​ 不过,YOLO相比于两阶段检测方法,的确很简单,这也是它的一大优点。

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

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

相关文章

深入了解Java虚拟机之高效并发

目录 Java内存模型与线程 概述 硬件的效率与一致性 Java内存模型 主内存与工作内存 内存间交互操作 对于volatile型变量的特殊规则 原子性、可见性与有序性 先行发生原则 Java与线程 线程实现 线程调度 状态切换 小结 线程安全与锁优化 概述 线程安全 Java中…

简单的UDP网络程序·续写

该文承接文章 简单的UDP网络程序 对于客户端和服务端的基本源码参考上文,该文对服务器润色一下,并且实现几个基本的业务服务逻辑 目录 demo1 第一个功能:字典翻译 初始化字典 测试代码:打印 字符串分割 客户端修改 成品效果…

AI宝典:AI超强工具大整合

😄😄个人介绍 光子郎.进行开发工作七年以上,目前涉及全栈领域并进行开发。会经常跟小伙伴分享前沿技术知识,java后台、web前端、移动端(Android,uniapp,小程序)相关的知识以及经验体…

C#发送邮箱设置及源码

用C#调用发送邮箱代码之前需要邮箱开通SMTP/POP3及设置授权码,开通及获取方法如下: 1、打开邮箱,登录邮箱,进入设置-》帐户 2、在“帐户”设置中,找到服务设置项,进行设置,如下…

[Flink] Flink On Yarn(yarn-session.sh)启动错误

在Flink上启动 yarn-session.sh时出现 The number of requested virtual cores for application master 1 exceeds the maximum number of virtual cores 0 available in the Yarn Cluster.错误。 版本说明: Hadoop: 3.3.4 Flink:1.17.1 问题…

Python实战基础20-解密文件及目录操作

任务1 为泸州驰援湖北的89名白衣勇士点赞 【任务描述】 设计python程序,实现用户可以为泸州驰援湖北的89名白衣勇士点赞留言。用户点赞留言内容保存到本地txt文件中。 import os # 导入os模块 import random # 导入随机模块 import string # 导入string模块# 定义…

《Lua程序设计》--学习3

输入输出 简单I/O模型 Lua 文件 I/O | 菜鸟教程 (runoob.com) 暂留 补充知识 局部变量和代码块 Lua语言中的变量在默认情况下是全局变量,所有的局部变量在使用前必须声明 在交互模式中,每一行代码就是一个代码段(除非不是一条完整的命…

chatgpt赋能python:Python如何将IP地址转换为整数

Python如何将IP地址转换为整数 在计算机网络中,IP地址是一个包含32位的二进制数字,通常由四个8位二进制数字(即“点分十进制”)表示。但在某些情况下,需要将IP地址转换为整数,例如在网络编程中检查网络连接…

Ingress详解

Ingress Service对集群外暴露端口两种方式,这两种方式都有一定的缺点: NodePort :会占用集群集群端口,当集群服务变多时,缺点明显LoadBalancer:每个Service都需要一个LB,并且需要k8s之外设备支…

FPGA量子类比机制-FPQA,将在量子运算设计中引发一场新的革命

1980年代现场可程式化逻辑门阵列(FPGA)的出现彻底改变了电子设计。大约40年后,现场可程式化量子位元阵列(FPQA)可望在量子运算电路设计中引发一场类似的革命。 1980年代现场可程式化逻辑闸阵列(FPGA)的出现彻底改变了电子设计。FPGA允许设计人员创建适合特定应用的…

ArrayList 万字长文解析:使用、优化、源码分析

文章目录 ArrayList 万字长文解析:使用、优化、源码分析前言ArrayList 简介ArrayList 的基本使用方法ArrayList 性能优化ArrayList 的源码分析内部结构构造方法解析扩容机制System.arraycop与 Arrays.copyof 实现方式 与 使用场景迭代器 JDK 8版本 ArrayList bug 示…

【基于Rsync实现Linux To Windows文件同步】

基于Rsync实现Linux To Windows文件同步 简介安装步骤安装Linux服务器端1.安装rsync2.启动Rsync3.验证是否启动成功4.修改rsyncd.conf重启rsync服务 安装Windows客户端1.rsync客户端安装:2.配置环境变量3.测试rsync命令4.创建密码文件5.密码文件授权6.查看服务端需要…

Python高光谱遥感数据处理与机器学习实践技术丨Matlab高光谱遥感数据处理与混合像元分解

目录 Python高光谱遥感数据处理与机器学习实践技术 第一章 高光谱基础 第二章 高光谱开发基础(Python) 第三章 高光谱机器学习技术(python) 第四章 典型案例操作实践 Matlab 高光谱遥感数据处理与混合像元分解 第一章 理论…

【大数据之路4】分布式计算模型 MapReduce

4. 分布式计算模型 MapReduce 1. MapReduce 概述1. 概念2. 程序演示1. 计算 WordCount2. 计算圆周率 π 3. 核心架构组件4. 编程流程与规范1. 编程流程2. 编程规范3. 程序主要配置参数4. 相关问题1. 为什么不能在 Mapper 中进行 “聚合”(加法)&#xff…

操作系统原理 —— 什么是基本分页存储管理?(二十二)

在操作系统中,一个新的进程需要载入内存当中执行,在装入的时候需要给该进程分配一定的运行内存,在之前的章节中讲解了连续分配的几种方式,比如:单一连续分配、固定分区分配、动态分区分配,还讲解了对应的动…

Nacos架构与原理 - 总体架构

文章目录 Nacos 起源Nacos 定位Nacos 优势Nacos 生态Nacos 总体设计设计原则架构图用户层业务层内核层插件 小结 Nacos 起源 Nacos 在阿里巴巴起源于 2008 年五彩石项目(完成微服务拆分和业务中台建设),成长于十年双十⼀的洪峰考验&#xff…

基于遗传算法的柔性生产调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

软件测试金融测试岗面试热点问题

1、网上银行转账是怎么测的,设计一下测试用例。 回答思路: 宏观上可以从质量模型(万能公式)来考虑,重点需要测试转账的功能、性能与安全性。设计测试用例可以使用场景法为主,先列出转账的基本流和备选流。…

DHT11温湿度传感器

接口定义 传感器通信 DHT11采用简化的单总线通信。单总线仅有一根数据线(SDA),通信所进行的数据交换、挂在单总线上的所有设备之间进行信号交换与传递均在一条通讯线上实现。 单总线上必须有一个上拉电阻(Rp)以实现单…

burpsuite工具的使用(详细讲解)

一)前言 我已经在之前详细的说明了burpsuite的安装过程,如果不了解的可以看 burpsuite安装教程 :http://t.csdn.cn/uVx9X 在这了补充说明一下,在安装完burpsuite并设置完代理后,会出现如果访问的url是使用http协议的…