下午好~ 我的论文【yolo1~4】(第二期)

写在前面:本来是一期的,我看了太多内容了,于是分成三期发吧 TAT (捂脸)


文章目录

  • YOLO系列
    • v1
    • v2
    • v3
    • v4

YOLO系列

v1

You Only Look Once: Unified, Real-Time Object Detection

2015 ieee computer society 12.3 CCF-C

摘要:
YOLO(You Only Look Once)是一种新颖的物体检测方法,它通过将物体检测问题转化为回归问题,直接预测空间分离的边界框和相关的类别概率。这种方法由华盛顿大学、艾伦研究所AI和Facebook AI研究部门共同提出。YOLO具有实时性能,其基本模型可以在45帧/秒的速度下处理图像,而其快速版本甚至可以处理高达155帧/秒的图像,同时保持其他实时检测器的两倍以上的mAP。YOLO的网络架构受到GoogLeNet图像分类模型的启发,但使用1x1的卷积层来替代Inception模块。YOLO的主要优点是速度快,因为它只需要一次前向传播就能完成所有对象的检测。此外,由于它在一个单一的神经网络中集成了多个任务,因此它的模型大小相对较小。然而,YOLO也有一些局限性,例如它对小物体的检测效果不佳,并且对物体的形状和尺度变化敏感。

在这里插入图片描述
简化的流程图。

1.图像调整大小到448×448像素。
2.运行单个卷积神经网络。
3.通过模型的置信度对结果进行阈值化处理。

在这里插入图片描述
展示了模型的工作原理。该模型将检测过程视为回归问题。它首先将图像划分为S x S的网格,并对每个网格单元预测B个边界框、这些边界框的置信度以及C类概率。这些预测被编码为S×S×(B*5+C)张量。

为了评估PASCAL VOC上的YOLO,论文使用S = 7, B = 2。PASCAL VOC有20个标签类,所以C = 20。

模型最终的预测是一个7 × 7 × 30张量

在这里插入图片描述
该网络由24个卷积层和2个全连接层组成。每个卷积层都具有不同的大小和数量的二维卷积,还有一个池化层。

模型设计:输入448x448x3,输出7x7x30

loss设计:

λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj  ( C i − C ^ i ) 2 + ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 \begin{gathered} \begin{aligned}\lambda_{\textbf{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\text{obj}}\left[\left(x_i-\hat{x}_i\right)^2+\left(y_i-\hat{y}_i\right)^2\right]\end{aligned} \\ +\lambda_\mathbf{coord}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^\mathrm{obj}\left[\left(\sqrt{w_i}-\sqrt{\hat{w}_i}\right)^2+\left(\sqrt{h_i}-\sqrt{\hat{h}_i}\right)^2\right] \\ +\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\mathrm{obj}}\left(C_i-\hat{C}_i\right)^2 \\ +\lambda_\text{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\text{noobj }} \left ( C _ i - \hat { C }_i\right)^2 \\ +\sum_{i=0}^{S^2}\mathbb{1}_i^\mathrm{obj}\sum_{c\in\mathrm{classes}}\left(p_i(c)-\hat{p}_i(c)\right)^2 \end{gathered} λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ijobj[(wi w^i )2+(hi h^i )2]+i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj (CiC^i)2+i=0S21iobjcclasses(pi(c)p^i(c))2

我们一步一步分解一下loss函数

S x S 是网格数量,B是每个网格边界框数量,C是这些边界框的类别数量。

S = 7, B = 2,C = 20

x,y,h,w:表示中心位置和长宽

1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj判断第i个网格中第j个bbox是否负责这个object:与object的ground truth box的IOU最大的bbox负责该object

λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \begin{aligned}\lambda_{\textbf{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\text{obj}}\left[\left(x_i-\hat{x}_i\right)^2+\left(y_i-\hat{y}_i\right)^2\right]\end{aligned} +\lambda_\mathbf{coord}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^\mathrm{obj}\left[\left(\sqrt{w_i}-\sqrt{\hat{w}_i}\right)^2+\left(\sqrt{h_i}-\sqrt{\hat{h}_i}\right)^2\right] λcoordi=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=0S2j=0B1ijobj[(wi w^i )2+(hi h^i )2]

含有object的bbox的Confidence预测
∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 \sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^{\mathrm{obj}}\left(C_i-\hat{C}_i\right)^2 i=0S2j=0B1ijobj(CiC^i)2

不含有object的bbox的Confidence预测

λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj  ( C i − C ^ i ) 2 \lambda_\text{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\text{noobj }} \left ( C _ i - \hat { C }_i\right)^2 λnoobji=0S2j=0B1ijnoobj (CiC^i)2

类别预测, 1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj判断是否有object的中心落在网格i中:网格中包含有object的中心,就负责预测该object的类别概率
∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 \sum_{i=0}^{S^2}\mathbb{1}_i^\mathrm{obj}\sum_{c\in\mathrm{classes}}\left(p_i(c)-\hat{p}_i(c)\right)^2 i=0S21iobjcclasses(pi(c)p^i(c))2

IOU是什么?
Intersection over Union(IoU)是一种用于评估目标检测算法性能的常见指标。它通常用于衡量算法检测的边界框(Bounding Box)与实际目标边界框之间的重叠程度。

IoU的计算方式是通过计算两个边界框的交集面积除以它们的并集面积。具体而言,IoU的公式如下:

I o U = A r e a I n t e r s e c t i o n A r e a U n i o n IoU = \frac{Area_{Intersection}}{Area_{Union}} IoU=AreaUnionAreaIntersection

其中, ( A r e a I n t e r s e c t i o n ) (Area_{Intersection}) (AreaIntersection)是两个边界框相交的面积, ( A r e a U n i o n ) (Area_{Union}) (AreaUnion)是两个边界框的并集面积。

IoU的取值范围在0到1之间,其中0表示没有重叠,1表示两个边界框完全重叠。在目标检测任务中,通常将IoU阈值设置为一个特定的值,例如0.5,来判断算法是否成功地检测到了目标。如果IoU大于等于该阈值,则认为检测是正确的,否则认为是错误的。

v2

YOLO9000: Better, Faster, Stronger

Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017, pp. 7263-7271

摘要:

作者采用了一种创新的多尺度训练方法,使得同一个 YOLOv2 模型可以在不同尺寸上运行,提供了在速度和准确性之间的一种简单权衡。

作者尝试了使用 RCNN 的RPN结构,结果显示速度仍然更快。

为了提高 YOLO9000 模型的检测能力,作者提出了一种目标检测与分类联合训练的方法,使得 YOLO9000 能够在没有标记检测数据的情况下预测对象类别。

作者通过对边界框的中心位置使用 sigmoid 函数进行限制,以提高模型的稳定性和预测准确性。

在研究中,作者比较了不同数量的聚类先验框对模型性能的影响,结果显示增加聚类先验框的数量可以提高模型的性能。

此外,作者还提出了一个名为 WordTree 的图像分类模型,利用 WordNet 中的语义关系构建了一个层次结构,从而可以有效地组合不同数据集进行分类。

实验结果显示,在 VOC 2007 数据集上,以 67 FPS 的速度下,YOLOv2 获得了 76.8 mAP,在 40 FPS 的速度下,获得了 78.6 mAP。

对于 YOLO9000 模型,在 ImageNet 检测验证集上获得了 19.7 mAP,尽管只有 44 个类别有检测数据。在其他 156 个类别中,模型的 mAP 为 16.0。尽管 YOLO 只能检测到 200 多个类别,但它成功预测了 9000 多种不同对象类别的检测结果,同时仍然能够实时运行。


图1:YOLO9000。YOLO9000可以实时检测各种各样的对象类。
在这里插入图片描述

图2展示了在 VOC 和 COCO 数据集上进行的聚类盒维度的结果。使用 k-means 聚类在边界框的维度上进行操作,以获取适用于模型的良好先验。在左图中,展示了在不同 k 值下获得的平均 IOU,发现选择 k = 5 在召回率和模型复杂性之间达到了良好的平衡。

右图则展示了 VOC 和 COCO 的相对质心。两组先验都表现出更薄、更高的边界框的倾向,而 COCO 的先验在尺寸上的变化比 VOC 更为显著。

这一聚类分析提供了在不同数据集上调整先验的指导,确保模型能够更好地适应特定任务的边界框形状和大小。

在这里插入图片描述

图3展示了具有尺寸先验和位置预测的边界框。通过预测盒子的宽度和高度作为簇质心的偏移量,实现对边界框尺寸的预测。为了预测框的中心坐标,运用了 sigmoid 函数,将其输出值压缩到 0 和 1 之间。

sigmoid 激活函数的输出与过滤器的位置相乘,从而获得框的中心坐标的预测值。这种方法使能够更精准地定位对象,并有效地捕捉它们的形状和大小。

见图公式:

b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h {\begin{array}{l}\color{red}{\mathrm{b}_x=}\sigma(t_x)+c_x\\\color{red}{\mathrm{b}_y=}\sigma(t_y)+c_y\\\color{red}{\mathrm{b}_w=}p_we^{t_w}\\\color{red}{\mathrm{b}_h=}p_he^{t_h}\end{array}} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth

在这里插入图片描述

图4:VOC 2007的精度和速度

在VOC 2007数据集上,YOLOv2模型的平均精度均值(mAP)达到了78.6%,相比于之前的YOLO模型有显著提升。同时,YOLOv2在保持高精度的同时能够实现较快的检测速度。
在这里插入图片描述

图5:在ImageNet和WordTree上的预测。大多数ImageNet模型使用一个大的softmax来预测概率分布。使用WordTree,我们对共下位词执行多个softmax操作。

WordTree是一个层次模型,它通过在ImageNet中的概念上构建一个层次结构来简化对象检测和分类问题。这个模型利用WordNet中的语义关系,根据视觉名词在WordNet图中的路径到根节点来构建一棵树。在训练过程中,WordTree可以用于结合多个数据集进行分类,只需将数据集中的类别映射到树中的同义词集即可。为了进行分类,我们假设图像包含一个对象:Pr(physical object) = 1。为了验证这种方法,作者使用WordTree将ImageNet和COCO的标签结合起来,训练了一个大型的检测模型。
在这里插入图片描述

图6:使用WordTree层次结构组合数据集。使用WordNet概念图,我们构建了一个视觉概念的层次树。然后我们可以通过将数据集中的类映射到树中的同义词集来合并数据集。这是一个简化的WordTree视图,用于说明。

在这里插入图片描述

v3

YOLOv3: An Incremental Improvement

Computer Science - Computer Vision and Pattern Recognition (CVPR)2018

yolo_v3作为yolo系列最新算法,在继承前作基础上做了一些保留和优化:

  1. 采用单元格划分检测的思路,这个想法从yolo_v1一直延续,只是划分单元格的数量有所变化。

  2. 继续沿用"leaky ReLU"作为激活函数,保持了之前版本的激活方式。

  3. 保持了端到端的训练方式,使用一个loss function来搞定整个训练过程,简化了训练的复杂性,只需要专注输入和输出。

  4. 从yolo_v2开始,引入了batch normalization,将其与leaky relu层结合在每个卷积层之后,用于正则化、加速收敛和防止过拟合。

  5. 引入了多尺度训练策略,权衡速度和准确率。可以在速度和准确率之间进行取舍,追求更快的速度或更高的准确率。

请添加图片描述
模型架构图1

DBL,左下角,也就是代码里的Darknetconv2d_BN_Leaky。简单说,就是卷积+BN+Leaky relu的组合,成了v3最基本的构件。

Resn,这个n是数字,比如res1、res2,一直到res8等等,表示在一个res_block里有多少个res_unit。这是yolo_v3里的大模块,借鉴了ResNet的残差结构。用这种结构让网络深度更深,毕竟从v2的darknet-19到v3的darknet-53,前者可是没这种残差结构的。看图1右下角,看到res_block的构造,其实基本元素还是DBL。

Concat,张量拼接的操作。把darknet中间层和后面某一层的上采样拼接在一起。拼接和残差层的add操作不一样,拼接会增加张量的维度,而add只是简单相加,不改变张量的维度。

Yolo每个版本的提升主要集中在改进主干网络上,从v2的darknet-19到v3的darknet-53。看数字就能看出模型是越做越大的趋势。

Darknet53骨架:
在这里插入图片描述

整个v3结构里,没有用到池化层和全连接层。在前向传播中,通过调整卷积核的步长(例如stride=(2, 2)),实现了张量尺寸的变化。这样的步骤相当于将图像边长缩小了一半,也就是将面积缩小到原来的四分之一。

在yolo_v2中,前向过程的张量尺寸变换通过了5次最大池化操作。而在yolo_v3中,这种变换则是通过卷积核增大步长的方式,同样也进行了5次(需要注意darknet-53最后有一个全局平均池化,但在yolo-v3中并没有考虑这一层,所以张量维度的变化只针对前面的5次)。


对于不适用池化层和全连接层的猜想:

不采用池化层的主要考虑是为了避免信息损失。池化层通过降采样降低了特征图的空间分辨率,可能导致丢失细节和空间信息,这样做有助于提高目标检测的准确性。

避免使用全连接层的原因在于参数量庞大,可能引发过拟合问题,特别是在训练数据有限的情况下。通过采用全卷积结构,可以减少模型参数数量,提高模型的泛化性。

卷积操作相对于全连接层更加灵活和计算效率更高,这有助于在减小特征图尺寸的同时有效地捕捉图像中的局部特征。通过使用卷积核增大步长的方式,实现了灵活性和计算效率的平衡。


Yolo V3的改进之一是引入了三个不同尺度的特征图,即y1、y2、y3,这体现在论文中提到的"predictions across scales"。这一设计受到了FPN(特征金字塔网络)的启发,通过多尺度对不同大小的目标进行检测,较精细的网格单元可用于探测小物体。

y1、y2、y3的深度均为255,且它们的边长遵循规律:13:26:52。对于COCO数据集的80个类别,每个盒子需要输出一个对每个类别的概率。在Yolo V3中,每个网格单元预测3个盒子,每个盒子需要有(x, y, w, h, confidence)这五个基本参数,以及80个类别的概率。这就导致了每个盒子输出255个数值,即3*(5 + 80) = 3 * 85 = 255。


在这里插入图片描述

Yolo V3采用上采样的方式实现多尺度的特征图。结合图1的情况,可以看到图1中的两个张量在拼接时具有相同的尺度(分别是26x26和52x52),通过使用(2, 2)的上采样来确保拼接后的张量具有相同的尺度。与SSD不同,作者并没有直接使用backbone中间层的处理结果作为特征图的输出,而是将其与后续网络层的上采样结果进行拼接,然后再进行处理,形成最终的特征图。


回想一下Yolo V2的边框预测机制:受到Faster R-CNN RPN中anchor机制的启发,但不愿手动设定anchor prior(模板框),于是采用了维度聚类的方法确定anchor box prior。在聚类中,发现选择k=5时的效果不错,因此采用了这个聚类数。然后,由于V2认为anchor机制中线性回归存在不稳定性(因为回归的偏移可以使边框移动到图像的任何位置),所以V2最终采用了自己的方法:直接预测相对位置,即预测边框中心点相对于网格单元左上角的相对坐标。

Yolo V2直接通过预测tx、ty、tw、th、to来确定边框的位置、大小和置信度,无需像RPN中的anchor机制那样遍历每个像素。从下图公式可见,边框的位置、大小和置信度都可通过tx、ty、tw、th、to计算得出。V2以相当直接的方式预测了边框的这些属性。

对于Yolo V3,关于先验框(prior)的处理有明确的解释:选择的先验框数量k为9,对于Tiny Yolo而言,k为6。这些先验框都是在数据集上通过聚类得到的,具体数值如下:
10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 这些先验框(也称为模板框)由两个数字组成,但是一个代表高度,另一个代表宽度。

(注意:9个anchor会被三个输出张量平分的。根据大中小三种size各自取自己的anchor。每个输出y在每个自己的网格都只会输出3个预测框)

pw和ph就是先验框的宽高,通过下图式子进行转化为bw和bh。
在这里插入图片描述

图2:具有维度先验和位置预测的边界框。我们将长方体的宽度和高度预测为与簇质心的偏移。我们使用sigmoid函数来预测框相对于过滤器应用程序位置的中心坐标。(我回头看了下v2,好家伙v2和v3图是一样的)

在Yolo V3中,每次对边框进行预测时,输出与V2相同,都是tx、ty、tw、th、to,然后通过公式1计算出绝对的(x, y, w, h, c)。


在边框预测的过程中,V3采用了logistic regression(逻辑回归)来处理0或1的问题。

逻辑回归用于对锚框周围的区域进行目标性评分(objectness score),即判断这个位置是否有可能包含目标。这一步在进行预测之前执行,它可以帮助过滤掉不太可能包含目标的锚框,从而减少计算量。也就是说如果某个模板框不是最佳的,即使其目标性评分(objectness score)超过我们设定的阈值,我们也不会对其进行预测。

与Faster R-CNN不同,Yolo V3只会操作一个prior,即最佳prior。而逻辑回归用于从9个anchor priors中找到具有最高目标存在可能性得分的那个。逻辑回归通过曲线对prior相对于目标性评分的映射关系进行了线性建模。


loss function:

xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[..., 0:2], from_logits=True)wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh - raw_pred[...,2:4])confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + \(1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5],from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)xy_loss = K.sum(xy_loss) / mf
wh_loss = K.sum(wh_loss) / mf
confidence_loss = K.sum(confidence_loss) / mf
class_loss = K.sum(class_loss) / mf
loss += xy_loss + wh_loss + confidence_loss + class_loss

