YOLO-V1~V3经典物体检测算法介绍

news2024/10/6 10:28:50

大名鼎鼎的YOLO物体检测算法如今已经出现了V8版本,我们先来了解一下它前几代版本都做了什么吧。

本篇文章介绍v1-v3,后续会继续更新。

一、节深度学习经典检测方法概述

1.1 检测任务中阶段的意义

我们所学的深度学习经典检测方法 ,有些是单阶段的,有些是两阶段的:

  • one-stage(单阶段):YOLO系列

  • two-stage(两阶段):Faster-rcnn、Mask-Rcnn系列

单阶段:

我们进行物体检测,简单来说,只需要的到四个值就可以了(图片中某个物体的左上x1y1、右下x2y2角的坐标),这四个值x1、y1、x2、y2我们通过回归任务就可完成。

只通过一个CNN网络提取特征,不去做其它的映衬,然后通过回归获得预测结果。

两阶段:

同样对于输入的图片通过CNN提取特征,最终结果依旧是获取猫的位置,只不过这里多了一个RPN区域建议网络,生成了多个预选框,我们最后在这些预选框里选择出所需要的结果。

1.2 不同阶段算法优缺点分析

one-stage:

  • 最核心的优势:速度非常快,适合做实时检测任务!

  • 但是缺点也是有的,效果通常情况下不会太好!

two-stage:

  • 速度通常较慢(5FPS),但是效果通常还是不错的!

  • 非常实用的通用框架MaskRcnn,建议熟悉下!

前面说到过了,像是YOLO特征提取后直接回归,步骤单一所以速度会比较快但是效果稍差,而像是Mask-Rcnn多了一步预选处理,效果不错但是速度会比较慢。一般视频任务中,我们要求实时监测,所以应该选用YOLO,当然FPS也是不固定的,总之网络越复杂,效果越好,速度越慢,反之那就反之。

1.3 YOLO指标计算

map指标:综合衡量检测效果;单看精度或recall不行吗?

  • 精度:检测出来的框与实际是否吻合

  • 召回率:有没有一些框没有检测到

二者一般相互矛盾,一个高了另一个就会低,所以单看某一个指标无法判断效果的好坏。

我们通常用mAP指标进行衡量。

IOU:交集和并集的比值

如图蓝色的是真实值/标记值,橙色是预测值,IOU越高,越接近1,效果越好,说明越“重合”。

我们希望橙色的预测框与蓝色的标记框越接近越重合越好(精度越高越好),同时我们希望把图片中需要检测出来的东西全部检测出来(召回率越高越好),比如上图如果还需要检测窗户等。

1.4 MAP指标计算

基于置信度阈值来计算,例如分别计算0.9;0.8;0.7

置信度:如检测的是人脸,置信度表示这是一个人脸的可能性。比所选置信度小的框就不要了。

如置信度选0.9时,对于上面三张图片:TP=1 FP=0 FN=2则Precision=1/1;Recall=1/3 ,即对于第一张图片是人脸也被检测出来了TP=1,第二三张图片是人脸没被检测出来(漏检)FN=2。

如何计算AP呢?需要把所有阈值0-1都考虑进来;MAP就是所有类别的平均。

上图纵坐标是精度,横坐标是召回率,可见精度高的时候召回率比较低,召回率高的时候精度比较低。

MAP即红线下方所围成的面积(取的最大值),即右侧A1+A2+A3+A4

当然,我们希望MAP越接近1(一个大矩形)越好。

二、YOLO-V1整体思想与网络架构

2.1 YOLO算法整体思路解读

YOLO-V1:

  • 经典的one-stage方法

  • You Only Look Once,你只看一次,名字就已经说明了一切!

  • 把检测问题转化成回归问题,一个CNN就搞定了!

  • 可以对视频进行实时检测,应用领域非常广!

核心思想:

预测一张图片上有哪些个物体,比如下图,有狗、自行车、汽车。假设这张图片大小为7x7,一共49个格子,我们要求这49个格子自己预测在自己这个格子上的是什么物体。

