YOLOV4简介

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YOLOV4简介相关的知识,希望对你有一定的参考价值。

参考技术A

其他基础操作:

便于分析,将Yolov4 的整体结构拆分四大板块:

(1)输入端:训练时对输入端的改进,主要包括Mosaic数据增强,cmBN,SAT自对抗训练。
(2)BackBone主干网络:将各种新的方式结合起来,包括:CSPDarknet53,Mish激活函数,Dropblock。
(3)Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4的SPP模块,FPN+PAN结构。
(4)Prediction:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms。

(1)Mosaic数据增强。
Yolov4中使用的Mosaic是参考2019年提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放,随机裁剪,随机排布的方式进行拼接。

(1)CSPDarknet53
CSPDarknet53是在Yolov3主干网络Darknet53的基础上,借鉴2019年的CSPNet的经验,产生的Backbone结构,其中包含了5个CSP模块。

Backbone中卷积层的数量:

每个CSP模块前面的卷积核大小都是3x3,步长为2,因此可以起到下采样的作用。
因为Backbone有5个CSP模块,输入图像是608 x 608,所以特征图的变化规律是:608->304->152->76->38->19
经过5次CSP模块后得到19*19大小的特征图。
而且作者只在Backbone中采用Mish激活函数,网络后面任然采用Leaky_relu激活函数。

CSPNet的作者认为推理计算过高的问题是由于网络优化中的 梯度信息重复 导致的。
因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将他们合并,在减少计算量的同时可以保证准确率。
因此Yolov4在主干网络Backbone采用 CSPDarknet53网络结构 ,主要是有三个方面的优点:

Yolov4中使用的Dropblock,其实和常见网络中的Dropout功能类似,也是一种缓解过拟合的一种正则化方式。
传统的Dropout很简单: 随机删除减少神经元的数量,使网络变得更简单。

这种方式其实是借鉴2017年的Cutout数据增强的方式,cutout是将输入图像的部分区域清零,而Dropblock则是将Cutout应用到每一个特征图。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。

Dropblock Cutout数据增强 对训练效果进行对比验证时,发现几个优点:

在目标检测领域,为了更好的提取融合特征,通常在Backbone和输出层,会插入一些层,这个部分称为Neck。
Yolov4的Neck结构主要采用了SPP模块,FPN+PAN的方式。
(1)SPP模块
SPP模块 在Backbone的主干网络之后:

(2)FPN+PAN
PAN结构是借鉴 2018年图像分割领域PANet的创新点
看下Yolov3和Yolov4中是如何设计的。

前面CSPDarknet53中讲到,每个CSP模块前面的卷积核都是3x3大小,想当于下采样操作。
因此可以看到三个紫色箭头处的特征图是76x76,38x38,19x19。
以及最后Prediction中用于预测的三个特征图:①76×76×255,②38×38×255,③19×19×255。
我们也看下Neck部分的立体图像,看下两部分是如何通过FPN+PAN结构进行融合的。

原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用concat 操作,特征图融合后的尺寸发生了变化。

(1)CIOU_loss
目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。
Bounding Box Regeression的Loss近些年的发展过程是: Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)
从最常用的 IOU_Loss 开始,进行对比拆解分析,看下Yolov4为啥要选择 CIOU_Loss

-------------------------------------------------------IOU_loss------------------------------

问题一 :即状态1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。
问题二 :即状态2和状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。
因此2019年出现了GIOU_Loss来进行改进。

-------------------------------------------------------GIOU-------------------------------------

看到上图的GIOU_loss中,增加了相交尺度的衡量方式,缓解了 单纯IOU_Loss 时的尴尬。
但为什么仅仅说缓解呢?因为还存在一种不足:

基于这个问题, 2020年的AAAI又提出了DIOU_Loss

------------------------------------------------DIOU_Loss------------------------------------------------------------

好的目标框回归函数应该考虑三个重要的几何因素: 重叠面积,中心点距离,长宽比。
针对IOU和GIOU存在的问题,作者从两个方面进行考虑
一:如何最小化预测框和目标框之间的归一化距离?
二:如何在预测框和目标框重叠时,回归的更准确?
针对第一个问题,作者提出了DIOU_Loss

-----------------------------------------------------------CIOU_Loss-----------------------------------------------------

CIOU_Loss DIOU_Loss 前面的公式都是一样的,不过在此基础上还增加了一个 影响因子 ,将预测框和目标框的长宽比都考虑了进去。

这样CIOU_Loss就将目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比全都考虑进去了。
再来综合的看下各个Loss函数的不同点:

nms主要用于预测框的筛选,YOLOV4将其中计算IOU的部分替换成DIOU的方式

在上图重叠的摩托车检测中,中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。
因此在重叠目标的检测中,DIOU_nms的效果优于传统的nms。

