当前位置: 首页 > news >正文

yolo学习笔记02——yolo简介

系列文章目录

yolo学习笔记01——前置基础


文章目录

  • 系列文章目录
  • 一、yolo是什么?
    • 1.1 背景
    • 1.2 简介
    • 1.3 模型结构
  • 二、yolov1简介
    • 2.1 网络结构
    • 2.2 核心思想
    • 2.3 损失函数
    • 2.4 算法性能对比
    • 2.5 总结
  • 三、yolov2简介
    • 3.1 网络结构
    • 3.2 优化策略
    • 3.3 输入端优化
      • 多尺度训练
      • 高分辨率分类器
    • 3.4 检测头优化
      • 检测训练
      • Convolutional With Anchor Boxes
      • Direct location prediction
    • 3.5 passthrough
    • 3.6 输出特征
    • 3.7 性能对比
  • 四、yolov3简介
    • 4.1 网络结构
    • 4.2 特征输出
    • 4.3 特征融合
    • 4.4 多尺度预测
    • 4.5 性能对比
  • 五、yolov4简介
    • 5.1 数据增强
      • CutMix
      • Mosaic
      • DropBlock 正则化
      • Class label smoothing
      • CmBN
      • Mish 激活函数
    • 5.2 损失函数
      • IoU Loss
      • GIoU Loss
      • DIoU Loss
      • CIoU Loss
    • 5.3 网络结构
      • 整体结构
      • CSPNet
      • SPPNet
      • FPN+PAN
    • 5.4 性能评估
  • 总结


一、yolo是什么?

1.1 背景

在YOLO出现之前,主流目标检测方法是两阶段检测器,需要先生成候选区域(region proposals),再进行目标识别,这两个阶段是分离的。例如RCNN系列算法(RCNN、Fast RCNN、Faster RCNN)都需要先通过Selective Search等方法生成约2000个候选区域,然后对每个区域进行特征提取和分类,导致处理流程冗长复杂。

由于需要对每个候选区域单独处理,传统深度学习方法的检测速度非常有限。例如Faster RCNN在GPU上也只能达到5-7 FPS,无法满足实时检测需求。检测过程需要"多次查看"同一图像的不同区域,效率低下。

两阶段方法需要分别训练区域建议网络和分类网络,难以实现端到端的训练和优化,模型调参复杂,训练过程繁琐。

1.2 简介

YOLO(You Only Look Once)是一系列基于卷积神经网络的实时目标检测系统,最初由Joseph Redmon等人于2015年提出。作为一种革命性的目标检测算法,YOLO通过单次图像处理即可完成物体识别与分类,极大提高了检测效率。与传统的RCNN、Fast RCNN和Faster RCNN等需要多阶段处理的方法不同,YOLO将物体检测直接视为回归问题求解。

  • 核心思想:
  • 回归框架:YOLO 将目标检测任务视为一个单一的回归问题,直接从输入图像中预测边界框的位置和类别。
  • 端到端优化:由于整个检测流程是由一个单一神经网络完成的,因此可以对整个检测流水线进行端到端的优化,从而提高检测性能。
  • 实时检测:YOLO 能够在一次前向传播中同时预测多个边界框及其对应的类别,这使得它在速度上具有显著优势,特别适合于实时应用

1.3 模型结构

YOLO(You Only Look Once)是一类单阶段目标检测器(One-stage Detector),其核心特点是速度快、端到端推理。其网络结构通常由以下 三个主要模块 组成:Backbone(主干网络)、Neck(颈部网络)、Detection Head(检测头)。
在这里插入图片描述
内部结构图:
在这里插入图片描述

  • Backbone network
    Backbone network,即主干网络(骨干网络),目标检测网络最为核心的部分,主要是使用不同的卷积神经网络构建。主要任务是特征提取,即从输入图像中提取特征信息,这些特征通常包含丰富的信息,能够帮助后续模块进行目标检测。
  • Neck network
    Neck network,即颈部网络,主要对主干网络输出的特征进行整合。主要任务是特征融合,将主干网络提取的多尺度特征进行融合,以增强特征的表达能力和鲁棒性。
  • Detection head
    Detection head,即检测头,在特征之上进行预测,包括物体的类别和位置。检测头的主要任务是基于融合后的特征图,通过回归任务预测边界框的坐标,通过分类任务预测目标的类别,生成最终的检测结果,包括边界框和类别。

二、yolov1简介

YOLOV1 论文地址

YOLOv1 的设计灵感来自用于 GoogLeNet 模型。

2.1 网络结构

其网络结构如下:
在这里插入图片描述

2.2 核心思想

YOLOv1 采用的是将一张图片平均分成为 S x S 的网格(论文中的设置是 7 x 7),每个网格分别负责预测中心点落在该网格内的目标。

  • 每个网格的大小取决于输入图像的分辨率(如 448×448,则每个网格约为 64×64 像素)
  • 每个网格负责检测中心点落在该网格内的目标【只有当目标的中心点坐标落在某个网格中时,该网格才负责预测该目标