比如图片左侧的狗落在图片的一个区域之中,但我们只关心它的中心点落在哪里,如图红色的格子它就负责预测这条狗,有一个物体落在红色格子上面了并且红色格子还是中心点。

49个格子预测自己所代表的是什么,或者说物体落到了以这个格子为中心点的话,这个格子需要把这个物体给预测出来。

如图红色的格子去做预测,但它也不知道狗长什么样子,但是有一些经验值比如一些物体是长方形的一些物体是正放心的h1w1,h2w2(如上图黄色的框),显然对于上图长方形的框更好一点(有真实值,长方形的IOU更高,派他上场),我们把候选框进行微调,即回归任务,找出最合适的h和w,并找出起始位置(v1:xy,hw)。

由于有很多个格子,就会产生很多个中心点坐标和候选框,但有一些框起来的不是一个物体(背景),所以我们还需要一个置信度confidence,来确定框起来的是不是物体,不是(小于)那就去掉。

简单来说V1版本关键词:

四个偏移量:中心点、两种候选框(选其一),x、y和h、w。

一个置信度的值:判断是否一个物体,是的话进行回归微调四个偏移量

2.2 网络架构解读

V1版本中,测试时输入大小为448*448*3,(训练时用224*224 当时计算机性能可能比较差,V2后进行改进。)相对来说是个固定值,进行特征提取,得到7*7*1024的特征图,进行全连接再reshape后,得到7*7*30。

其中,7*7就是前面说的那个“格子”,实际上一个格子代表这部分感受野的信息/特征等。

前面提到V1版本有两个候选框,h1w1x1y1和c1,h2w2x2y2和c2,这样就有了5+5=10个值,7*7*30这30里除了这10个值,剩下的20则是20分类,20个概率值。

这里B是框的个数=2,C是类别个数=20

(7*7) * (2*5+20)

2.3 位置损失计算

位置损失:

对于每个格子的每两个候选框,选择IOU最大的那个,计算真实值的预测值之间的差异(xywh)。

有些物体比较大,wh差不太多就可以,但对于小的物体,wh相差一定的值就会不好,因此这里将wh进行了开根号处理(数值较小的时候相对敏感一些)。

置信度误差:

一张图片的背景要多于前景,我们要分类讨论它预测的是前景还是背景。

我们让真实值前景置信度为1,背景为0。

如果一个候选框和真实框的IOU大于一定阈值如0.5,我们认为它是一个前景,希望它的confidence接近1(它毕竟不是一个真实框,有自己的IOU),IOU越大越好。

小于0.5或者没有的时候,便是背景,置信度为0。

(自己的置信度-真实置信度)²,前景直接算背景加权重参数。

分类误差:

交叉熵计算。

2.4 NMS非极大值抑制

即我们最后会得到好多个框(经过IOU大于一定阈值筛选后),先按置信度进行排序,选置信度最大的,别的就不要了。

2.5 优缺点分析

优点:

  • 快速,简单!

缺点:

  • 每个Cell只预测一个类别,如果重叠无法解决

  • 小物体检测效果一般,长宽比可选的但单一

小物体一般检测不到,B1,B2候选框经验值一般是大的。假如多个物体重合在一起,如狗和猫前后在一起,一个格子预测结果出来是狗就预测不到猫了。多标签处理也不好做,如狗、斑点狗哈士奇等。

三、YOLO-V2改进细节

整体的网络架构和思想相较于V1没有变化,改进了网络在实现过程中的小细节。

加入上表那些细节后,mAP由63.4提升到了78.6。

3.1 YOLO-V2-Batch Normalization

  • V2版本舍弃Dropout,卷积后全部加入Batch Normalization

  • 网络的每一层的输入都做了归一化,收敛相对更容易

  • 经过Batch Normalization处理后的网络会提升2%的mAP

  • 从现在的角度来看,Batch Normalization已经成网络必备处理

3.2 YOLO-V2-更大的分辨率

  • V1训练时用的是224*224,测试时使用448*448

  • 可能导致模型水土不服,V2训练时额外又进行了10次448*448 的微调

  • 使用高分辨率分类器后,YOLOv2的mAP提升了约4%