注意 :为什么不用CIOU_nms,而用DIOU_nms?
因为前面讲到的CIOU_loss,实在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。
但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。

检测算法简介及其原理——fast R-CNN,faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3

1 引言

深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析。

目标检测可以理解为是物体识别和物体定位的综合,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。

为了完成这两个任务,目标检测模型分为两类。一类是two-stage,将物体识别和物体定位分为两个步骤,分别完成,这一类的典型代表是R-CNN, fast R-CNN, faster-RCNN家族。他们识别错误率低,漏识别率也较低,但速度较慢,不能满足实时检测场景。为了解决这一问题,另一类方式出现了,称为one-stage, 典型代表是Yolo, SSD, YoloV2, YoloV3等。他们识别速度很快,可以达到实时性要求,而且准确率也基本能达到faster R-CNN的水平。下面针对这几种模型进行详细的分析。

2 R-CNN

2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图:

技术图片

算法步骤如下:

  1. 获取输入的原始图片
  2. 使用选择性搜索算法(selective search)评估相邻图像之间的相似度,把相似度高的进行合并,并对合并后的区块打分,选出感兴趣区域的候选框,也就是子图。这一步大约需要选出2000个子图。
  3. 分别对子图使用卷积神经网络,进行卷积-relu-池化以及全连接等步骤,提取特征。这一步基本就是物体识别的范畴了
  4. 对提取的特征进行物体分类,保留分类准确率高的区块,以作为最终的物体定位区块。

R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个:

  1. 候选框由传统的selective search算法完成,速度比较慢
  2. 对2000个候选框,均需要做物体识别,也就是需要做2000次卷积网络计算。这个运算量是十分巨大的。

 

3 Fast R-CNN

针对R-CNN的部分问题,2015年微软提出了fast R-CNN算法,它主要优化了两个问题:

  1. 提出ROI pooling池化层结构,解决了候选框子图必须将图像裁剪缩放到相同尺寸大小的问题。由于CNN网络的输入图像尺寸必须是固定的某一个大小(否则全连接时没法计算),故R-CNN中对大小形状不同的候选框,进行了裁剪和缩放,使得他们达到相同的尺寸。这个操作既浪费时间,又容易导致图像信息丢失和形变。fast R-CNN在全连接层之前插入了ROI pooling层,从而不需要对图像进行裁剪,很好的解决了这个问题。

如下图,剪切会导致信息丢失,缩放会导致图像形变。

技术图片

ROI pooling的思路是,如果最终我们要生成MxN的图片,那么先将特征图水平和竖直分为M和N份,然后每一份取最大值,输出MxN的特征图。这样就实现了固定尺寸的图片输出了。ROI pooling层位于卷积后,全连接前。

  1. 提出多任务损失函数思想,将分类损失和边框定位回归损失结合在一起统一训练,最终输出对应分类和边框坐标。

Fast R-CNN的结构如如下

技术图片

4 Faster R-CNN

R-CNN和fast R-CNN均存在一个问题,那就是由选择性搜索来生成候选框,这个算法很慢。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。faster R-CNN 针对这个问题,提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度。这个算法十分复杂,我们会详细分析。它的基本结构如下图

技术图片

主要分为四个步骤:

  1. 卷积层。原始图片先经过conv-relu-pooling的多层卷积神经网络,提取出特征图。供后续的RPN网络和全连接层使用。faster R-CNN不像R-CNN需要对每个子图进行卷积层特征提取,它只需要对全图进行一次提取就可以了,从而大大减小了计算时间。
  2. RPN层,region proposal networks。RPN层用于生成候选框,并利用softmax判断候选框是前景还是背景,从中选取前景候选框(因为物体一般在前景中),并利用bounding box regression调整候选框的位置,从而得到特征子图,称为proposals。
  3. ROI层,fast R-CNN中已经讲过了ROI层了,它将大小尺寸不同的proposal池化成相同的大小,然后送入后续的全连接层进行物体分类和位置调整回归
  4. 分类层。利用ROI层输出的特征图proposal,判断proposal的类别,同时再次对bounding box进行regression从而得到精确的形状和位置。

使用VGG-16卷积模型的网络结构如下图

技术图片

4.1 卷积层

卷积层采用的VGG-16模型,先将PxQ的原始图片,缩放裁剪为MxN的图片,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。

MxN的图片,经过卷积层后,变为了(M/16) x (N/16)的feature map了。

4.2 RPN层

faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。

4.2.1 候选框的生成 anchors

卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。

4.2.2 softmax判断选区是前景还是背景

对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。

对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。

4.2.3 确定候选框位置

另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。

技术图片

假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下:

技术图片

我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。

4.2.4 输出特征子图proposal

