学习yolo系列,最重要的,最核心的就是网络模型、正负样本匹配、损失函数等三个方面。本篇汇总了yolov1-yolov5等5个版本的相关知识点,主要看点是在yolo框架搭建。初学者可以通过相关篇章搭建自己的知识点框架,然后再深入各个知识点,就像攻克一个又一个山头。当大部分的知识点都了然于胸,yolo系列就算掌握了。
免责申明:本篇的主要来源是B站视频,加上网上各种博客,由于参考较多,不能一一列出。非商用,侵权请联系我。
v1
关注点:
一、网络结构
- grid cell 核心思想
二、正负样本匹配规则
- bbox和gt的IOU
三、损失函数
- 定位损失
- 置信度损失
- 分类损失
网络结构
输入固定大小:448 * 448,为什么需要固定尺寸?
因为fc层。fc层卷积核肯定是固定的,要求前面的处理结果都是固定的。所以输入的尺寸不能改变。
核心思想
在YOLOv1中作者将一幅图片分成7x7个网格(grid cell),由网络的最后一层输出7×7×30的tensor,也就是说每个格子输出1×1×30的tensor。30里面包括了2个bounding box的x,y,w,h,confidence以及针对格子而言的20个类别概率,输出就是 7x7x(5x2 + 20)
通用公式: SxS个网格,每个网格要预测B个bounding box还要预测C个categories,输出就是S x S x (5×B+C)的一个tensor。 注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的
网络输出
网络的输出:S x S x (5 × B + C)
需要强调的是,这里的x,y,w,h都是归一化的坐标,并且x,y是相对于该bounding box所在的grid cell的左上角的偏移量。
对与w,h的归一化比较简单:w=框的宽度/图片总宽度,h=框的高度/图片总高度
因为x,y只是bounding box中心点的相对于所在grid cell左上角的偏移,具体而言如下图
这个x,y是绿色grid cell 左上角的偏移量,因为是归一化后的结果,所以x,y的值在(0,1)范围。
例如这个坐标为(0.4, 0.7),如果是在这个网格坐标系,那么红点在网格坐标系实际的坐标为(1.4,4.7),同样也可以将xywh放缩到image实际的大小,也就可以在image中画出这个红框了。
正负样本
一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bounding box)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好
损失函数
损失函数:
参与损失计算的bounding box
置信度计算
参与损失函数计算的置信度并不是直接用网络模型推理出来的置信度,其中还有一个转换
网络输出的7×7×30的张量内的值最初都是随意的,拿出一个30维张量为例:
参与损失函数计算的标签:
参与损失函数计算的置信度计算公式:
- 置信度分数:对于每个边界框,置信度分数是通过以下方式计算的:
负责预测该对象的P(object) = 1, 不负责预测该对象的P(object) = 0。
训练和推理时置信度计算的区别
在YOLOv1中,训练时和推理时对置信度的计算方式有一些不同的细节。以下是详细的解释:
训练时置信度计算
训练时,置信度分数用于衡量预测边界框的准确性和物体存在的可能性。置信度分数的计算包括两个部分:预测框和真实框之间的重叠程度(IoU),以及是否存在物体。
- 预测框置信度:
- 每个预测框输出一个置信度分数,表示预测框中有物体的置信度。这个置信度分数是在模型的输出层计算的,是模型学习到的一个值。
- 置信度损失计算:
- 置信度损失包括有物体时的置信度损失和无物体时的置信度损失。
- 有物体时的置信度损失:计算预测框和真实框之间的IoU,作为置信度分数的目标值。置信度损失是预测的置信度和目标置信度(IoU)的差异。
- 无物体时的置信度损失:对于没有物体的网格单元,置信度目标为0,损失是预测的置信度和0之间的差异。
- 总损失函数:
- 总损失函数是边界框坐标损失、类别损失和置信度损失的加权和。
- 通过最小化总损失,模型学习到准确的边界框和类别预测。
推理时置信度计算
推理时,置信度分数用于选择最终的边界框和类别。推理时的置信度计算方式如下:
预测框置信度 :
每个预测框输出一个置信度分数,表示预测框中有物体的置信度。这是模型直接输出的一个值,是在训练时学习到的。
类别置信度 :
每个网格单元输出类别概率。类别概率表示该网格单元包含特定类别物体的概率。
类特定置信度 :
类特定置信度是预测框置信度和类别概率的乘积。这个值表示边界框包含特定类别物体的置信度。
公式:类特定置信度 = 预测框置信度 × 类别概率
非极大值抑制(NMS) :
为了减少重叠框的数量,应用非极大值抑制。
保留置信度最高的边界框,抑制IoU高于一定阈值的重叠框。
最终输出 :
置信度高于某个阈值的边界框被保留,并作为最终的检测结果输出。
示例
假设一个网格单元预测以下值:
- 预测框置信度:0.8
- 类别概率(比如"狗"):0.9
在推理时,类特定置信度计算为:
- 类特定置信度 = 0.8 × 0.9 = 0.72
这个类特定置信度表示该边界框包含狗的置信度。如果这个置信度高于设定的阈值(例如0.5),并且通过了非极大值抑制步骤,那么这个边界框将被保留并输出为最终的检测结果。
总结
- 训练时,置信度基于预测框与真实框的IoU以及物体存在的可能性进行计算。
- 推理时,置信度基于预测框置信度和类别概率的乘积,用于筛选和输出最终的检测结果。
YOLOv1--从样本标签与训练输出角度分析_一个文件中的样本标签怎么一样啊-CSDN博客
推理和NMS
在模型推理时需要做bounding box筛选的工作,让最后的结果只保留每一个类别中最好的结果。分为两步走:
- 设置置信度阈值,小于阈值的bounding box得分置0
- 剩下的bounding box做NMS处理,得出最好的结果
对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)。
得到98bbox的信息后,首先对阈值小于0.2的score清零,然后重新排序,最后再用NMS算法去掉重复率较大的bounding box
v2
关注点:
一、网络结构
- anchor机制
- **Batch Normalization:数据归一化处理,**使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失
- High Resolution Classifier: 更高分辨率的分类器。将分类网络从224224变成448448
- **Convolutional With Anchor Boxes:**基于anchor的目标边界框预测。yolov1中直接预测目标边界框,yolov2使用预测目标相对边界框的位移。
- **Dimension Clusters:**自动生成边界框。基于训练集中图片尺寸生成合适的边界框。
- **Direct location prediction:**每个anchor去负责目标中心落在某个grid cell区域内的目标
- Fine-Grained Features: 融合高层特征和低层特征。在检查小目标时需要底层信息。融合1313 和 2626的特征。通过passthrough layer实现。
- 去掉了全连接层,改成了全卷积结构,可满足不同尺度的输入
二、正负样本匹配规则
三、损失函数
https://blog.51cto.com/u_11299290/4908318
[YOLO专题-5]:YOLO V2 - 网络结构、原理、改进的全新、全面、通俗、结构化讲解_yolov2网络结构-CSDN博客
网络结构
主干:Darknet-19
https://juejin.cn/post/7038239379877265444
【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)-CSDN博客
anchor机制
在YOLOv1中,输入图片最终被划分为 网格,每个单元格预测2个边界框。
YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。
作者借鉴了Faster RCNN的anchor机制,让网络输出的每个feature map点都生成若干anchor:
使用anchor boxes之后,YOLOv2的mAP有稍微下降(这里下降的原因,我猜想是YOLOv2虽然使用了anchor boxes,但是依然采用YOLOv1的训练方法)。YOLOv1只能预测98个边界框( ),而YOLOv2使用anchor boxes之后可以预测上千个边界框( )。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。
Batch Normalization
Batch Normalization是2015年一篇论文中提出的数据归一化方法,往往用在深度神经网络中激活层之前。其作用可以加快模型训练时的收敛速度,使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失。
为什么需要归一化?
神经网络在训练的时候随着网络层数的加深,激活函数的输入值的整体分布逐渐往激活函数的取值区间上下限靠近,从而导致在反向传播时浅层的神经网络的梯度消失。而batch normalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题
将激活函数处理过后的数值从边缘区域拉到中心区域
Nomalization通过规范化处理的函数,使得原先离散、发散的数据,根据的规范化和集中化,向中心点处集中
批归一化(Batch Normalization,简称BN)是一种在深度学习中常用的技术,特别是在训练卷积神经网络(CNN)和循环神经网络(RNN)时。批归一化通过规范化(归一化)层的输入来加速收敛速度,同时提供一定程度的正则化效果。以下是批归一化的优缺点:
优点:
- 加速收敛 :
批归一化可以显著加快模型的训练速度,因为它减少了训练过程中的内部协变量偏移(internal covariate shift)。 - 提高模型稳定性 :
由于归一化操作,模型对于初始化权重的敏感度降低,这使得模型训练更加稳定。 - 允许更高的学习率 :
批归一化减少了梯度消失或爆炸的风险,因此可以使用更高的学习率,进一步加速训练过程。 - 提供一定程度的正则化 :
批归一化层引入了噪声,这可以被视为一种正则化形式,有助于减少模型的过拟合。 - 缓解梯度问题 :
批归一化有助于缓解梯度消失或爆炸的问题,因为它确保了每层的输入数据都有稳定的分布。 - 允许网络更深 :
由于加速收敛和提高稳定性,批归一化使得训练更深的网络成为可能。
缺点:
- 计算复杂性 :
批归一化在每次前向传播时都需要计算均值和方差,这增加了计算负担。 - 内存使用 :
批归一化需要额外的内存来存储均值、方差、缩放因子和偏移量。 - 批大小敏感性 :
批归一化的统计数据是基于当前批的,因此批大小的选择对模型性能有影响。小批量大小可能导致训练过程中的不稳定性。 - 泛化能力 :
批归一化在训练和测试时的行为不同,因为在训练时使用的是批次统计数据,而在测试时使用的是移动平均统计数据。这可能导致模型在测试时性能下降。 - 不适合小批量 :
当批量大小较小时,批归一化可能无法有效地工作,因为它依赖于批次数据的统计特性。 - 可能引入过拟合 :
虽然批归一化提供了一定程度的正则化,但在某些情况下,它也可能引入过拟合,特别是当批量大小较大时。 - 对网络结构有要求 :
批归一化通常不适用于RNN的隐藏状态,因为隐藏状态的维度通常是序列长度,这使得批归一化难以应用。 - 实现复杂性 :
在某些情况下,如使用特定类型的层或自定义层时,正确实现批归一化可能会比较复杂。
总的来说,批归一化是一种强大的技术,可以显著提高深度学习模型的训练效率和性能。然而,它也带来了一些挑战,特别是在处理小批量大小、内存限制和特定类型的网络结构时。
BN的计算过程:
批归一化(Batch Normalization)的计算过程旨在对每个小批量数据进行归一化处理,使得网络的每一层输入数据的分布更加稳定。以下是批归一化的计算步骤:
更大的分辨率
更大的分辨率
在yolov1中使用了预训练模型。预训练模型是在数据集ImageNet上使用 224 * 224 分辨率来训练模型的backbone,即模型的特征提取能力。
但是这样存在一个问题,就是预训练模型的输入图片尺寸是224 * 224 ,而正式训练中使用的是448 * 448,会导致模型水土不服。
yolov2中为了解决这个问题,在yolov1预训练模型的基础上做finetune,增加了10个epoch的448 * 448 输入尺寸的训练,让模型习惯更大分辨率的输入。
- YOLOv1的预训练:
- YOLOv1是YOLO算法的第一版,它在设计时使用了224x224像素的图像作为网络输入。
- 在ImageNet数据集上进行预训练,意味着YOLOv1的backbone(即网络的基础部分,负责特征提取)首先在大量图像上进行训练,以学习图像的通用特征。
- ImageNet是一个大型的图像识别数据库,广泛用于计算机视觉领域的研究,特别是在深度学习模型的预训练阶段。
- YOLOv1的正式训练:
- 在预训练完成后,网络需要进行正式训练,也就是在目标检测任务上进行训练。
- 这个阶段的挑战在于,网络需要同时学习如何检测图像中的对象,并且适应更大的图像分辨率,可能会出现水土不服的情况。
- YOLOv2的改进:
- YOLOv2是YOLO算法的第二版,它在YOLOv1的基础上做了一些改进。
- 在YOLOv2中,作者使用了更大的分辨率448x448像素的图像来继续进行fine-tune(微调)。
- Fine-tune通常指的是在预训练模型的基础上,针对特定任务进行额外的训练,以提高模型的性能。
- YOLOv2在更大的分辨率上训练10个epoch,这意味着网络在10个完整的训练周期内不断调整权重,以适应更高的图像分辨率。
- 适应大分辨率的重要性:
- 目标检测任务中,更大的图像分辨率可以提供更多的细节信息,有助于更准确地识别对象。
- 通过在更大的分辨率上进行fine-tune,网络可以更好地学习如何处理高分辨率图像,从而提高检测的准确性。
总的来说,这段话强调了YOLO算法在不同版本中如何通过调整训练策略来适应不同分辨率的图像,并提高目标检测的性能。通过预训练和fine-tune,YOLO能够更好地提取特征并进行有效的目标检测。
网络结构变换
输入416 * 416 :得出特征图的尺寸为基数,416/32 = 13
5次降采样:将模型的输入尺寸除以32,h/32, w/32。特征图上一个点相当于原图的32个点
13 * 13 特征图:输出的尺寸为13 * 13,优化了小目标的检测
1 * 1 卷积:
- 降低通道数
- 升维或降维
深度学习笔记(六):1x1卷积核的作用归纳和实例分析_1x1卷积降维-CSDN博客
聚类提取先验框
使用聚类算法,获得5个anchor,先验框
偏移量计算方法
v2 中并没有预测相对anchor宽高的偏移量,而是**预测相对grid cell的偏移量。**原因是没有直接预测相对宽高的偏移量会导致预测值缺少约束,预测不稳定。
预测边界框中心点相对于对应cell左上角位置的相对偏移值。将网格归一化为1×1,坐标控制在每个网格内,同时配合sigmod函数将预测值转换到0~1之间的办法,做到每一个Anchor只负责检测周围正负一个单位以内的目标box。
使模型更容易稳定训练,mAP值提升了约5%。
模型位置预测:tx, ty, tw, th。这些值并不是真是的坐标值,而是相对值。具体来说:
- tx,ty 相对anchor所在grid cell 左上角位置的偏移值,取值范围在0-1之间
- tw, th 相对于anchor的宽高的偏移值
将模型预测偏移值还原到特征图的位置:
bx = sigmod(tx) + Cx
by = sigmod(ty) + Cy
sigmod用于将tx和ty映射到0-1之间,Cx是anchor所在grid cell的位置。
bw = Pw * e ** tw
bh = Ph * e ** th
感受野
感受野的作用:
感受野能够看到原始图像的特征,感受到原图上一块较大区域的信息
随着卷积操作的进行,卷积1能够识别图片浅层信息,卷积2能够识别轮廓信息,卷积3能够识别图片的全局信息。这个就是感受野的变化。
小卷积核的优点
多个小卷积核可以做到一个大卷积核的功能,同时需要的参数更小,感受野更丰富。
Fine-Grained Features 细粒度特征融合
在YOLOv1中,小目标的检测效果非常不好,一方面是与损失函数设计有关,模型loss将偏向大目标,会影响小目标的学习;另一方面与模型的coarse feature有关,网络一直在进行下采样,损失了非常多的细节信息。深度学习模型的学习到的浅层特征是物体的角点和边之类的细节信息,而学习到的深层特征是偏向抽象语义的,那么对于目标检测任务来说浅层特征和深层特征都是很重要的,定位任务需要细节信息才能框的准。因此,YOLOv2借鉴了RestNet的思想,融合了更精细化的特征。作者将2626 512的特征通过passthrough层转化为了1313 256维度的tensor,与原始粗粒度特征13131024进行融合,网络结构如下图所示:
其中的passthrough层就是特征矩阵隔一个拆出来一个的方式,这样能实现特征图大小减半,但是channel变成原来的4倍,如下图所示:
Multi-Scale Training 多尺度训练
因为yolov2取消了fc层,所以可以不受尺度大小限制。
多尺度训练是为了让网络能适应不同大小的图像,提升模型的泛化能力,通过多尺度训练,能让mAP提升1个百分点。
- 移除全连接层:这样网络就可以接收任意大小的图像,提升模型的鲁棒性。
- 多尺度:设置尺度[320, 352, 384, ..., 608],训练每隔10个epoch变换一次。
正负样本选择
- 对5个Anchor-box进行IOU判断,大于设定值的称为匹配上;
- 在匹配上的A-boxes中选中IOU最大的一个负责该cell中物体的预测;
- 未匹配上的A-boxes当作背景处理
损失函数
源码中计算loss的步骤:
- 计算包含目标和不包含目标的anchors的iou损失
- 12800样本之前计算未预测到target的anchors的梯度
- 针对于每一个target,计算最接近的anchor的coord梯度
- 计算类别预测的损失和梯度。
v3
关注点:
一、网络结构
- FPN 特征金字塔
- 多尺度预测
- 残差连接
- anchor 设计
- 分类由单标签改为多标签
- 去掉池化和全连接层
二、正负样本匹配规则
正样本:和gt_box有最大的IoU,无论是否满足IoU>ignore_thresh,用1标记
负样本:不是和gt_box有最大IoU的anchor,且IoU <= ignore_thresh, 用0标记
忽略样本:不是和gt_box有最大IoU的anchor,且IoU > ignore_thresh, 用-1标记
三、损失函数
网络结构
这个网络主要是由一系列的1x1和3x3的卷积层组成(每个卷积层后都会跟一个BN层和一个LeakyReLU)层,作者说因为网络中有53个convolutional layers,所以叫做 Darknet-53
将输入图片缩放到416x416,通过特征提取网络(Darknet53 without FC layer)进行了5次下采样,还用了残差网络,目的是使网络在深层能够很快的收敛继续训练下去,然后通过yolo层对输入图像提取特征得到大小一定的特征图13x13,输出的特征图经过DBL后的13×13的特征图上采样后与倒数第二次下采样的结果相加,二者都为26×26,然后在进行和尺度一同样的后续操作。最后是26×26的特征图上采样后与倒数第三次下采样的特征图相加,即还为26×26,在进行后续操作。
最后会输出三个不同尺度的特征图(即多尺度预测),每个尺度的特征图用来预测不同大小的目标,比如小尺度13x13可以预测大目标,中尺度26x26预测中目标,大尺度52x52预测小目标。而后,每个特征图对应3种anchor大小不同的负责预测目标。
多scale 多尺度预测
在yolov3输出不再是一个尺度的feature map, 而是三个尺度,分别是经过32倍下采样、16倍下采样、8倍下采样的特征图
输入416X416的图像,则会得到13X13 (416/32),26X26 (416/16) 以及52X52 (416/8)这3个尺度的特征图。
FPN 特征金字塔
为了增强语义性,传统的物体检测模型通常只在深度卷积网络的最后一个特征图上进行后续操作,而这一层对应的下采样率(图像缩小的倍数)通常又比较大,如16、32,造成小物体在特征图上的有效信息较少,小物体的检测性能会急剧下降 ,这个问题也被称为多尺度问题。
解决多尺度问题的关键在于如何提取多尺度的特征。传统的方法有图像金字塔(Image Pyramid),主要思路是将输入图片做成多个尺度,不同尺度的图像生成不同尺度的特征,这种方法简单而有效,大量使用在了COCO等竞赛上,但缺点是非常耗时,计算量也很大。
浅层的特征图感受野小,比较适合检测小目标(要检测大目标,则其只"看"到了大目标的一部分,有效信息不够);深层的特征图感受野大,适合检测大目标(要检测小目标,则其"看"到了太多的背景噪音,冗余噪音太多),因此FPN应运而生。
2017年的FPN(Feature Pyramid Network)方法融合了不同层的特征,较好地改善了多尺度检测问题。
为什么特征金字塔能够有效检测小物体?
特征提取越多感受野越大,对于小物体的检测越差。FPN中将浅层特征通过上采样融合深层特征,最终将大感受野和小感受野融合起来,既保留了语义信息,也保留了目标信息。
残差连接
大型网络存在的问题
残差网络是为了解决模型层数增加时出现梯度消失或梯度爆炸的问题而出现的。传统的神经网络中,尤其是图像处理方面,往往使用非常多的卷积层、池化层等,每一层都是从前一层提取特征,所以随着层数增加一般会出现退化等问题。残差网络采取跳跃连接的方法避免了深层神经网络带来的一系列问题。
残差网络原理
残差网络的核心原理是通过残差模块来构建深层网络。在传统的神经网络中,每一层的输出是下一层的输入。而在残差网络中,每一层的输入不仅会传递给下一层,还会通过跳跃连接(skip connection)直接传递给更深的层次。
这种设计允许梯度直接流过这些跳跃连接,从而缓解了深层网络中的梯度消失问题。
𝑥 表示输入,𝐹(𝑥) 表示残差块在第二层激活函数之前的输出。如果在该 2 层网络中,最优的输出就是输入 𝑥,那么对于没有 shortcut connection 的网络,就需要将其优化成 𝐻(𝑥)=𝑥,对于有 shortcut connection 的网络,即残差块,如果最优输出是 𝑥,则只需要将 𝐹(𝑥)=𝐻(𝑥)−𝑥 优化为 0 即可。后者的优化会比前者简单。这也是残差这一叫法的由来。
优点:能够有效增大网络层级,网络效果至少不比原来差
去掉池化和全连接层
去掉池化和全连接层,全部卷积。
全连接的本质是矩阵的乘法运算,会产生固定尺寸的输出,而 YOLOV3 是需要多尺寸的输出的,所以要去掉全连接层
没有池化,通过卷积步长为2来实现下采样。没有池化的另一个好处是输入图片的尺寸可变
先验框 anchor 设计
yolov2中使用了5个anchor,在yolov3中有三个预测层输入,因此设计了3中anchor,分别对应三层输出的预测。
单标签分类改进为多标签分类
YOLOv3 使用的是logistic 分类器 ,而不是之前使用的softmax。
在YOLOv3 的训练中,便使用了Binary Cross Entropy ( BCE, 二元交叉熵) 来进行类别预测。
softmax被替代的原因?
(1)softmax只适用于单目标多分类(甚至类别是互斥的假设),但目标检测任务中可能一个物体有多个标签。(属于多个类并且类别之间有相互关系),比如Person和Women。
(2)logistic激活函数来完成,这样就能预测每一个类别是or不是。
正负样本选择
目标检测网络yolo3详解(二) - silence_cho - 博客园
虽然设置了大量anchor,但一张训练图片上可能只有几个gt_box,因此需要确定选择那些anchor来负责预测这几个gt_box
yolo3中,anchor和gt_box进行匹配,正负样本是按照以下规则决定的:
- 第一步,如果一个anchor与所有的gt_box的最大 IoU小于ignore_thresh 时,那这个anchor就是负样本。(一般ignore_thresh=0.7)
- 第二步,如果gt_box的中心点落在一个区域中,该区域就负责检测该物体。将与该物体有最大IoU的anchor作为正样本。注意这里没有用到ignore_thresh, 即使该最大IoU小于ignore_thresh也不会影响该anchor为正样本, 对于其他anchor,若IoU>ignore_thresh, 但不是最佳匹配,设置为忽略样本
根据上面匹配规则,yolo3中anchor有三种样本:正样本,负样本,忽略样本
- 正样本:和gt_box有最大的IoU,无论是否满足IoU大于ignore_thresh,用1标记
- 负样本:不是和gt_box有最大IoU的anchor,且IoU 小于ignore_thresh, 用0标记
- 忽略样本:不是和gt_box有最大IoU的anchor,且IoU 大于 ignore_thresh, 用-1标记
特点:一个gt只能匹配一个anchor,即一个正样本
损失函数
目标检测网络yolo3详解(二) - silence_cho - 博客园
2 - wi * hi:
计算center_loss 和scale_loss时有一个权重系数 (2.0 - (gtw * gth) / (416*416)), 是为了抑制gt_box尺度大小(gtw, gth为gt_box的宽高)对loss的影响,当物体尺度大时,权重系数小,而物体尺寸小时,权重系数大。
yolov4
主要改进:
一、网络结构
输入端:
- Mosaic数据增强
- cmBN
- 噪声SAT自对抗训练
主干网络、特征提取:
- CSPDarknet53
- Mish激活函数
- Dropblock
- CBAM 注意力
颈部网络、加强特征提取:
- SPP模块
- CSPNet
- PAN结构
二、正负样本匹配
三、损失函数
- 训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms
- 平滑标签
网络结构
【YOLO系列】--YOLOv4超详细解读/总结(网络结构)-CSDN博客
YOLOv4模型由以下部分组成:
- **CSPDarknet53 **作为骨干网络BackBone;
- **SPP **作为Neck的附加模块,**PANet **作为Neck的特征融合模块;
- YOLOv3作为Head
YOLOv4的五个基本组件:
CBM:Yolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。
CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
CSPX:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成。
SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
1.输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练
2.主干网络(Backbone)-主干特征提取网络:将各种新的方式结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock
3.颈部网络(Neck)-加强特征提取网络:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块、FPN+PAN结构
4.头部网络(Head)--用来预测:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms
基础数据增强
数据增强包括:
- 光照变换
- 几何变换
- 翻转图片
- 随机擦除
- cutout
- hide and seek
- gird mask
- mixup
马赛克数据增强
Mosaic 数据增强算法将多张图片按照一定比例组合成一张图片,使模型在更小的范围内识别目标。
方法步骤:
- 随机选取图片拼接基准点坐标(xc,yc),另随机选取四张图片。
- 四张图片根据基准点,分别经过 尺寸调整 和 比例缩放 后,放置在指定尺寸的大图的左上,右上,左下,右下位置。
- 根据每张图片的尺寸变换方式,将映射关系对应到图片标签上。
- 依据指定的横纵坐标,对大图进行拼接。处理超过边界的检测框坐标。
优点:
- 增加数据多样性,随机选取四张图像进行组合,组合得到图像个数比原图个数要多。
- 增强模型鲁棒性,混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。
- 加强批归一化层(Batch Normalization)的效果。当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好。
- Mosaic 数据增强算法有利于提升小目标检测性能。Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标。
- 训练的难度增大,有助于模型性能的提升
SAT自对抗训练
自对抗训练(Self-Adversarial Training,简称SAT)是一种新型的数据增强技术。神经网络改变原始图像而不是网络权值。SAT的两个阶段:
- 第一阶段:神经网络在训练过程中会生成一种对抗性的攻击,这种攻击可以改变原始图像
- 第二阶段:训练神经网络对修改后的图像进行正常的目标检测。
SAT简单来说就是在原图像中增加扰动噪声生成
优点
- 提高模型的鲁棒性:SAT通过对原始图像进行修改,使其看起来像没有目标物体一样,训练模型对这些修改后的图像进行正常的目标检测。这样可以增强模型对噪声和其他干扰的鲁棒性,使其在实际应用中能够更好地应对不同的挑战和场景。
- 增强模型的泛化能力 :SAT通过引入神经网络自身的对抗性攻击,使得模型在训练过程中需要面对各种不同的假象和挑战。这样可以使得模型更好地适应不同的数据分布和场景,提高其泛化能力。
3.** 改善决策边界**:SAT通过神经网络的对抗性攻击,可以改善学习决策边界中的薄弱环节。这有助于模型更好地理解数据分布和特征,从而更好地进行目标检测。
缺点
- 计算效率低 :SAT自对抗训练需要生成大量的修改图像,并对其进行正常的目标检测,这使得计算复杂度较高,训练效率相对较低。
2.** 需要调整参数**:SAT自对抗训练需要调整一些参数,例如攻击的强度、数量等。这些参数的选择对于训练效果具有重要影响,需要进行精细的调整和优化。 - 对某些场景的适应性有限:虽然SAT自对抗训练可以应用于各种目标检测任务中,但对于某些特定的场景和任务,其适应性可能有限。因此,在实际应用中需要根据具体任务和数据集进行评估和调整。
DropBlock
dropout 作用:防止过拟合,
dropout 缺点:每次训练时随机去掉的神经元可以通过相邻的神经元来预测,因为随着网络层数的增加,神经元之间的相关性是越来越强。
dropblock:每次训练时随机去掉一整片区域,这样就能组合更多不一样的网络,从而表现出更好的泛化作用。
Label Smoothing 平滑标签
标签平滑(Label smoothing),像L1、L2和dropout一样,是机器学习领域的一种正则化方法,通常用于分类问题,目的是防止模型在训练时过于自信地预测标签,改善泛化能力差的问题。
类标签平滑不是一个图像处理技术,而是一个直观的对类标签的改变。
通常情况下,正确的边界框分类是用类的独热向量[0,0,0,1,0,0,...]来表示,并据此计算损失函数。
one-hot 编码存在的问题:
- 倾向于让模型更加"武断",成为一个"非黑即白"的模型,导致泛化性能差;
- 面对易混淆的分类任务、有噪音(误打标)的数据集时,更容易受影响。
根据这种直觉,对类标签表示进行编码以在某种程度上衡量不确定性更为合理。通常情况下,作者选择0.9,所以用[0,0,0,0.9,0...]来代表正确的类。
机器学习的样本中通常会存在少量错误标签,这些错误标签会影响到预测的效果。标签平滑采用如下思路解决这个问题:在训练时即假设标签可能存在错误,避免"过分"相信训练样本的标签。当目标函数为交叉熵时,这一思想有非常简单的实现,称为标签平滑(Label Smoothing)。
我们以2类分类问题为例,此时训练样本为(xi,yi),其中yi是样本标签,为0或1。在训练样本中,我们并不能保证所有的样本标签都标注正确,如果某个样本的标注是错误的,那么在训练时,该样本就有可能对训练结果产生负面影响。一个很自然的想法是,如果我们有办法"告诉"模型,样本的标签不一定正确,那么训练出来的模型对于少量的样本错误就会有"免疫力"。
SPP 空间金字塔池化
不同的输入大小,输出都是一致的
全连接层存在的问题:
卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的是全连接层。所有存在全连接层的网络都需要固定的输入大小,例如 yolov1
固定输入数据大小有两个问题:
1.很多场景所得到数据并不是固定大小的,例如街景文字基本上其高宽比是不固定的 ,如下图示红色框出的文字。
2.切割的话很可能会丢失到重要信息
切割图像可能会导致丢失一些重要信息
SPP的提出就是为了解决CNN输入图像大小必须固定的问题,从而可以使得输入图像高宽比和大小任意。
SPP 原理
上图是原文中给出的示意图,需要从下往上看:
- 首先是输入层(input image), 其大小可以是任意的,进行卷积运算,输出得到该层的特征映射(feature maps),其大小也是任意的。
- 下面进入SPP层 最左边有16个蓝色小格子的图,它的意思是将从输出特征映射分成16份,中间的4个绿色小格子和右边1个紫色大格子也同理,即将特征映射分别分成4和1份。
- 通过SPP层,特征映射被转化成了16X256+4X256+1X256 = 21X256的矩阵,在送入全连接时可以扩展成一维矩阵,即1X10752,所以第一个全连接层的参数就可以设置成10752了,这样也就解决了输入数据大小任意的问题了。
SPP的实现方法:
SPP 通过池化来实现,通过计算出合适大小的卷积核和卷积步长,就能得到固定输出大小的矩阵。
SPP层通常包含几个不同大小的池化窗口,例如1x1、3x3和5x5。这些窗口将以不同的步长(如1, 2, 4)在特征图上滑动,以捕获不同尺度的特征。
输入层:首先我们现在有一张任意大小的图片,其大小为w * h。
输出层:21个神经元 -- 即我们待会希望提取到21个特征。
分析如下图所示:分别对1 * 1分块,2 * 2分块和4 * 4子图里分别取每一个框内的max值(即取蓝框框内的最大值),这一步就是作最大池化,这样最后提取出来的特征值(即取出来的最大值)一共有1 * 1 + 2 * 2 + 4 * 4 = 21个。得出的特征再concat在一起。
CSP Net
Cross Stage Partial Network (CSPNet) 是从网络结构设计的角度来解决以往工作在推理过程中需要很大计算量的问题。
作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。CSPNet是一种处理的思想,可以和ResNet、ResNeXt和DenseNet结合
CSPNet的思想,将feature map拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate (区别于残差网络的add)。
从实验结果来看,分类问题中,使用CSPNet可以降低计算量,但是准确率提升很小;在目标检测问题中,使用CSPNet作为Backbone带来的提升比较大,可以有效增强CNN的学习能力,同时也降低了计算量。
用 Concat 代替 Add,提取更丰富的特征。
之前介绍过 Concat 操作后,特征图的尺寸不变,深度会增加,而 Add 操作后尺寸和深度都不改变,从这个意义上说,用 Concat 代替 Add,就能够提取更丰富的特征。
引入 transition layer (1 * 1conv + 2 * 2pooling),提取特征,降低计算量,提升速度。
为什么引入 1 * 1 conv,能够降低计算量,提升速度 ?
CSPNet提出主要是为了解决三个问题:
- 增强CNN的学习能力,能够在轻量化的同时保持准确性。
- 降低计算瓶颈
- 降低内存成本
优点:速度增快,精度略有上升
CBAM 注意力机制
注意包括:
- 通道注意力
- 位置注意力
在yolov4中为了实时性,只使用了SAM即位置注意力机制。
yolov8改进之CBAM注意力机制_yolov8添加cbam-CSDN博客
yolov8改进之CBAM注意力机制_yolov8添加cbam-CSDN博客
注意力机制介绍
计算机视觉中的注意力机制是一种聚焦于局部信息 的机制,其基本思想是让系统学会忽略无关信息而关注重点信息 。这种机制在图像识别、物体检测和人脸识别等任务中都发挥了重要作用。
注意力机制的实现方法有多种,其中包括空间注意力模型 、通道注意力模型 、空间和通道混合注意力模型 等。这些模型可以将图像中的关键信息提取出来,并通过抑制无用信息来提高模型的性能。在计算机视觉中,注意力机制被广泛应用于各种任务,如目标检测、图像分类、人脸识别等。
通过引入注意力机制,计算机视觉系统可以更加高效地处理图像数据,减少计算资源的浪费,同时提高模型的性能和准确性。在未来,随着深度学习技术的不断发展,注意力机制在计算机视觉领域的应用前景将会更加广阔。
CBAM(Convolutional Block Attention Module)是一种注意力机制,它结合了通道注意力和空间注意力来提高卷积神经网络的性能。通道注意力模块通过计算每个通道的重要性,以区分不同通道之间的特征。空间注意力模块则计算每个像素在空间上的重要性,以更好地捕捉图像中的空间结构。
上图可以看到,CBAM包含CAM(Channel Attention Module)和SAM(Spartial Attention Module)两个子模块,分别进行通道和空间上的Attention。这样不只能够节约参数和计算力,并且保证了其能够做为即插即用的模块集成到现有的网络架构中去。
CBAM的工作原理如下:
- 通道注意力模块:通过在通道维度上对输入特征图进行最大池化和平均池化,然后将这两个池化结果输入到一个全连接层中,最后输出一个通道注意力权重向量。这个权重向量可以用来加权输入特征图的每个通道,以增强重要的通道特征并抑制不重要的通道特征。
- 空间注意力模块:类似于通道注意力模块,空间注意力模块也是通过对输入特征图进行操作来计算每个像素的重要性。它通常使用全局平均池化来获取每个像素的特征向量,然后通过一个全连接层来输出每个像素的权重。这些权重可以用于加权输入特征图的每个像素,以强调图像中的重要区域并抑制不重要的区域。
通过将通道注意力和空间注意力模块串联起来,可以得到一个完整的CBAM模块,用于插入到卷积神经网络中以提升模型性能。CBAM可以显著提高计算机视觉任务的性能,例如目标检测、图像分类和语义分割等。
通道注意力模块
通过全局最大池化和全局平均池化-->全连接层-->Sigmoid激活-->注意力加权操作实现。
空间注意力模块
PAN 路径聚合网络
FPN是自顶向下,将高层的强语义特征传递下来,对整个金字塔进行增强,不过只增强了语义信息 ,对定位信息 没有传递。
PAN (Path Aggregation Network) 就是针对这一点,在FPN的后面添加一个自底向上的金字塔,这样的操作是对FPN的补充,将低层的强定位特征传递上去。
PAFPN结构主要由三部分组成:自顶向下的路径、自底向上的路径和横向连接。通过这三部分结构的协同作用,PAFPN能够充分利用不同层级的特征信息,提升目标检测的精度和速度。
- 自顶向下的路径 :这部分路径将高层级的语义信息传递给低层级,使得低层级的特征能够利用到更多的语义信息。在YOLOv5中,高层级的特征图经过上采样后与低层级的特征图进行融合,从而实现了高层级特征向低层级的传递。
- 自底向上的路径 :这部分路径将低层级的细节信息传递给高层级,使得高层级的特征能够利用到更多的细节信息。在YOLOv5中,低层级的特征图经过下采样后与高层级的特征图进行融合,从而实现了低层级特征向高层级的传递。
- 横向连接 :这部分连接将同一层级的特征进行融合,使得网络能够同时利用不同来源的特征信息。在YOLOv5中,横向连接通过简单的相加操作实现了特征的融合。
Mish 激活函数
在诸如CIFAR-10, CIFAR-100, CalTech-256, ASL等具有挑战性的数据集的70多个不同的问题标准中,Mish函数的表现超过了广泛使用的激活函数,如ReLU和Swish。
下图显示了Mish、Swish和ReLU在不同模型的CIFAR-10数据集上的性能,从图中可以很容易地推断,Mish比Swish函数的性能大约高0.494%,ReLU比Swish函数的性能高1.671%,因此是三者中最准确的:
Mish 特征:
- 无上界,有下界:无上界是任何激活函数都需要的特性,因为它避免了导致训练速度急剧下降的梯度饱和。因此,加快训练过程。无下界属性属性有助于实现强正则化效果(适当的拟合模型)。(Mish的这个性质类似于ReLU和Swish的性质,其范围是 -0.31,正无穷。
- 非单调函数:这种性质有助于保持小的负值,从而稳定网络梯度流。大多数常用的激活函数,如ReLU,Leaky ReLU,由于其差分为0,不能保持负值,因此大多数神经元没有得到更新。
- 无穷连续性和光滑性:Mish是光滑函数,具有较好的泛化能力和结果的有效优化能力,可以提高结果的质量。
- 计算量较大,但是效果好:与ReLU相比,它的计算量比较大,但在深度神经网络中显示了比ReLU更好的结果。
- 自门控:此属性受到Swish函数的启发,其中标量输入被共给gate。它优于像ReLU这样的点式激活函数,后者只接受单个标量输入,而不需要更改网络参数。
CmBN 交叉小批归一化
CBN 交叉小批量标准化
交叉小批量标准化(Cross-Iteration Batch Normalization,简称CBN)是一种深度学习中的归一化技术,旨在解决标准批量归一化(Batch Normalization,简称BN)在小批量尺寸下性能不佳的问题。以下是CBN的详解:
背景:
- 标准BN在每个小批量数据上独立计算均值和方差,进行归一化处理。这有助于加速模型训练并提高模型稳定性。
- 然而,当小批量尺寸较小时,计算得到的均值和方差可能不够准确,导致模型性能下降。
CBN的核心思想:
- 跨迭代归一化:CBN在计算当前小批量的归一化参数时,不仅考虑当前小批量的数据,还会考虑之前几个小批量的数据。这样可以有效增加"有效批量大小",提高均值和方差的估计准确性。
CBN的计算步骤:
- 收集统计量:在训练过程中,CBN会收集并累积之前几个小批量的均值和方差。
- 加权平均:当前小批量的均值和方差会与之前累积的均值和方差进行加权平均,得到最终用于归一化的统计量。
- 归一化:使用加权平均后的均值和方差对当前小批量的数据进行归一化处理。
- 更新统计量:将当前小批量的均值和方差加入到累积统计量中,并根据预定策略(如滑动平均)更新长期统计量。
CBN的优点:
- 提高小批量尺寸较小时的性能:通过跨迭代归一化,CBN能够提高在小批量尺寸较小时的模型性能。
- 保持BN的优点:CBN继承了BN加速训练和提高稳定性的优点。
CBN的应用:
CBN可以应用于各种深度学习模型中,特别是那些单个小批量尺寸较小或者使用多个GPU并行训练的场景。
实现细节:
- 在实现CBN时,需要额外的存储空间来保存之前小批量的统计量。
- 需要设计合适的权重策略,以确定如何结合当前和历史统计量。
CmBN
交叉小批归一化(Cross-Mini Batch Normalization,简称CmBN)是一种在深度学习中用于提高训练稳定性和性能的归一化技术。CmBN是批归一化(Batch Normalization,BN)的一种改进形式,它特别适用于单GPU训练或小批量尺寸的情况。以下是CmBN的详解:
CmBN的背景:
- 标准BN在每个小批量(mini-batch)上独立计算均值和方差,进行归一化处理。这有助于加速模型训练并提高模型稳定性。
- 然而,当使用单个GPU或小批量尺寸较小时,每个小批量的统计量(均值和方差)可能不够准确,导致模型性能不佳。
CmBN的核心思想:
- 跨小批量归一化:CmBN在计算归一化参数时,会考虑同一个大批量(batch)内部多个小批量(sub-mini-batches)的数据。通过这种方式,CmBN能够在小批量尺寸较小的情况下,收集更多的数据来估计均值和方差,从而提高估计的准确性。
CmBN的计算步骤:
- 分割大批量:将一个大批量数据分割成多个小批量(sub-mini-batches)。
- 计算统计量:对每个小批量分别计算均值和方差。
- 跨小批量聚合:将所有小批量的均值和方差进行聚合(例如,通过平均或加权平均)。
- 归一化处理:使用聚合后的均值和方差对每个小批量的数据进行归一化处理。
- 缩放和平移:引入可学习的参数(缩放因子γ和偏移因子β),对归一化后的数据进行缩放和平移。
CmBN的优点:
- 提高小批量尺寸较小时的性能:通过跨小批量聚合统计量,CmBN能够在小批量尺寸较小的情况下,提供更准确的归一化。
- 保持BN的优点:CmBN继承了BN的优点,如加速训练和提高模型稳定性。
CmBN的应用:
CmBN可以应用于各种深度学习模型中,特别适用于单GPU训练或小批量训练的场景。
总结:
CmBN是一种有效的归一化技术,能够在单GPU训练或小批量训练中提高模型性能,是BN的一个有价值的改进。通过跨小批量聚合统计量,CmBN提供了一种在小批量尺寸受限情况下提高归一化准确性的方法。
正负样本匹配
yolov3中正负样本的匹配规则是:
- 正样本:一个gt只会产生一个正样本。三个尺度的预测网络中,和gt的IOU最大的anchor为正样本
- 负样本:和所有gt的IOU都小于一个忽略阈值的anchor成为负样本
- 忽略样本:和gt的IOU大于忽略阈值,但是又不是最大的IOU的anchor成为忽略样本
yolov3的策略中正样本个数太少,为了平衡正负样本,yolov4中一个gt可以产生多个正样本。
- 正样本:一个gt会产生多个正样本,但是只会在大中小其中一层里。IOU大于一个阈值A的anchor都会成为正样本
- 负样本:IOU小于一个阈值B的anchor都会成为负样本
- 忽略样本:IOU大于阈值B,但是又小于阈值A的样本会成为忽略样本
IoU loss 中 IoU 交并比,两个框的交集/并集,有两个缺点:
- 无法反应两个的距离
例如 状态 1,两个框不相交,无论怎样移动两个框,IoU = 0。
- 无法区分两者相交的情况
例如 状态 2 和 3,两个框相交的情况完全不一样,但是 IoU 相同。
损失函数:
LOSS=L(正样本坐标损失)+L(正样本置信度损失)+L(负样本置信度损失)+L(正样本分类损失)
NMS
nms剔除效果太强烈,对于重叠的框直接剔除。而soft-nms对于重叠的框会降低阈值而不是剔除框。
一个成熟的IoU衡量指标应该要考虑预测框与真实框的重叠面积、中心点距离、长宽比三个方面。但是IoU 只考虑到了预测框与真实框重叠区域,并没有考虑到中心点距离、长宽比。
基于此,DIOU-NMS就不仅仅考虑IOU,还考虑两个框中心点之间的距离。如果两个框之间IOU比较大,但是两个框的中心距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。
DIoU (Distance-IoU )。简单地在IoU loss基础上添加一个惩罚项,该惩罚项用于最小化两个bbox的中心点距离。
DIoU公式:
yolov5
网络结构
yolov5仍然使用darknet-53网络结构
网络输出:sum(grid_cells * anchor_num * object)
13 * 13 * 3 * (nc + 5)
26 * 26 * 3 * (nc + 5)
52 * 52 * 3 * (nc + 5)
nc是类别个数,5是xywh+confidence
自适应图片缩放
yolo中常用图片尺寸:416x416, 608x608
存在问题:实际图片长宽比例不同,放缩填充后可能填充过多造成冗余
在yoloV5中,设原图长x宽=800x600,放缩过程如下:
- 计算需要填充黑边宽度:104
- yoloV5执行5次下采样:2^5=32,对该数值取模:104%32=8
- 将填充区域分散到两边:8/2=4
Focus
FOCUS模块在yoloV5中是在图片进入backbone前,对图片进行切片操作。
具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了4张图片,四张图片互补,长的差不多,但是没有信息丢失,这样使得W,H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
以yoloV5为例,原始的640x640x3的图像输入FOCUS结构,采用切片操作,先变成320x320x12的特征图,再经过一次卷积操作,最终变成320x320x32的特征图。
Focus 的目的是为了增加推理的速度,而不是提高map
Focus结构的优势
- 计算效率:相比于直接进行卷积操作,Focus结构通过切片和拼接的方式减少了计算量。
- 信息保留:尽管进行了下采样,但由于切片操作的特性,图像的关键视觉信息得以保留。
- 特征增强:增加的通道数为后续网络结构提供了更丰富的特征表示,有助于提升检测性能。
在YOLOv5的早期版本中,Focus结构是作为一个独立的模块实现的。但在后续的版本中,为了提高计算效率,特别是考虑到某些硬件对大卷积核的支持更好,Focus结构被一个6x6的卷积层所替代。这个6x6的卷积层在计算上等同于Focus结构的切片和拼接操作,但可能更适合某些GPU硬件的优化。
Focus结构是YOLOv5中的一个创新点,它体现了设计者在保持模型性能的同时对计算效率的重视。通过这种方式,YOLOv5能够在资源受限的设备上实现高效的目标检测。
BottleneckCSP
SPPF
spp原来并行的结构改成了串行结构,减少了计算量(速度更快,f即fast),而且发挥spp相同的作用。
优点:
串联的好处在于通过三个55的卷积核就能替代之前的SPP中5 5 、99、1313 三个卷积核,从卷积核的个数来看,参数会小很多。
训练技巧
- Multi-scale training 多尺度训练。将训练输入图片的大小随机取值
- AutoAnchor 在图片尺寸差异较大的情况下,自动生成anchor
- Warmup and Cosine LR scheduler 预训练,将学习率从很小的值增加到设定值,cosine慢慢降低学习率
- EMA 指数移动平均法: 一种使用过去各步参数平均值来稳定训练过程并减少泛化误差的策略。
- Mixed percison 混合精度训练。使用不同精度的训练。需要GPU支持
- Evolve hyper-parameter 超参数进化
- 断点续训
- 多GPU训练,DDP模型
多尺度训练
多尺度训练对全卷积网络有效,一般设置几种不同尺度的图片,训练时每隔一定iterations随机选取一种尺度训练。这样训练出来的模型鲁棒性强,其可以接受任意大小的图片作为输入,使用尺度小的图片测试速度会快些,但准确度低,用尺度大的图片测试速度慢,但是准确度高。
训练时,预先定义几个固定的尺度,每个epoch随机选择一个尺度进行训练(实际中还是单个尺度的训练)。
正负样本匹配
Yolov3-v5正负样本匹配机制 - AI大道理 - 博客园
正负样本选择
首先需要清楚的是:正负样全称是anchor正样本,正样本所指的对象是anchor box,即先验框。
先验框:
从YOLO v2开始,yolo系列吸收了Faster RCNN的优点,设置了一定数量的预选框,使得模型不需要直接预测物体尺度与坐标,只需要预测先验框到真实物体的偏移,降低了预测难度。
正样本获取规则
Yolov5算法使用如下3种方式增加正样本个数:
一、跨anchor预测
假设一个GT框落在了某个预测分支的某个网格内,该网格具有3种不同大小anchor,若GT可以和这3种anchor中的多种anchor匹配,则这些匹配的anchor都可以来预测该GT框,即一个GT框可以使用多种anchor来预测。
具体方法:
不同于IOU匹配,yolov5采用基于宽高比例的匹配策略,GT的宽高与anchors的宽高对应相除得到ratio1,anchors的宽高与GT的宽高对应相除得到ratio2,取ratio1和ratio2的最大值作为最后的宽高比,该宽高比和设定阈值(默认为4)比较,小于设定阈值的anchor则为匹配到的anchor。
python
anchor_boxes=torch.tensor([[1.25000, 1.62500],[2.00000, 3.75000],[4.12500, 2.87500]])
gt_box=torch.tensor([5,4])
ratio1=gt_box/anchor_boxes
ratio2=anchor_boxes/gt_box
ratio=torch.max(ratio1, ratio2).max(1)[0]
print(ratio)
anchor_t=4
res=ratio<anchor_t
print(res)
python
tensor([4.0000, 2.5000, 1.3913])
tensor([False, True, True])
与GT相匹配的的anchor为anchor 2和anchor3。
二、跨grid预测
假设一个GT框落在了某个预测分支的某个网格内,则该网格有左、上、右、下4个邻域网格,根据GT框的中心位置,将最近的2个邻域网格也作为预测网格,也即一个GT框可以由3个网格来预测。
计算例子:
GT box中心点处于grid1中,grid1被选中,为了增加增样本,grid1的上下左右grid为候选网格,因为GT中心点更靠近grid2和grid3,grid2和grid3也作为匹配到的网格,根据上步的anchor匹配结果,GT与anchor2、anchor3相匹配,因此GT在当前层匹配到的正样本有6个,分别为:
grid1_anchor2,grid1_anchor3,grid2_anchor2,grid2_anchor3,grid3_anchor2,grid3_anchor3。
三、跨分支预测
假设一个GT框可以和2个甚至3个预测分支上的anchor匹配,则这2个或3个预测分支都可以预测该GT框,即一个GT框可以由多个预测分支来预测,重复anchor匹配和grid匹配的步骤,可以得到某个GT 匹配到的所有正样本。
基本流程:
step1:对每一个GT框,分别计算它与9种anchor的宽与宽的比值、高与高的比值;这里的9种指的是全部三层
step2:在宽比值、高比值这2个比值中,取最极端的一个比值,作为GT框和anchor的比值,具体实现的伪代码为:max(anchor / GT, GT / anchor );
step3:得到GT框和anchor的比值后,若这个比值小于设定的比值阈值,那么这个anchor就负责预测GT框,这个anchor的预测框就被称为正样本,所有其它的预测框都是负样本。
得到当前层需要检测的GT以及其对应的anchor_id。
yolov5 可以在三个层面上匹配anchor
总结:
- yolov5中三个层面都可以匹配,yolov3和yolov4只能匹配一个预测层。
- 每一个预测层可以匹配3个gird cell
- 每一个grid cell可以匹配3个anchor
所以yolov5中一个gt最多可以匹配3 * 3 * 3 = 27个anchor
负样本:所有的anchor,选中为正样本的,剩余anchor都是负样本
忽略样本:yolov5中没有忽略样本
损失函数
定位损失
定位损失使用的CIOU loss,CIOU考虑了重叠面积,中心点距离,长宽比。
边界框回归: