YOLO算法(You Only Look Once)系列讲解与实现(待完善)

news2025/7/15 22:51:16

文章目录

  • 前言
  • 一、指标分析
    • 1.mAP (mean Average Precision)
    • 2.IOU
  • 二、YOLO
    • 1.YOLO-v1
      • (1)步骤
      • (2)网络结构
      • (3)损失函数
      • (4)存在问题
    • 2.YOLO-v2
      • (1)新的尝试-Better
      • (2)新的尝试-Faster
      • (3)其他细节
    • 3.YOLO-v3
      • (1)新的尝试
  • 三、代码实现
  • 总结


前言


一、指标分析

1.mAP (mean Average Precision)

综合衡量检测效果,各类别Precision-Recall曲线下面积的平均值。精度为:
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP
召回率为:
R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP
其中 T P TP TP F P FP FP F N FN FN T N TN TN分别为被检测到相关true positives、被检测到无关false positives、未检测到相关true negatives、未检测到无关false negatives。 计算得到如下Precision-Recall曲线:
在这里插入图片描述

蓝色折线为实际精度,红色折线为最大精度,mAP可以通过计算红色折线的期望获得。

2.IOU

真实区域和预测区域的交集/并集

二、YOLO

将检测问题转化为回归问题。

1.YOLO-v1

(1)步骤

(1)将一幅图像分成S×S个,如果某个目标的中心落在这个网格单元(grid cell)中,则该单元就负责预测此目标。
(2)每个网格单元要预测B个边界盒子(bounding box),每个边界盒子除了要预测位置之外,还要附带一个置信度(confidence)值。每个网格还要预测C个类别的分数。
当S取7,B取2,C取20时,我们所需要得到的预测结果大小是7×7×30。
在这里插入图片描述

(2)网络结构

在这里插入图片描述

首先,通过7×7的卷积层,步距为2,然后通过一个2×2的最大池化层,步距也为2。
然后,通过3×3的卷积层,步距为1,然后通过一个2×2的最大池化,步距为2.
等等。
在4096全连接层前,进行展平处理。通过4096全连接层后,再通过一个1470个结点的全连接层。
最后,重整(reshape)成一个7×7×30的矩阵。

(3)损失函数

在这里插入图片描述

关于bounding box损失,为什么要用根号再平方呢?
因为对于不同大小的目标而言,在同样的偏移量下,计算得到的IOU差异一致,并不合理。改为根号再开平方,则可使得小目标IOU大于大目标。
confidence损失符号含义
obj部分计算正样本的损失,noobj计算负样本的损失。

(4)存在问题

(1)对小目标检测效果差。
(2)定位不准确

2.YOLO-v2

(1)新的尝试-Better

Batch Normalization
对训练收敛有较大的改善,对模型有正则化效果,减少了正则化处理,提升了超过2%的mAP,dropout层(用于减轻过拟合的层)不再必要。
High Resolution Classifier
由224×224的分类器改为448×448的分类器,提升了4%的mAP。
Convolutional With Anchor Boxes
YOLO_v1中没有用到基于anchor的边界框定位,定位效果较差,因此YOLO_v2版本对此进行改进。
Dimension Clusters
采用k-means聚类方法获得先验anchor。
Direct location prediction
直接基于anchor预测的话,会出现训练模型不稳定的情况,特别是训练的前期。这是由于预测anchor中心坐标 ( x , y ) (x,y) (x,y)不稳定所导致的,由于x和y的数值没有限定可能出现偏移量过大,错失目标的情况。入下式:
x = ( t x ∗ w a ) + x a y = ( t y ∗ h a ) + y a x=(t_x*w_a)+x_a \\ y=(t_y*h_a)+y_a x=(txwa)+xay=(tyha)+ya
因此YOLO的作者采用了新的限定方法:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t o ) b_x=\sigma(t_x)+c_x\\ b_y=\sigma(t_y)+c_y\\ b_w=p_we^{t_w}\\ b_h=p_he^{t_h} \\ Pr(object)*IOU(b,object)=\sigma(t_o) bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=phethPr(object)IOU(b,object)=σ(to)
其中,假设原点在美国grid cell的左上角,则中心坐标为 ( c x , c y ) (c_x,c_y) (cx,cy),并且bounding box的高度和宽度分别为 p w , p h p_w,p_h pw,ph。同时, t x , t y t_x,t_y tx,ty分别是我们对anchor预测的一个偏移量,利用 σ \sigma σ函数将中心坐标限定在grid cell中。使得mAP有了5%的提升。
Fine-Grained Features
在高层预测特征图上结合一些低层信息,因为这些底层信息包含更多的图像细节在里面,而这些细节也是检测小目标所需要的。通过passthrough layer这一层实现。如下图所示,其中最后一层卷积层的125来自5个anchor参数加上20个类别(VOC数据集),还要乘以五个概率分数:
在这里插入图片描述