以上是一段keras框架描述的yolo v3 的loss_function代码。可以从上述代码看出:除了w, h的损失函数依然采用总方误差之外,其他部分的损失函数用的是二值交叉熵。最后加到一起。


YOLO的不同版本(v1、v2、v3等)代表了算法在不同时间点的演进。以下是YOLO版本之间的一些主要区别:

  1. YOLOv1(YOLO):

    • 单一检测尺度: YOLOv1采用单一的检测尺度,将目标检测任务看作回归问题,通过在整个图像上直接预测边界框的位置和类别。
    • Grid Cell: 图像被划分为固定数量的网格单元(grid cell),每个网格单元负责预测一个边界框。
    • 不同尺度的边界框: YOLOv1通过在每个网格单元上预测多个边界框,每个边界框对应不同尺度和宽高比的目标。
    • 非极大值抑制(NMS): 用于去除重叠的边界框,保留置信度最高的框。
  2. YOLOv2(YOLO9000):

    • Anchor Boxes: 引入了锚框(Anchor Boxes),通过预定义一些具有不同尺度和宽高比的锚框,模型可以更好地适应不同形状的目标。
    • Darknet-19: YOLOv2使用了一个更深的卷积神经网络(Darknet-19)。
    • 多尺度训练: 使用不同尺度的图像进行训练,以提高模型的鲁棒性。
  3. YOLOv3:

    • FPN(Feature Pyramid Network): YOLOv3采用了FPN来提取多尺度特征,使得模型能够在不同层次上检测不同大小的目标。
    • 三个不同尺度的检测: YOLOv3输出三个不同尺度的检测结果,分别来自不同层次的特征。
    • 更多的锚框: 引入更多的锚框,提高了模型对不同目标形状的适应能力。
    • YOLOv3还引入了一些其他改进,如多尺度训练、更多卷积层等。

