yolov4训练总结推荐4篇

发布时间:2024-05-01 00:43:33

yolov4训练总结第1篇

以下是对这四个结构进行的改进: 

基于深度学习的现在目标检测算法中主要有三个组件:Backbone、neck和Head 

基于深度学习的目标检测模型的结构是这样的:输入->主干->脖子->头->输出。主干网络提取特征,脖子提取一些更复杂的特征,然后头部计算预测输出。

    Yolov4中使用的mosaic是参考2019年底提出的Cutmix数据增强的方式,但Cutmix只使用了两张图片进行拼接,而mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。

1.为什么要进行mosaic数据增强呢?

2.进行mosaic数据增强的优点

 Cutmix数据增强这种增强方式v4中没有使用到,这里介绍一下:

   数据增强的原因:在平时项目训练时,小目标的ap一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。Coco数据集中小目标占比达到,数量比中目标和大目标都要多。但在所有的训练集图片中,只有的图片有小目标,而中目标和大目标的分布相对来说更加均匀一些。    核心思想:将一部分区域cut掉但不填充0像素,而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配。    处理方式:对一对图片做操作,随机生成一个裁剪框Box,裁剪掉a图的相应位置,然后用B图片相应位置的Roi放到a图中被裁剪的区域形成新的样本,groundtruth标签会根据patch的面积按比例进行调整。

另外两种数据增强的方式:(1)mixup: 将随机的两张样本按比例混合,分类的结果按比例分配(2)Cutout: 随机的将样本中的部分区域Cut掉,并且填充0像素值,分类的结果不变

自对抗训练也是一种新的数据增强方法,可以一定程度上抵抗对抗攻击。其包括两个阶段,每个阶段进行一次前向传播和一次反向传播。

 通过引入噪音点进行数据增强:

1.Bn: 无论每个batch被分割为多少个minibatch,其算法就是在每个minibatch前向传播后统计当前的Bn数据(即每个神经元的期望和方差)并进行nomalization,Bn数据与其他minibatch的数据无关。2.CBn: 每次iteration中的Bn数据是其之前n次数据和当前数据的和(对非当前batch统计的数据进行了补偿再参与计算),用该累加值对当前的batch进行nomalization。好处在于每个batch可以设置较小的size。: 只在每个Batch内部使用CBn的方法,若每个Batch被分割为一个minibatch,则其效果与Bn一致;若分割为多个minibatch,则与CBn类似,只是把minibatch当作batch进行计算,其区别在于权重更新时间点不同,同一个batch内权重参数一样,因此计算不需要进行补偿。 

   原因:对预测有100%的信心可能表明模型是在记忆数据,而不是在学习。如果训练样本中会出现少量的错误样本,而模型过于相信训练样本,在训练过程中调整参数极力去逼近样本,这就导致了这些错误样本的负面影响变大。

   具体做法:标签平滑调整预测的目标上限为一个较低的值,比如。它将使用这个值而不是来计算损失。这样就缓解了过度拟合。说白了,这个平滑就是一定程度缩小label中min和max的差距,label平滑可以减小过拟合。所以,适当调整label,让两端的极值往中间凑凑,可以增加泛化性能。

 ​​​

   CSpDarknet53是在Yolov3主干网络Darknet53的基础上,借鉴2019年CSpnet的经验,产生的Backbone结构,其中包含了5个CSp模块。

1.为什么采用CSp模块?

yolov4训练总结第2篇

使用CioU,CioU考虑了与anchorbox之间的三个因素分别为:重叠面积、中心点距离、宽高比。惩罚项作用是控制预测框的宽高能够尽可能快速地与真实框的宽高接近。

loss公式如下:

yolov4训练总结第3篇

总体思想:YoLo将全图划分为S×S的格子,每个格子负责对落入其中的目标进行检测,一次性预测所有格子所含目标的边界框、定位置信度、以及所有类别概率向量。

经过Cnn:24个卷积层+2个全连接层

一些卷积层交替使用1×1的reduction层以减少特征图的深度。对于最后一个卷积层,它输出一个形状为(7,7,1024)的张量。然后张量展开。使用2个全连接的层作为一种线性回归的形式,它输出7*7*30个参数,然后reshape为7*7*30

进行7×7×2边界框预测。将具有高的框置信度得分(大于)的结果作为最终预测

损失函数

只有cell内存在目标才计算所有损失,当cell内label不存在物体中心,则只计算置信度损失