大致步骤为:

  1. 将图像划分为 S x S 的网格(论文中的设置是 7 x 7的网格)。如果某个物体的中心落在这个网格中,那么这个网格就负责预测这个物体。
  2. 然后每个网格预测 B 个边框(论文中的设置是 2 个边框),即预测出 7 x 7 x 2 个边框,每个边框都要预测边界框中心点相对于该网格左上角的偏移量(x,y)、边界框的宽和高(w,h)、该边界框的置信度表示框中存在目标的可能性(confidence),共5个量。
  3. 除了边界框信息,每个网格还会预测 C 个类别概率(C 是类别数量,如 VOC 数据集为 20 类),这些概率是基于网格的,而并非“每个框都输出自己的类别”,边界框负责回归位置和大小,但不区分类别。最终输出的边界框类别概率 = 网格类别概率 × 边界框置信度
  4. 总体而言,S x S 个网格,每个网格要预测 B 个边框,还要预测 C 个类。即输出的维度是 S x S x (5 x B + C)。
    在这里插入图片描述

2.3 损失函数

YOLOv1 中的损失函数=定位损失+置信度损失+分类损失,由 5 个部分组成,公式:
λcoord∑i=0S2∑j=0B1ijobj[(xi−x^i)2+(yi−y^i)2]【注解:边框中心点误差】+λcoord∑i=0S2∑j=0B1ijobj[(wi−w^i)2+(hi−h^i)2]【注解:边框宽高误差】+∑i=0S2∑j=0B1ijobj(Ci−C^i)2【注解:有物体时置信度误差】+λnoobj∑i=0S2∑j=0B1ijnoobj(Ci−C^i)2【注解:无物体时置信度误差】+∑i=0S21iobj∑c∈classes(pi(c)−p^i(c))2【注解:网格内有物体时的分类误差】\begin{gathered} \lambda_{\mathbf{coord}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\mathrm{obj}}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right]【注解:边框中心点误差】 \\ +\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[(wiw^i)2+(hih^i)2]【注解:边框宽高误差】+i=0S2j=0B1ijobj(CiC^i)2【注解:有物体时置信度误差】+λnoobji=0S2j=0B1ijnoobj(CiC^i)2【注解:无物体时置信度误差】+i=0S21iobjcclasses(pi(c)p^i(c))2【注解:网格内有物体时的分类误差】
公式解释:

  • λcoord\lambda_{coord}λcoord是一个权重系数,用于平衡坐标损失与其他损失项,论文中设置的值为 5
  • S2S^2S2表示有多少个 grid,
  • B 表示框的个数,在 YOLOv1 中是 2 种,即 B 为 2
  • obj 表示有物体时的情况
  • noobj 表示没有物体时的情况
  • iji jij 表示第 i 个 的第 j 个框
  • 1ijobj1_{ij}^{obj}1ijobj是一个指示函数,当某个边界框负责某个对象时为 1,否则为 0
  • xi和yix_i和y_ixiyi表示实际的坐标,xi^和yi^\hat{x_i}和\hat{y_i}xi^yi^表示预测的坐标
  • wi和hiw_i和h_iwihi表示实际的宽高,wi^和hi^\hat{w_i}和\hat{h_i}wi^hi^表示预测的宽高
  • CiC_iCi表示实际的置信度分数(Ci=Pr(obj)∗IoUC_i=Pr(obj)*IoUCi=Pr(obj)IoU),Ci^\hat{C_i}Ci^表示预测的置信度分数
  • λnoobj\lambda_{noobj}λnoobj一个较小的权重系数,用来减少无对象区域的置信度损失的影响,论文中设置的值为 0.5
  • 1ijnoobj1_{ij}^{noobj}1ijnoobj是一个指示函数,当某个边界框负责某个对象时为 0,否则为 1
  • pi(c)p_i(c)pi(c)是第 i 个网格单元格中对象的真实类别分布,pi^(c)\hat{p_i}(c)pi^(c)是预测的类别概率分布

2.4 算法性能对比

在这里插入图片描述

2.5 总结

  • 优点
    • 实时处理:可达到 45 fps,远高于 Faster R-CNN 系列,轻松满足视频目标检测。
    • 避免产生背景错误:YOLO 的区域选择阶段是对整张图进行输入,上下文信息利用更充分,不容易出现错误背景信息。
  • 缺点
    • 定位精度不够高:由于输出层为全连接层,在检测时只支持与训练图像相同的输入分辨率。
    • 小物体和密集物体检测效果不佳:每个网格单元只能预测两个框,并且只能有一个类,这使得它难以处理成群出现的小对象,例如鸟群。
    • 召回率低:会错过一些实际存在的目标。

三、yolov2简介

YOLOv2 论文地址
YOLOv2 主要是在 COCO 和 ImageNet 数据集上进行训练,由于 YOLOv2 能够检测 9000 个类别,所以 YOLOv2 也被称之为 YOLO9000

3.1 网络结构

DarkNet-19 是 YOLOv2 的主干网络(Backbone),由 Joseph Redmon 等人在 YOLOv2 中提出,用于替代 YOLOv1 中的 GoogLeNet-like 网络。

它的主要特点是:

  • 轻量、高效
  • 使用 BatchNorm(BN)
  • 没有全连接层(FC)
  • 使用全局平均池化(Global Average Pooling, GAP)代替 FC 层进行分类或检测
  • 总共有 19 个卷积层(conv 层) + 5 个 max pooling 层,不包含全连接层(FC)

在这里插入图片描述
Darknet-19 只需要 55.8 亿次操作来处理一幅图像,却在 ImageNet 上达到了 72.9% 的最高准确率和 91.2% 的 top-5 准确率。

Batch Normalization 导致收敛性显著改善,同时消除了对其他形式的规范化的需求。通过在所有卷积层后加 Batch Normalization,mAP 增加了 2%。批量规范化也有助于规范化模型。有了批量归一化,我们可以在不过拟合的情况下去除模型中的dropout。