参考资料:https://blog.csdn.net/leviopku/article/details/82660381

v4

在这里插入图片描述

YOLOv4: Optimal Speed and Accuracy of Object Detection

2020年4月,YOLOv4在悄无声息中发布,引起了目标检测领域的广泛关注。在YOLO系列的原作者Joseph Redmon宣布退出CV领域后,表明官方不再更新YOLOv3。然而,在过去的两年中,AlexeyAB继承了YOLO系列的思想和理念,对YOLOv3进行不断改进和开发,并于今年4月发布了YOLOv4,获得了原作者Joseph Redmon的认可。

YOLOv4能够使用传统GPU进行快速准确的训练和测试,实现实时、高精度的目标检测。在与其他最先进目标检测器的比较中,YOLOv4在性能相当的情况下,推理速度比EfficientDet快两倍。相较于YOLOv3,YOLOv4的AP和FPS分别提高了10%和12%。YOLOv4的主要贡献可以总结如下:

  1. 提出了一种实时、高精度的目标检测模型,可使用通用GPU(如1080Ti或2080Ti)进行快速准确的训练。

  2. 在检测器训练阶段,验证了一些最先进的Bag-of-Freebies和Bag-of-Specials方法的效果。

  3. 对SOTA方法进行改进,使其更加高效,更适合单GPU训练,包括CBN、PAN和SAM等。

参考资料:https://zhuanlan.zhihu.com/p/342570549


“Bag of Freebies”(Freebies的袋子)是一个在深度学习领域中用来描述一系列无代价或低代价的技术和方法的术语。这些技术和方法的目的是提高深度神经网络的性能、稳定性和泛化能力,而不会显著增加训练成本或复杂性。

这个术语通常与另一个术语 “Bag of Tricks”(Tricks的袋子)一起使用,它们一起描述了一系列用于改善深度学习模型的技巧和策略。

“Bag of Freebies” 可能包括以下一些常见的技术:

  1. 数据增强:通过对训练数据进行变换,增加模型的鲁棒性。

  2. 学习率调度:动态调整学习率,以提高训练的稳定性和效果。

  3. 权重初始化:使用更有效的权重初始化策略,以加速模型的收敛。

  4. Batch Normalization:在每个小批量数据上进行归一化,有助于加速训练。

这些技术通常被称为 “Freebies”,因为它们是相对低成本的、容易实施的方法,可以在训练过程中“免费”地提高模型的性能。在深度学习社区中,研究人员和从业者经常分享和讨论这些方法,以帮助改进模型的训练和表现。


“Bag of Specials”(Specials的袋子)是深度学习领域中的一个术语,通常与 “Bag of Freebies” 一起使用,用来描述一系列相对于“Freebies”而言代价较高或复杂的技术和方法。这些特殊的技术和方法可能在一定程度上提高模型的性能,但通常需要更多的计算资源、时间或专业知识。

