YOLO综述

YOLO目标检测算法原理及应用
版本作者时间备注
V1.0.0Zhe Chen2021.1.27YOLO系列学习笔记

前言

什么是目标检测?

在这里插入图片描述

**目标检测 **的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检测一直是机器视觉领域最具有挑战性的问题。

计算机视觉中关于图像识别有四大类任务:

  • 分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
  • 定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
  • 检测-Detection:解决“是什么?在哪里?”的问题,即定位出这个目标的的位置并且知道目标物是什么。
  • 分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。

目标检测中的核心问题?

除了图像分类之外,目标检测要解决的核心问题是:

  1. 目标可能出现在图像的任何位置。

  2. 目标有各种不同的大小。

  3. 目标可能有各种不同的形状。

    如果用矩形框来定义目标,则矩形有不同的宽高比。由于目标的宽高比不同,因此采用经典的滑动窗口+图像缩放的方案解决通用目标检测问题的成本太高。

基础知识

  • IoU(Intersect over union): 交并比。指目标预测框与真实框的交集和并集的比例。后续的CIoU、DIoU、GIoU都是IoU的变种优化。

在这里插入图片描述

  • mAP(mean Average Precision): 所有类别的平均精度求和除以所有类别。

YOLO

目标检测架构分为两种,一种是two-stage(R-CNN),一种是one-stage(YOLO),区别就在于 two-stage 有候选框提取(region proposal) 过程,类似于一种海选过程,网络会根据候选区域生成位置和类别,而 one-stage 直接从图片生成位置和类别。

相对于R-CNN系列的"看两眼"(候选框提取与分类),YOLO只需要Look Once。YOLO统一为一个回归问题,而R-CNN将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。

YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。

之前刚开始接触物体检测算法的时候,老是分不清deep learning中,物体检测和图片分类算法上的区别,弄得我头好晕,终于在这篇paper上,看到了解释。

物体检测和图片分类的区别:图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来,还有一点,物体检测是要把所有图片中的物体都识别定位出来。

YOLO

YOLOv1-开山之作

统一检测

作者将目标检测的流程统一为单个神经网络。该神经网络采用整个图像信息来预测目标的bounding boxes的同时识别目标的类别,实现端到端实时目标检测任务。

  • 将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。

在这里插入图片描述

  • 每个网络需要预测B个BBox的位置信息(x, y, w, h)和confidence(置信度)信息,一个BBox对应着四个位置信息和一个confidence信息。confidence代表了所预测的box中含有object的置信度和这个box预测的object有多准的两重信息:

在这里插入图片描述

​ 而YOLOv1中的S=7, B=2, Pascal VOC有20个类别标签,C=20,所以最终的预测是一个7×7×30的张量。

在这里插入图片描述

网络结构

在这里插入图片描述

YOLOv1采用卷积神经网络,开始由卷积层提取图像特征,全连接层预测输出概率。模型结构类似于GoogleNet,如图3所示。作者还训练了YOLO的快速版本(fast YOLO)。Fast YOLO模型卷积层和filter更少。最终输出为7×7×30的tensor。

训练方法

作者采用sum-squared error为目标函数来优化,下图为总的loss训练:

在这里插入图片描述

作者在PASCAL VOC2007和PASCAL VOC2012数据集上进行了训练和测试。训练135轮,batch size为64,动量为0.9,学习速率延迟为0.0005. Learning schedule为:第一轮,学习速率从0.001缓慢增加到0.01(因为如果初始为高学习速率,会导致模型发散);保持0.01速率到75轮;然后在后30轮中,下降到0.001;最后30轮,学习速率为0.0001.
作者还采用了dropout和 data augmentation来预防过拟合。dropout值为0.5;data augmentation包括:random scaling,translation,adjust exposure和saturation。

  • 这里有一个小的细节问题:作者为什么设置定位损失的宽和高为开根号的平方和呢?

在这里插入图片描述

这里,作者用到了一个trick,稍微缓解了yolo对大目标和小目标检测精度的平衡。这就是后续作者要进行改进的地方。

预测