3.3 YOLO-V2-网络结构

  • DarkNet网络结构(借鉴了VGG Restnet),实际输入为416*416(为什么不是448?要被32整除才行,希望结果是奇数有实际中心点。)。

  • 没有FC(全连接)层(容易过拟合、参数多训练慢),5次降采样(2*2池化,共缩小了32倍),最后得到13*13(416/32)的特征图(第一代版本7*7小了点,先验框也是。)。

  • 3*3的卷积借鉴了VGG参数比较少感受野比较大。1*1卷积节省了很多参数,在1*1卷积这步只改变了特征图的个数。 ps:1*1卷积可以用来降维/升维,增加非线性特征(激活函数)等

注:上图output那一列仅供参考,实际上输入416输出13。

之前要全连接全连接reshape:

3.4 YOLO-V2-聚类提取先验框

  • faster-rcnn系列选择的先验比例都是常规的,但是不一定完全适合数据集

  • K-means聚类中的距离:,有的框大有的框小,使用欧氏距离的话大的框产生差异的情况也会比较大,所以使用IOU进行距离度量,IOU=1时效果越好d=0。

之前学的YOLO-V1里面B=2,但正常的物体不就是什么长方形正方形这两种形状,faster-rcnn这种2-stage的方法用了9种先验框,YOLO-V2版本一想自己也多加几种吧。

faster-rcnn里使用如1:1 1:2 2:1三种比例的框,每种比例分不同大小各3个,共9个框。YOLO-V2中使用聚类在某数据集如COCO中进行先验框提取,比如Kmean中的K=5那就分出5堆长宽比不同的先验框,每堆长宽相近,比如300:200一堆,316:271一堆,110:115一堆...。这样更加合适一些。

上图左边横坐标是Kmeans中k的取值,纵坐标是平均IOU。K越小,堆之间差异越大,K越大,堆之间差异越小越“细腻”,一般选K=5。右边就是那5个堆。

V1版本B=2,V2版本K=5,从两种框提升到了5种框

3.5 YOLO-V2-Anchor Box

  • 通过引入anchor boxes,使得预测的box数量更多(13*13*n)

  • 跟faster-rcnn系列不同的是先验框并不是直接按照长宽固定比给定

上图可见有无先验框对mAP没怎么变(略微下降)。因为先验框多了也就是说框起来的虽然多了,但不一定框的都对。

但是召回率上升了,也就是查全率提升,图像中但凡有真实值标记出来的被检测出的可能性更大一点,毕竟框多了。

3.6 YOLO-V2-Directed Location Predictio

  • bbox:中心为(xp,yp);宽和高为(wp,hp),则 。如tx=1,则将bbox在x轴向右移动wp;tx=−1则将其向左移动wp

  • 这样会导致收敛问题(乱移动),模型不稳定,尤其是刚开始进行训练的时候。V2中并没有直接使用上面的偏移量,而是选择相对grid cell的偏移量(这样无论怎么偏移都不会偏移出中心点这个格子)

计算公式为:

其中为sigmoid函数,这里用sigmoid函数是为了让预测框的中心位置位于grid中,这种对偏移量的约束一定程度上保证了训练时间减少,加快收敛。

相对grid cell左上角那个点的距离,用sigmoid压缩到了0-1之间,因为一个格子就是一个单位不能超过1;Cx、Cy是指这个左上角的点在13*13格子里的坐标,这里是1,1。

例如预测值(σtx,σty,tw,th)=(0.2, 0.1, 0.2, 0.32),anchor框为 (注:这都是特征图grid cell的不是原始图像)

3.7 YOLO-V2-Fine-Grained Features

到最后一层,感受野太大了,小目标可能会丢失,需要融合之前的特征。

以YOLO-V2的DarkNet19为例,不光光要最后一层的13*13*1024,还要把中间层的特征图拿出来,比如中间的26*26*512,可以把它改写成4*13*13*512,这样和13*13*1024一进行叠加,就能得到既有大小目标通吃的13*13*3072的特征图了。

3.8 YOLO-V2-Multi-Scale

因为都是卷积没有全连接,所以输入大小可以不固定。一般照一张图片进行检测,如果把它resize成一定大小,效果没有以下方法好一些:一定iterations之后改变输入图片大小,即多尺度。

