在 YOLO(You Only Look Once)网络的后续版本(如 YOLOv3、YOLOv4)中,残差连接(Residual Connection)被引入以改进网络的深度和性能。残差连接最初由 ResNet 提出,旨在解决深度网络的梯度消失问题,同时提高网络的训练效率和性能。在 YOLO 中使用残差连接的主要目的是增强特征提取能力并保持稳定的梯度传播,尤其是在处理复杂场景时。
在 YOLO 中,残差连接的作用类似于 ResNet,它通过在某些层之间跳过连接输入,直接将输入信息传递到后面的层。这可以避免信息在深层网络中丢失。对于 YOLOv3 及之后的版本,通常在每一个卷积层后引入残差块(Residual Block)。残差块的结构如下:
y = f ( x ) + x y = f(x) + x y=f(x)+x
其中:
引入残差连接的主要目的有以下几点:
改善梯度传播:在深层神经网络中,梯度随着网络深度的增加可能会逐渐变得非常小(即梯度消失问题)。残差连接允许梯度更稳定地从网络后层反向传播回前层,减轻了这一问题。
提升模型性能:YOLO 的残差块帮助模型保留更多的低层特征,使得网络在处理不同尺度和复杂性的目标时更有效。尤其是对于小目标,残差连接可以让模型保留更多的细节信息。
简化训练过程:残差连接使得网络的训练更加稳定,允许模型使用更深的网络架构(如 YOLOv3 中引入了 53 层深的 Darknet-53 作为特征提取器),而不会导致性能下降或训练困难。
在 YOLOv3 和 YOLOv4 中,残差块的结构与 ResNet 中的残差块非常相似,通常包括两个卷积层、Batch Normalization 和 Leaky ReLU 激活函数。具体步骤如下:
这种结构允许网络在进行非线性变换的同时,保留原始输入的信息。
YOLOv3 使用了 Darknet-53 作为骨干网络,Darknet-53 是由 53 层卷积组成的深度网络,其中多个残差块相互堆叠而成。每个残差块可以帮助模型在深层次上提取更丰富的特征,同时保持输入信息的完整性。
YOLOv4 继续优化了残差连接,并结合了 CSPNet(Cross Stage Partial Network)结构,在保持性能的同时减少计算复杂度。这使得 YOLOv4 的推理速度更快,但检测效果更好。
YOLO(You Only Look Once)是一种实时目标检测算法,它通过将整个图像作为输入,并在一次前向传播中同时进行分类和定位。YOLO的网络架构简洁高效,能够在保持较高准确率的同时,实现实时检测。
YOLO的网络架构可以分为三个主要部分:
YOLO的特征提取网络是一个卷积神经网络(CNN),通常基于经典的网络架构(如Darknet、ResNet等)。这个部分的主要任务是从输入的图像中提取高级特征。
$416 \times 416$
。特征提取部分的输出是一个特征图,它总结了输入图像中的信息,并传递到预测头进行进一步处理。
YOLO的关键在于其创新的检测头设计,它通过回归来同时预测每个区域的边界框和类别。每个位置预测的内容包括:
(x, y)
和宽高 (w, h)
。具体的步骤为:
$S \times S$
个网格,每个网格预测多个边界框。(x, y)
,宽高 (w, h)
,以及一个置信度分数。YOLO的后处理步骤包括:
YOLO使用的是一种全局的框架来检测目标,它在一次前向传播中完成所有的目标预测。这种架构让YOLO相比其他目标检测算法,如R-CNN、Faster R-CNN,具有更快的检测速度。
Softmax 是一种常用于多分类问题的激活函数,通常出现在深度学习模型的输出层。它的作用是将一个包含未归一化数值(即 logits)的向量转换为概率分布,即每个输出值的范围都在 [ 0 , 1 ] [0, 1] [0,1] 之间,并且这些输出值的和为 1。这样就可以表示每个类别的预测概率。
Softmax 函数的定义如下:
σ ( z i ) = e z i ∑ j = 1 N e z j \sigma(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{N} e^{z_j}} σ(zi)=∑j=1Nezjezi
其中:
σ ( z i ) = e z i − max ( z ) ∑ j = 1 N e z j − max ( z ) \sigma(z_i) = \frac{e^{z_i - \max(z)}}{\sum_{j=1}^{N} e^{z_j - \max(z)}} σ(zi)=∑j=1Nezj−max(z)ezi−max(z)
Softmax 通常用于多分类问题的输出层,比如在分类任务中,将模型的最终输出通过 Softmax 转换为各个类别的概率,然后根据概率的大小来决定最终的分类结果。
假设我们有一个 3 类分类问题,模型的输出 logits 为:
z = [ 2.0 , 1.0 , 0.1 ] z = [2.0, 1.0, 0.1] z=[2.0,1.0,0.1]
经过 Softmax 转换后的结果为:
σ ( z ) = [ e 2.0 e 2.0 + e 1.0 + e 0.1 , e 1.0 e 2.0 + e 1.0 + e 0.1 , e 0.1 e 2.0 + e 1.0 + e 0.1 ] \sigma(z) = \left[ \frac{e^{2.0}}{e^{2.0} + e^{1.0} + e^{0.1}}, \frac{e^{1.0}}{e^{2.0} + e^{1.0} + e^{0.1}}, \frac{e^{0.1}}{e^{2.0} + e^{1.0} + e^{0.1}} \right] σ(z)=[e2.0+e1.0+e0.1e2.0,e2.0+e1.0+e0.1e1.0,e2.0+e1.0+e0.1e0.1]
BOF指的是一种通过改进模型训练过程或数据增强技术来提升模型性能的方法,而无需增加推理时的计算量或模型复杂度。BOF 主要集中在优化训练流程和提升模型鲁棒性,而不改变推理时的架构或计算成本。
Bag of Freebies 的例子包括:
通过这些“免费”的技术,可以在不增加推理时的开销的情况下,提高模型的准确性和鲁棒性。
是目标检测算法中的一种技术,类似于 Bag of Freebies (BOF),其目标是通过在训练过程中不增加推理时间的情况下提升模型性能。与 BOF 强调优化已有数据的使用方式不同,BOS 更注重特征提取或网络结构的调整。具体来说,它可以通过设计特定的网络结构、增加有效的层次等方式来优化性能。
BOS 常被用于卷积神经网络(CNN)和 YOLO 等目标检测算法中,以提高检测精度而不增加计算开销。这些“specials”通常包括创新的激活函数、归一化层、或者注意力机制,帮助模型更好地学习目标特征。
PAN(Path Aggregation Network)是一种用于目标检测任务的网络架构,旨在增强特征图的表达能力和上下文信息。PAN 主要通过路径聚合机制来结合不同层次的特征信息,从而提高检测精度。以下是 PAN 的核心概念和工作原理:
PAN(Path Aggregation Network)是一种用于目标检测任务的网络架构,旨在增强特征图的表达能力和上下文信息。PAN 主要通过路径聚合机制来结合不同层次的特征信息,从而提高检测精度。以下是 PAN 的核心概念和工作原理:
路径聚合:
– PAN 通过将不同层次的特征图进行融合,以利用不同层次的语义信息。这种机制能够捕捉到更加丰富的上下文信息,并且加强了特征图的表达能力。
特征融合:
– PAN 通过多种方式将高层特征(语义信息更丰富)与低层特征(包含更多的空间细节)进行融合。这样的融合使得检测器可以更好地处理不同尺度的目标。
特征提取:
– 从图像中提取不同层次的特征图。高层特征通常语义信息丰富但空间分辨率低,低层特征则空间分辨率高但语义信息较少。
特征融合:
– 使用路径聚合网络将这些不同层次的特征进行融合。常见的融合方式包括自底向上的路径聚合和自顶向下的路径聚合。
自底向上聚合:
– 从低层特征图开始,通过卷积和上采样等操作,将低层特征逐步向高层特征图传递,直到达到目标分辨率。
自顶向下聚合:
– 从高层特征图开始,通过卷积和下采样等操作,将高层特征逐步向低层特征图传递。这有助于融合高层的语义信息。
特征融合和预测:
– 将融合后的特征图用于目标检测模型进行预测。通过这种特征融合机制,PAN 可以提高模型对不同尺度和复杂背景目标的检测能力。
PAN 主要用于目标检测任务中的特征图增强,例如在像 YOLO 和 Faster R-CNN 等目标检测模型中,PAN 可以作为一种有效的特征融合策略,提升模型的检测精度和鲁棒性。
MISH(Monotonic Inverted-Swish)是一种激活函数,用于提升深度神经网络的性能。它是 Swish 函数的改进版,具有更好的性能和稳定性。
MISH 函数定义为:
MISH ( x ) = x ⋅ tanh ( softplus ( x ) ) \text{MISH}(x) = x \cdot \tanh(\text{softplus}(x)) MISH(x)=x⋅tanh(softplus(x))
其中:
平滑性:
单调性:
非线性:
自适应性:
与传统的 ReLU 激活函数相比,MISH 在多个任务上(如图像分类、目标检测)通常能够提供更好的性能。这是因为 MISH 在处理负值和较小值时比 ReLU 更加柔和,从而能够更好地保留有用的信息。
在深度学习框架中,MISH 激活函数可以通过自定义层或函数来实现。例如,在 PyTorch 中,可以自定义 MISH 激活函数如下:
import torch
import torch.nn as nn
class Mish(nn.Module):
def forward(self, x):
return x * torch.tanh(torch.nn.functional.softplus(x))
# 使用 MISH 激活函数的示例
mish = Mish()
input_tensor = torch.tensor([1.0, -1.0, 0.0])
output_tensor = mish(input_tensor)
print(output_tensor)
感觉YOLO好难,万事开头难,一点点做起来吧.想多了都是问题,做多了都是答案,加油.