学习yolo系列,最重要的,最核心的就是网络模型、正负样本匹配、损失函数等三个方面。本篇汇总了yolov1-yolov5等5个版本的相关知识点,主要看点是在yolo框架搭建。初学者可以通过相关篇章搭建自己的知识点框架,然后再深入各个知识点,就像攻克一个又一个山头。当大部分的知识点都了然于胸,yolo系列就算掌握了。
免责申明:本篇的主要来源是B站视频,加上网上各种博客,由于参考较多,不能一一列出。非商用,侵权请联系我。
关注点:
一、网络结构
二、正负样本匹配规则
三、损失函数
输入固定大小: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预测的越来越好
损失函数:
参与损失函数计算的置信度并不是直接用网络模型推理出来的置信度,其中还有一个转换
网络输出的7×7×30的张量内的值最初都是随意的,拿出一个30维张量为例:
参与损失函数计算的标签:
参与损失函数计算的置信度计算公式:
负责预测该对象的P(object) = 1, 不负责预测该对象的P(object) = 0。
在YOLOv1中,训练时和推理时对置信度的计算方式有一些不同的细节。以下是详细的解释:
训练时置信度计算
训练时,置信度分数用于衡量预测边界框的准确性和物体存在的可能性。置信度分数的计算包括两个部分:预测框和真实框之间的重叠程度(IoU),以及是否存在物体。
推理时,置信度分数用于选择最终的边界框和类别。推理时的置信度计算方式如下:
预测框置信度:
每个预测框输出一个置信度分数,表示预测框中有物体的置信度。这是模型直接输出的一个值,是在训练时学习到的。
类别置信度:
每个网格单元输出类别概率。类别概率表示该网格单元包含特定类别物体的概率。
类特定置信度:
类特定置信度是预测框置信度和类别概率的乘积。这个值表示边界框包含特定类别物体的置信度。
公式:类特定置信度 = 预测框置信度 × 类别概率
非极大值抑制(NMS):
为了减少重叠框的数量,应用非极大值抑制。
保留置信度最高的边界框,抑制IoU高于一定阈值的重叠框。
最终输出:
置信度高于某个阈值的边界框被保留,并作为最终的检测结果输出。
示例
假设一个网格单元预测以下值:
在推理时,类特定置信度计算为:
这个类特定置信度表示该边界框包含狗的置信度。如果这个置信度高于设定的阈值(例如0.5),并且通过了非极大值抑制步骤,那么这个边界框将被保留并输出为最终的检测结果。
总结
YOLOv1--从样本标签与训练输出角度分析_一个文件中的样本标签怎么一样啊-CSDN博客
在模型推理时需要做bounding box筛选的工作,让最后的结果只保留每一个类别中最好的结果。分为两步走:
对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)。
得到98bbox的信息后,首先对阈值小于0.2的score清零,然后重新排序,最后再用NMS算法去掉重复率较大的bounding box
关注点:
一、网络结构
二、正负样本匹配规则
三、损失函数
https://blog.51cto.com/u_11299290/4908318
[YOLO专题-5]:YOLO V2 - 网络结构、原理、改进的全新、全面、通俗、结构化讲解_yolov2网络结构-CSDN博客
主干:Darknet-19
https://juejin.cn/post/7038239379877265444
【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)-CSDN博客
在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是2015年一篇论文中提出的数据归一化方法,往往用在深度神经网络中激活层之前。其作用可以加快模型训练时的收敛速度,使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失。
为什么需要归一化?
神经网络在训练的时候随着网络层数的加深,激活函数的输入值的整体分布逐渐往激活函数的取值区间上下限靠近,从而导致在反向传播时浅层的神经网络的梯度消失。而batch normalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题
将激活函数处理过后的数值从边缘区域拉到中心区域
Nomalization通过规范化处理的函数,使得原先离散、发散的数据,根据的规范化和集中化,向中心点处集中
批归一化(Batch Normalization,简称BN)是一种在深度学习中常用的技术,特别是在训练卷积神经网络(CNN)和循环神经网络(RNN)时。批归一化通过规范化(归一化)层的输入来加速收敛速度,同时提供一定程度的正则化效果。以下是批归一化的优缺点:
优点:
缺点:
总的来说,批归一化是一种强大的技术,可以显著提高深度学习模型的训练效率和性能。然而,它也带来了一些挑战,特别是在处理小批量大小、内存限制和特定类型的网络结构时。
BN的计算过程:
批归一化(Batch Normalization)的计算过程旨在对每个小批量数据进行归一化处理,使得网络的每一层输入数据的分布更加稳定。以下是批归一化的计算步骤:
更大的分辨率
在yolov1中使用了预训练模型。预训练模型是在数据集ImageNet上使用 224 * 224 分辨率来训练模型的backbone,即模型的特征提取能力。
但是这样存在一个问题,就是预训练模型的输入图片尺寸是224 * 224 ,而正式训练中使用的是448 * 448,会导致模型水土不服。
yolov2中为了解决这个问题,在yolov1预训练模型的基础上做finetune,增加了10个epoch的448 * 448 输入尺寸的训练,让模型习惯更大分辨率的输入。
总的来说,这段话强调了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。这些值并不是真是的坐标值,而是相对值。具体来说:
将模型预测偏移值还原到特征图的位置:
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能够识别图片的全局信息。这个就是感受野的变化。
多个小卷积核可以做到一个大卷积核的功能,同时需要的参数更小,感受野更丰富。
在YOLOv1中,小目标的检测效果非常不好,一方面是与损失函数设计有关,模型loss将偏向大目标,会影响小目标的学习;另一方面与模型的coarse feature有关,网络一直在进行下采样,损失了非常多的细节信息。深度学习模型的学习到的浅层特征是物体的角点和边之类的细节信息,而学习到的深层特征是偏向抽象语义的,那么对于目标检测任务来说浅层特征和深层特征都是很重要的,定位任务需要细节信息才能框的准。因此,YOLOv2借鉴了RestNet的思想,融合了更精细化的特征。作者将2626512的特征通过passthrough层转化为了1313256维度的tensor,与原始粗粒度特征13131024进行融合,网络结构如下图所示:
其中的passthrough层就是特征矩阵隔一个拆出来一个的方式,这样能实现特征图大小减半,但是channel变成原来的4倍,如下图所示:
因为yolov2取消了fc层,所以可以不受尺度大小限制。
多尺度训练是为了让网络能适应不同大小的图像,提升模型的泛化能力,通过多尺度训练,能让mAP提升1个百分点。
源码中计算loss的步骤:
关注点:
一、网络结构
二、正负样本匹配规则
正样本:和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大小不同的负责预测目标。
在yolov3输出不再是一个尺度的feature map, 而是三个尺度,分别是经过32倍下采样、16倍下采样、8倍下采样的特征图
输入416X416的图像,则会得到13X13 (416/32),26X26(416/16) 以及52X52(416/8)这3个尺度的特征图。
为了增强语义性,传统的物体检测模型通常只在深度卷积网络的最后一个特征图上进行后续操作,而这一层对应的下采样率(图像缩小的倍数)通常又比较大,如16、32,造成小物体在特征图上的有效信息较少,小物体的检测性能会急剧下降,这个问题也被称为多尺度问题。
解决多尺度问题的关键在于如何提取多尺度的特征。传统的方法有图像金字塔(Image Pyramid),主要思路是将输入图片做成多个尺度,不同尺度的图像生成不同尺度的特征,这种方法简单而有效,大量使用在了COCO等竞赛上,但缺点是非常耗时,计算量也很大。
浅层的特征图感受野小,比较适合检测小目标(要检测大目标,则其只“看”到了大目标的一部分,有效信息不够);深层的特征图感受野大,适合检测大目标(要检测小目标,则其”看“到了太多的背景噪音,冗余噪音太多),因此FPN应运而生。
2017年的FPN(Feature Pyramid Network)方法融合了不同层的特征,较好地改善了多尺度检测问题。
为什么特征金字塔能够有效检测小物体?
特征提取越多感受野越大,对于小物体的检测越差。FPN中将浅层特征通过上采样融合深层特征,最终将大感受野和小感受野融合起来,既保留了语义信息,也保留了目标信息。
大型网络存在的问题
残差网络是为了解决模型层数增加时出现梯度消失或梯度爆炸的问题而出现的。传统的神经网络中,尤其是图像处理方面,往往使用非常多的卷积层、池化层等,每一层都是从前一层提取特征,所以随着层数增加一般会出现退化等问题。残差网络采取跳跃连接的方法避免了深层神经网络带来的一系列问题。
残差网络原理
残差网络的核心原理是通过残差模块来构建深层网络。在传统的神经网络中,每一层的输出是下一层的输入。而在残差网络中,每一层的输入不仅会传递给下一层,还会通过跳跃连接(skip connection)直接传递给更深的层次。
这种设计允许梯度直接流过这些跳跃连接,从而缓解了深层网络中的梯度消失问题。
𝑥 表示输入,𝐹(𝑥) 表示残差块在第二层激活函数之前的输出。如果在该 2 层网络中,最优的输出就是输入 𝑥,那么对于没有 shortcut connection 的网络,就需要将其优化成 𝐻(𝑥)=𝑥,对于有 shortcut connection 的网络,即残差块,如果最优输出是 𝑥,则只需要将 𝐹(𝑥)=𝐻(𝑥)−𝑥 优化为 0 即可。后者的优化会比前者简单。这也是残差这一叫法的由来。
优点:能够有效增大网络层级,网络效果至少不比原来差
去掉池化和全连接层,全部卷积。
全连接的本质是矩阵的乘法运算,会产生固定尺寸的输出,而 YOLOV3 是需要多尺寸的输出的,所以要去掉全连接层
没有池化,通过卷积步长为2来实现下采样。没有池化的另一个好处是输入图片的尺寸可变
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进行匹配,正负样本是按照以下规则决定的:
根据上面匹配规则,yolo3中anchor有三种样本:正样本,负样本,忽略样本
特点:一个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的影响,当物体尺度大时,权重系数小,而物体尺寸小时,权重系数大。
主要改进:
一、网络结构
输入端:
主干网络、特征提取:
颈部网络、加强特征提取:
二、正负样本匹配
三、损失函数
【YOLO系列】--YOLOv4超详细解读/总结(网络结构)-CSDN博客
YOLOv4模型由以下部分组成:
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
数据增强包括:
Mosaic 数据增强算法将多张图片按照一定比例组合成一张图片,使模型在更小的范围内识别目标。
方法步骤:
优点:
自对抗训练(Self-Adversarial Training,简称SAT)是一种新型的数据增强技术。神经网络改变原始图像而不是网络权值。SAT的两个阶段:
SAT简单来说就是在原图像中增加扰动噪声生成
优点
缺点
dropout 作用:防止过拟合,
dropout 缺点:每次训练时随机去掉的神经元可以通过相邻的神经元来预测,因为随着网络层数的增加,神经元之间的相关性是越来越强。
dropblock:每次训练时随机去掉一整片区域,这样就能组合更多不一样的网络,从而表现出更好的泛化作用。
标签平滑(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。在训练样本中,我们并不能保证所有的样本标签都标注正确,如果某个样本的标注是错误的,那么在训练时,该样本就有可能对训练结果产生负面影响。一个很自然的想法是,如果我们有办法“告诉”模型,样本的标签不一定正确,那么训练出来的模型对于少量的样本错误就会有“免疫力”。
不同的输入大小,输出都是一致的
全连接层存在的问题:
卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的是全连接层。所有存在全连接层的网络都需要固定的输入大小,例如 yolov1
固定输入数据大小有两个问题:
1.很多场景所得到数据并不是固定大小的,例如街景文字基本上其高宽比是不固定的,如下图示红色框出的文字。
2.切割的话很可能会丢失到重要信息
切割图像可能会导致丢失一些重要信息
SPP的提出就是为了解决CNN输入图像大小必须固定的问题,从而可以使得输入图像高宽比和大小任意。
SPP 原理
上图是原文中给出的示意图,需要从下往上看:
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在一起。
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提出主要是为了解决三个问题:
优点:速度增快,精度略有上升
注意包括:
在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激活–>注意力加权操作实现。
空间注意力模块
FPN是自顶向下,将高层的强语义特征传递下来,对整个金字塔进行增强,不过只增强了语义信息,对定位信息没有传递。
PAN (Path Aggregation Network) 就是针对这一点,在FPN的后面添加一个自底向上的金字塔,这样的操作是对FPN的补充,将低层的强定位特征传递上去。
PAFPN结构主要由三部分组成:自顶向下的路径、自底向上的路径和横向连接。通过这三部分结构的协同作用,PAFPN能够充分利用不同层级的特征信息,提升目标检测的精度和速度。
在诸如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 特征:
CBN 交叉小批量标准化
交叉小批量标准化(Cross-Iteration Batch Normalization,简称CBN)是一种深度学习中的归一化技术,旨在解决标准批量归一化(Batch Normalization,简称BN)在小批量尺寸下性能不佳的问题。以下是CBN的详解:
背景:
CBN的核心思想:
CBN的计算步骤:
CBN的优点:
CBN的应用:
CBN可以应用于各种深度学习模型中,特别是那些单个小批量尺寸较小或者使用多个GPU并行训练的场景。
实现细节:
CmBN
交叉小批归一化(Cross-Mini Batch Normalization,简称CmBN)是一种在深度学习中用于提高训练稳定性和性能的归一化技术。CmBN是批归一化(Batch Normalization,BN)的一种改进形式,它特别适用于单GPU训练或小批量尺寸的情况。以下是CmBN的详解:
CmBN的背景:
CmBN的核心思想:
CmBN的计算步骤:
CmBN的优点:
CmBN的应用:
CmBN可以应用于各种深度学习模型中,特别适用于单GPU训练或小批量训练的场景。
总结:
CmBN是一种有效的归一化技术,能够在单GPU训练或小批量训练中提高模型性能,是BN的一个有价值的改进。通过跨小批量聚合统计量,CmBN提供了一种在小批量尺寸受限情况下提高归一化准确性的方法。
yolov3中正负样本的匹配规则是:
yolov3的策略中正样本个数太少,为了平衡正负样本,yolov4中一个gt可以产生多个正样本。
IoU loss 中 IoU 交并比,两个框的交集/并集,有两个缺点:
例如 状态 1,两个框不相交,无论怎样移动两个框,IoU = 0。
例如 状态 2 和 3,两个框相交的情况完全不一样,但是 IoU 相同。
损失函数:
LOSS=L(正样本坐标损失)+L(正样本置信度损失)+L(负样本置信度损失)+L(正样本分类损失)
nms剔除效果太强烈,对于重叠的框直接剔除。而soft-nms对于重叠的框会降低阈值而不是剔除框。
一个成熟的IoU衡量指标应该要考虑预测框与真实框的重叠面积、中心点距离、长宽比三个方面。但是IoU 只考虑到了预测框与真实框重叠区域,并没有考虑到中心点距离、长宽比。
基于此,DIOU-NMS就不仅仅考虑IOU,还考虑两个框中心点之间的距离。如果两个框之间IOU比较大,但是两个框的中心距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。
DIoU (Distance-IoU )。简单地在IoU loss基础上添加一个惩罚项,该惩罚项用于最小化两个bbox的中心点距离。
DIoU公式:
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,放缩过程如下:
FOCUS模块在yoloV5中是在图片进入backbone前,对图片进行切片操作。
具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了4张图片,四张图片互补,长的差不多,但是没有信息丢失,这样使得W,H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
以yoloV5为例,原始的640x640x3的图像输入FOCUS结构,采用切片操作,先变成320x320x12的特征图,再经过一次卷积操作,最终变成320x320x32的特征图。
Focus 的目的是为了增加推理的速度,而不是提高map
Focus结构的优势
在YOLOv5的早期版本中,Focus结构是作为一个独立的模块实现的。但在后续的版本中,为了提高计算效率,特别是考虑到某些硬件对大卷积核的支持更好,Focus结构被一个6x6的卷积层所替代。这个6x6的卷积层在计算上等同于Focus结构的切片和拼接操作,但可能更适合某些GPU硬件的优化。
Focus结构是YOLOv5中的一个创新点,它体现了设计者在保持模型性能的同时对计算效率的重视。通过这种方式,YOLOv5能够在资源受限的设备上实现高效的目标检测。
spp原来并行的结构改成了串行结构,减少了计算量(速度更快,f即fast),而且发挥spp相同的作用。
优点:
串联的好处在于通过三个55的卷积核就能替代之前的SPP中55 、99、1313 三个卷积核,从卷积核的个数来看,参数会小很多。
多尺度训练对全卷积网络有效,一般设置几种不同尺度的图片,训练时每隔一定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。
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)
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中一个gt最多可以匹配3 * 3 * 3 = 27个anchor
负样本:所有的anchor,选中为正样本的,剩余anchor都是负样本
忽略样本:yolov5中没有忽略样本
定位损失
定位损失使用的CIOU loss,CIOU考虑了重叠面积,中心点距离,长宽比。
边界框回归:
模型的损失计算包括3个方面,分别是: 1. 定位损失 2. 分类损失 3. 置信度损失 本篇主要讲解yolov5中损失计算的实现,包括损失的逻辑实现,张量操作的细节等。