该层将低层和高层结合,原理如下:
在这里插入图片描述

将原图的4×4的特征图拆解为四个2×2的特征图,长度和宽度变为原来的一半,深度变为原来的四倍。而流程图中,首先将低层的26×26×512经过一个1×1的卷积处理(源于YOLO作者原码,而YOLO作者原论文并未提到),压缩为26×26×64的矩阵。然后通过passthrough layer变为13×13×256矩阵,然后和高层的13×13×1024在深度层次上进行拼接,变为13×13×1080。使得mAP提升了1%。

Multi-Scale Training
提升模型鲁棒性。不使用固定的输入图像尺寸,而是每迭代十个batches,就将图像进行一个随机地缩放,尺寸从320×320、352×352、384×384…608×608中选择。

(2)新的尝试-Faster

BankBone: Darknet-19
输出为224×224是为了与其他算法比较,本算法更常用416×416的。
在这里插入图片描述

(3)其他细节

由于本文着重讲解YOLO_v3,因此不再赘述匹配正负样本和计算误差的方法,其他细节如下所示(取自原文):
在这里插入图片描述

3.YOLO-v3

(1)新的尝试

BankBone: Darknet-53
在这里插入图片描述

检测准确的进一步提升,利用卷积层替换最大池化层。而且convolutional不单是一个卷积层,组成如下所示:
在这里插入图片描述
而每个方框对应一个残差结构:
在这里插入图片描述
bounding box仍使用k-means算法,有九个尺度,每个预测特征值上各三个

特征图层特征图大小预设边界框尺寸预设边界框数量
特征图层113×13(116×90), (156×198), (373×326)13×13×3
特征图层226×26(30×61), (62×45), (59×119)26×26×3
特征图层352×52(10×13), (16×30), (33×23)52×52×3

N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N×N×[3*(4+1+80)] N×N×[3(4+1+80)]个参数:N对应13、26或52,每个scale会预测3个尺度,每个尺度会预测4+1+80个参数(COCO数据集,80个类别),anchor有四个参数,再加上一个YOLO有个独有的confidence score。
在这里插入图片描述
得到整体的流程图:
在这里插入图片描述
在这里插入图片描述

三、代码实现


总结

图片和内容参考:
1.视频YOLO系列理论合集(YOLOv1~v3)

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

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

相关文章

Pod的生命周期

Pod的生命周期 与容器一样,Pod也有生命周期,Pod在整个生命周期中被定义为各种状态。了解这些状态对于后面我们学习Pod的调度是有帮助的。 Pending 挂起状态,Pod已经被K8s系统所认可,但是目前还有一个或多个容器镜像还没有被创建&…

Git错误:Incorrect username or password (access token)

目录 问题描述: 解决办法: 步骤一:进入电脑控制界面 步骤二:进入用户账户 步骤三:管理你的凭据 步骤四:选择Windows凭据 步骤五:找到gitee 步骤六:修改正确的用户名和密码 问…

【学习笔记23】JavaScript数组的遍历方法

笔记首发 1、forEach 语法: 数组.forEach(function(item, index, origin){})参数: item: 数组实际每一项的值index: 数组每一项对应的下标origin:原数组 作用: 遍历数组返回值: 返回值是undefined,哪怕你手写了return,也是undefined var arr…

springboot 使用shiro集成阿里云短信验证码

目录 1.阿里云短信验证码服务 2.发送短信验证码 3.多个realm配置 4.验证短信验证码 5.一些拓展思路 引言:短信验证码是通过发送验证码到手机的一种有效的验证码系统,主要用于验证用户手机的合法性及敏感操作的身份验证。在注册和修改密码时需要用到…

手摸手教会你在idea中配置Tomcat进行servlet/jsp开发(多图超详)

1. 下载安装idea,创建project,如果没有JDK可以通过idea指定文件夹并下载JDK。工程就是普通的Java工程,名字为webdemo 2.因为是Web项目,所以要对这个普通的项目进行WEB扶持^^,在项目名称webdemo上右键单间选择菜单项&qu…