对于PASCAL VOC数据集,模型需要对每张图片预测98个bounding box和对应的类别。对于大部分目标只包含一个box;其它有些面积大的目标包含了多个boxes,采用了Non-maximal suppression(非最大值抑制)来提高准确率。

  • NMS(非最大值抑制): 抑制目标框中的重合框。目的就是要去除冗余的检测框,保留最好的一个。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0BrUyRT5-1611736648084)(picture/NMS.png)]

缺点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmLkY56q-1611736648087)(picture/yolodetectionsystem.png)]

  • YOLOv1的每一个网格只预测两个Boxes和一个类别,这导致了模型对相邻近的目标预测准确率下降。因此YOLOv1对成群结队的目标(比如:一群鸟)识别准确率较低。
  • YOLOv1是从数据中学习预测bounding boxes,因此,对新的尺寸或者不常见角度的目标无法识别。
  • YOLOv1的loss函数对small bounding boxes 和large bounding boxes的error平等对待,影响了模型识别的准确率,因此yolov1对小目标检测不适用。
  • 所有的误差来源是来自定位不准确的原因。

效果比对

如表4-1所示,在准确率保证的情况下,YOLO速度快于其它方法,下表 PASCAL VOC 2007数据集测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6NK67XU-1611736648089)(picture/yolo1result1.png)]

总结

  • YOLOv1每个小方格只能预测一类物体,对于小目标检测很难。
  • 在损失函数中,对小物体变化的置信度和大物体变化的置信度惩罚相同,实际小物体变化应该加大惩罚。
  • YOLOv1在2007+2012上训练,mAP为63.4%,45fps。
  • Faster R-CNN ZF在2007+2012上训练,mAP为62.1%,18fps。
  • YOLOv1比Faster R-CNN有更多的定位错误。
  • YOLOv1比Faster R-CNN有更少的背景错误。
  • YOLOv1具有一定的鲁棒性,具有普适性,可以适用于实时目标检测。

YOLOv2-Better,Faster,Stronger

性能对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CqaYfSv7-1611736648092)(picture/yolo2.png)]

从测试效果来看,YOLOv2在当时主流框架的对比下,生命力还是很强的。

YOLOv2中的各种尝试 – Better

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ZtJF00a-1611736648094)(picture/yolo2map.png)]

Batch Normalization(批量归一化)-- improve 2% in mAP

批量归一化使得在收敛方面得到了显著改进,同时消除需要其他形式的正则化。通过对YOLO中所有卷积层添加批量归一进行标准化,我们在mAP上得到了超过2%的改进。批量正常化也有助于使模型规范化。使用批量归一化,我们删除dropout,也可以防止过度拟合。

High Resolution Classifier(更好分辨率的分类器)-- improve 4% in mAP
  • YOLO1中的输入尺寸是224×224,
  • YOLO2中采用448×448,可以得到4%的mAP提升。
Convolutional with Anchor Boxes(引入anchor)
  • YOLO1中采用bounding box通过卷积层直接得到坐标。
  • YOLO2中采用预测anchor offset能够简化这个问题,使得网络更容易去学习。
  • 不采用Anchor时,得到69.5mAP和81% recall;采用anchor时,得到69.2mAP和88% recall。虽然mAP有一定的下降,但是召回率有7%的提升。
Dimension Clusters(维度的集群)

采用k-means聚类的方法来获得anchor的个数。

Direct location prediction(方向位置预测) – improve 5% in mAP
  • 作者发现:如果直接采用anchor boxes的方式运用到yolo时,模型会很不稳定,因为没有对 t x 和 t y t_x和t_y txty进行限制,所有预测boxes会跑到图中任意的位置。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqOpIsAy-1611736648097)(picture/anchor.png)]

  • 对此,作者对以上公式进行了如下修改,对 t x 、 t y t_x、t_y txty应通过逻辑激活函数(sigmoid函数)进行限制,因此预测结构只会出现在grid cell之间,让每个anchor去负责预测目标中心落在某个grid cell区域内的目标:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yOblISoz-1611736648102)(picture/anchor modified.png)]

  • 通过增加anchor和sigmoid函数,YOLO有5% mAP的提升。