由于YOLOv2 中移除了最后的全连接层,用了一个全局平均池化层来替换全连接层
故可以不用去 resize image。

3.2 优化策略

YOLOv2 作者通过实验,统计了以下方式对提升模型的 mAP 值的影响。
在这里插入图片描述

  • Batch Norm (批量归一化):在卷积层后加入批量归一化层,可以显著改善模型的收敛性,减少对其它正则化技术(如Dropout)的依赖,同时提升模型精度。
  • Hi-Res Classifier(高分辨率分类器):原始YOLO先在ImageNet上用224x224的输入训练分类网络,然后切换到448x448分辨率进行检测训练。YOLOv2改为直接在ImageNet上用 448x448 输入对分类网络进行微调,让网络卷积核提前适应高分辨率输入。
  • Convolutional(全卷积网络): 原始YOLO最后使用了全连接层,这会固定输入尺寸。YOLOv2移除了全连接层,改用全卷积网络(FCN)结构,只包含卷积和池化层。这为后续的多尺度训练奠定了基础。
  • Anchor Boxes(锚点框): YOLOv1让每个网格直接预测边界框的坐标,难度较大。YOLOv2借鉴了Faster R-CNN的锚点框(Anchor Boxes) 机制。网络不再直接预测框的绝对坐标,而是预测相对于预先定义好的锚点框的偏移量,大大降低了学习难度。
  • New Network(新主干网络): YOLOv2提出了一个新的主干特征提取网络——Darknet-19。它包含19个卷积层,比之前用的GoogLeNet更轻量、更高效,在保证精度的同时大大提升了检测速度。
  • Dimension Priors(维度聚类): 不同于Faster R-CNN手动选择锚点框的尺寸,YOLOv2对训练集上的真实边界框的宽高进行了 K-means聚类,自动找出最具代表性的5个先验框(Priors)尺寸作为锚点框。这样得到的先验框更贴合实际数据。
  • Location Prediction (直接位置预测): YOLOv2没有直接采用Faster R-CNN的预测偏移量方式,而是设计了约束预测公式,将边界框的中心点坐标预测约束在当前的网格内,使得训练初期更稳定。
  • Passthrough (细粒度特征传递): 为了更好地检测小物体,YOLOv2引入了一个Passthrough层,将浅层特征图(高分辨率、低维特征)与深层特征图(低分辨率、高维特征)进行拼接,融合了细粒度的局部信息和高级的语义信息。
  • Multi-Scale (多尺度训练): 得益于全卷积结构,YOLOv2在训练时每隔几次迭代就随机改变输入图像的尺寸(例如从320x320到608x608)。这让模型学会了在不同分辨率下进行预测,从而更加鲁棒。

3.3 输入端优化

多尺度训练

由于yolov2模型只使用卷积层和池化层,因此可以实时调整大小。在模型中进行了五次最大池化操作进行下采样,每次图片宽高缩减为原来的一半,因此模型的输出比输入缩减了32倍。若希望 YOLOv2 能够鲁棒地运行在不同尺寸的图像上,故可以从32的倍数中选取输入图像尺寸。
在这里插入图片描述

高分辨率分类器

高分辨率分类器的思路如下:对于 YOLOv2,首先在 ImageNet 上以 448×448 的完整分辨率对分类网络进行微调,并进行 10 个 epochs 的预训练。这让网络有时间调整其滤波器,以便在更高的分辨率输入下更好地工作。然后,再对检测网络的结果微调。这个高分辨率的分类网络使其 mAP 增加了近 4%。

流程如下:

  • ImageNet 分类预训练

    • 使用 224×224 的图像进行分类预训练(与 YOLOv1 一致)
  • 高分辨率微调(High-Resolution Finetuning)

    • 将网络输入分辨率调整为 448×448
    • 在 ImageNet 上继续微调 10 个 epoch
    • 目标是让网络的卷积滤波器适应更高分辨率的输入
  • 目标检测微调

    • 将微调后的主干网络用于 YOLOv2 的检测任务
    • 在目标检测数据集(如 VOC)上进行微调

3.4 检测头优化

检测训练

对网络进行了修改,去掉了最后一个卷积层,还增加了三个 3×3 的卷积层,每个卷积层有 1024 个过滤器,然后是最后一个 1×1 的卷积层,输出的数量是检测所需的。对于 VOC,预测 5 个框的 5 个坐标,每个框有 20 个类别,所以有 125 个过滤器。最后还从最后的 3×3×512 层向第二个卷积层添加了一个直通层,以便模型可以使用细粒度的特征。
在这里插入图片描述

Convolutional With Anchor Boxes

在 YOLOv2 中,将检测框与 Anchor Box 的偏差(offset)进行回归,并且每个网格指定 5 个 Anchor Box。在训练时,只有最接近 ground truth 的检测框进行损失的计算。引入锚框后,将类别预测机制与空间位置分开处理,单独预测每个锚框的类和目标。和原来的YOLO一样,目标预测仍然预测先验框和真实框的IOU,而类别预测则预测在有目标存在下,该类别的条件概率。

Achor Boxes
在 YOLO2 中引入了 Anchor Boxes(先验框、锚框、候选框)的思想来替代 YOLOv1 中的直接预测 bounnding box 的方式。
在这里插入图片描述
上图中,每个格子会预设多个 Anchor Boxes(YOLOV2 论文中设置 5 个), 他们分别具有不同的尺寸,作为预测边界框的参考模板,YOLOv2 基于 Anchor Boxes 预测相对偏移量并对宽高做调整,使得预测更加灵活,它被用来帮助模型更好地预测不同大小和长宽比的目标。

Dimension Clusters
YOLOv2 使用了 Dimension Clusters 操作初始化锚框的尺寸。对于边界框的聚类,YOLOv2 采用了一种不同的距离度量方法——IoU距离,IoU度量了两个边界框之间的重叠程度。

计算步骤:

  1. 数据准备:从训练数据集中提取所有目标的真实框,这些边界框通常以坐标(x, y, w, h)的形式表示,其中(x, y)是边界框中心的坐标,w 和 h 是边界框的宽度和高度
  2. 初始化:随机选择 k 个边界框作为初始的聚类中心(centroids),YOLOv2 选择的是 5
  3. 分配簇:对于每个训练样本中的边界框,计算它与所有聚类中心的 IoU,并根据1 - IoU的值将其分配到最近的簇中(即IoU最大的那个簇)
  4. 更新聚类中心:对于每个簇,重新计算其聚类中心(centroid),通常是取簇内所有边界框的平均值或中位数
  5. 迭代优化:重复步骤2和3,直到聚类中心不再显著变化或达到预定的最大迭代次数

通过聚类我们可以得到对训练数据最具代表性的5个框。

Direct location prediction

YOLOv2 不是直接预测边界框的位置,而是预测相对于 Anchor Boxes 的偏移量。这意味着每个 Anchor Box 会预测一个小的偏移量,用以调整 Anchor Box 的位置和大小,使之更接近真实的目标框。

位置偏移量
在这里插入图片描述

  • 计算公式如下:
    • tx、tyt_x、t_ytxty是网络预测的中心坐标偏移量
    • cx、cyc_x、c_ycxcy是单元格与图像左上角的偏移量
    • σ\sigmaσ是 Sigmoid 函数,用于将tx和tyt_x和t_ytxty映射到 [0,1] 区间内
    • bx、byb_x、b_ybxby是最终预测的边界框中心坐标
    • bw和bhb_w和b_hbwbh是最终预测编辑框的大小,由于宽高不能为负,故作指数处理。
    • pw和php_w和p_hpwph是 Anchor Box 的宽度和高度
    • tw和tht_w和t_htwth是宽度、高度的相对偏移量
      bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth\begin{aligned} &b_{x} =\sigma\left(t_x\right)+c_x \\ &b_{y} =\sigma\left(t_y\right)+c_y \\ &b_{w} =p_we^{t_w} \\ &b_{h} =p_he^{t_h} \end{aligned} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth

所有上述计算都是基于归一化的坐标和尺寸(即相对于图像宽度和高度的比例),因此,在实际应用中,需要将这些归一化的值转换为像素单位的实际坐标和尺寸。例如,如果图像的宽度和高度分别是 W 和 H,则实际的边界框坐标可以通过以下方式计算:

  • 实际的 x 坐标:X=bx×WX=b_x×WX=bx×W
  • 实际的 y 坐标:Y=by×HY=b_y×HY=by×H
  • 实际的宽度:Width=bw×WWidth=b_w×WWidth=bw×W
  • 实际的高度:Height=bh×HHeight=b_h×HHeight=bh×H

除了上述的边界框坐标和尺寸外,YOLOv2 还会输出一个置信度分数,confidence=Pr(object)∗IOU(b,object)confidence = Pr(object)∗IOU(b,object)confidence=Pr(object)IOU(b,object)。其中Pr(object)表示当前边界框中是否包含一个目标对象的概率(即“有物体”的概率),IOU(b,truth)表示预测框 b 与真实框(ground truth)之间的交并比(Intersection over Union)。

3.5 passthrough

在不断执行卷积的过程中,感受野会越来越大,所以最后一层感受野太大,小目标可能会丢失,于是需要融合之前的特征。YOLOv2 通过直通层(passthrough),将相邻特征堆叠到不同通道上,将高分辨率特征和低分辨率特征串联起来。

具体的做法就是将输出的 13x13 的特征图融合了中间的 26x26 的特征图。过程如下:可以把前面的特征图拆分成和后面特征图大小相同然后和后面的特征相加,这个相加指的是沿通道维度进行拼接(concatenation),形成一个H2×W2×(4C+N)\frac{H}{2}×\frac{W}{2}×(4C+N)2H×2W×(4C+N)的特征图。
在这里插入图片描述
26x26x512 的特征图分别按行和列隔点采样,可以得到 4 个 13x13x512 的特征,把这 4 张特征按 channel 串联起来,就是最后的 13x13x2048 的特征图。
在这里插入图片描述

3.6 输出特征

在 YOLOv2 中,类别变成由 anchor 负责了,每个网格产生 5 个 anchor,每个 anchor 除了产生 4 个定位参数和 1 个置信度参数之外还有 每个类别的条件类别概率。因此输出的维度:S×S×B×(4+1+C)S \times S \times B \times (4 + 1 + C)S×S×B×(4+1+C)

3.7 性能对比

在这里插入图片描述

四、yolov3简介

YOLOv3 论文地址
YOLOv3 在实时性和精确性在当时都是做的比较好的,并在工业界得到了广泛应用。其改进了网络结构,使其更适合小目标检测,改进 softmax,预测多标签任务,其中最显著的改进就是在 3 个尺度上以相同的方式进行目标的检测,每种 3 个锚框,共 9 个。这使其可以检测到不同规模的目标。

4.1 网络结构

在这里插入图片描述
在这里插入图片描述

4.2 特征输出

特征图尺寸越小,感受野越大。因可以将网络中不同感受野大小的特征图提取出来,分别适配不同大小的目标:

  • 52 × 52 感受野小,更适合检测小型目标
  • 26 X26 感受野中等,更适合检测中小型目标
  • 13 × 13 感受野大,更适合检测大型目标
    在这里插入图片描述

4.3 特征融合

FPN(Feature Pyramid Network),就是特征金字塔网络,目标是:融合多尺度特征,使每个尺度的特征图都具备丰富的语义信息,从而提升对不同尺度目标的检测能力,尤其是小目标。

FPN 的主要思想如下:

  • 特征提取:使用骨干网络(如 ResNet、Darknet-53 等)提取不同尺度的特征图。这些特征图通常有不同的分辨率,例如 13x13、26x26 和 52x52
  • 自顶向下路径:从最高层的特征图开始,逐层进行上采样,并与下一层的特征图进行拼接,通过 CBL 模块对拼接后的特征图进行进一步处理,作用是将高层语义信息“传递”到低层,增强低层特征的语义表达能力
  • 横向连接:在每个尺度上,将自顶向下路径的特征图同尺度的骨干网络输出特征图进行通道拼接(Concatenate),作用是融合低层的细节信息
  • 高层的语义信息,提升多尺度检测能力
  • 特征融合:在每个尺度的横向连接后,使用一个 CBL 模块(Conv + BN + Leaky ReLU) 或普通卷积层,对拼接后的特征图进行进一步处理,通常使用 3×3 卷积进行特征融合,作用是增强特征表达能力,减少信息冗余

YOLOv3 采用了 FPN 的设计思想,分别对 16 倍、32 倍以及各自上采样后的结果进行了融合,但是也对其进行了一定的改进,在传统的 FPN 中,特征图通常是通过 加法(Add) 来进行融合的。但在 YOLOv3 中,作者选择使用 通道拼接(Concatenate) 来代替加法操作,以便- 增加特征图的通道数并型能够捕捉到更多的信息避免信息丢失
在这里插入图片描述

  • 1×1 卷积完成通道的一致性
  • 2×up(上采样)完成尺寸的一致性

4.4 多尺度预测

如果输入的是 416×416x3 的图像,YOLOv3 会产生 3 个尺度的特征图,分别为:13×13、26×26、52×52,也对应着网格个数,即总共产生 13×13+26×26+52×52 个网格。对于每个网格,对应 3 个锚框,于是,最终产生了(13×13+26×26+52×52)×3=10647 个预测框,利用阈值过滤掉置信度低于阈值的预选框,每个网格同样最终只预测一个结果,取置信度最大的。

对于每个网格,其都对应一个高维度的 Tensor(C + 5)

  • 5=4+1:中心点坐标、宽、高,置信度。
  • C:C 个类别的类别概率。

4.5 性能对比

在这里插入图片描述

  • AP50:IoU 阈值为 0.5 时的 AP 测量值
  • AP75:IoU 阈值为 0.75 时的 AP 测量值
  • APs:对于小目标的 AP 值
  • APm:对于中等目标的 AP 值
  • APL:对于大目标的 AP 值

五、yolov4简介

YOLOv4 论文地址
YOLOv4 是一种高效且准确的目标检测模型,它在 YOLOv3 的基础上引入了多项改进,旨在提高模型的检测速度和精度,自诩为Optimal Speed and Accuracy of Object Detection(目标检测的最佳速度和最佳精度)。

主要改进点有:

  • 输入端改进:CutMix、Mosaic 数据增强【丰富训练数据集】
  • 主干网络:CSPDarknet53 为 backbone、 SPP 额外添加模块
  • 颈部网络:SPP(Spatial Pyramid Pooling)、PANet(Path Aggregation Network)
  • 检测头:YOLOv3(基于 anchor 的)
  • 损失函数:CIOU(Complete Intersection over Union )损失
  • 激活函数:Mish 激活函数
  • 样本匹配:增加了匹配样本的数量

5.1 数据增强

只需改变训练策略或只增加训练成本的方法称为bag of freebies。目标检测经常采用并符合这个定义的就是数据增强。增加少量的推理成本的插入模块和后期处理方法, 但可显著提高目标检测的准确性,我们称其为Bag of specials。一 般来说,这些插入模块是用来增强模型的某些属性的,如扩大感受野、 引入注意力机制、增强特征整合能力等,而后处理是一种筛选模型预测结果方法。

CutMix

在这里插入图片描述
CutMix数据增强应用于模型中有如下优点:

  • 增强局部特征的学习:通过将不同图像的局部特征混合在一起,模型可 以学习到更多的局部信息
  • 提高训练效率:高价值信息增多,提升训练效率,优化算法性能
  • 防止模型过拟合:通过引入更多样的训练样本,CutMix 能够提高模型的泛化能力,减少过拟合现象
  • 数据稳定:由于采用填充的形式,不会有图像混合后不自然的情形,能够提升模型分类的表现

Mosaic