这些技术通常被称为 “Specials”,因为它们相对于 “Freebies” 更为复杂、需要更多的专业知识,或者对计算资源的要求更高。在实践中,选择使用 “Freebies” 还是 “Specials” 取决于具体的问题、数据和可用资源。


通常目标检测器都接收一张图像作为输入,并通过卷积神经网络的主干将特征压缩。在图像分类中,这些主干网络就是网络的末端,可以在其基础上进行预测。
在目标检测中,需要在图像周围绘制多个边界框,并进行分类,因此需要将卷积主干的特征层进行特征融合,这一过程发生在网络的颈部部分。

目标检测可以分为两类:一阶段检测和二阶段检测。检测过程通常在网络的"head"层。
二阶段检测将目标定位和每个边界框的分类任务解耦。
一阶段检测同时对目标的定位和分类进行预测。
YOLO是一种一阶段检测器,因此称为"You Only Look Once"。
Yolov4框架


目标检测器的主干网络通常在ImageNet分类任务上进行预训练。
预训练意味着网络的权重已经被调整以识别图像中的相关特征。
在目标检测的新任务中模型将会被微调。

作者考虑了以下主干网络用于YOLOv4目标检测器。

CSPResNext50
CSPDarknet53
EfficientNet-B3

在这里插入图片描述
CSPResNext50和CSPDarknet53都基于DenseNet。DenseNet的设计旨在通过以下动机连接卷积神经网络中的层:缓解梯度消失问题(在非常深的网络中通过反向传播损失信号是困难的)、增强特征传播、鼓励网络重复使用特征以及减少网络参数的数量。

CSPResNext50和CSPDarknet53的思想是消除DenseNet中的计算瓶颈。在CSPResNext50和CSPDarknet53中,对DenseNet进行了修改,通过复制并发送一个副本,直接发送另一个副本到下一阶段来分离层的特征图。

在这里插入图片描述

在这里插入图片描述

EfficientNet是由Google Brain设计的,主要用于研究卷积神经网络的缩放问题。在扩展ConvNet时,有许多决策可以进行,包括输入大小、宽度缩放、深度缩放以及对上述所有因素进行缩放。EfficientNet论文认为在所有这些因素中都存在一个最优点,并通过搜索找到这个点。

EfficientNet在图像分类方面优于其他同等规模的网络。然而,YOLOv4的作者认为,其他网络在目标检测环境中可能工作得更好,并决定对所有网络进行实验。
基于他们的直觉和实验结果(又称大量实验结果),最终的YOLOv4网络实现了CSPDaknet53作为骨干网络。

在这里插入图片描述


目标检测的下一步是混合和组合ConvNet主干中形成的特征,为检测步骤做准备。YOLOv4考虑了几种颈部组件:

  1. FPN (Feature Pyramid Network): 特征金字塔网络,旨在解决目标检测任务中不同尺度目标的问题,通过构建多尺度的特征金字塔来提高检测性能。

  2. PAN (Path Aggregation Network): 路径聚合网络,用于改善特征传播和整合,特别是在处理不同尺度特征图时。

  3. NAS-FPN (Neural Architecture Search - FPN): 神经结构搜索 - 特征金字塔网络,通过神经网络结构搜索方法来自动搜索和优化特征金字塔网络的结构。

  4. BiFPN (Bi-directional Feature Pyramid Network): 双向特征金字塔网络,是一种改进的特征金字塔网络,旨在更好地处理不同尺度的特征。

  5. ASFF (Adaptive Spatial Feature Fusion): 自适应空间特征融合,用于目标检测中的特征融合,通过自适应地融合不同尺度和分辨率的特征。

  6. SFAM (Selective Feature Aggregation Module): 选择性特征聚合模块,是一种用于自动选择和聚合具有信息丰富性的特征的模块,通常用于图像分类任务中。

颈部的组件通常在层之间上下流动,并且仅连接卷积网络末端的少数层。
在这里插入图片描述

YOLOv4选择PAN作为网络的特征聚合。他们没有写太多关于这一决定的理由。
在这里插入图片描述


YOLOv4部署与YOLOv3相同的YOLO HEAD检测层,都是具有基于锚的检测步骤和三个级别的检测粒度的检测。这里就不细说了。

在这里插入图片描述


YOLOv4采用了一种被称为"Bag of Freebies"的方法。
大多数"Bag of Freebies"都涉及数据增强。
作者对YOLOv4中数据增强的具体细节进行了深入探讨。在此总结这些技术。
在这里插入图片描述
其中许多策略已经为计算机视觉社区所知,YOLOv4只是在验证它们的有效性。新的贡献是 mosaic数据增强,它将四个图像拼接在一起,教会模型找到更小的对象,而不太关注对象周围的周围场景。

在这里插入图片描述

作者在数据扩充方面做出的另一个独特贡献是自我对抗训练(SAT)。SAT的目标是找到网络在训练过程中最依赖的图像部分,然后编辑图像以掩盖这种依赖,迫使网络推广到有助于检测的新特征。

YOLOv4的作者提供了一项消融研究,证明他们使用的数据增强是合理的。
在这里插入图片描述

另一个贡献是CIoU loss函数。YOLOv4的作者使用CIoU损失,它与预测边界框与实际边界框的重叠方式有关。基本上,仅仅查看重叠是不够的,因为在没有重叠的情况下,还想看一下预测框与实际框的距离有多近,并鼓励网络将预测框拉得更接近实际框。当然这涉及到很多数学工程。


YOLOv4还采用了一种被称为"Bag of Specials"的策略,它们在推理时间上只添加了边际的增加,但在性能上有显著提升。

作者尝试了各种激活函数。激活函数在信息通过网络时对特征进行转换。对于传统的激活函数,如ReLU,很难使网络将特征的创建推向最佳点。

Mish激活函数。

在这里插入图片描述

作者使用DIoU NMS(Distance Intersection over Union Non-Maximum Suppression)来分离预测的边界框。在目标检测任务中,网络有时会预测多个边界框,涉及同一个物体。

DIoU NMS是对传统IoU NMS的改进,IoU(Intersection over Union)用于度量两个边界框之间的重叠程度。DIoU引入了边界框中心点的距离,考虑了预测边界框和真实边界框之间的距离,从而更全面地评估边界框的匹配质量。
请添加图片描述
使用YOLOv3,它需要一些更好的NMS
YOLOv4中这不能同时是两种吉普车(绿色标签是Jeep TJ,棕色标签是Jeop YJ)

对于批处理规范化,作者使用了Cross mini batch normalization(CmBN)
在这里插入图片描述

YOLOv4使用DropBlock正则化。在DropBlock中,图像的某些部分被隐藏,使其在网络的第一层中不可见。DropBlock是一种技术,可以迫使网络学习那些它可能不太依赖的特征。例如,您可以将其比喻为一只狗将头部藏在灌木丛后。网络应该能够从狗的躯干以及头部来识别它。
在这里插入图片描述

https://arxiv.org/pdf/1905.04899.pdf?ref=blog.roboflow.com


消融实验
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高云GW1NSR-4C开发板M3核串口通信

1.PLLVR频率计算 高云的M3核要用到PLLVR核,其输出频率FCLKIN*(FBDIV_SEL1)/(IDIV_SEL1),但同时要满足FCLKIN*(FBDIV_SEL1)*ODIV_SEL)/(IDIV_SEL1)的值在600MHz和1200MHz之间。例如官方示例,其输入频率FCLKIN50MHz,要输出80MHz&am…

appium2.0.1安装完整教程+uiautomator2安装教程

第一步:根据官网命令安装appium(Install Appium - Appium Documentation) 注意npm前提是设置淘宝镜像: npm config set registry https://registry.npmmirror.com/ 会魔法的除外。。。 npm i --locationglobal appium或者 npm…

oracle DG 三种应用机制

首先理解不管是哪种机制,oracle都不是从主库直接传归档文件到备库,而是通过网络将主库的redo数据传输到备库: 1、普通DG是主库发生日志切换,备库把接收到的redo数据在备库通过归档进程生成为归档文件进行应用 2、ADG则是备库把接收…

Java技术栈 —— 微服务框架Spring Cloud —— Ruoyi-Cloud 学习(二)