Fine-grained features(细粒度特性) – improve 1% in mAP

作者将底层的26×26×512的特征图和64 1×1的卷积层进行融合通过PassThrough Layer转变 为13×13×256。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FeekUQpT-1611736648109)(picture/yolo2network.png)]

  • PassThrough Layer:将底层特征向高层融合。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhoMrM3Z-1611736648115)(picture/passthrough.png)]

  • 作者将底层信息向高层信息融合后,YOLO模型有1% mAP的提升。
Multi-scale training(多尺度训练)

为了提升YOLO的鲁棒性,作者在训练过程中,作者每迭代10个batch,会对网络的输入尺寸进行一个随机的尺寸进行选择(全部都是32的整数倍),以此来达到速度和精度的一个平衡。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nP0aPuPU-1611736648118)(picture/multiscale.png)]

YOLOv2中的各种尝试 – Faster

  • 架构(BackBone):采用Darknet-19,19个卷积层和5个最大池化层。
  • 分类器的训练(Training for classification):做了一些标准的图像增广技巧。
  • 检测器的训练(Training for detection):移除了最后一个卷积层,增加了三个3×3的卷积层和一个1024的滤波器和一个passthrough层。

YOLOv2中的各种尝试 – Stronger

  • 层次分类

  • 数据集与wordTree结合

  • 分类器与检测器结合

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RaLelOCk-1611736648129)(picture/wordtree.png)]

总结

​ 建立在YOLOv1的基础上,经过Joseph Redmon等的改进,YOLOv2和YOLO9000算法在2017年CVPR上被提出,重点解决YOLOv1召回率和定位精度方面的误差。在提出时,YOLOv2在多种监测数据集中都要快过其他检测系统,并可以在速度与精确度上进行权衡。

    文章提出了一种新的训练方法–联合训练算法。这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用监测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升鲁棒性。YOLO9000 就是使用联合训练算法训练出来的,他拥有 9000 类的分类信息,这些分类信息学习自ImageNet分类数据集,而物体位置检测则学习自 COCO 检测数据集。

    YOLOV2着重改善 recall,提升定位的准确度,同时保持分类的准确度。

YOLOv3 -An Incremental Improvement(做大做强,再创辉煌)

Darknet-53 模型结构

在这里插入图片描述

这个网络主要是由一系列的1x1和3x3的卷积层组成(每个卷积层后都会跟一个BN层和一个LeakyReLU)层,作者说因为网络中有53个convolutional layers,所以叫做Darknet-53(2 + 12 + 1 + 22 + 1 + 82 + 1 + 82 + 1 + 4*2 + 1 = 53 按照顺序数,最后的Connected是全连接层也算卷积层,一共53个)。上图就是Darknet-53的结构图,在右侧标注了一些信息方便理解。(卷积的strides默认为(1,1),padding默认为same,当strides为(2,2)时padding为vali。

看完上图应该就能自己搭建出Darknet-53的网络结构了,上图是以输入图像256 x 256进行预训练来进行介绍的,常用的尺寸是416 x 416,都是32的倍数。下面我们再来分析下YOLOv3的特征提取器,看看究竟是在哪几层Features上做的预测。

YOLOv3模型结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9q7YFSOK-1611736648149)(picture/yolo3model.png)]

​ 作者在论文中提到利用三个特征层进行边框的预测,具体在哪三层我感觉作者在论文中表述的并不清楚(例如文中有“添加几个卷积层”这样的表述),同样根据代码我将这部分更加详细的分析展示在上图中。

注意:原Darknet53中的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256,上图是以YOLO v3 416模型进行绘制的,所以输入的尺寸是416x416,预测的三个特征层大小分别是52,26,13。

在上图中我们能够很清晰的看到三个预测层分别来自的什么地方,以及Concatenate层与哪个层进行拼接。**注意Convolutional是指Conv2d+BN+LeakyReLU,和Darknet53图中的一样,而生成预测结果的最后三层都只是Conv2d。**通过上图我们就能更加容易地搭建出YOLOv3的网络框架了。