Mosaic 数据增强则利用了 4 张图片,对 4 张图片进行拼接,每一张图片都有其对应的框,将 4 张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框,然后将这样一张新的图片传入到神经网络当中去学习,这极大丰富了检测物体的背景

  • Mosaic数据增强的具体步骤如下:
    • 首先随机取 4 张图片
    • 分别对 4 张图片进行基本的数据增强操作(包括翻转、缩放以及色域变化等),并分别粘贴至与最终输出图像大小相等掩模的对应位置
    • 进行图片的组合和框的组合

在这里插入图片描述

优点:

  • 增加数据多样性:通过将多张图像混合在一起,生成更多不同的训练样 本
  • 提升模型的鲁棒性:模型在训练过程中见过更多样的图像组合,能够更好地应对不同场景下的目标检测任务
  • 减少过拟合:通过增加数据的多样性,有助于防止模型过拟合,提升泛化能力
  • 减少训练算力:由于一次性可以计算 4 张图片,所以 Batch Size 可以不用 很大,也为 YOLOv4 在一张 GPU 卡上完成训练奠定了数据基础

DropBlock 正则化

DropBlock 是一种用于卷积神经网络的正则化技术,旨在防止过拟合。它通过在训练过程中随机丢弃特征图中的连续区域(块)来增加模型的泛化能力。与传统的Dropout 不同,Dropout 随机丢弃独立的神经元,而 DropBlock 丢弃的是特征图中的连续相邻区域,这样可以更有效地移除某些语义信息,从而提高正则化的效果。

在这里插入图片描述

图(b) 表示 Dropout 、图(c)表示 DropBlock

Class label smoothing

标签平滑(Label Smoothing)是一种正则化技术,用于减少模型在训练过程中对训练数据的过拟合,提高模型的泛化能力。标签平滑的基本思想是通过在训练过程中对标签进行平滑处理,减少模型对单一类别的过度自信,从而使得模型更加鲁棒

标签平滑的工作原理:

  • 在传统的分类任务中,标签通常是以 one-hot 编码的形式给出的。例如,对于一个三分类任务,标签可能是 [1, 0, 0][0, 1, 0][0, 0, 1]。标签平滑通过将这些硬标签平滑为软标签,使得每个类别的概率不再是 0 或 1,而是一个介于 0 和 1 之间的值。
  • 公式:ysmoothed=(1−ϵ)⋅ytrue+ϵKy_{smoothed}=(1-\epsilon)·y_{true}+\frac{\epsilon}{K}ysmoothed=(1ϵ)ytrue+Kϵytruey_{true}ytrue是原始的 one-hot 编码标签;ysmoothedy_{smoothed}ysmoothed是平滑后的标签;ϵ\epsilonϵ是平滑系数,通常是一个较小的正数(例如 0.1);K 是类别的总数。

CmBN

交叉小批量归一化(Cross mini-Batch Normalization,CmBN)会跨多个小批量对均值和方差进行积累和计算,逐渐形成一个全局的均值和方差,从而提升了统计量的稳定性和准确性,减少训练震荡。

Mish 激活函数

与 ReLU 等非平滑激活函数相比,Mish 具有更好的平滑性,平滑的激活函数能够让模型获得更好的非线性,从而得到更好的准确性和泛化,Mish 激活函数的数学表达式为:Mish(x)=x∗tanh(ln(1+ex))Mish(x)=x*tanh(ln(1+e^x))Mish(x)=xtanh(ln(1+ex))
在这里插入图片描述
Mish 函数和 ReLU 一样都是无正向边界的,可以避免梯度饱和。使用了Mish激活函数的 TOP-1 和 TOP-5 的精度比没有使用时都略高一些:
在这里插入图片描述

5.2 损失函数

IOU 损失函数演变的过程如下:IOU => GIOU => DIOU =>CIOU 损失函数,每一种损失函数都较上一种损失函数有所提升。

IoU Loss

IoU 损失定义如下:交集越大,损失越小。
LIoU=1−∣B∩Bgt∣∣B∪Bgt∣\mathcal{L}_{IoU}=1-\frac{|B\cap B^{gt}|}{|B\cup B^{gt}|}LIoU=1BBgtBBgt
缺陷:

  • 情况 1 ,当预测框和目标框不相交时,IoU=0,无法反映两个框距离的远近,此时损失函数不可导
  • 情况 2 和情况 3 的情况,当 2 个预测框大小相同,2 个 IoU 也相同,IOU Loss 无法区分两者位置的差异
    在这里插入图片描述

GIoU Loss

GIoU(Generalized loU)是对 IoU 的改进版本,不仅关注重叠区域,还关注其他的非重合区域,能够更好的反映两者的重合度,即添加了惩罚因子,缓解了 IoU Loss 不可导的问题.图中最大外接矩形为 C,红色区域为差集 A(C-并集),那么给出 GIoU Loss 的表达式如下:LGIoU=1−∣IoU∣+∣A∣∣C∣\mathcal{L}_{GIoU}=1-|IoU|+\frac{|A|}{|C|}LGIoU=1IoU+CA
在这里插入图片描述
缺陷:

  • 下面 3 种情况差集均相等,这个时候 GIoU Loss 就退化为了 IoU Loss,GIoU Loss 也无法反映 3 种情况的好坏,即无法区分相对位置关系
    在这里插入图片描述

DIoU Loss