RuoYi项目开发过程 一、登录功能(鉴权模块)1.1 后端部分1.1.1 什么是JWT?1.1.2 什么是Base64?为什么需要它?1.1.3 SpringBoot注解解析1.1.4 依赖注入和控制反转1.1.5 什么是Restful?1.1.6 Log4j 2、Logpack、SLF4j日志框架1.1.7 如何将项目打包成指定bytecode字节…

基于springboot的教学在线作业管理系统(源码+调试)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍…

性能提升100%、存储节约50%!猕猴桃游戏搭载OceanBase开启云端手游新篇章

近日,武汉灵动在线科技有限公司(以下简称“灵动在线”)与 OceanBase 达成合作,旗下品牌猕猴桃游戏的“游戏用户中心(微信小程序)”和“BI 分析报表业务系统“两大关键业务系统全面接入 OB Cloud 云数据库&a…

windows下redis 设置开机自启动

1,在redis的目录下执行(执行后就作为windows服务了) redis-server --service-install redis.windows.conf 2,安装好后需要手动启动redis redis-server --service-start 3,停止服务 redis-server --service-stop

用标记接口定义类型

标记接口是不含有任何方法的接口,它的目的是通过将特定接口应用于类来为该类添加类型信息。以下是一个示例: public interface Drawable {// 标记接口,不包含任何方法 }public class Circle implements Drawable {private int radius;public…

【C++11特性篇】利用 { } 初始化(1)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.回顾C98标准中{}的使用二.一切皆可用…

大创项目推荐 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…

TrustZone之中断及中断处理

一、中断 接下来,我们将查看系统中的中断,如下图所示: 通用中断控制器(GIC)支持TrustZone。每个中断源,在GIC规范中称为INTID,分配到以下三个组之一: • Group0:安全中断,以FIQ方式发出信号 • 安全Group1:安全中断,以IRQ或FIQ方式发出信号 • 非安全Gr…

万兆网络之屏蔽线序接法(上)

可以经常听到用RJ45指代网线,用RJ11指代电话线的,RJ(Registered Jack)即已注册插口,可以简单理解为一种约定就行(参见参考链接) 前一篇已经讲到,网线线对互相缠绕是为了电流方向相反…

netty-daxin-2(netty常用事件讲解)

文章目录 netty常用事件讲解ChannelHandler接口ChannelHandler适配器类ChannelInboundHandler 子接口Channel 的状态调用时机ChannelHandler 生命周期示例NettServer&CustomizeInboundHandlerNettyClient测试分析 ChannelInboundHandlerAdapter适配器类SimpleChannelInboun…

LeetCode-反转链表问题

1.反转链表 题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 思路: 反转链表也就是链表倒置,我一直以来的办法就是先建立一个头节点,之后再遍历链表来进行头插。 代码&#xff1…

比尔盖茨最新文章——AI 将彻底改变计算机的使用形式

最近发现比尔盖茨还在写文章,确实了不起,68 岁的老人家还在坚持输出,除了写文章,比尔盖茨还致力于教育、医疗和卫生等慈善工作,奋斗在一线,看来美国人也延迟退休啊 😅 原文《AI 将彻底改变计算…

Java数据结构篇——单链表的基本操作

1. 前言 在上一篇《Java数据结构篇——实现顺序表的增删查改》,我们已经熟悉了 ArrayList 的使用并且进行了简单的模拟实现。ArrayList底层使用数组来存储元素,由于其底层是一段连续的空间,当ArrayList 任意位置插入或者删除元素时&#xff…

《使用ThinkPHP6开发项目》 - 登录接口一

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 《使用ThinkPHP6开发项目》 - 创建应用-CSDN博客 《使用ThinkPHP6开发项目》 - 创建控制器-CSD…

SystemVerilog基础:并行块fork-join、join_any、join_none(二)

相关阅读 SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html 在第一节中,我们讨论了并行块中的fork-join块和fork-join_any块,了解了它们的差异,本文将继续讨论fork-join_none块的使用。 fork-join_none并行块…

12.12_黑马数据结构与算法笔记Java

目录 079 优先级队列 无序数组实现 080 优先级队列 有序数组实现 081 优先级队列 堆实现 1 082 优先级队列 堆实现 2 083 优先级队列 堆实现 3 084 优先级队列 e01 合并多个有序链表1 084 优先级队列 e01 合并多个有序链表2 085 阻塞队列 问题提出 086 阻塞队列 单锁实…

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具,它能够帮助用户更好地了解和使用产品,提高用户体验。然而,创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法,帮助企业更好地为…