注:这里作者在YOLO3的模型中把池化层换成了卷积层来做上采样层。

目标边界框的预测

YOLOv3网络在三个特征图中分别通过(4+1+c)×k个大小为1×1的卷积核进行卷积预测,k为预设边界框(bounding box prior)的个数(k默认取3),c为预测目标的类别数,其中4k个参数负责预测目标边界框的偏移量,k个参数负责预测目标边界框内包含目标的概率,ck个参数负责预测这k个预设边界框对应c个目标类别的概率。下图展示了目标边界框的预测过程(该图是本人重新绘制的,与论文中的示意图有些不同,个人感觉自己绘制的更便于理解)。图中虚线矩形框为预设边界框,实线矩形框为通过网络预测的偏移量计算得到的预测边界框。其中sigmoid函数其目的是将预测偏移量缩放到0到1之间(这样能够将预设边界框的中心坐标固定在一个cell当中,作者说这样能够加快网络收敛)。这里跟yolov2是一样的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fK4JFFg-1611736648153)(picture/yolo3bbox.png)]

下图给出了三个预测层的特征图大小以及每个特征图上预设边界框的尺寸(这些预设边界框尺寸都是作者根据COCO数据集聚类得到的):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BDyVpXAj-1611736648156)(picture/yolo3kmeans.png)]

损失函数的计算

关于YOLOv3的损失函数文章中写的很粗略,比如坐标损失采用的是误差的平方和,类别损失采用的是二值交叉熵,本人在github上也找了很多YOLO v3的公开代码,有的采用的是YOLOv1或者YOLOv2的损失函数,下面给出本人认为正确的损失函数。YOLOv3的损失函数主要分为三个部分:目标定位偏移量损失+目标置信度损失+目标分类损失。

λ 1 和 λ 2 和 λ 3 \lambda_1和\lambda_2和\lambda_3 λ1λ2λ3是平衡系数)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJMndOxx-1611736648160)(picture/yolo3confi.png)]

目标置信度损失

目标置信度可以理解为预测目标矩形框内存在目标的概率,目标置信度损失采用的是二值交叉熵损失(Binary Cross Entropy), o i = 0 o r 1 o_i={0 or 1} oi=0or1表示预测目标边界框i中是否真实存在目标,0表示不存在,1表示存在。表示预测目标矩形框$$i内是否存在目标的Sigmoid概率(将预测值通过sigmoid函数得到)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s8LXn7HS-1611736648163)(picture/yolo3class.png)]

目标类别损失

目标类别损失同样采用的是二值交叉熵损失(采用二值交叉熵损失的原因是,作者认为同一目标可同时归为多类,比如猫可归为猫类以及动物类,这样能够应对更加复杂的场景。但在本人实践过程中发现使用原始的多类别交叉熵损失函数效果会更好一点,原因是本人针对识别的目标都是固定归于哪一类的,并没有可同时归于多类的情况)。 o i = 0 o r 1 o_i={0 or 1} oi=0or1表示预测目标边界框 i i i中是否真实存在目标,0表示不存在,1表示存在。
在这里插入图片描述

目标定位损失

目标定位损失采用的是真实偏差值与预测偏差值差的平方和,其中 i i i表示预测矩形框坐标偏移量(注意网络预测的是偏移量,不是直接预测坐标), g g g表示与之匹配的GTbox与默认框之间的坐标偏移量。这些参数都是映射在预测特征图上的。

b x , b y , b w , b h b^x,b^y,b^w,b^h bx,by,bw,bh)是预测的目标矩形框参数,( c x , c y , p w , p h c^x,c^y,p^w,p^h cx,cy,pw,ph)是默认矩形框参数,( g x , g y , g w , g h g^x,g^y,g^w,g^h gx,gy,gw,gh)是与之匹配的真实目标矩形框参数,这些参数都是映射在预测特征图上的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdtAciMj-1611736648166)(picture/yolo3locloss.png)]

总结