得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下:

  1. 得到前景anchors和他们的[x y w h]坐标
  2. 按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个
  3. 剔除非常小的anchors
  4. 通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题
  5. 选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。

经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了

 

4.3 ROI Pooling层

和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和图片形变问题。我们使用ROI pooling可以有效的解决这个问题。

ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。

 

4.4 分类层

ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。

技术图片

这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到83.8%的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。

 

5 Yolo:you only look once

针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,yolo可实现45帧每秒的运算速度,完全能满足实时性要求(达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图

技术图片

主要分为三个部分:卷积层,目标检测层,NMS筛选层

5.1 卷积层

采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)

5.2 目标检测层

先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图

技术图片

  1. bounding box坐标: 如上图,7x7网格内的每个grid(红色框),对应两个大小形状不同的bounding box(黄色框)。每个box的位置坐标为(x,y,w,h), x和y表示box中心点坐标,w和h表示box宽度和高度。通过与训练数据集上标定的物体真实坐标(Gx,Gy,Gw,Gh)进行对比训练,可以计算出初始bounding box平移和伸缩得到最终位置的模型。
  2. bounding box置信度confidence:这个置信度只是为了表达box内有无物体的概率,并不表达box内物体是什么。

confidence=技术图片

其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。

  1. 分类信息:yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集。常用目标检测数据集如下表:

| Name | # Images (trainval) | # Classes | Last updated |
| --------------- | ------------------- | --------- | ------------ |
| ImageNet | 450k | 200 | 2015 |
| COCO | 120K | 90 | 2014 |
| Pascal VOC | 12k | 20 | 2012 |
| Oxford-IIIT Pet | 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |

每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。

5.3 NMS筛选层

筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。

5.4 yolo损失函数

yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下

技术图片

误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。

yolo算法开创了one-stage检测的先河,它将物体分类和物体检测网络合二为一,都在全连接层完成。故它大大降低了目标检测的耗时,提高了实时性。但它的缺点也十分明显:

  1. 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。
  2. 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差
  3. 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
  4. 对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD对它有些优化,我们后面再看。

 

6 SSD: Single Shot MultiBox Detector

Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),72.1%的mAP。

SSD网络结构如下图

技术图片

和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层

6.1 卷积层

SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。

6.2 目标检测层

这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下

6.2.1 多尺寸feature map上进行目标检测

每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。

技术图片

如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。

6.2.2 多个anchors,每个anchor对应4个位置参数和21个类别参数

和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示

技术图片

另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率

另外,SSD采用了数据增强。生成与目标物体真实box间IOU为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了8.8%的准确率。

6.3 筛选层

和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。

SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型ssd_mobilenet_v1_android_export.pb,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。

7 YoloV2, Yolo9000和其他模型

针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下

  1. 网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下:

技术图片

  1. 去掉全连接层:和SSD一样,模型中只包含卷积和平均池化层(平均池化是为了变为一维向量,做softmax分类)。这样做一方面是由于物体检测中的目标,只是图片中的一个区块,它是局部感受野,没必要做全连接。而是为了输入不同尺寸的图片,如果采用全连接,则只能输入固定大小图片了。
  2. batch normalization:卷积层后加入BN,对下一次卷积输入的数据做归一化。可以在增大学习率的前提下,同样可以稳定落入局部最优解。从而加速训练收敛,在相同耗时下,增大了有效迭代次数。
  3. 使用anchors:借鉴faster R-CNN和SSD,对于一个中心点,使用多个anchor,得到多个bounding box,每个bounding box包含4个位置坐标参数(x y w h)和21个类别概率信息。而在yolo中,每个grid(对应anchor),仅预测一次类别,而且只有两个bounding box来进行坐标预测。
  4. pass through layer:yolo原本最终特征图为13x13x256。yoloV2还利用了之前的26x26的特征图进行目标检测。26x26x256的feature map分别按行和列隔点采样,得到4幅13x13x256的feature map,将他们组织成一幅13x13x2048的feature map。这样做的目的是提高小物体的识别率。因为越靠前的卷积,其感受野越小,越有利于小物体的识别。
  5. 高分辨率输入Training:yolo采用224x224图片进行预训练,而yoloV2则采用448x448
  6. Multi-Scale Training:输入不同尺寸的图片,迭代10次,就改变输入图片尺寸。由于模型中去掉了全连接层,故可以输入不同尺寸的图片了。从320x320,到608x608

 

yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。

技术图片

 

8 YoloV3

YOLOv3是到目前为止,速度和精度最均衡的目标检测网络。通过多种先进方法的融合,将YOLO系列的短板(速度很快,不擅长检测小物体等)全部补齐。达到了令人惊艳的效果和拔群的速度。