为了解决 GIoU 遇到的问题,提出了 DIoU Loss(Distance IoU Loss),DIoU Loss 考虑了重叠面积和中心点距离。公式:LDIoU=1−|DIoU|=1−|IoU|+ρ2(B,Bgt)lc2ρ(B,Bgt)表示检测框中心点和真实框中点之间的欧式距离,lc表示最小外接矩形的对角线距离\begin{aligned} &\mathcal{L}_{DIoU}=1-\text{|DIoU|}=1-\text{|IoU|}+\frac{\rho^2(B,B^{gt})}{l_c^2} \\ &\rho(B,B^{gt})\text{表示检测框中心点和真实框中点之间的欧式距离,}l_c\text{表示最小外接矩形的对角}\\&\text{线距离}\end{aligned}LDIoU=1|DIoU|=1|IoU|+lc2ρ2(B,Bgt)ρ(B,Bgt)表示检测框中心点和真实框中点之间的欧式距离,lc表示最小外接矩形的对角线距离
在这里插入图片描述
效果图:
在这里插入图片描述
缺陷:

  • 如下图所示的 3 种状态预测框和真实目标框的中心点距离是相同的,DIoU Loss 也退化成了 IoULoss。如上面提到的目标检测回归函数需要考虑到的 3 种因素,DIoU Loss 没有引入长宽比的衡量。
    在这里插入图片描述

CIoU Loss

为了解决 DIoU 遇到的问题,CIoU(Complete loU) Loss 被提出来,CIoU 在 DIoU 基础上把目标框长宽比的相似程度考虑进去,利用惩罚因子进行约束,宽高比不能为负。YOLOv4 采用 CIoU Loss 做回归损失函数,而分类损失和目标损失都使用的是交叉熵损失。对于回归损失,其数学表达式如下:
LCIoU=1−∣CloU∣=1−∣IoU∣+ρ2(B,Bgt)lc2+αvv=4π2(arctanwgthgt−arctanwphp)2ρ2(B,Bgt),lc2分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离,w和h表示预测框的宽高v是衡量长宽比一致性的参数,wgt,hgt为真实框的宽高,wp,hp为检测框的宽高α是平衡因子,计算公式为v(1−IoU)+v\begin{aligned} &\mathcal{L}_{CIoU}=1-|CloU|=1-|IoU|+\frac{\rho^2(B,B^{gt})}{l_c^2}+\alpha{v} \\ &v=\frac4{\pi^2}\left(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w^p}{h^p}\right)^2 \\ &\rho^2(B,B^{gt}),l_c^2 分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离,w和h表示预测框的宽高 \\ &v\text{是衡量长宽比一致性的参数,}w^{gt},h^{gt}\text{为真实框的宽高,}w^p,h^p\text{为检测框的宽高}\\ &\alpha是平衡因子,计算公式为\frac{v}{(1-IoU)+v} \end{aligned}LCIoU=1CloU=1IoU+lc2ρ2(B,Bgt)+αvv=π24(arctanhgtwgtarctanhpwp)2ρ2(B,Bgt)lc2分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离,wh表示预测框的宽高v是衡量长宽比一致性的参数,wgt,hgt为真实框的宽高,wp,hp为检测框的宽高α是平衡因子,计算公式为(1IoU)+vv

5.3 网络结构

整体结构

YOLOv4 采用了称为 CSPDarknet-53 的新的主干网络结构,它基于 Darknet-53,并通过使用 CSP(Cross Stage Partial)模块来提高特征表示的能力。- YOLOv4 = CSPDarknet53(骨干) + SPP 附加模块 PANet 路径聚合(颈) + Yolov3(检测头)。
在这里插入图片描述
在这里插入图片描述

CSPNet

CSPNet(Cross Stage Partial Network)跨阶段局部网络,主要从网络结构设计的角度解决推理中计算量很大的问题。CSP 在论文《CSP:A New Backbone that can Enhance Learning Capability of CNN 》提出,把 CSP 应用到 ResNe(X)t,模型结构如下图所示:
在这里插入图片描述

CSPNet 的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用 CSP(Cross Stage Partial)模块先将基础层的特征按照通道划分为两部分,一部分直接传递到下一个阶段,另一部分则通过一些卷积层进行处理后再传递到下一个阶段,然后通过跨阶段层次结构将它们合并。

CSP 优点:

  • 增强 CNN 的学习能力,使得在轻量化的同时保持准确性
  • 降低计算成本、内存成本

在这里插入图片描述
在yolov4中CSP具体步骤如下:

  • 通道划分(Split)

    • 输入特征图的通道被平均分成两个部分(通常是 1: 1):
      • Part A:不做任何处理,直接跳过当前模块,传递到最终的拼接层
      • Part B:通过一系列卷积操作(如 Conv + Bottleneck)进行特征提取
  • 特征处理(Transform)

    • Part B 会经过多个标准的 Darknet Bottleneck 模块(类似 ResNet 的残差块)

    • 通常包括:

      • 1×1 卷积降维
      • 3×3 卷积提取特征
      • 可选的残差连接(Residual)
  • 跨阶段融合(Merge)

    • Part APart B 的输出 在通道维度上进行 拼接(Concatenate)

    • 然后通过一个 1×1 卷积 进一步融合特征,输出到下一个阶段

在这里插入图片描述

SPPNet