这样就让网络有了一定的适应能力,既能在大的分辨率检测到,也能在小的分辨率检测到。

3.9 总结

以上各点结合在一起就是YOLO-V2进行的细节改进,整体的结构相较于V1思想还是没有变的,都是one-stage方法,最后经过回归得到结果。

四、YOLO-V3核心网络模型

不像V2改进了许多细节,V3版本主要针对一点:网络架构的升级,即特征提取得更好一些。

上图横坐标表示预测时间,纵坐标表示mAP值。

  • YOLO-V3最大的改进就是网络结构,使其更适合小目标检测

  • 特征做的更细致,融入多持续特征图信息来预测不同规格物体

  • 先验框更丰富了,3种scale,每种3个规格,一共9种

  • softmax改进,预测多标签任务

4.1 多scale

为了能检测到不同大小的物体,设计了3个scale。

之前我们在V2中提到特征融合,比如把中间某层的特整图和最后的特征图整合到一起,达到“大小目标通吃”的效果,但是这样直接融合可能会把一些“擅长的东西淹没”。现在我们来想一想,由于感受野的存在,不同层的特征图虽都是特征提取,但实际细分做的工作还是不同的,比如前几次卷积更注重纹理轮廓颜色等,中间注重其它特征,后面的注重整体特征(感受野大)。

我们把负责不同工作的特征图放到一起,不如把它们分开来,如提取轮廓的都放到一起,注重整体的放到一起... 这样“分工明确”,效果会更好一些。

比如上图13*13的特征图感受野大,那就去预测大物体;26*26的特征图,感受野中等,去预测中等目标;52*52的特征图,感受野小,去预测小目标。只不过不是把这些大小的特征图单拿出来,在预测中目标时要参考大特征图;在预测小目标时要参考中特征图。

至于BOX1、BOX2、BOX3则是三种比例,共9种都不一样,下面会讲解。

scale变换经典方法

这里简单介绍3种:

法1. 图像金字塔

resize输入图片的大小,通过改变分辨率来得到不同大小的结果,13*13、26*26、52*52...

该方法可行,但在注重速度的YOLO上还是差了点。

法2.对不同的特征图分别利用

该方法也可行,但不如下面的好。

法3. 不同特征图融合后进行预测(YOLO-V3核心思想)

因为13*13的感受野大,可以把大目标识别好,但中等的“眼界”不如大的,小的“眼界”也不如中等的,因此不如让“老年人”帮帮中年人,让“中年人”帮帮小孩。这里,进行了特征融合。

把13*13的特征图通过上采样变成26*26的,与原本26*26的进行融合。“中年人”帮小孩同理。

4.2 残差连接

从今天的角度来看,基本上所有的网络架构都用上了残差连接的方法。V3中也用了resnet的思想,堆叠更多的层来进行特征提取。

在过去14年VGG出现,人们以为卷积层数越多越好,但实际上通过测试发现发现越学越差,比如16层的时候要比30的好。因为无法保证卷积的时候,在某特征图之上继续提取特征效果会更好。

后来15还是16年诞生Resnet 残差网络,如果新加进来的这层效果不好,我把它的权重设为0 不用这一层。 即好的我们要不好的不要。

4.3 核心网络架构-DarkNet53

可以看到里面加入了残差块。

  • 没有池化和全连接,全部卷积。

  • 下采样通过stride为2实现。

  • 3中scale,更多先验框。

看上图右下角部分,得到13*13*75结果,(这里75根据不同任务设置的,我们主要看前面的),它前面13*13*1024特征图还进行了26*26*256的上采样与26*26*512的特征图进行融合,得到26*26*768的融合特征图,在经过卷积变换->26*26*256->输出26*26*75。完成“老人给中年人提建议”。"中年人给小孩提建议"同理,小孩融合了中年人和老年人的建议。

在V1中网格7*7,V2中网格为13*13,V3则是有3种:13*13、26*26、52*52

以13*13为例,输出结果13*13*3*85,其中13是网格数,3是3种比例的先验框BOX123,85里分为4个xywh坐标值、1个置信度(前景还是背景),剩下的80则是任务的类别数量。

