目标检测算法通常分为两类,包括one stage和two stage它们两者的区别在于two stage算法需要先生成一个有可能包含待检物体的预选框,然后再在这些预选框进行分类和回归;而one stage算法会直接在网络中提取特征来预测物体分类和位置。
以往的物体检测方法R-CNN、Fast R-CNN 等通常将检测问题转变为分类问题,而YOLO将检测变为一个回归问题,并且它的训练和检测均是在一个单独网络中进行,输入一张图像,经过网络直接输出预测框和类别,可以直接进行端到端的优化。而R-CNN、Fast R-CNN 等就是one stage算法,YOLO是two stage算法。
[1506.02640] You Only Look Once: Unified, Real-Time Object Detection (arxiv.org)
对于目标检测来说,我们需要人工对图片中的目标使用矩形框进行标注并指明类别,得到训练集。
输入图像划分成S × S个网格,每个网格会给出B个边界框(bouding box)。如果目标的中心点落入了某个网格中,则由这个网格来负责预测这个目标。训练时只选择与ground truth(真实框)的IOU最大的那个边界框来负责预测该目标,
其中每个边界框包含5个预测值:x,y,w,h,confidence,(x,y)代表预测边界框的中心点坐标,w,h是边界框的宽度和高度,confidence是预测边界框和真实边界框的IOU。
confidence反映了网络模型对该边界框是否含有目标的信心,以及边界框位置预测的准确度。定义为如下公式
其中 Pr(Object)代表若网格中存在目标为1,不存在为0。如果网格中不包含目标则Pr(Object) = 0因此confidence也为0,包含物体Pr(Object) = 1那么confidence就等于预测边界框和真实边界框的IOU(交并比)。IOU越大代表预测框和真实框。
对于每一个需要目标检测的类别都有一个概率,每个网格预测C个条件类别概率, Pr(Class i |Object)是一个bounding box在含有物体的条件下属于某个类别的概率,每个网格只预测一组条件类别概率,B个边界框共用这个概率。
这些信息包含在一个含S×S×(B×5+C)的张量中,C为类别个数。YOLOv1在PASCAL VOC数据集上进行评估,于是设置S=7,B=2,C=20。YOLO通过卷积神经网络得到这个张量。
输入448×448×3的图像。经过24层卷积层,同样和ResNet的bottleneck一样,使用1×1卷积降维和升维。经过两个全连接层输出1470,然后Reshape得到7×7×30的特征图。每个网格包含30个信息。
损失函数由多个部分组成,都是均方误差的形式,所以YOLO将目标检测问题变成了回归问题
λnoobj = 0.5即调低不存在目标对象的bounding box的置信度误差的权重,让有目标对象的bouding box的置信度损失占比更大
此外,x,y,w,h还需要进行归一化
经过上述公式得到的normalization的(x, y, w, h),再加之前提到的confidence,才共同组成了一个真正在网络中用于回归的bounding box;而当网络在Test阶段(x, y, w, h)经过反向解码又可得到目标在图像坐标系的框。
输入图片进入网络后,7×7×30的特征图。包含98个boudingbox的位置信息和每个网格条件类概率(包含物体的条件下是某个类别的概率)
物体的概率即置信度和条件类概率(包含物体的条件下是某个类别的概率)相乘就可以得到该边界框20个类别的得分值。
可以得到下面这个图,每个网格2个边界框,每个边界框有20个类的得分值。然后我们需要剔除得分值低的,剔除重复框
1.接下来对于每一个类别,设置一个阈值,过滤掉得分值太低的,直接置0。然后按照从大到小排序。
2.然后需要经过NMS非极大值抑制。例如下面最高为0.5,将每一个除了之外的都与最高的进行比较,设置一个阈值,如果他们IOU超过这个阈值,就认为重复识别了一个目标,那么就将低得分值的过滤掉置0
3.接着不断重复这个步骤,到得分值次高的,bb20已经被置0了,直接到bb15
这里示例只是对于狗这个类别。对于每一个类别都进行如上操作1.2.3。最后将不为0的框都画出来,得到最后结果。
优点:
1. 检测速度快,因为它是one-stage的,直接将检测视作回归问题;
2. YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。
3. YOLO可以学到物体的泛化特征。当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。
缺点:
1. 虽然每个格子可以预测B个bounding box,但是这B个bbox的预测输出只能是一个类的。这种空间约束限制了我们的模型可以预测附近目标的数量,即对成群的小目标预测有问题;
2. 多个不同类的目标中心落在同一个网格时,我们一个网格内的bbox输出类别唯一,检测出现问题;
3. 模型采用了多个下采样层,导致模型学到的特征并不精细,也会影响检测结果;
4. 相比于其他先进的目标检测系统,它的精度稍低;召回率低;
5. YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
[1612.08242] YOLO9000: Better, Faster, Stronger (arxiv.org)
YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。YOLOv2的改进策略如图2所示,可以看出,大部分的改进方法都可以比较显著提升模型的mAP。下面详细介绍各个改进策略。
Batch Normalization可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。使用Batch Normalization后,YOLOv2的mAP提升了2.4%。
基于ImageNet分类模型基本采用大小为 224×224 的图片作为输入,分辨率相对较低,不利于检测模型。所以YOLOv1在采用 224×224 分类模型预训练后,将分辨率增加至 448×448 ,并使用这个高分辨率在检测数据集上finetune(微调)。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。
所以YOLOv2增加了在ImageNet数据集上直接说使用 448×448 输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提升了约4%。
在YOLOv1中,输入图片会被划分为 7×7 网格,每个单元格预测2个边界框。而实际中由于各个图片中存在不同尺度和长宽比的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。
YOLO一代包含有全连接层,从而能直接预测Bounding Boxes的坐标值。 Faster R-CNN的方法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。
此外,YOLOv2不是采用 448×448 图片作为输入,而是采用 416×416 大小。因为YOLOv2模型下采样的总步长为 32 ,对于 416×416 大小的图片,最终得到的特征图大小为 13×13 ,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。
YOLOv1两个bouding box共享一套类别概率,YOLOv2使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值,
和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个先验框所对应的边界框负责预测它,具体是哪个边界框预测它,需要在训练中确定,即由那个与ground truth的IOU最大的边界框预测它,而剩余的4个边界框不与该ground truth匹配。
使用Anchor Box会让精确度稍微下降,但用了它能让YOLO能预测出大于一千个框,同时recall大大提升达到88%,mAP达到69.2%。
在Faster R-CNN和SSD中,先验框的长和宽都是手动设定的,带有一定的主观性(下图15)。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误(下图SSE),因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标
上图为在VOC和COCO数据集上的聚类分析结果,随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框,其相对于图片的大小如上右图所示。
预测的边界框的实际中心位置(x,y)根据下面公式来计算,
,
为预测的坐标偏移值;
,
为先验框的宽高,
和
为先验框的中心位置。
但是上面的公式是无约束的,预测的边界框很容易向任何方向偏移,如当 tx=1 时边界框将向右偏移先验框的一个宽度大小,而当 tx=−1 时边界框将向左偏移先验框的一个宽度大小,因此每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的偏移量。
Yolov2中将边框的结果的中心点约束在当前的网格中而不会飞到别的网格,预测边界框中心点相对于对应cell左上角位置的相对偏移值,要先将网格大小归一化,即令一个网格的宽=1,高=1,并使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内。可以按如下公式计算出边界框实际位置和大小:
为当前网格对于图像左上角的偏移量,
为当前网格对于图像左上角的偏移量,
,
是先验框的宽和高。
最终预测边框的蓝色中心点被约束在蓝色背景的网格内
约束了边界框的位置预测值使得模型更容易稳定训练,结合聚类分析得到先验框与这种预测方法,YOLOv2的mAP值提升了约5%。
预测框在原图的还原:
假设网络预测值为:
anchor框为:
假设当前网格距离左上角的偏移量为
则目标在特征图中的位置:
在原图像中的位置:
*32是因为经过了5次降采样
YOLOv2采用了一个新的特征提取网络Darknet-19,包括19个卷积层和5个maxpooling层,如图4所示。主要采用 3×3 卷积,采用 2×2 的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。Darknet-19最终采用global avgpooling做预测,并且在 3×3 卷积之间使用 1×1 卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。
YOLOv2的输入图片大小为 416×416 ,经过5次maxpooling之后得到 13×13 大小的特征图,并以此特征图采用卷积做预测。 13×13 大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。
YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是 26×26 大小的特征图(最后一个maxpooling层的输入)。以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。于 26×26×512 的特征图,经passthrough层处理之后就变成了 13×13×2048 的新特征图,与后面的 13×13×1024 特征图连接在一起形成 13×13×3072 大小的特征图
使用Fine-Grained Features之后YOLOv2的性能有1%的提升。
作者希望YOLO v2能健壮的运行于不同尺寸的图片之上,所以把这一想法用于训练model中。
区别于之前的补全图片的尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小320*320,最大608*608,网络会自动改变尺寸,并继续训练的过程。
这一策略让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高。
YOLOv2的训练主要包括三个阶段。
第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为 224×224 ,共训练160个epochs。
然后第二阶段将网络的输入调整为 448×448 ,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。
第三个阶段就是修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。网络修改包括:移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3×3×2014卷积层,同时增加了一个passthrough层,最后使用 1×1 卷积层输出预测结果。
在YOLO-V2的整个技术架构中中,还提出了一个联合训练分类和检测数据的机制,以大幅提升其支持的检测目标种类,该目标检测模型称为YOLO-9000。
ImageNet这样的分类任务数据集往往拥有类别众多且图像数量庞大的标注数据,但是缺少目标的位置信息,而目标检测数据集提供精确的目标位置信息,但是图像数量相对分类任务数据集要少很多,目标类别也很少。YOLO-9000的联合训练机制旨在综合两种数据集的优势——使用目标检测数据集的数据去训练检测相关的能力,例如包围框的位置信息、以及每个包围框中是否包含特定目标及其属于各类目标的概率,而使用仅有类别标签的分类任务数据集来扩展可检测的目标种类。YOLO-9000在具体实现过程中,包括层级分类(hierarchical classification)模型构造与分类与检测模型联合训练两方面内容。
YOLO9000效果其实并不好,这里不详细介绍。
[1804.02767] YOLOv3: An Incremental Improvement (arxiv.org)
新的用于特征提取的骨干网络backbone为Darknet-53
Backbone部分由Yolov2时期的Darknet-19进化至Darknet-53,加深了网络层数,引入了Resnet中的残差连接。虽然速度有所下降,但提高了准确率与运算速度,比同精度的ResNet还快很多
上图三个蓝色方框内表示Yolov3的三个基本组件:
其他基础操作:
网络结构解析:
3.Yolov3总共输出3个特征图,第一个特征图下采样32倍,第二个特征图下采样16倍,第三个下采样8倍。输入图像经过Darknet-53(无全连接层)再经过3*3卷积层、1*1卷积之后生成特征图一,特征图一经过1*1卷积层加上采样层,与Darnet-53网络的中间层输出结果进行拼接,产生特征图二。同样的操作产生特征图三。以416输入为例,三个特征图一共可以产生(13×13×3)+(26×26×3)+(52×52×3)= 10647个预测框,比起v1和v2大大提升了小目标和密集目标的检测性能
4.上采样层(upsample):作用是将小尺寸特征图通过插值等方法,生成大尺寸图像。上采样层不改变特征图的通道数。
Yolov3精度与SSD相比略有小优,与Faster R-CNN相比略有逊色,几乎持平,比RetinaNet差。但是速度是SSD、RetinaNet、Faster R-CNN至少2倍以上。
[2004.10934] YOLOv4: Optimal Speed and Accuracy of Object Detection (arxiv.org)
在 YOLO 系列的原作者 Joseph Redmon 宣布退出 CV 领域后,表明其不会再更新YOLO系列。但AlexeyAB 继承了 YOLO 系列的思想和理念,在 YOLOv3 的基础上不断进行改进发布了 YOLOv4,并得到了原作者 Joseph Redmon 的承认。
YOLOv4 可以使用传统的单GPU 进行训练和测试,并能够获得实时的,高精度的检测结果。与当时其他最先进的目标检测器的比较的结果如图所示,YOLOv4 在与 EfficientDet 性能相当的情况下,推理速度比其快两倍。相比 YOLOv3 的 AP 和 FPS 分别提高了 10% 和 12%。
整体而言,YOLOv4几乎没有像前几代YOLO一样提出一些创新性的东西,而是大量列举了近几年以来关于目标检测的一些最新技术和成果,并对这些方法进行了大量的试验来从而达到更好的效果。
只增加训练成本,但是能显著提高精度,并不影响推理速度
将四张训练图通过随机缩放、随机裁减、随机排布的方式拼接成一张进行训练
进行Mosaic数据增强的优点
其主要目标是通过改变输入图像,使得网络难以识别,从而迫使网络提高泛化性能
DropBlock是适用于卷积层的正则化方法,它作用的对象的特征图。在DropBlock中,特征在一个个block中,当应用DropBlock时,一个feature map中的连续区域会一起被drop掉。那么模型为了拟合数据网络就不得不往别出看以寻找新的证据。
其中(a)是输入到卷积网络的原始图像,(b)和©中的绿色区域包括激活单元,这些激活单元在输入图像中包含语义信息。随机丢弃激活对删除语义信息无效,因为附近的激活包含紧密相关的信息。 相反,删除连续区域可以删除某些语义信息(例如,头或脚),从而强制其余单元学习用于分类输入图像的其它特征,这样就增加了模型的泛化能力。
原因:对预测有100%的信心可能表明模型是在记忆数据,而不是在学习。如果训练样本中会出现少量的错误样本,而模型过于相信训练样本,在训练过程中调整参数极力去逼近样本,这就导致了这些错误样本的负面影响变大。
具体做法:标签平滑调整预测的目标上限为一个较低的值,比如0.9。它将使用这个值而不是1.0来计算损失。这样就缓解了过度拟合。
YOLOV4用CIOU损失代替了YOLOv3的box位置损失,取代了预测框和真实框的中心点坐标以及宽高信息设定MSE损失函数,其他部分损失没改变
其中,ρ2(b,bgt)分别代表了预测框和真实框的中心点的欧式距离。c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。
我们知道,BN 是对当前 mini-batch 的数据进行归一化;CBN 是通过收集最近几次迭代iterations信息来更新当前迭代时刻的均值和方差;而 CmBN 是在整个 batch 中使用 Cross min-batch Normalization 进行归一化,而不是在单独的 mini-batch 中进行归一化,这只收集一个批次内mini-batches之间的数据
如果ground ture的中心点落在了grid cell的左上角或者右下角,那么就需要的值接近于0或者1,对于Sigmoid函数来说就相当于预测值需要接近负无穷或者负无穷,这种很极端的值网络很难做到,于是引入了一个大于1的缩放系数
通过引入这个系数,网络的预测值能够很容易达到0或者1,现在比较新的实现方法包括YOLOv5都将这个系数设置为2
下图为原Sigmoid函数和改进后的Sigmoid函数图像,并且偏移的范围由原来的( 0 , 1 )调整到了( − 0.5 , 1.5 )
1.8 多个Anchor对应一个ground ture
在YOLOv3中针对每一个GT都只分配了一个Anchor。但在YOLOv4中一个GT可以同时分配给多个Anchor,它们是直接使用Anchor模板与GT Boxes进行粗略匹配,然后在定位到对应cell的对应Anchor
之前正样本匹配过程。流程大致如下图所示:比如说针对某个预测特征层采用如下三种Anchor模板AT 1、AT 2、AT 3
但在YOLOv4中关于匹配正样本的方法又有些许不同。通过缩放后网络预测中心点的偏移范围已经从原来的( 0 , 1 )调整到了( − 0.5 , 1.5 ),某个Cell左上角点距离GT中心在( − 0.5 , 1.5 )范围内都满足条件。所以对于同一个GT Boxes可以分配给更多的Anchor,即正样本的数量更多了。如下图所示:
通过稍许增加推理成本,来提高目标检测精度的方法
在实际应用场景中,当两个不同物体挨得很近时,由于IOU值比较大,往往经过NMS处理后,只剩下一个检测框,这样导致漏检的错误情况发生。
基于此,DIOU-NMS就不仅仅考虑IOU,还考虑两个框中心点之间的距离。如果两个框之间IOU比较大,但是两个框的距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。 其公式如下:
得分最高的预测框M和其它框Bi的(IOU-DIOU)值比较小时,Bi的得分值Si仍然保持,否则,当(IOU-DIOU)大于NMS threshold值时,Si值就设成0了,即被过滤掉。
传统的非极大值抑制是将IOU超过阈值的候选框都删除掉,这种状态下如果遇到两个物体重叠出现,效果就大打折扣,Soft-NMS不直接剔除,而是降低置信度得分。
作者发现用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时精度要高一些。Backbone中采用了Mish激活函数,网络后面仍然采用Leaky_relu激活函数。
SPP 是空间金字塔池化网络,它采用并行最大池化的方式,将输入的特征图进行不同尺度的最大池化,再进行多尺度融合,这样可以提高感受野,分离出最显著的上下文特征,并且几乎没有降低网络运行速度。但更重要的作用是可以让任意大小的特征图都能够转换成固定大小的输出,那么,当 SPP 后面接入全连接层时,则可以输出固定大小的特征图给全连接层。
通过使用 SPP 模块,比单纯的使用 k x k 的最大池化,能更有效的加强特征提取,从而显著的分离了最重要的上下文特征。
具体步骤为将特征层分别通过一个池化核大小为5x5
、9x9
、13x13
的最大池化层,通过padding不改变输出尺寸,然后在通道方向进行将三个新特征图和原输入特征图进行在通道方向concat拼接
PAN
(Path Aggregation Network
)结构其实就是在YOLOV3使用的FPN
(从顶到底信息融合)基础上加上了从底到顶的信息融合
但YOLOv4
的PAN
结构和原始PAN
结构论文的融合方式又略有差异,如下图所示。图(a)是原始论文中的融合方式,即特征层之间融合时是直接通过相加的方式进行融合的,但在YOLOv4
中是通过在通道方向Concat
拼接的方式进行融合的,这和V3的FPN是一样的
SAM 模块是注意力模块,YOLOv4 将 SAM 的 spatial-wise 注意力改为 point-wise 。并且在SAM中没有使用 pooling ,而是直接用一个卷积进行代替,再使用 sigmoid 进行激活,然后对应点相乘,所以说改进后的模型是 point-wise attention。
从结构上来看,CSP模块是将输入通道分成两部分进行操作,一部分进行常规操作后跟另一部分进行通道拼接
使用了CSP模块后的Backnode如下图
YOLOv5项目的作者是Glenn Jocher,
YOLOv5在V4发布不久后便出来了,但这个项目至今都没有发表过正式的论文,只能从代码进行分析,YOLOv5变化并不大,总体和V4差不多,V5更偏重于工程实践,更便于我们使用。此外YOLOv5是YOLO 家族中首次使用 PyTorch 而不是 Darknet 编写模型的本地版本,Darknet版本的YOLO配置更加复杂,不适合生产环境。
ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLite (github.com)
在前面的版本中Anchors的大小是预先给出的(根据COCO数据集得到),YOLOV5将使用K-means计算数据集Anchors嵌入代码中,通过参数设置即可调用,这样一来Anchors的大小可以更加匹配自己的数据集
V5中使用的是SiLU激活函数
在SPP的基础上改进为SPPF,SPPF在输出相同的情况下速度更快
在YOLOv4中,Neck的PAN结构是没有引入CSP结构的,但在YOLOv5中作者在PAN结构中加入了CSP,详情见网络结构图
与之前不同的是在YOLOv5中给出了四种不同网络(n,s,m,l,x),变为多种可选配的网络,网络架构是一致的,深度和宽度逐渐增加,输入图像尺寸为640×640。此外还有输入图像尺寸为1280×1280的版本,后缀为s,当然结构上也有些差异,后者会下采样64倍,采用4个预测特征层,而前者只会下采样到32倍且采用3个预测特征层
yolov5l完整网络结构如下。和YOLOv4对比,YOLOv5在Backbone部分没太大变化
YOLOv5的损失主要由三个部分组成,基本还是没变:
这里是指针对三个预测特征层(P3, P4, P5)上的obj损失采用不同的权重。在源码中,针对预测小目标的预测特征层(P3)采用的权重是4.0,针对预测中等目标的预测特征层(P4)采用的权重是1.0,针对预测大目标的预测特征层(P5)采用的权重是0.4,作者说这是针对COCO数据集设置的超参数。
在YOLOv5中除了调整预测Anchor相对Grid网格左上角的计算之外,还调整了预测目标高宽的计算公式,之前是
在YOLOv5调整为:
作者的大致意思是,原来的计算公式并没有对预测目标宽高做限制,这样可能出现梯度爆炸,训练不稳定等问题
下图是修改前,和修改后
,(相对Anchor宽高的倍率因子)的变化曲线, 很明显调整后倍率因子被限制在( 0 , 4 ) 之间。
主要的区别在于GT Box与Anchor模板的匹配方式。在YOLOv4中是直接将每个GT Box与对应的Anchor模板计算IoU,只要IoU大于设定的阈值就算匹配成功。但在YOLOv5中,作者先去计算每个GT Box与对应的Anchor模板的高宽比例,即:
然后统计这些比例和它们倒数之间的最大值,这里可以理解成计算GT Box
和Anchor
分别在宽度以及高度方向的最大差异(当相等的时候比例为1,差异最小):
ultralytics/ultralytics: NEW - YOLOv8 in PyTorch > ONNX > OpenVINO > CoreML > TFLite (github.com)
YOLOv8和v5都是Ultralytics下的产品,v8是在v5的基础上吸收了YOLOX,v6,v7的一些优点改进的版本。对比v5精度提高不少,但推理速度也有所下降
在之前版本中YOLOv2~v5(注意YOLOv1不包括在内)都是基于Anchor进行预测的。即先在原图上生成一堆密密麻麻的Anchor Boxes,然后网络基于这些Anchor去预测它们的类别、中心点偏移量以及宽高缩放因子得到网络预测输出的目标,最后通过NMS即可得到最终预测目标。那基于Anchor的网络存在哪些问题
YOLOv8使用了Anchor Free,它的思想是跳出Anchor的限制,在预测特征图的每个位置上直接去预测该点分别距离目标左侧(l: left),上侧(t:top),右侧(r: right)以及下侧(b:bottom)的距离
Head 部分相比 YOLOv5 改动较大,换成了目前主流的解耦头结构
之前版本的检测头将类别和box位置信息等一并输出,yolov5检测头如下
v8使用的解耦头将分类和检测头分离
动态分配策略则可以根据训练的进展和样本的特点动态调整权重。在训练初期,模型可能会很难区分正负样本,因此应该更加关注那些容易被错分的样本。随着训练的进行,模型逐渐变得更加强大,可以更好地区分样本,因此应该逐渐减小困难样本的权重,同时增加易分样本的权重。动态分配策略可以根据训练损失或者其他指标来进行调整,可以更好地适应不同的数据集和模型。
典型的动态分配策略如YOLOX的simOTA、TOOD的Task-Aligned Assigner和RTMDet的DynamicSoftlLabelAssigner等。
YOLOv5采用的依然是静态分配策略,考虑到动态分配策略的优异性,Yolov8算法中直接引用了TOOD中的Task·Aligned Assigner正负样本分配策略。
Task-Aligned Assigner,顾名思义就是对齐分配器,即在训练过程中动态调整正负样本的分配比例。根据分类与回归的分数,作为加权分数,选择正样本。公式如下:
其中
s是标注类别对应的预测分值,u是预测框和GT Box的loU,两者相乘即可衡量对齐程度(Task-Alignment)。
a和β是权重超参数。,可以同时控制分类得分和I0U的优化来实现Task-Alignment,从而引导网络动态关注高质量的anchor。当类别分值越高且loU越高时,t的值就越接近于1。
具体执行步骤如下:
1.基于分类得分和预测框与GT的loU,加权得到一个关联分类以及回归的对齐分数alignment metrics.
2.计算anchor的中心点是否在当前GT框内,只有在当前GT内的anchor才能作为正样本。
3.满足2的前提下,基于alignment metrics选取topK大的作为正样本,其余作为负样本进行训练。
DFL(Distribution Focal Loss),其主要是将框的位置建模成一个 general distribution,能够让网络更快地聚焦于目标 y 附近的值,增大它们的概率;
DFL的含义是以交叉熵的形式去优化与标签y最接近的一左一右2个位置的概率,从而让网络更快的聚焦到目标位置的邻近区域的分布;也就是说学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。
YOLOv8将C3模块改进为C2f,输入通道数都变成一半,减少了计算量和参数量,另一半在最后进行融合。C2f让YOLOv8可以在保证轻量化的同时获得更加丰富的梯度流信息
对比v5总体架构改动过并不大