当前位置:   article > 正文

yolo系列网络算法的演变过程_yolo算法发展脉络

yolo算法发展脉络

目录

目标检测的历史发展历程:

Yolo1

论文地址

Yolo1结构图:

设计思路: 

Yolo1输出形状 

bbox的置信度计算

bbox的所属类的置信度计算

Yolo1的损失函数

四个部分 

loss函数设计的缺陷 

总结Yolo1的优点和需要改进的地方

优点:

需要改进之处:

Yolo2

论文地址:

Yolo2网络结构: 

Yolo2损失函数

Yolo2做的优化

High resolution classifier(高分辨率图像分类器)

增加BN移除dropout

Convolution with anchor boxes(使用先验框)

去掉全连接层的全卷积网络多尺度训练

尺寸聚类

Fine-Grained Features(passthrough层检测细粒度特征)

总结Yolo2的效果优点

Yolo3

论文地址:

网络结构:

Yolo3改进之处

引入FPN(多尺度预测)

主干网络改为DarkNet-53

二分类交叉损失熵分类

Yolo4

论文地址

结构图

堆trick的v4主要的创新点:

从结构4个部分来看创新点:

相关研究论文:

如何提升YOLO对小目标检测的精度


目标检测的历史发展历程:

图片引自:https://arxiv.org/pdf/1905.05055.pdf 

        可以看到yolo出现的比较晚,R-CNN系列算法相对较早,同时R-CNN系列的算法也继承了传统目标检测算法的思路,分为两个阶段来执行,第一步先获取候选框,第二步再做分类。

        为了做到提速,并且简化检测流程做到更加端到端效果,yolo系列换了思路,利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别,做到了one-stage的效果。

        R-CNN和Yolo对比,two-stage的精度高但是相对慢,one-stage的快但是相对精度有所妥协。

Yolo1

论文地址

https://arxiv.org/abs/1506.02640

Yolo1结构图:

        yolov1的网络结构借鉴了 GoogLeNet 。24个卷积层,2个全链接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules ) 

设计思路: 

        YOLO的全称是You Only Look Once,即你只用看一次。YOLO1版本是YOLO系列的开山之作,其核心思想是:把目标检测当做一个单一的回归任务。它首先将图像划分为SxS个网格(grid cell),物体真实框中心落在哪个网格上,就由该网格对应的锚框负责检测该物体

Yolo1输出形状 

        Yolo1是将图像分成了S*S个网格,每个cell会负责预测落在其上边物体的类别(假如一共C个类别),另外每个cell会预测B个bounding box,每个bounding box要预测(x, y, w, h)和置信度confidence共5个值,因此yolov1输出是一个S x S x (5*B+C)的一个张量tensor。

         假如是PASCAL VOC数据集的20分类,取S=7,B=2,所以输出为7*7*(2*5+20)的tensor。整个图片最多识别7X7X2个box,最多识别49个目标。如上图,每一个网格只能只能预测两个框,不利于识别密集型目标和小目标。注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。

bbox的置信度计算

        上边说道每个cell要预测B个bbox,每个bbox除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的: 

        其中如果有object落在一个grid cell里,第一项取1,否则取0。第二项是预测的bounding box和实际的groundtruth之间的IoU值

bbox的所属类的置信度计算

        在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score: 

        等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。

        得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。非极大值抑制解释请移步:目标检测综述(一:历史由来和古典目标检测的出现)_RayChiu757374816的博客-CSDN博客_目标检测起源

Yolo1的损失函数

四个部分 

        Yolo1的损失函数分为四部分坐标预测、含object的bbox confidence预测、不含object的bbox confidence预测、类别预测,参数的解释:

        其中只有当某个网格中有object的时候才对classification error进行惩罚,只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而cell中两个bbox哪个负责就要看其预测值和ground truth box的IoU,IoU最大的负责。

loss函数设计的缺陷 