1)定位损失

这里不希望在大框和小中同等地加权绝对误差。即不认为大框中的2像素误差对于小框是相同的。

为了部分解决这个问题,YoLo预测边界框宽度和高的平方根,而不是单纯的平方和。另外,为更加强调边界框的精度,将损失乘以(默认值:5)

2)置信度损失(是指框的置信度)

若cell对应标签中有物体中心点落入(即正样本),则损失函数为上面的部分,正样本就是1,负样本就是0

若没有(即负样本),损失函数即为下面的部分,这个分开是通过前面的示性函数实现的

大多数框不包含任何目标。这导致类不平衡问题,即训练模型时更频繁地检测到背景而不是目标。为了解决这个问题,将这个损失用因子(默认值:)降低。

这里的应该就是预测出的框和Gt的ioU(?),但是预测阶段怎么算

3)分类损失

如果检测到目标,则每个单元格的分类损失是每个类别的条件类别概率的平方误差:

测试阶段(inference)

先经过网络,得到的矩阵

对于每一个cell有2个框,则一共有个,每个框有一个20维(类别数)的向量,向量的值就是20个classscores,如下图计算所示

通过非极大值抑制(nmS)

假设对于狗这个类别每个bbbox中狗的是这样排列的

1)set0ifscore

2)sort

3)nmS对与ioU>的两个框保留较大的那个

4)然后挑出有score大于0的框,框的类别为框向量排序中最大的那个

问题

1)这个论文里有写,但是我好像没找到那里用了,这个有ioUtruth_pre应该是train里面的,但是train的损失函数里面也没有用到这个

解决的blog

2)为什么原图resize后经过一层卷积是算出来是224(),我算的都是222

公式?

3)框的置信度得分在预测阶段怎么算

p(obj)

yolov4训练总结第4篇

多尺度融合

yolov3输出了3个不同尺度的特征,y1,y2和y3的深度都是255,边长的规律是13:26:52:对于CoCo类别而言,有80个类别,所以每box应该对每个类别都输出一个概率。yolov3设定的是每个网格单元预测3个边界框,所以每个边界框有(x,y,w,h,o)五个基本参数,然后还要有80个类别的概率。所以3*(5+80)=255。

YoLov3采用了多尺度的特征融合,所以边界框的数量要比之前多很多,以输入图像416*416为例:(13*13+26*26+52*52)*3=10647比13*13*5多很多

使用K-means聚类,预先选择9个聚类簇

Darknet53

Darknet-53主要由3×3和1×1滤波器组成,具有residual连接,如Resnet中的残差结构

整个v3结构里面,是没有池化层和全连接的,是全卷积的结构。前向传播过程中,张量的尺寸变换是通过改卷积核步长来实现比如stride=(2,2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。v3也和v2一样,backbone都会将输出特征图缩小到入的1/32。所以,通常都要求输入图片是32的

损失函数

YoLov3使用逻辑回归(logistic)预测每个边界框的目标性得分(objectnessscore)。

根据objectnessscore来区分正负以及忽略样本,来计算损失函数。正样本示性函数为1,负样本示性函数为0

overview:

1)如果边界框先验(锚定框)与Gt目标比其他目标重叠多,则相应的目标性得分应为1。

2)对于重叠大于预定义阈值(默认值)的其他先验框,不会产生任何代价。

3)每个Gt目标仅与一个先验边界框相关联。如果没有分配先验边界框,则不会导致分类和定位损失,只会有目标性的置信度损失。

4)使用tx和ty(而不是bx和by)来计算损失。

a)定位损失

与yolov1不同的就是采用了anchor的offset来做回归的值以及\lambda的值不同

b)置信度损失

与v1基本相同,v1的1^{noobj}前面有的系数

c)分类损失

这里是对每个类别采用binarycross-entropyloss

负样本的objectness是零,故不会有分类损失。通过示性函数体现

eg.

概率加起来可能会大于1

问题

1)正样本负样本的定义?

2)多尺度(Fpn)怎么融合

不是合并的问题,三个输出分别为13*13,26*26,52*52,深度为255(每个格子三个框的参数),这里的框是通过深度体现的。

所以最后就是有(13*13+26*26+52*52)*3=10647个框,然后就是按条件对这些框进行选择。13*13就是用来找大目标的,52*52生成的框就是用来找小目标的

Fpn的实现原理