YOLO物体检测-系列教程1:YOLOV1整体解读(预选框/置信度/分类任/回归任务/损失函数/公式解析/置信度/非极大值抑制)

news2024/11/28 7:36:11

🎈🎈🎈YOLO 系列教程 总目录

YOLOV1整体解读
YOLOV2整体解读

YOLOV1提出论文:You Only Look Once: Unified, Real-Time Object Detection

1、物体检测经典方法

  • two-stage(两阶段):Faster-rcnn Mask-Rcnn系列
  • one-stage(单阶段):YOLO系列
  • 最核心的优势:速度非常快,适合做实时检测任务!
  • 但是缺点也是有的,效果通常情况下不会太好!

2、机器学习分类任务评价指标

机器学习 分类任务 评价指标

3、YOLOV1简介

  • 经典的物体检测算法
  • You Only Look Once,名字就已经说明了一切
  • 把检测问题转化为回归问题,一个CNN就搞定了
  • 可以对视频进行检测,应用领域非常广

只需要一个起始位置坐标,加上长和宽,即(x,y,w,h),就能把一个物体框出来了,这就是转化为回归问题

YOLO算法,在当时15、16年等了很久,因为Faster R-CNN精度高,但是太慢了,速度在当时比精度更重要

4、YOLOV1预测流程

  1. 把图像分词S*S个格子
  2. 遍历每个格子,如果哪一个物体的中心点落在了这个格子,那么这个格子就负责预测这个物体
  3. 得到了若干个格子,遍历每一个格子
  4. 根据当前的格子都生成两个候选框,找出一个接近的框
  5. 现在有了一个这个物体的位置,需要调整框的长宽来得到最终结果
  6. 在调整的过程中会得到很多个候选框,每个候选框都会得到一个confidence值(即置信度,这个置信度表示了当前框住的部分是否是一个我们需要检测的物体)
  7. 置信度低的框会被过滤掉(因为目标格子可能会有多个,但是不一定都符合)

总结

首先输入就是一个S*S个格子,每一个格子都产生两个候选框,产生两个候选框进行微调,但是不是所有候选框都进行微调,需要切实有物体的,什么时候有物体,通过执行度来判断

5、整体网络架构

输入图像是一个448*448,是一个固定值(这个固定值并不意味着只能检测固定大小的东西,这个固定值是通过openCV的resize到固定值得到,里面的物体会进行缩放,最后的框会映射到一个完整的原始图像中),这个固定值也导致了一些问题,在v1版本中有一定的局限性

  1. 输入数据(448,448,3)
  2. 经过20层修改的GoogLeNet,得到(14,14,1024)
  3. 经过2次Conv+relu,得到(14,14,1024)
  4. 经过2次Conv+relu,得到(7,7,1024)
  5. 一次拉平操作+FC+relu,得到(4096,1)
  6. 一次全连接(1470,1)
  7. reshape(7,7,30)
  8. 生成检测

在这里插入图片描述

在网络的最后得到一个(7,7,30)的特征图,这个特征图表示的意义:77表示前面提到的SS个grid格子,在7*7的格子中,每一个格子都有30个值,每一个格子都要预测出30个值。

30个值的意义:

  • 7*7个格子分别对应 B 1 B_1 B1 B 2 B_2 B2两个框,比如 B 1 B_1 B1框,对应了4个值 ( x 1 , y 1 , w 1 , b 1 ) (x_1,y_1,w_1,b_1) x1y1w1b1就可以表示成一个唯一的框,但是这里的 x 1 和 y 1 x_1和y_1 x1y1不是一个具体的坐标值,是经过归一化后得到的一个在0到1之间的相对值
  • 因此 B 2 B_2 B2框,也对应了4个值 ( x 2 , y 2 , w 2 , b 2 ) (x_2,y_2,w_2,b_2) x2y2w2b2
  • 此外每一个框,是不是有框住了物体呢?有一个置信度C值。
  • 因此 B 1 B_1 B1框,对应5个值 ( x 1 , y 1 , w 1 , b 1 , C 1 ) (x_1,y_1,w_1,b_1,C_1) x1y1w1b1C1 B 2 B_2 B2框,对应了5个值 ( x 2 , y 2 , w 2 , b 2 , C 2 ) (x_2,y_2,w_2,b_2,C_2) x2y2w2b2C2
  • 在前面提到了一共有30个值,前10个对应了这10个值,后面的20个值,则是对应了20分类,也就是对应了20个类别的概率值。

了解了30个值的意义,就了解了(7,7,30),就基本懂了yolo-v1了

6、损失函数计算公式

在这里插入图片描述

6.1 每个数字的意义