YOLOv3中保留v1和v2的东西:
  • 分而治之:从yolo_v1开始,yolo算法就是通过划分单元格来做检测,只是划分的数量不一样。

  • 采用Leaky ReLU作为激活函数。

  • 端到端进行训练。一个loss function搞定训练,只需关注输入端和输出端。

  • 从yolo_v2开始,yolo就用batch normalization作为正则化、加速收敛和避免过拟合的方法,把BN(Batch Normalization)层和leaky relu层接到每一层卷积层之后。

  • 多尺度训练。在速度和准确率之间的平衡(tradeoff)。想速度快点,可以牺牲准确率;想准确率高点儿,可以牺牲一点速度。

Yolo每一代的提升很大一部分决定于backbone网络的提升,从v2的darknet-19到v3的darknet-53。yolo_v3还提供替换backbone——tiny darknet。要想性能好,backbone可以用Darknet-53,要想轻量高速,可以用tiny-darknet。总之,yolo就是天生“灵活”,所以特别适合作为工程算法。

YOLOv3在YOLOv2基础上进行了一些改进
  • 用logistic regression对方框置信度进行回归,对先验与实际方框IOU大于0.5的作为正例,与SSD不同的是,若有多个先验满足目标,只取一个IOU最大的先验。
  • 对每个类别独立地使用logistic regression,用二分类交叉熵损失作为类别损失,可以很好地处理多标签任务。
  • 利用多个scale进行预测,实际使用3个不同的scale。将前两层的feature-map进行上采样,与开始的feature-map进行concat起来,加一些卷积层,然后进行预测。
  • 更好的基础分类网络(darknet-53, 类似于ResNet引入残差结构)。

Darknet-53和Resnet-152正确率相同,但速度是2倍。

比较
  • 在IOU=0.5这个标准下,YOLO-v3非常强;能够预测出小物体。
  • YOLOv3-320, map-50为51.5%,时间是22ms。
  • RetinaNet-50-500,map-50为50.9,时间是73ms。
作者尝试过的一些方法
  • 使用线性激活函数回归x,y偏移,相对于方框长和宽的比例(YOLOv3中采用的是相对于方格的比例);这种方法降低了模型稳定性,并且效果不好;
  • 使用线性激活函数直接预测x,y偏移,而不是logistic regression,导致mAP下降;
  • 使用Focal Loss,mAP下降了2个点;
  • 用两个阈值,IOU在0.3-0.7之间的忽略,小于0.3的作为负例。
思考

后续的YOLOv3-spp和YOLOv4和YOLOv5其实都是沿用YOLOv3的框架,只是加了各自的工业上提升检测速度和精度的方法,如YOLOv4把IoU更换为GIoU、DIoU和CIoU加快了训练和检测速度等tricks。

YOLOv4

摘要

随着深度学习的发展,目前已经出现了很多算法(或者训练技巧,tricks)来提升神经网络的准确率。在实际测试中评价一个算法的好坏优劣主要看两点,一是能否在大规模的数据集中起作用(work),二是是否有理论依据。一些算法仅能在某些特定的模型上或者某类特定的问题上运行,亦或是适用于一些小规模的数据集。然而,还有一些算法,例如batch normalization(BN)或者残差连接(residual-connections)已经被用在了不同的模型,任务以及不同的数据集中,已经被充分的证明了这些算法的普适性,是一个general的算法。我们假设这样的general(or universal)的算法包括Weighted-residual-connection(WRC),cross-stage-partial-connections(SCP),cross mini-batch Normalization(CmBN),self-adversarial-training(SAT)以及mish-activation。此外,我们还加了一些其余的tricks,包括Mosaic data augmentation,DropBlock regularization,CIoU loss,设计了一个YOLO-V4,并且在MS coco数据集中取得了新的state-of-the-art的结果:在Tesla V100显卡能达到43.5% AP(65.7% AP)的精度,且达到~65FPS的速度。目前代码已经开源。

创新

