首页 > 编程知识 正文

yolov4训练自己的数据,yolov3什么时候出来的

时间:2023-05-04 19:24:09 阅读:11547 作者:135

YOLO系列有版本,分为v1、v2、v3、v4四个版本,因此需要从论文开始分析。 本文从实战入手,分析YOLOv3的原理。

代码地址: https://github.com/Runist/YOLOv3

1、YOLOv3网络结构

主干网(backbone ) ——特征提取YOLOv2的backbone采用DarkNet19,YOLOv3采用DarkNet53。 DarkNet53没有池化层、全连通层,特征图的缩小是通过增加卷积核的步长来实现的。 DarkNet53的每个卷积部分都采用特有的Conv2D Block结构,每次卷积时进行l2正则化,卷积完成后进行。 BatchNormalization标准化和LeakyReLU。 采用FPN思想,输出3个尺度特征层: 13x13、26x26、52x52。 其中13x13适合于检测大目标,52x52适合于检测小目标。 然而,YOLOv2合并所有特征层以仅输出一个预测结果,而v3的三个特征层输出结果。 FPN——到54多尺度预测结果13x13的特征层首先经过1x1的卷积校正信道数目,并且通过上采样校正空间维度的尺寸。 可以将输出结果与26x26的特征层重叠。 融合后,再用3x3卷积对每个融合结果进行5次卷积,达到消除上采样混叠效应的目的。 最后经过3x3和1x1的卷积完成了三个尺度的预测特征图的构建。 很多预测特征图的初学者不知道特征图是什么概念。 以13x13大小的特征图为例,如下图所示。

由于输入图像的尺寸为416x416,因此这里忽略卷积的真实感区域,通过将输入宽度的高度除以特征图宽度的高度来计算416.13=32 (frac { 416 } { 13 }=321-3416=32 ),从而生成特征图上的一个

图中的灰色边框表示与特征层上的实际边框相关的栅格。 但是,实际上并不是所有的格点都有用。 在此图中,坐标信息只存储在红色网格点内,即框最中心的网格点。 因此,根据YOLOv3目标检测的标准可知,物体的中心落在其网格点,并且网格点识别并存储所述网格点。 因此,在数据输入时,例如,如果真框坐标为(100,100 ),(200,200 ),则有必要根据YOLOv3的请求将数据转换为特征层上的对应的网格点。

“预边框”(Anchor ) Anchor是预设的检测边框(已设置大小和大小),因此在中文中将其翻译为预边框。 检测器可能很难学习任意形状和大小的物体,但检测器比只预测基于先验框的偏移值更容易。 这是因为预测值都为0时,与输出先验框等价,平均更接近现实物体。 在没有预先框架的情况下开始训练时,必须从头学习不同的边界框架的形状。

另一方面,YOLOv3的预框架策略是在所有训练图像的所有框架上进行k均值聚类来选择预框架,论文提出在一个网格点上预框架的数量为5个,这是速度和精度折中的结果。

2、预测结果的分析输出维度从YOLOv3输出的三个特征图shape可以看出,都是(batch_size、xxx、xxx、75 )。 我知道这里的第2、3维是预测特征层的宽度和高度,这75是什么呢?

75可视为3 x 2525,也可分割为20 4 1。 首先,3 x 25之3是指每个特征层上的一个单元格内,将会有3个先验框来预测是否有物体。 其次,20(4) 1、20是指需要预测VOC中的20种目标。 另一方面,4是预测框的4个数据x、y、w、h。 1是指该框内的框达到了物体的可靠度。 所以其实75可以继续分割,根据代码的不同可以说(batch_size、xxx、xxx、3、25 ),在实现上非常灵活。

如果你的数据集更像2、3而不是20个分类,输出特征层的维度当然会不同。 例如,如果只有两个类别,则维是(batch_size、xxx、xxx、21=3*(41 )2) )

物体分类、识别得分以VOC为例,输出有20个,与图像分类中的one-hot相似。 在预测阶段,用sigmoid激活。 但是,不同的是,作为最后的输出,需要乘坐物体的可靠性。 从20个结果中提取最大值最大值的索引,得到了预测的分数和具体的物体分类。

边框回归预测边框回归的思想有点难以理解,但如果明白了的话应该很简单。边框回归最简单的想法就是通过平移加尺度缩放进行微调。边框回归为何只能微调?当预测框与真实框相差不大的时候,让预测框通过平移变换可以认为是线性变换。 从下图来看YOLO的预测框回归。

在YOLO9000之后,神经网络为每个边界框预测四个系数:

t x , t y , t w , t h t_x,t_y,t_w,t_h tx​,ty​,tw​,th​,对应着输出维度中4+1的4。光有这四个系数是不够的。现在我们还需要其他一些参数:

p w , p h p_w,p_h pw​,ph​:为先验框的宽和高 c x , c y c_x,c_y cx​,cy​:这两个是相对于左上角坐标的偏移值,框的中心在哪个格点,偏移就为多少个格点

图中 b x , b y , b w , b h b_x,b_y,b_w,b_h bx​,by​,bw​,bh​是预测框的结果。而 σ ( x ) sigma(x) σ(x)是指激活函数sigmoid, e e e则是指数学自然常数的2.718281828459045。用sigmoid将tx,ty压缩到[0,1]区间內,可以有效的确保目标中心处于执行预测的网格单元中,防止偏移过多。

我们不直接拿预测框和真实框的实际宽高来计算边界框回归,是因为物体分类和识别分数的预测值都是在0-1之间的,如果不对bounding box做归一化处理,那么bounding box loss值将非常大,在整个yolo loss中占主导地位,且会导致训练不稳定。

3、损失函数

YOLOv3的loss function分为3个部分,一个是回归框的损失,第二个是置信度的损失,第三个是分类损失。其中回归框的损失又分为坐标点的损失和回归框的宽高损失。

回归框的损失

首先,我们要知道xy经过神经网络输出是没有经过激活函数的,也就是说输出并不一定在0-1区间,所以我们需要用带有sigmoid激活的损失函数。其次,由于是一个微调的线性回归问题,因此可以选用均方误差,但在复现代码中也可以使用交叉熵损失(tf.nn.sigmoid_cross_entropy_with_logits)。

而wh的输出则没有取值范围的限定,因此我们可以直接使用均方误差(tf.nn.square)进行计算。

值得注意的一点是,因为大框的loss在总的loss中会占比较大比重,所以我们需要使用加权平均法平衡一下回归框的损失,而加权因子:
b o x _ l o s s _ s c a l e = 2 − w × h box_loss_scale = 2 - w times h box_loss_scale=2−w×h

置信度损失、分类损失

这两个比较简单,直接采用交叉熵损失即可。

4、总结

本文基于代码实现进行讲解,并未对论文中一些细节和公式进行展开讨论,但在代码中也有实现,请读者自行查阅相关论文。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。