不同类别数量的问题 

        yolov1的损失函数简单粗暴的采用了sum-squared error loss来做这件事,这种简单粗暴的loss设计在类别数量不同的情况下存在问题: 8维的localization error和20维的classification error同等重要显然是不合理,解决办法就是设置不同的权重分数。

W和H的处理

        对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。

总结Yolo1的优点和需要改进的地方

优点:

  1. 速度快,达到了完全实时的效率
  2. 错误率低(相对于faster rcnn会把很多背景预测为物体)
  3. 泛华能力强(论文试验-在美术绘画作品中也有较好的效果)

需要改进之处:

  1. 由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。
  2. 虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个
  3. YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性

Yolo2

论文地址:

https://arxiv.org/abs/1612.08242

Yolo2网络结构: 

可以看到骨干网络换成了DarkNet

Yolo2损失函数

        只有YOLO v1明确提出了loss公式,V2和V3都使用了anchor的概念,因此计算loss的方式做出了调整 。

Yolo2做的优化

        Yolo1 定位误差高,而且相比于基于区域提议的方法,Yolo1 的召回率偏低。针对Yolo1的这些缺点做了以下优化:

High resolution classifier(高分辨率图像分类器)

        V1 使用 224×224 分辨率图像训练分类网络,并且将分辨率增加到 448 用于检测,mAP提升了4%

增加BN移除dropout

        在所有的卷积层后增加 BatchNormalization 这可以显著改善网络的收敛性,并且有利于正则化模型,防止过拟合。增加 BN以后移除网络的 dropout 。这将 mAP 提升 2%。

Convolution with anchor boxes(使用先验框)

        学习RPN使用先验框,这种操作基于的理论是:“模型学习拟合偏移量相对于学习直接拟合出坐标操作会更加容易”,简单说就是预先设定一些预测框,然后在训练的过程中去调整这些检测框(这个过程就是在学习偏移量)

        网络通过32 降采样因子,网络输出特征图大小为 13×13;yolov2 将类预测机制与空间位置分离,为每个锚框预测类和目标。v1在每幅图像仅预测 98个框,但是 v2在每幅图像预测超过 1000个框(前提每个anchor 9个Anchor Boxes,实际上通过后边讲的聚类效果发现5个box就能达到Faster RCNN的9中box的效果)。使用锚框导致精度略微下降,但是召回率显著提高。

去掉全连接层的全卷积网络多尺度训练

        和SSD一样,模型中只包含卷积和平均池化层(平均池化是为了变为一维向量,做softmax分类)。这样做一方面是由于物体检测中的目标,只是图片中的一个区块,它是局部感受野,没必要做全连接。而是为了输入不同尺寸的图片,如果采用全连接,则只能输入固定大小图片了。全卷积网络使得模型支持多种尺度图像的输入并轮流进行训练

尺寸聚类

        通过在训练数据集上运行 k−means聚类算法,为预测框找到较优的先验尺寸,更科学与更准确的选择Anchor Box的尺寸,检测效果更好。

Fine-Grained Features(passthrough层检测细粒度特征)

        对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO2中输入416*416经过卷积网络下采样最后输出是13*13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。

        YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。Passthrough  层类似于 ResNet中的恒等映射,通过将相邻特征堆叠到不同的通道而不是空间位置,来连接高分辨率特征和低分辨率特征。具体来说,就是在最后一个pooling之前,特征图的大小是26*26*512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。

总结Yolo2的效果优点

  1. 小目标检测召回率好了一些
  2. 物体距离近的检测效果好了一些
  3. 精度好了一些

Yolo3

论文地址:

https://arxiv.org/abs/1804.02767

网络结构:

Yolo3改进之处