26*26、52*52同理。

4.4 先验框设计

V1中2(B=2)个,V2中5(K=5)个,V3中9(3*3)个。

3种scale,每种3个规格,一共9种

如下图:黄色表示标签 蓝色表示先验框的大小

4.5 softmax层改进

  • 物体检测任务中可能一个物体有多个标签

  • logistic激活函数来完成,这样就能预测每一个类别是/不是,即概率越接近1,损失越接近0,概率越接近0损失越无穷大。

这样比如检测猫输出结果的数组中,猫的概率0.7,狗的概率0.3,加菲猫的概率0.8,幼年猫的概率0.7... 我们可以设置一个阈值来进行筛选。

4.6 总结

  • YOLO-V3最大的改进就是网络结构,使其更适合小目标检测

  • 特征做的更细致,融入多持续特征图信息来预测不同规格物体

  • 先验框更丰富了,3种scale,每种3个规格,一共9种

  • softmax改进,预测多标签任务

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

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

相关文章

windows无法访问指定设备路径或文件怎么办?2个解决方案

有时候Win10电脑打不开程序或文件,windows无法访问指定设备路径或文件该怎么办?原因是什么呢?一般导致这种情况的出现,大多是因为我们的电脑缺乏相应的查看权限,我们只需要通过赋予权限就可以解决这个难题了。 操作环境…

负载均衡下的webshell上传

负载均衡下的webshell上传1.应用场景2.面临的困难2.1 shell文件上传问题2.2 命令执行时的漂移2.3 大工具投放失败2.4 内网穿透工具失效3.一些解决方案3.1 关机3.2 基于IP判断执行主机3.3 脚本实现web层的流量转发3.3.1 创建antproxy.jsp脚本3.3.2 修改 Shell 配置4.总结1.应用场…

零基础学SQL(十、子查询与多表关联)