技术图片

                                                      图:YOLOv3与其他网络的mAP与运行时间对比

8.1多标签分类预测

在YOLO9000[1]之后,我们的系统使用维度聚类(dimension clusters )作为anchor boxes来预测边界框,网络为每个边界框预测4个坐标。

在YOLOv3[2]中使用逻辑回归预测每个边界框(bounding box)的对象分数。 如果先前的边界框比之前的任何其他边界框重叠ground truth对象,则该值应该为1。如果以前的边界框不是最好的,但是确实将ground truth对象重叠了一定的阈值以上,我们会忽略这个预测,按照进行。我们使用阈值0.5。与YOLOv2不同,我们的系统只为每个ground truth对象分配一个边界框。如果先前的边界框未分配给grounding box对象,则不会对坐标或类别预测造成损失。

在YOLOv3中,每个框使用多标签分类来预测边界框可能包含的类。该算法不使用softmax,因为它对于高性能没有必要,因此YOLOv3使用独立的逻辑分类器。在训练过程中,我们使用二元交叉熵损失来进行类别预测。对于重叠的标签,多标签方法可以更好地模拟数据。

8.2跨尺度预测

YOLOv3采用多个尺度融合的方式做预测。原来的YOLO v2有一个层叫:passthrough layer,假设最后提取的feature map的size是13*13,那么这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样的操作也是为了加强YOLO算法对小目标检测的精确度。这个思想在YOLO v3中得到了进一步加强,在YOLO v3中采用类似FPN的上采样(upsample)和融合做法(最后融合了3个scale,其他两个scale的大小分别是26*26和52*52),在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。虽然在YOLO v3中每个网格预测3个边界框,看起来比YOLO v2中每个grid cell预测5个边界框要少,但因为YOLO v3采用了多个尺度的特征融合,所以边界框的数量要比之前多很多。

8.3网络结构改变

YOLO v3使用新的网络来实现特征提取。在Darknet-19中添加残差网络的混合方式,使用连续的3×3和1×1卷积层,但现在也有一些shortcut连接,YOLO v3将其扩充为53层并称之为Darknet-53。

技术图片 

图:Darknet-53网络结构

 

这个新网络比Darknet-19功能强大得多,而且比ResNet-101或ResNet-152更有效。

 技术图片

图:ImageNet结果

每个网络都使用相同的设置进行训练,并以256×256的单精度测试进行测试。运行时间是在Titan X上以256×256进行测量的。因此,Darknet-53可与state-of-the-art的分类器相媲美,但浮点运算更少,速度更快。Darknet-53比ResNet-101更好,速度更快1:5倍。 Darknet-53与ResNet-152具有相似的性能,速度提高2倍。

Darknet-53也可以实现每秒最高的测量浮点运算。这意味着网络结构可以更好地利用GPU,从而使其评估效率更高,速度更快。

 【后续】

当前目标检测模型算法也是层出不穷。在two-stage领域,2017年Facebook提出了mask R-CNN。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。

one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。

8 总结

目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下:

  1. 检测速度:实时性要求高,故网络结构不能太复杂,参数不能太多,卷积层次也不能太多。
  2. 位置准确率:(x y w h)参数必须准确,也就是检测框大小尺寸要匹配,且重合度IOU要高。SSD和faster RCNN通过多个bounding box来优化这个问题
  3. 漏检率:必须尽量检测出所有目标物体,特别是靠的近的物体和尺寸小的物体。SSD和faster RCNN通过多个bounding box来优化这个问题
  4. 物体宽高比例不常见:SSD通过不同尺寸feature map,yoloV2通过不同尺寸输入图片,来优化这个问题。
  5. 靠的近的物体准确率低
  6. 小尺寸物体准确率低:SSD取消全连接层,yoloV2增加pass through layer,采用高分辨率输入图片,来优化这个问题

 

 

【注】本文主体内容来自于:

一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2从YOLOv1到v3的进化之路

其他参考链接:

[1]   J. Redmon and A. Farhadi. Yolo9000: Better, faster, stronger. In Computer Vision and Pattern Recognition (CVPR), 2017 IEEE Conference on, pages 6517–6525. IEEE, 2017. 1, 2, 3

[2]   J. Redmon and A. Farhadi. Yolov3: An incremental improvement. arXiv, 2018. 4





以上是关于YOLOV4简介的主要内容,如果未能解决你的问题,请参考以下文章

Yolov4.conv.137 在 Yolov4 暗网中是啥意思?

Raspberry Pi 4 (8 GB) 和 YOLOV4/YOLOV4-TINY 使用 Tensorflow-lite?

目标检测算法YOLOv4详解

YOLOv4 迁移学习/微调

最强目标检测算法YOLOv4论文解读

深度剖析目标检测算法YOLOV4