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

大名鼎鼎的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改进,预测多标签任务

猜你喜欢

转载自blog.csdn.net/suic009/article/details/128843134