目录 前置建表 ​编辑 编辑 一、子查询 1、什么是子查询 2、子查询的类型 二、表关联查询 1、连接分类 1.1、交叉连接 (CROSS JOIN) 1.2、内连接(inner join) 1.3、外连接(left join ,right join,full joi…

Nodejs原型链污染

Nodejs与JavaScript和JSON 有一些人在学习JavaScript时会分不清Nodejs和JavaScript之间的区别,如果没有node,那么我们的JavaScript代码则由浏览器中的JavaScript解析器进行解析。几乎所有的浏览器都配备了JavaScript的解析功能(最出名的就是…

《Terraform 101 从入门到实践》 第二章 Providers插件管理

《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。 不怕出身低,行行出状元。 插件 Terraform可以对多种平台的多种资源进行管理,这个是通过…

隐私计算概览

1、政策背景与应用驱动 1、国内政策法规 2022年1月,十四五规划:初步建立数据源要素市场体系,在保护数据安全和用户隐私前提下,参与数据价值开发。2022年3月,国务院《关于构建更加完善的要素市场化配置体制机制的意见…

java面试题(十七)spring

2.1 请你说说Spring的核心是什么 参考答案 Spring框架包含众多模块,如Core、Testing、Data Access、Web Servlet等,其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能,而这些功能…

Python|每日一练|广度优先搜索|字符串|贪心算法|数组|二分查找|单选记录:删除无效的括号|盛最多水的容器|搜索旋转排序数组

1、删除无效的括号(广度优先搜索,字符串) 给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。 返回所有可能的结果。答案可以按 任意顺序 返回。 示例 1: 输入&am…

一文详解 Redis 常见数据类型

一文详解 Redis 常见数据类型1.Redis 数据类型2.String3.key的层级格式4.Hash5.List6.Set7.SortedSet1.Redis 数据类型 Redis支持五种基本数据类型:string(字符串),hash(哈希),list&#xff08…

Cadence OrCAD 16.6 原理图导出带标签pdf(免费软件版)

Cadence OrCAD 16.6原理图导出带标签pdf(免费软件版) Cadence OrCAD 16.6 导出有标签的原理图,页面导航、跨页符、元件封装等,更方便阅读。找了一些可用的免费软件。 安装软件 系统win10 22H2,OrCAD SPB 16.6 根据…

odoo16内置机器人对接chatgpt模块源码分析

首先分析 __manifest__.py 代码 # -*- coding: utf-8 -*- # Copyright (c) 2020-Present InTechual Solutions. (<https://intechualsolutions.com/>){name: Odoo ChatGPT Integration,version: 16.0.1.0.1,license: AGPL-3,summary: Odoo ChatGPT Integration,descript…

Boom 3D最新2023电脑版音效增强软件

Boom 3D是适用于Mac和Windows系统的专业音效增强软件&#xff0c;旨在通过播放器&#xff0c;媒体或流媒体服务等介质&#xff0c;在不同类型的耳机上以3D环绕效果播放媒体内容。您无需使用昂贵的耳机或其他附加环绕音效增强器即可感受3D环绕音乐。 Boom 3D专业音效增强软件&am…

CHI一致性概述

硬件保证一致性使得系统功能部件能够在不需要软件编程参与的情况下共享内存。如果任意两个组件对相同地址单元进行写访问&#xff0c;且系统内所有组件看到的这两个写访问顺序是相同&#xff0c;那么这个地址具有一致性属性。 一致性模型 参见下图&#xff0c;每个请求部件RN…

@LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析

背景 最近引入了 Nacos Config 配置管理能力&#xff0c;说起来用法很简单&#xff0c;还是踩了三个坑。 Nacos Config 的 nacos 的帐号密码加密配置后&#xff0c;怎么解密而且在 NacosConfigBootstrapConfiguration 真正注入 Nacos Config 注入之前&#xff0c;而且不能触发…

十分钟利用环信WebIM-vue3-Demo,打包上线一个即时通讯项目【含音视频通话】

这篇文章无废话&#xff0c;只教你如果接到即时通讯功能需求&#xff0c;十分钟利用环信WebIM-vue3-Demo&#xff0c;打包上线一个即时通讯项目【包含音视频通话功能】。 写这篇文章是因为&#xff0c;结合自身情况&#xff0c;以及所遇到的有同样情况的开发者在接到即时通讯&a…

VS+QT项目创建及配置设置

1.创建QT项目 选择MSV2015 32 (与VS一致即可) 2.在VS中 Qt VS Tools-OpenQtProjectFiles(.pro) 打开QT项目。 3.VS属性页中设置配置 &#xff08;1&#xff09;修改SDK版本和 平台工具集 &#xff08;2&#xff09;更改输出目录 &#xff08;3&#xff09;确认Qt Project …

设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

工厂模式 Factory Pattern&#xff08;简单工厂、工厂方法、抽象工厂&#xff09; 工厂模式-创建型模式-提供了创建对象的最佳方式。 在工厂模式中&#xff0c;创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过一个共同的接口来创建新的对象。 简单工厂 简单工厂…

微服务负载均衡器Ribbon

目录 什么是Ribbon 客户端的负载均衡 服务端的负载均衡 常见负载均衡算法 Nacos使用Ribbon 添加LoadBalanced注解 修改controller Ribbon负载均衡策略 IRule AbstractLoadBalancerRule 修改默认负载均衡策略 自定义负载均衡策略 配置自定义的策略 饥饿加载 Ribbo…

Codeforces Round #699 (Div. 2)

E. 题意:n本书,每本书有颜色a[i],一次操作可以将其中一本书放在末尾,求满足:相同颜色的书都是相邻的 的最小操作次数. 显然最多只需要n次,考虑能节省多少次.倒着考虑,记f[i]为i~n最多能节约的次数.先预处理出每种颜色的出现的位置范围l[i],r[i]. 1.不节约这本书f[i] f[i 1]…

Linux文件,目录IO类系统调用总结与示例

tags: C Syscall Linux 写在前面 无论是做网络编程还是系统编程, 逃不开的一个内容就是C系统调用的学习, 正如C的STL一样, 学习OS也有如下的三步骤: 会使用: 熟悉API懂原理: 分析源码写扩展: 实际开发 现在就来熟悉一下系统调用吧. 环境Ubuntu x86_64. 源码部分也参考了apu…