前面我们已经解释了每个数字的意义

  • 10 = (X,Y,W,H,C)* 2
  • 当前数据集有20个类别
  • 7*7代表最终网格的大小
  • SS(B*5+C)

6.2 坐标回归误差(中心点定位)

位置损失计算的是(X,Y,W,H)这4个值和真实值之间的误差
前面我们仔细解释了各项参数的含义,下面陆续给出整个损失计算公式,首先是位置损失,位置损失又包含两部分,分别是坐标和长宽,不是一个具体的坐标值,是经过归一化后得到的一个在0到1之间的相对值
λ 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 ] λ_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}1^{obj}_{ij}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]

  1. λ c o o r d λ_{coord} λcoord=5:超参数,坐标损失的权重
  2. ∑ i = 0 S 2 \sum_{i=0}^{S^2} i=0S2:遍历所有的grid cell格子
  3. ∑ j = 0 B \sum_{j=0}^{B} j=0B:遍历所有的bounding box候选框
  4. 指示函数 1 i j o b j 1^{obj}_{ij} 1ijobj:挑选负责检测物体的bbox
  5. ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 (x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2 (xix^i)2+(yiy^i)2:中心点定位 预测值标签值 的差的平方和

6.3 坐标回归误差(长宽定位)

+ λ 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 ] +λ_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}1^{obj}_{ij}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2] +λcoordi=0S2j=0B1ijobj[(wi w^i )2+(hi h^i )2]

  1. λ c o o r d λ_{coord} λcoord=5:超参数,坐标损失的权重
  2. ∑ i = 0 S 2 \sum_{i=0}^{S^2} i=0S2:遍历所有的grid cell格子
  3. ∑ j = 0 B \sum_{j=0}^{B} j=0B:遍历所有的bounding box候选框
  4. 指示函数 1 i j o b j 1^{obj}_{ij} 1ijobj:挑选负责检测物体的bbox
  5. ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 (\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2 (wi w^i )2+(hi h^i )2 :宽高定位 预测值标签值 算术平方根的差的平方和

求根号能使小框对误差更敏感

6.4 置信度回归误差(含有object)

主要是判断当前预测的是前景还是背景,含有object物体即为前景
∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 \sum_{i=0}^{S^2}\sum_{j=0}^{B}1^{obj}_{ij}(C_i-\hat{C}_i)^2 i=0S2j=0B1ijobj(CiC^i)2

  1. ∑ i = 0 S 2 \sum_{i=0}^{S^2} i=0S2:遍历所有的grid cell格子
  2. ∑ j = 0 B \sum_{j=0}^{B} j=0B:遍历所有的bounding box候选框
  3. 指示函数 1 i j o b j 1^{obj}_{ij} 1ijobj:挑选负责检测物体的bbox
  4. ( C i − C ^ i ) 2 : (C_i-\hat{C}_i)^2: (CiC^i)2 预测值标签值差的平方和
  5. C i C_i Ci :从模型正向推断结果为SS(B*5+C)维向量找到这个bbox的confidence score
  6. C ^ i \hat{C}_i C^i :计算这个bbox与ground truth的IOU

6.5 置信度回归误差(不含有object)

λ 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 λ_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}1^{noobj}_{ij}(C_i-\hat{C}_i)^2 λnoobji=0S2j=0B1ijnoobj(CiC^i)2

  1. λ n o o b j = 0.5 λ_{noobj}=0.5 λnoobj=0.5:超参数,非目标置信度损失的权重
  2. ∑ i = 0 S 2 \sum_{i=0}^{S^2} i=0S2:遍历所有的grid cell格子
  3. ∑ j = 0 B \sum_{j=0}^{B} j=0B:遍历所有的bounding box候选框
  4. 指示函数 1 i j n o o b j 1^{noobj}_{ij} 1ijnoobj:挑选不负责检测物体的bbox
  5. ( C i − C ^ i ) 2 (C_i-\hat{C}_i)^2 (CiC^i)2预测值标签值差的平方和

6.6 分类误差

∑ i = 0 S 2 1 i o b j ∑ C ∈ c l a s s e s ( p i ( C ) − p ^ i ( c ) ) 2 \sum_{i=0}^{S^2}1^{obj}_{i}\sum_{C∈classes}(p_i(C)-\hat{p}_i(c))^2 i=0S21iobjCclasses(pi(C)p^i(c))2

  1. ∑ i = 0 S 2 \sum_{i=0}^{S^2} i=0S2:遍历所有的grid cell格子
  2. 1 i o b j 1^{obj}_{i} 1iobj:挑选不负责检测物体的bbox
  3. ∑ C ∈ c l a s s e s \sum_{C∈classes} Cclasses:遍历所有类别

7、指示函数

前面的误差计算公式提到了三个指示函数:

7.1 第1个 1 i o b j 1^{obj}_{i} 1iobj