Yolo-V4的主要目的在于设计一个能够应用于实际工作环境中的快速目标检测系统,且能够被并行优化,并没有很刻意的去追求理论上的低计算量(BFLOP)。同时,Yolo-V4的作者希望算法能够很轻易的被训练,也就是说拥有一块常规了GTX-2080ti或者Titan-XP GPU就能够训练Yolo-V4, 同时能够得到一个较好的结果。主要贡献可以总结为以下几点:

  • 研究设计了一个简单且高效的目标检测算法,该算法降低了训练门槛,使得普通人员在拥有一块1080TI或者2080TI的情况下就能够训练一个super fast and accurate 的目标检测器。
  • 在训练过程中,验证了最新的Bag-of-Freebies和Bag-of-Specials对Yolo-V4的影响
  • 简化以及优化了一些最新提出的算法,包括(CBN,PAN,SAM),从而使Yolo-V4能够在一块GPU上就可以训练起来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCr08pGC-1611736648168)(picture/yolo4model.png)]

  • 对于GPU,作者在卷积层中使用:CSPResNeXt50 / CSPDarknet53.
  • 对于VPU,作者使用分组卷积,但避免使用(SE)块-具体来说,它包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3.

作者的目标是在输入网络分辨率,卷积层数,参数数量和层输出(filters)的数量之间找到最佳平衡。

YOLOv4框架

  • Backbone:CSPDarknet53
  • Neck:SPP,PAN
  • Head:YOLOv3

YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3

其中YOLOv4用到相当多的技巧:

  • 用于backbone的BoF:CutMix和Mosaic数据增强,DropBlock正则化,Class label smoothing
  • 用于backbone的BoS:Mish激活函数,CSP,MiWRC
  • 用于检测器的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,Self-Adversarial 训练,消除网格敏感性,对单个ground-truth使用多个anchor,Cosine annealing scheduler,最佳超参数,Random training shapes
  • Bag of Specials检测器网络改进技巧:Mish激活函数,SPP模块,SAM模块,路径聚合模块(PAN), DIoU-NMS 。

YOLOv4实验调参方法

论文做了大量的实验,因为包含的Tticks太多了。论文验证了大量的BoF,包括grid sensitivity elimination, mosaic data augmentation, IoU threshold, genetic algorithm,class label smoothing, cross mini-batch normalization, self adversarial training, cosine annealing scheduler, dynamic mini-batch size, DropBlock, Optimized Anchors, different kind of IoU losses。我们还对各种BoS验证,包括Mish、SPP、SAM、RFB、BiFPN、BiFPN和Gaussian YOLO。对于所有的实验,只使用一个GPU训练。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3hbm9dcF-1611736648174)(picture/yolov4parameter.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSdkb3wX-1611736648176)(picture/yolov4parameter2.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9HHLaoc-1611736648179)(picture/yolov4parameter3.png)]

效果

YOLOv4 算法在实时目标检测算法中精度最高,实现了精度和速度的最佳平衡。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M3GhEqTv-1611736648181)(picture/yolo4result.png)]

个人总结

论文包含了大量的知识点,需要看很多论文才能知道很多Tricks是什么,因此也可以作为综述类的论文来看。Bag of freebies和Bag of specials对工业界或者打比赛也是十分有帮助的。YOLOv4意义不仅仅是一篇论文,更重要的是能在落地应用基础上提高了性能。

YOLOv4模型 = CSPDarkNet53 + SPP + PANet(path-aggregation neck) + YOLOv3-head

YOLOv4使用这些新的技巧:WRC、CSP、CmBN、SAT,Mish-activation,Mosaic data augmentation、CmBN、DropBlock正则化和CIoU损失,以及组合技巧,以达到最好的效果。在MS COCO数据集中的AP43.5%(65.7% AP50),在实际应用中,Tesla V100上速度可达到65FPS。

YOLOv4网络结构图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HPnCXBjD-1611736648183)(picture/yolo4network.png)]

所以说,Yolov4大部分框架还是采用的v3的结构,需要把v3给吃透,v4提到的一些tricks可以尝试地加到自己的网络中,如马赛克增强图像增广和Loss训练的改进等。