Hive搭建

Hive系列第二章 第二章 Hive搭建 2.1 MySQL5.6安装 1、检查删除已有的 有就删除,没有就不用管。 rpm -qa | grep mysql rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 --nodepsrpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_642、删除mysql分…

Windows下Labelimg标注自己的数据集使用(Ubuntu18.04)Jetson AGX Orin进行YOLO5训练测试完整版教程

一、环境配置介绍 整个实现过程所涉及的文件目录,其中,自备表示自己需要准备的,生成表示无需自己准备。 使用yolov5时出现“assertionerror:no labels found in */*/*/JPEGImages.cache can not train without labels”问题 很多朋友都会遇…

SpringBoot+Vue项目医疗管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

待办事项是什么意思,怎么用?

待办事项是什么意思,为什么要用?待办事项工具怎么设置?这里一文给你讲清! 废话不多说,下面直接教你:梳理待办事项清单的方法,以及待办工具的操作实操步骤。想要快速提升工作效率的小伙伴&#…

第三十七篇 Vue中封装Swiper组件

在上一篇内容的结尾讲到了将swiper初始化从mounted生命周期转移到updated中来能够让swiper动起来,但同时是否会造其他的一个问题?什么问题呢?在每次data中的状态发什么改变,updated中的内容会又重新执行,这样会导致swi…

二维数组与二级指针是好朋友吗?

抛出问题 有一个二维数组,我想把它传给一个函数。于是我把函数接口定义出来了,如下: int array[2][3] {1,2,3,4,5,6}; void fun(int **array) {array[0][0] 5; } 当我试图直接把数组名传给函数时候,fun(array)编译会报错&…

C++ 中explicit的作用及用法

目录 Cexplicit(官网的说法) Cexplicit 清楚的说法(建议英文不好的从这里开始食用哦) Cexplicit使用的例子(建议喜欢自己敲代码实验的从这里开始食用哦) 总结 Cexplicit(官网的说法&#xff…

神经网络和深度学习-梯度下降Gradient Descent(下)

梯度下降gradient descent 我们接着用数学公式来看一下梯度下降 首先是梯度 ∂cos⁡t∂ω\frac{\partial \cos t}{\partial \omega} ∂ω∂cost​ 然后我们对权重进行更新 ωω−α∂cos⁡t∂ω\omega\omega-\alpha \frac{\partial \cos t}{\partial \omega} ωω−α∂ω∂c…

python基础之容器类型公共方法

文章目录一、简介1.高级数据类型的公共方法:2.python的内置函数:3.python包含的内置函数:二、遍历字典的列表一、简介 1.高级数据类型的公共方法: 列表元组字典或者字符串都能够共同使用的方法; 2.python的内置函数…

【kafka】七、kafka数据可靠性保证

数据可靠性保证 为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack&#xff0c…

基于AntBlazor的学生在线练习系统实现过程的简单总结

前言 疫情当前,作为一名教师,如何能让学生进行有效练习成了一个难题。如果使用 “问卷星”等线上调查问卷式的网站来做练习测试,是无法及时有效的进行,更谈不上对学生练习情况进行跟踪。鉴于以上现实情况和问题&#xff…

神经网络和深度学习-用pytorch实现线性回归

用pytorch实现线性回归 用pytorch的工具包来实现线性模型的训练过程 准备数据集 设计模型 构造损失函数和优化器(使用pytorch API) 训练过程:前馈、反馈、更新 准备数据 在PyTorch中,计算图是小批处理的,所以X和…

MATLAB | 世界杯来用MATLAB画个足球玩叭~

世界杯教你用MATLAB画个超逼真的足球, 需要准备Partial Differential Equation Toolbox工具箱,同时因为用到了polyshape类所以至少需要R2017b版本。 绘制讲解 数据来源及说明 我是真的不想写注释了太麻烦了,给大家讲一下我的思路希望能够看…

判断一个时间段是否经过了另一个时间段

场景: IOT设备存在离线与恢复时间记录,每一次离线和恢复记为一个周期即一条数据, 现在需要统计出在某个时段存在离线记录的数据,如果目前未恢复,没有恢复时间,恢复时间置为9999-01-01 00:00:00 原始数据如下(t_offline_record):…

OPengl学习——初识opengl

文章目录1、网站罗列2、一些词语解析1.入门概念2.Opengl Vs DirectX3、QOpenGLWidget4、引用**OpenGL(Open Graphics Library)*是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资…