1 i o b j = { 1 , 如果第  i  个网格单元包含目标。 0 , 否则。 1^{obj}_{i} = \begin{cases} 1, & \text{如果第 } i \text{ 个网格单元包含目标。} \\ 0, & \text{否则。} \end{cases} 1iobj={1,0,如果第 i 个网格单元包含目标。否则。

1 i o b j 1^{obj}_{i} 1iobj:第i个grid cell是否包含物体,也即是否有groud truth框的中心点落在grid cell中,若有则为1,否则为0

7.2 第2个 1 i j o b j 1^{obj}_{ij} 1ijobj

1 i j o b j = { 1 , 如果第  i  个网格单元中的第  j  个边界框预测到了目标。 0 , 否则。 1^{obj}_{ij} = \begin{cases} 1, & \text{如果第 } i \text{ 个网格单元中的第 } j \text{ 个边界框预测到了目标。} \\ 0, & \text{否则。} \end{cases} 1ijobj={1,0,如果第 i 个网格单元中的第 j 个边界框预测到了目标。否则。
1 i j n o o b j 1^{noobj}_{ij} 1ijnoobj:第i个grid cell的第j个bounding box若负责预测物体则为1,否则为0

7.3 第3个 1 i j n o o b j 1^{noobj}_{ij} 1ijnoobj

1 i j n o o b j = { 1 , 如果第  i  个网格单元中的第  j  个边界框没有预测到目标。 0 , 否则。 1^{noobj}_{ij} = \begin{cases} 1, & \text{如果第 } i \text{ 个网格单元中的第 } j \text{ 个边界框没有预测到目标。} \\ 0, & \text{否则。} \end{cases} 1ijnoobj={1,0,如果第 i 个网格单元中的第 j 个边界框没有预测到目标。否则。
1 i j n o o b j 1^{noobj}_{ij} 1ijnoobj:第i个grid cell的第j个bounding box若不负责预测物体则为1,否则为0

  • 1 i j o b j 1^{obj}_{ij} 1ijobj为1, 1 i o b j 1^{obj}_{i} 1iobj也必为1
  • 1 i j o b j 1^{obj}_{ij} 1ijobj为1, 1 i j n o o b j 1^{noobj}_{ij} 1ijnoobj必为0

8、NMS(非极大值抑制)

在这里插入图片描述

置信度是可以设置的,设置的较大的时候则比较严格,可能出现有些物体没有被检测,较小的时候可能一个物体出现多个预选框。
但是有时候就算设置较大的置信度,还是出现了多个预选框,我们可以进行非极大值抑制操作,对预选框的置信度进行排序,最终只选取较大的预选框。

YOLOV1到这里内容就全部都结束了,那YOLOV1有哪些问题呢?

  1. 小物体检测效果不好:当前一个grid cell只预测一个类别,当有两个物体高度重合在一起的时候,比如一只狗的旁边还有一只猫,那可能只能检测出狗。
  2. 多标签预测效果不好:这里介绍的是20分类,实际任务可以设置更多或者更少的分类,假设标签中有狗这个类别,还有斑点狗,还有哈士奇之类的,可能一个物体对应了两个标签,既是狗又是哈士奇,softmax可能无法拿到多个标签

那么YOLOV2做了哪些改进呢?

YOLOV1整体解读
YOLOV2整体解读

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

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

相关文章

PMP-项目启动过程组的重要性

一、什么是项目启动过程组 启动过程组包括定义一个新项目或现有项目的一个新阶段,授权开始该项目或阶段的一组过程。启动过程组的目的是:协调相关方期望与项目目的,告知相关方项目范围和目标,并商讨他们对项目及相关阶段的参与将如…

flask查询工具

fist_index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>电话查询工具</title> </head> <body><table><form action"/search_phone" method"get&…

《PostgreSQL备份与恢复:步骤与最佳实践》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

将vue项目变成可发布的npm包项目

第一步&#xff1a; 在main.ts 文件的平级上新建一个index.ts文件 &#xff0c;文件中导出你想发布的组件 第二步&#xff1a; 在package.json文件的平级上新建index.js文件 第三步&#xff1a; 修改package.json文件&#xff0c;新增命令 "buildnpm": "vu…

c#设计模式-创建型模式 之 建造者模式

简介&#xff1a; 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。意图是将一个复杂的构建与其表示相分离&#xff0c;使得同样…

LeetCode_模拟_中等_2596.检查骑士巡视方案

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 骑士在一张 n x n 的棋盘上巡视。在有效的巡视方案中&#xff0c;骑士会从棋盘的左上角出发&#xff0c;并且访问棋盘上的每个格子恰好一次 。 给你一个 n x n 的整数矩阵 grid &#xff0c;由范围 [0, n * …

SAP 委外联产品 如何分摊加工费 ?

SAP 委外联产品 如何分摊加工费 &#xff1f; 目前对委外联产品分摊加工费还没好办法&#xff0c;看上去与委外副产品业务是一样的&#xff0c;除了主数据设置多了一些。 委外物料与联产品物料都设置S价&#xff0c;跑物料分类账时根据主数据设置分摊规则将差异分摊到对应的物…

获取Windows 10中的照片(旧版)下载

Windows 10中的新版照片应用&#xff0c;目前发现无法直接打开部分iOS设备上存储的照片。需要使用照片&#xff08;旧版&#xff09;才行。 但目前应用商店中无法直接搜索到照片&#xff08;旧版&#xff09;&#xff0c;因此笔者提供如下链接&#xff0c;可以直接访问并呼出W…

Swift学习内容精选(二)

Swift 类是构建代码所用的一种通用且灵活的构造体。 我们可以为类定义属性&#xff08;常量、变量&#xff09;和方法。 与其他编程语言所不同的是&#xff0c;Swift 并不要求你为自定义类去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类&#xff0c;系…

详解带头双向循环列表

目录 前言 一、带头双向循环链表的结构 二、 带头双向循环链表的实现 2.1链表的创建 2.2开辟新的结点 2.3初始化 2.4释放销毁 2.5链表的打印 2.7尾插 2.8尾删 2.9头插 2.10头删 三、带头双向循环链表中间随机值的插入和删除 3.1在pos位置插入x 3.2删除pos位置的…

C#回调函数学习1

回调函数&#xff08;Callback Function&#xff09;是一种函数指针&#xff0c;它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数&#xff0c;在这个函数工作完成后&#xff0c;它将通过这个回调函数的指针来回调通知调用者处理结果。…

XREAL 联合创始人吴克艰谈AR:下一代计算平台及其关键技术

// 编者按&#xff1a;一种行业观点是&#xff0c;AR或是未来十年、三十年的革命性技术&#xff0c;是下一代计算平台。近半个世纪&#xff0c;我们总能听到苹果在AR行业的创新动作&#xff0c;开辟了新的硬件范式。AR/VR行业为苹果不断欢呼的同时&#xff0c;激发了人们的好…

JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;蓝桥云课讲师。 目录 一、什么是装饰模式二、…

linux安装Sentinal1.8.6

前言&#xff1a; 使用docker search sentinel-dashboard命令&#xff0c;发现docker中的镜像版本过低&#xff0c;由于要配合使用1.8.6&#xff0c;所以这里采用java后台运行sentinel1.8.6-jar的方式。 1、官网下载对应版本jar&#xff08;https://github.com/alibaba/Sentin…

【Unity编辑器扩展】| 自定义窗口和面板

前言【Unity编辑器扩展】| 自定义窗口和面板一、EditorWindow二、ScriptableWizard三、编辑器绘制3.1 文本输入3.2 空行3.3 滑动条、进度条3.4 枚举选择3.5 其他总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介…

招募 AIGC 训练营助教 @上海

诚挚邀请对社区活动感兴趣的你&#xff0c;成为我们近期开展的训练营助教。 与我们共同开启这场创新之旅&#xff01; 助教需要参与&#xff1a; 协助策划和组织训练营活动 协助招募和筛选学员 协助制定训练营的宣传方案 负责协调和组织各项活动 助教可获得&#xff1a; AIGC知…

vue cli 打包、生产环境http-proxy-middleware代理

结构树 版本 1、创建vue.config.js const path require(path); const UglifyJsPlugin require(uglifyjs-webpack-plugin) //压缩 const CompressionWebpackPlugin require(compression-webpack-plugin) const isProduction process.env.NODE_ENV ! development;module.exp…

C#控制台程序中使用log4.net来输出日志

Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft .NE​​T 运行时的端口。 我喜欢他可以自定义输出&#xff0c;区分等级等特点。 导入库 我们在工程里添加NuGet的包。输入名称log4net &#xff0…

【Transformer系列】深入浅出理解Positional Encoding位置编码

一、参考资料 一文教你彻底理解Transformer中Positional Encoding Transformer Architecture: The Positional Encoding The Annotated Transformer Master Positional Encoding: Part I 如何理解Transformer论文中的positional encoding&#xff0c;和三角函数有什么关系&…

05ShardingSphere-JDBC水平分片

1、准备服务器 随着业务的扩大&#xff0c;订单表数据量不断增加&#xff0c;数据库面临存储压力&#xff0c;开始考虑对订单表进行水平分片。 将t_order表扩展为server-order0中的t_order0和t_order1、server-order1中的t_order0和t_order1 服务器规划&#xff1a;使用dock…