引入FPN(多尺度预测)

        YOLOv3 借鉴了 FPN 的思想,从不同尺度提取特征。相比 YOLOv2,YOLOv3 提取最后 3 层特征图,不仅在每个特征图上分别独立做预测,同时通过将小特征图上采样到与大的特征图相同大小,然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出 9 种尺度的 anchor box,将 9 种尺度的 anchor box 均匀的分配给 3 种尺度的特征图。

        YOLOv2每个网格分配 5 个锚框,YOLOv3 为每个网格分配 3 个尺度的特征图,每个尺度分配 3 个锚框,一共使用 9 个锚框。输出为N×N×[3∗(4+1+C)] 维度的张量,C为预测的类别数量。

主干网络改为DarkNet-53

        更好的基础分类网络(darknet-53, 类似于ResNet引入残差结构)

二分类交叉损失熵分类

        在实际应用场合中,一个物体有可能输入多个类别,单纯的单标签分类在实际场景中存在一定的限制。举例来说,一辆车它既可以属于 car(小汽车)类别,也可以属于 vehicle(交通工具),用单标签分类只能得到一个类别。因此在 YOLO v3 在网络结构中把原先的 softmax 层换成了逻辑回归层,从而实现把单标签分类改成多标签分类。用多个 logistic 分类器代替 softmax 并不会降低准确率,可以维持 YOLO 的检测精度不下降。

        Softmax和logistic 之间的区别是在一个多分类任务中,如果类别是互斥的使用Softmax,因为Softmax类似于onehot编码,只能有一个被激活;如果类别是不互斥的可以使用Logistic,可能同时激活多个单元。

Yolo4

        YOLOv4的特点是集大成者,俗称堆料。但最终达到这么高的性能,一定是不断尝试、不断堆料、不断调参的结果

论文地址

https://arxiv.org/abs/2004.10934

结构图

 Backbone:CSPDarknet53, Neck:SPP,PAN, Head:YOLOv3
 YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3

堆trick的v4主要的创新点:

从结构4个部分来看创新点:

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

相关研究论文:

        Mosaic数据增强:参考2019年的Cutouthttps://arxiv.org/abs/1905.04899v2

        CSPDarknet:参考2019年的CSPNethttps://arxiv.org/pdf/1911.11929.pdf

        Mish激活函数:参考2019年的https://arxiv.org/abs/1908.08681

        Dropblock:参考2018年的https://arxiv.org/pdf/1810.12890.pdf

        SPP:参考2019年的《DC-SPP-Yolohttps://arxiv.org/ftp/arxiv/papers/1903/1903.08589.pdf

        PAN:参考2018年的PANethttps://arxiv.org/abs/1803.01534

        CIOU_loss:参考2020年的https://arxiv.org/pdf/1911.08287.pdf

        当然,这只是其中一部分,还有其他的创新点,没有一一列出。

如何提升YOLO对小目标检测的精度

        这个问题要从不同版本的角度去分析,比如针对v1版本,可以说v2版本的聚类得到的先验框回归偏差可能会解决小目标检测问题。针对v2可以说v3的多尺度预测、更好的分类网络都能提升对小目标的检测准确率。针对v3可以说v4众多的trick的引入使得网络性能巨大的提升,自然就比v3小目标监测准确率高。

        要是针对v5,或者说针对整个base YOLO的模型,那解决的方法就是类似SSD那样在每个尺度的特征图上抽样送入末端卷积层去处理,自然对小目标的检测率会提升,比如说base EfficiNet模型。

        或者说效仿base Transformer模型将输入图片划分为多个patch,然后在末端去使用like RCNN去处理,有放大局部目标物体的作用。

参考:目标检测之YOLO算法:YOLOv1,YOLOv2,YOLOv3,TinyYOLO,YOLOv4,YOLOv5,YOLObile,YOLOF,YOLOX详解 - 知乎

如何看待新提出来的YOLOv4? - 知乎

深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解 - 知乎

行为分析(六):人形检测部分(一):YOLOv1-v5的学习笔记_是魏小白吗的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/397065
推荐阅读
相关标签
  

闽ICP备14008679号