YOLOv5

YOLOv5与YOLOv3的主要不同点

  • 输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放-------推理速度得到了**37%**的提升。
  • BackBone:Focus结构,CSP结构
  • Neck:FPN+PAN结构--------加强网络特征融合的能力
  • Prediction:GIOU_Loss加权NMS

Yolov5的作者并没有发表论文,因此只能从代码角度进行分析。
Yolov5代码:https://github.com/ultralytics/yolov5

小目标分割检测缺点

目标检测发展很快,但对于小目标的检测还是有一定的瓶颈,特别是大分辨率图像小目标检测。比如7920×2160,甚至16000×16000像素的图像。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CImDAklZ-1611736648185)(picture/yaogan.png)]

图像的分辨率很大,但又有很多小的目标需要检测。但是如果直接输入检测网络,比如Yolov3检出效果并不好

主要原因是:

(1)小目标尺寸: 以网络的输入608×608为例,Yolov3Yolov4Yolov5中下采样都使用了5次,因此最后的特征图大小是19×1938×3876×76。三个特征图中,最大的76×76负责检测小目标,而对应到608×608上,每格特征图的感受野608/76=8×8大小。再将608×608对应到7680×2160上,以最长边7680为例,7680/608×8=101。即如果原始图像中目标的宽或高小于101像素,网络很难学习到目标的特征信息。
(PS:这里忽略多尺度训练的因素及增加网络检测分支的情况)

(2)高分辨率: 而在很多遥感图像中,长宽比的分辨率比7680×2160更大,比如上面的16000×16000。如果采用直接输入原图的方式,很多小目标都无法检测出。

(3)显卡爆炸:很多图像分辨率很大,如果简单的进行下采样,下采样的倍数太大,容易丢失数据信息。但是倍数太小,网络前向传播需要在内存中保存大量的特征图,极大耗尽GPU资源,很容易发生显卡爆炸显存爆炸,无法正常的训练及推理。

优点

  • YOLOv5速度比前代更快,在运行Tesla P100的YOLOv5 Colab笔记本中,每个图像的推理时间快至0.007秒,意味着每秒140帧(FPS)!
  • YOLOv5体积小,YOLOv5 s的权重文件为27MB。YOLOv4(Darknet架构)的权重文件为244MB。YOLOv5比YOLOv4小近90%。这意味着YOLOv5可以更轻松地部署到嵌入式设备。
  • YOLOv5是在PyTorch中实现的,所以它受益于已建立的PyTorch生态系统;YOLOv5还可以轻松地编译为ONNX和CoreML,因此这也使得部署到移动设备的过程更加简单。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaIs6nMX-1611736648187)(picture/yolov5.png)]

总结

YOLOv1-v3是YOLO系列的精华之作,后续的YOLOv3-SPP、YOLOv4和YOLOv5都是针对V3版本进行修改、增加的一些工程上的Tricks,从而提高YOLO的推理速度。YOLOv1解决了传统的目标检测速度慢等问题,将检测问题转变成回归问题;YOLOv2解决了v1中准确率的问题,能够提升多目标检测的精度,进一步提升了检测速度;YOLOv3进一步提升了v2中的速度和准确率,增加多尺度训练,灵活处理输入图片,提升了小目标检测的精度,改善了Loss训练的效率;YOLOv4解决了GPU训练的问题,只需要单片GPU1080Ti就可以开始你的模型训练了;Pytorch版本YOLOv5的发布解决了YOLO体积大的问题,可以在移动边缘端部署YOLO。

参考文献

[1] Redmon, Joseph, et al. “You only look once: Unified, real-time object detection.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

[2] Redmon J, Farhadi A. YOLO9000: better, faster, stronger[J]. arXiv preprint, 2017.

[3] Redmon, Joseph, and Ali Farhadi. “Yolov3: An incremental improvement.” arXiv preprint arXiv:1804.02767 (2018).

[4] AlexeyAB. YOLOv4: Optimal Speed and Accuracy of Object Detection. arxiv:https://arxiv.org/abs/2004.10934

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Metroplitan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值