空间金字塔池化网络(Spatial Pyramid Pooling Network,SPPNet)主要目的是解决图像在输入到卷积神经网络时尺寸不一的问题。通过将不同大小的输入映射到固定长度的输出,SPP 模块使得神经网络能够处理任意大小的输入,从而大大提高了模型的灵活性和泛化能力。YOLOv4 借鉴了 SPP 的思想,SPP 模块被集成在主干网络之后,用于增强模型对多尺度目标的感知能力。
在这里插入图片描述
将经过不同尺度池化后的特征图沿通道维度进行拼接。由于每个池化操作的结果都是 13×13×256,而我们进行了 4 次不同的池化操作(包括原特征图),最终得到的是一个 13×13×(4×256)=13×13×1024 的特征图,在这个过程中,虽然我们改变了特征图的处理方式,但我们并没有改变其空间分辨率(仍然是 13×13),而是增加了通道数(从 256 增加到 1024)。这样做可以有效地增加网络的感受野,并结合了不同尺度的信息,有助于提高模型对于各种大小目标的检测性能。
在这里插入图片描述

FPN+PAN

路径聚合网络(Path Aggregation Network,PAN),在 FPN 的基础之上进一步优化而来,用于在不同尺度的特征图之间进行信息传递和融合,以获取更好的多尺度特征表示。

YOLOV4 中的 PANet 主要由两部分组成:

  • 自顶向下的路径(FPN):这部分与传统的 FPN 类似,从高层(语义信息丰富但空间信息较少)到低层(空间信息丰富但语义信息较少)逐步上采样,并与低层特征图进行融合,生成多尺度的特征图,作用就是负责将深层的强语义特征传递到底层特征图中,增强低层特征图的语义表达能力,有助于检测大目标。
  • 自底向上的路径(PAN):这是 PANet 相对于传统 FPN 的一个重要改进,它从低层到高层逐步下采样,并与高层特征图进行融合,进一步增强特征图的跨尺度信息传递,作用就是负责将浅层的精确定位特征传递到高层特征图中,增强高层特征图的定位能力,有助于检测小目标。

在这里插入图片描述

YOLOv4 在原始 PAN 结构的基础上进行了改进。原本的 PANet 网络的 PAN 结构中,特征层之间融合时是直接通过加法(addition)的方式进行融合的,而 YOLOv4 中则采用在通道方向上进行拼接(Concat)的方式进行融合。

5.4 性能评估

在这里插入图片描述
在这里插入图片描述

COCO 数据集性能对比

总结

本文介绍了yolov1-v4的网络结构,核心思想,性能对比等。


文章转载自:

http://zRJBsfO8.qhmgq.cn
http://iSc5d6ja.qhmgq.cn
http://oPEhlxM7.qhmgq.cn
http://3X2pEH13.qhmgq.cn
http://iYM0Ijdu.qhmgq.cn
http://FWZTJmEg.qhmgq.cn
http://e694y5CU.qhmgq.cn
http://levmg8n5.qhmgq.cn
http://hbMRCMbK.qhmgq.cn
http://fISjjVuf.qhmgq.cn
http://axB77YoY.qhmgq.cn
http://hMbkRIML.qhmgq.cn
http://eGlPdKRH.qhmgq.cn
http://LwkQn9BR.qhmgq.cn
http://3E6cAmVX.qhmgq.cn
http://uRxzsble.qhmgq.cn
http://HxE9Wdqi.qhmgq.cn
http://r2fI27Ac.qhmgq.cn
http://nRQyJJBR.qhmgq.cn
http://oQ6Bgi6J.qhmgq.cn
http://ubplW1Nh.qhmgq.cn
http://06CrvbWF.qhmgq.cn
http://nquom9Ex.qhmgq.cn
http://PVDI727S.qhmgq.cn
http://C4A2uri1.qhmgq.cn
http://fsRSDCpv.qhmgq.cn
http://dZQGSthh.qhmgq.cn
http://gOuHYmq9.qhmgq.cn
http://RS32w6uv.qhmgq.cn
http://cgfdDz71.qhmgq.cn
http://www.dtcms.com/a/379194.html

相关文章:

  • OpenCV 开发 -- 图像算术运算
  • 字符串-43.字符串相乘-力扣(LeetCode)
  • java properties/反射基础
  • solidity的高阶语法4
  • Vue.js Data定义方式对比 data() { return {...} } 与 data: {} 的区别
  • P11961原根判断(1)
  • 特征空间的转换方法 IPM/LSS/Transformer
  • 【Vue3】05-Options API和Composition API的区别
  • 锁框架-面试
  • 电商 API 爬虫高阶技巧:多线程 / 异步请求结合,突破接口频率限制
  • vue两个组件互相引入时候会报错
  • 《芯片封装后未测试品粘连及边缘残胶的多维度工艺与材料失效分析》
  • MySQL基础全面解析
  • 探索容器技术:从LXC到Podman的演进
  • IntelliJ IDEA 启动项目时配置端口指南
  • java 实现rtsp 直播流下载
  • Python高级编程实战:装饰器、迭代器与生成器的深度应用
  • 高级SQL技术综合指南(MySQL)
  • 【51单片机】【protues仿真】基于51单片机电子琴系统
  • 解决idea2021maven依赖导入后还是找不到包,爆红无法导入
  • Netty学习
  • VGGNet:为什么16层简单堆叠能成为CNN经典?
  • 知识图谱RAG
  • 与controller层的接口入参注解@Valid有关的实体类判断空的注解
  • 基于AT89C52单片机的智能蓝牙台灯设计
  • Javaweb前端内容的思维导图
  • PyTorch深度学习实战【10】之神经网络的损失函数
  • 3.前置知识学习
  • Whois查询域名信息
  • 机器学习vs人类学习:人类学习如何借鉴机器学习方法?