Pytorch机器学习知识

🔥SummaryWriter

SummaryWriter 是 PyTorch 中的一个可视化工具,用于帮助开发者更好地理解和调试他们的模型。可以将训练过程中的结果写入到 TensorBoard 中,以便进行可视化展示和分析。

具体来说,SummaryWriter 用于创建一个写入器,将训练过程中的标量、图像、音频等数据写入到指定的目录下,以供 TensorBoard 进行可视化展示。其中,log_dir 参数指定了写入的目录。

使用 SummaryWriter 的一般流程如下:

  1. 创建 SummaryWriter 对象,指定写入的目录:
from torch.utils.tensorboard import SummaryWriter

log_dir = "logs"
writer = SummaryWriter(log_dir=log_dir)
  1. 在训练循环中,将需要可视化的数据写入到 SummaryWriter 中:
for epoch in range(num_epochs):
    # 训练代码
    loss = ...
    accuracy = ...
    
    # 将训练结果写入 SummaryWriter
    writer.add_scalar("train/loss", loss, epoch)
    writer.add_scalar("train/accuracy", accuracy, epoch)

在上面的例子中,add_scalar 方法用于将标量数据写入到 SummaryWriter 中,第一个参数是数据的名称,第二个参数是数据的值,第三个参数是数据所对应的步数(即训练的 epoch 数)。

  1. 训练结束后,关闭 SummaryWriter
writer.close()

关闭 SummaryWriter 会将写入的数据保存到指定的目录下,以供 TensorBoard 进行可视化展示。

需要注意的是,使用 SummaryWriter 需要先安装 TensorFlow 和 TensorBoard,可以使用以下命令进行安装:

pip install tensorflow tensorboard

另外,SummaryWriter 还有其他方法可以用于写入不同类型的数据,比如 add_image 用于写入图像数据,add_audio 用于写入音频数据等,具体可以参考 PyTorch 官方文档。

使用 SummaryWriter 产生的记录,需要使用 TensorBoard 进行可视化展示。TensorBoard 是 TensorFlow 提供的一个可视化工具,可以用于展示训练过程中的各种指标、模型结构、图像等信息。

要使用 TensorBoard 进行可视化展示,可以使用以下命令启动 TensorBoard:

tensorboard --logdir=<log_dir>

其中,<log_dir>SummaryWriter 中指定的日志目录。启动后,可以在浏览器中访问 http://localhost:6006,即可看到 TensorBoard 的界面。

在 TensorBoard 的界面中,可以选择查看不同的指标、模型结构、图像等信息。比如,在 Scalars 标签页中,可以查看训练过程中的各种指标变化趋势;在 Images 标签页中,可以查看训练过程中生成的图像;在 Graphs 标签页中,可以查看模型结构等。

需要注意的是,TensorBoard 可以读取多个日志目录,可以使用以下命令启动 TensorBoard:

tensorboard --logdir=<log_dir_1>:<log_dir_2>:<log_dir_3>

其中,多个日志目录之间使用冒号分隔。这样,就可以将多个模型的训练结果同时展示在 TensorBoard 中,方便比较和分析。

🔥数据集划分

X_train, X_test, y_train, y_test = train_test_split(features_scaled, targets_scaled, test_size=0.1, random_state=22)

这是使用Scikit-learn库中train_test_split函数将一组特征和目标值数据集按照0.1的比例进行随机拆分,其中被拆分为测试集的数据占原始数据集的10%。该函数返回四个数据集:训练数据集(X_train, y_train)和测试数据集(X_test, y_test)。random_state=22表示设置了随机数种子以确保结果可重现。而features_scaled是进行特征缩放后的特征数据集,targets_scaled是进行目标的缩放后的目标数据集。

🔥dataset和dataloader

在PyTorch中,DatasetDataLoader是用于数据处理和数据加载的两个关键类。

Dataset类是将训练或测试数据加载到模型中的接口。它需要实现__len__()方法和__getitem__()方法,分别提供数据集的大小和数据。

DataLoader类是通过批量加载和并行处理数据增加训练效率的工具。它接受一个Dataset,并允许使用多个进程或线程异步加载数据、并以一定的batch大小进行划分数据集。

简而言之,Dataset负责将数据准备好,DataLoader则从Dataset中获取数据,并将其整理成可供模型使用的批量数据。这样就可以对大规模数据集进行高效的训练了。

  • 以下是一个简单的使用DatasetDataLoader的代码示例:
import torch
from torch.utils.data import Dataset, DataLoader

# 创建自定义数据集类,继承自Dataset,并重载__len__()和__getitem__()方法
class CustomDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets
        
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, index):
        return self.data[index], self.targets[index]

# 创建数据集对象,并设置超参数
data = torch.randn([1000, 10])
targets = torch.randn([1000, 1])
train_dataset = CustomDataset(data, targets)
batch_size = 32

# 使用数据集对象创建数据加载器,并设置超参数
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

# 遍历数据加载器进行模型的训练
for batch_idx, (data, target) in enumerate(train_dataloader):
    # ...

在此示例中,我们首先创建了一个自定义数据集类 CustomDataset,该类继承自Dataset并实现__len__()和__getitem__()方法。然后我们创建了数据集对象并设置了超参数。接下来,我们使用数据集对象创建了数据加载器,并将其用于多批数据的训练过程。在训练过程中,数据加载器会逐步从数据集中提取数据,每个batch大小为32。在此基础上,可以根据实际需求修改DatasetDataLoader的实现方法和超参数,以优化模型训练的效率和精度。

🔥batch

在机器学习中,通常会使用batch(批次)来处理数据。每个batch表示一组数据样本,通常是以矩阵的形式存储。这些样本被分成许多组,并且模型只能在一组中学习模型参数。在完成一组batch的所有样本的训练后,模型将根据损失函数计算一个平均梯度,然后使用这个平均值来更新网络的权重和偏差, 这个过程被称为”批量梯度下降”。

使用batch训练模型的好处包括:

  • 内存效率:每个batch的大小可以控制内存使用,从而避免计算机内存不足或过剩的情况。
  • 训练速度:优化器可以更快地计算每个batch的梯度,从而使模型更容易收敛。
  • 更好的泛化性能:使用batch可以减少过拟合的风险,因为训练数据的随机子集不太可能代表整个数据集,因此该方法有助于提高泛化性能。

通常,batch的大小是可以调节的超参数,因此它可以根据具体问题的复杂性、可用的计算资源和时间限制进行调整。一般来说batch_size越大(即一个batch的数据越多)训练的会越快

🔥正则化

正则化是机器学习领域中用于控制模型复杂度,从而避免过拟合的技术。在许多情况下,我们的模型会以过高的复杂度来拟合训练数据,从而导致模型在新数据上表现不佳。为了解决这个问题,可以采用正则化技术。

正则化通过附加一些限制或惩罚项来约束模型参数的取值范围,从而使其更加趋向于简单的模型。常见的正则化方法有L1正则化和L2正则化。

  • L1正则化:也称为L1范数正则化或Lasso正则化,它向损失函数中添加一个关于权重绝对值之和的惩罚项。L1正则化有助于在优化过程中将某些特征的权重归零,因此该方法还可以用于特征选择。
  • L2正则化:也称为L2范数正则化或Ridge正则化,它向损失函数中添加一个关于权重平方和的惩罚项。L2正则化有助于平滑和缩小权重,从而避免了权重的大幅波动。

通过引入正则化项,我们可以有效控制模型的复杂度,从而减少过拟合并提高模型的泛化能力。因此,正则化被广泛用于机器学习领域中的各种模型中,例如线性回归、逻辑回归、神经网络等。

optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=0.01)

weight_decay 即是正则化,过大可能导致收敛,过小可能没有作用

🔥归一化

Scaler归一化是机器学习中常用的数据预处理技术,它通过对特征值进行线性变换,将特征值缩放到一个给定的范围内。具体来说,Scaler归一化的主要目的是使数据分布在相同的尺度上,从而避免特征之间的数值差异过大而导致算法性能下降。

Scaler归一化方法有多种,其中较常见的有:

  • Min-max Scaler: 缩放数据到指定的最小值和最大值之间(通常为0和1)。
  • Standard Scaler: 将数据缩放到均值为0、方差为1的标准正态分布。
  • Robust Scaler: 将数据缩放到中位数和四分位数之间的距离内,以避免异常值对数据的影响。

反归一化则是将经过Scaler归一化后的结果还原回原始数据的过程。反归一化的目的是得到真实的数据范围和大小,以便对模型的预测结果进行实际含义的解释或可视化。

Scaler归一化和反归一化应该注意以下几点:

  • 归一化和反归一化操作的顺序应该相反,即先进行Scaler归一化处理,再进行反归一化处理。

  • 参数的计算范围应该是基于训练数据计算,然后在训练数据、验证数据和测试数据上进行Scaler归一化和反归一化处理。

  • 一些算法(如决策树)并不需要归一化处理,因为它们对特征之间的比例关系不敏感。相反,某些算法(如KNN)则非常敏感于不同特征的范围差异,因此需要进行Scaler归一化处理。

  • 归一化前要先将所有离散变量数值转换为对应的数值编码,否则这些变量会被误认为连续变量而进行归一化。

  • 下面是一个简单的使用sklearn库进行Scaler归一化的代码示例,它基于Min-max Scaler方法:

from sklearn.preprocessing import MinMaxScaler

# 创建MinMaxScaler对象
scaler = MinMaxScaler()

# 假设我们有一个2D数组X,我们要将每列特征都缩放到[0, 1]范围内
X = [[1, 2], [3, 4], [5, 6]]

# 对数据进行Scaler归一化处理(fit并transform)
X_scaled = scaler.fit_transform(X)

# 输出归一化后的结果
print(X_scaled)

在上面的代码中,我们首先导入了MinMaxScaler类,然后创建了一个该类的对象scaler。接着,我们通过提供一个2D数组X来演示Scaler归一化处理过程。最后,我们使用fit_transform()函数直接对数据进行归一化处理,并输出归一化后的结果。

需要注意的是,在实际应用中,fit_transform()函数的参数通常是训练集或验证集数据。然后,我们可以使用相同的Scaler对象对测试集数据进行Scaler归一化操作。这是因为Scaler对象根据训练集数据计算得出的缩放范围和参考点。

fit()函数用于从训练数据中计算出一些参数或者所需的信息,在fit()函数调用之后,这些参数或信息将被保存在模型对象内部,以供后续的数据转换或预测使用。

transform()函数则是对数据进行某种处理或变换,并输出相应的转换结果。transform()仅仅对数据进行转换处理,不会再次计算参数或信息并更新模型内部状态。

fit_transform()函数则是将fit()transform()两个函数合起来执行。即先使用训练数据来调整模型的参数,然后用该参数对训练数据进行转换得到新的训练数据。运行fit_transform()相当于依次调用fit()transform()函数。

总的来说,fit()fit_transform()适用于模型训练过程中,transform()则适用于模型预测和测试过程中。在使用Scikit-learn库时,通常先使用fit()函数计算训练集所需的参数,然后再使用transform()函数对训练集、验证集和测试集进行数值化处理。

需要注意的是,对于测试集数据需要使用训练集(或验证集)计算得到的参数进行相同的转换处理。这样才能确保训练集、验证集和测试集之间的特征范围一致,避免因特征缩放不一致而导致模型表现不佳。

🔥损失函数和优化器

    criterion = nn.MSELoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

这段代码是使用PyTorch构建神经网络模型时常用的两个组件,分别是误差函数(或损失函数)和优化器。

  • nn.MSELoss()是一个预定义的PyTorch损失函数类,它计算神经网络的MSE(均方误差),即预测值与目标值之间的平均二次差异。我们将使用此损失函数作为神经网络的误差函数来度量模型的训练效果。

  • torch.optim.Adam()是一个预定义的PyTorch优化器类,它实现了Adam优化算法。Adam优化器是一种比较先进的随机梯度下降算法,具有自适应学习速率、加权聚合梯度等特点。我们使用该优化器来更新神经网络的参数,以最小化神经网络的误差函数。

在这里,我们首先定义了一个误差函数criterion,并使用nn.MSELoss()类实例化了它。然后,我们定义了一个优化器optimizer,并使用torch.optim.Adam()类对卷积神经网络model的所有参数进行优化。

除了MSELoss(均方误差损失函数)之外,常见的神经网络损失函数还包括:

  • 交叉熵损失(Cross-Entropy Loss):适用于分类问题的损失函数,通常与Softmax激活函数一起使用,可以度量模型输出概率和目标标签之间的差异。
  • 二元交叉熵损失(Binary Cross-Entropy Loss):适用于二分类问题的损失函数,输出结果限定在[0,1]范围内。可以看作是交叉熵损失在二分类问题上的简化版。
  • 对数似然损失(Negative Log-Likelihood Loss):也是一种适用于分类问题的损失函数,用于衡量模型预测值的概率与真实标签之间的差距。常用于多类别分类问题中,也常与Softmax神经网络结合使用。
  • Hinge Loss:适用于支持向量机(SVM)算法的损失函数,比较适用于处理二分类问题。
  • Kullback-Leibler散度损失(Kullback-Leibler Divergence Loss):也称为KL散度损失或信息增益损失,用于衡量两个分布之间的差异。

这些损失函数都有其适用的场景和特点,需要根据具体的问题和目标选择合适的损失函数进行神经网络训练。需要根据任务和数据类型选取相应的损失函数。

除了Adam优化器之外,还有一些其他常用的优化器,每个优化器适用于不同的神经网络场景:

  • 随机梯度下降(Stochastic Gradient Descent, SGD):是最基本和广泛使用的优化方法之一。其基本思想是根据负梯度方向更新每个参数的值。
  • 动量(Momentum):通过增加之前梯度变化情况的动态平均来保持优化器的动量。它可以在缓解局部极小值和加速收敛两方面帮助优化。
  • Adamax:是Adam算法的一个变种,在横向加权时间步长上进行规范化,并放弃Adam算法的RMS Prop分母项。
  • Adagrad: 用于稀疏数据和问题,对历史梯度进行累积,可以自动调整模型中每个参数的学习率。具有Theano、Pandas 和 Numpy 这三个库
  • Adadelta: 是Adagrad改进的一个算法,将不断累加的历史梯度平方和替换为仅保存固定长度的平方渐变和。
  • AdaGradDelta-SGD、AdaMax和Nadam是针对特定情况和要求做出的修改和改进版本。

需要根据具体情况和任务选择最适合的优化器。在实践中,需要通过反复实验和比较才能确定最优选择。

🔥模型定义(LSTM为例)

class LSTMModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_layers, output_dim):
        super(LSTMModel, self).__init__()
        self.hidden_dim = hidden_dim
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_().to(device)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_().to(device)
        out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))        # lstm层
        out = self.fc(out[:, -1, :])            # 全连接层

这是一个基于LSTM(长短期记忆神经网络)的PyTorch模型。其中__init__()方法定义了LSTM的网络结构,forward()方法实现了LSTM网络的前向传播。输入特征input_dim映射的到lstm模块的hidden_dim个隐藏层神经元,中间经过num_layers层最后映射到output_dim个输出特征

forward()过程中,输入数据x首先通过LSTM层self.lstm进行处理,得到每个时间步骤的隐状态(hidden state)和细胞状态(cell state)。其中,h0c0是初始隐藏状态和细胞状态,通常设置为全零张量。

接着,通过取每个样本(batch)的最后一个时间步骤的隐状态,并通过全连接层self.fc将其映射到输出维度上,从而得到最终的输出。

具体而言,out[:, -1, :]表示取out张量中的每个batch的最后一行,也就是最终时间步骤的所有隐状态,并且通过self.fc层进行线性映射得到模型最终的输出结果。最终输出的形状是(batch_size, output_dim)。

需要注意的是,在PyTorch中的LSTM层中,默认情况下会返回所有时间步骤的输出,而不只是最后一个时间步骤的输出。因此,需要通过out[:, -1, :]来取出最后一个时间步骤的输出。

nn.LSTM

nn.LSTM是PyTorch中实现长短期记忆神经网络(LSTM)的模块。它接受以下参数:

  • input_dim:输入张量的特征维度(即每个时间步骤输入的特征数量)。在应用场景中,可以理解为一个样本输入数据的维度。
  • hidden_dim:LSTM中隐藏状态的维度(也称作LSTM单元个数或输出大小),通常与input_dim的值相近或稍微大一些。
  • num_layers:LSTM的层数,通常选择2层(默认值)到数十层之间,其数目会影响到LSTM提取特征的复杂度和表达能力。
  • batch_first:布尔型变量,默认值是False,表示输入张量的第0维是沿着时间步的(即(batch_size, seq_length, input_dim)),如果将其设置为True,则第0维表示批次大小(即(seq_length,batch_size,input_dim)),在此时需要注意加改变维度。

nn.LSTM()方法还具有其他可选参数,例如dropout(控制在训练期间应用于LSTM输出的丢失率)和bidirectional(是否使用双向LSTM)等等。

该层的输入张量的形状为(seq_len, batch, input_dim)(如果batch_first=False),或者是(batch, seq_len, input_dim)(如果batch_first=True)。该层的输出张量形状为(seq_len, batch, hidden_dim)(如果batch_first=False),或者是(batch, seq_len, hidden_dim)(如果batch_first=True)。LSTM层的输出包括最终的隐状态和细胞状态,可以通过return_sequencereturn_state参数进行控制。

nn.Linear

nn.Linear() 是 PyTorch 中实现线性变换的模块。它接受两个参数:

  • in_features:输入张量的特征维度;在神经网络中通常是该层的输入维度。
  • out_features:输出张量的特征维度;在神经网络中通常是该层的输出维度或者神经元的个数。

在这里,nn.Linear(hidden_dim, output_dim) 表示一个将输入张量从大小为 hidden_dim 的空间转换为大小为 output_dim 的空间的全连接 (Fully Connected) 层或线性层。可以理解为对每个样本进行一次矩阵乘法,并加上偏置项(bias)。当然,可以根据需求添加其他功能,例如批标准化(Batch Normalization)、激活函数(Activation function)等等。注意到在运行前输入张量的形状应该是 (batch_size, hidden_dim) ,该层的输出将是 (batch_size, output_dim)

🔥张量

张量是多维数组的一种泛称,它是数学和计算机科学中一种十分重要的数据结构。在机器学习和深度学习中,张量是描述数据的基本结构。

可以将张量看作是一个高维数组,它包含了一个或多个数据元素,这些元素可以是实数、整数、布尔值等。通常情况下,我们使用张量来存储神经网络中的输入、输出、权重、偏置等参数。在 PyTorch、TensorFlow 等深度学习框架中,张量是非常重要的基础数据类型之一。

在机器学习中,张量最常见的应用就是存储和处理数据,包括训练数据、测试数据、模型参数以及计算输出结果等。以下是一些具体的例子:

  1. 图像数据:在计算机视觉中,图像通常由 RGB 矩阵组成,可以转换成三维张量,其中第一维表示通道数(3),第二、三维分别表示图像的高和宽。
  2. 自然语言处理数据:在自然语言处理中,文本数据通常会转化为单词或者字符的序列,这些序列可以被编码为二维或三维张量,其中第一维表示序列长度,第二维表示单词或字符的嵌入向量的维度。
  3. 模型参数:神经网络中的权重和偏置通常被存储在张量中作为模型参数,在训练过程中不断更新,以优化模型效果。
  4. 计算输出结果:每个神经网络层的输入和输出都是张量,通过逐层传递张量,可以在神经网络中完成前向传播计算,得出最终的输出结果。

在实际机器学习应用中,涉及到的数据可能是高维度的,因此需要将其转化为多维张量来方便存储和处理。

🔥Yolo

Yolov5

YoloV5(You Only Look Once Version 5)是一种目标检测算法,它可以实现快速准确地识别图像中的物体,并输出其在图像中的位置信息和类别。以下是对YoloV5算法的详细分析:

  1. 网络结构:YoloV5采用卷积神经网络模型,整个网络由骨架网络、FPN(feature pyramid network)、head网络组成。骨架网络用于提取特征,FPN用于提取多尺度特征并加强低层次特征的表达能力,head网络用于预测每个anchor所对应的bounding box以及类别。
  2. 目标检测流程:YoloV5通过预测bounding box来实现目标检测。首先将输入图像通过骨架网络得到特征图,然后将特征图传入FPN网络中获取不同分辨率的特征图,最后将这些特征图输入到head网络中进行预测。每个anchor会计算与ground truth的IOU(Intersection over Union),如果IOU大于某一阈值,则视为正样本,否则视为负样本。
  3. Anchor匹配:YoloV5引入了类似RetinaNet的anchor-free思想,但是不同之处在于YoloV5仍然采用了anchor的方式进行处理。具体来说,YoloV5通过k-means聚类的方法从训练集中选取若干个bbox作为anchor,并在网络中引入scale和aspect ratio来适应不同尺度和不同形状的物体。在推理阶段,每个anchor预测物体的类别和偏移量。
  4. Loss函数:YoloV5使用GIoU(Generalized Intersection over Union)来计算bounding box的损失值,同时也采用了多个不同权重的loss函数包括置信度、类别识别等。其中,GIoU是目前行业内最流行的bounding box loss函数之一,并能够较好地考虑bounding box之间的相似性。
  5. 优化器:YoloV5使用AdaBelief来作为优化器,这是一种效果非常好的优化器,具有较强的收敛速度和通用性,并且能够抵抗梯度下降的噪声干扰。

总之,YoloV5作为一款高精度、快速的目标检测算法,在工业界和学术界已经得到了广泛的应用和认可。其综合考虑尺度、形状和特征点信息的特点,使得它能够更加准确地检测出目标物体,并且在复杂环境下具备较好的鲁棒性。

YoloX

YoloX是一种目标检测算法,由腾讯AI Lab于2021年提出,其最大的特点是采用了多层金字塔感受野设计以及SE模块结构。以下是对YoloX算法的详细分析:

  1. 网络结构:YoloX采用了多层级的金字塔网络结构,每个层级都可以感受到不同大小的物体。此外,YoloX还引入了精细化特征流结构,通过较大尺寸的卷积核来实现高分辨率的感受野和更大的场景背景。

  2. 目标检测流程:YoloX采用anchor-free的方式进行预测。具体来说,YoloX使用FCOS(Fully Convolutional One-Stage Object Detection)作为检测器,并采用YOLOv3作为基础模型,在输出特征图之后直接预测边界框及类别概率。

  3. Anchor替代:YoloX放弃了传统的Anchor形式,使用FCOS的思路直接预测中心点、宽、高三个值,并且进一步加入IOU Loss以实现最小化输出与真实框间的IOU。

  4. SE模块:YoloX还引入了SE(Squeeze-and-Excitation)模块,来增强特征表达能力和适应性。SE模块可以自适应地调整特征图通道间的相互依赖和关系,提升了模型的泛化能力。

  5. Loss函数:YoloX采用IoULoss,在FCOS的输出与真实框之间进行最小化。

  6. 优化器:YoloX使用了不同于其他目标检测算法的Ranger优化器,它是一种基于RAdam和Lookahead two-stage训练的优化器,并具有较好的收敛速度和泛化性能。

总体来说,YoloX在网络结构、Anchor替换、SE模块以及优化器等方面都有一些创新和改进。在COCO数据集上的测试,YoloX获得了目前最高的AP(average precision)值,表现出色。

🔥IoU与GIoU

GIoU(Generalized Intersection over Union)是一种应用于目标检测算法中bounding box回归损失函数中的算法。与传统IoU(Intersection over Union)相比,GIoU在提高预测性能的同时,还保持可导性和计算效率。以下是对GIoU算法的详细分析:

  1. IoU算法:IoU是指交并比,用于评估真实边界框和预测边界框之间的重叠程度,其计算方式为两个边界框的交集面积除以它们的并集面积。IoU可以用来评价目标检测算法的准确性。
  2. 传统的bounding box损失函数:在目标检测算法中,最常用的bounding box损失函数是Smooth L1 Loss。然而,它存在较大的问题,如仅考虑坐标差异不够准确,特别是在小物体检测和密集布置物体的场景下更为明显。
  3. GIoU算法:GIoU作为IoU的扩展,引入了如何惩罚非对齐的框之间计算出的IoU值的概念,即比如垂直的框之间的IoU值不应该等同于水平的框之间的IoU值。GIoU将IoU的差异与边界框内外形状的重叠程度相结合,提高了对bounding box回归的准确性和稳定性。
  4. 计算方式:GIoU计算时先根据IoU进行如下三项分别加权: $s_{iou}$ (IoU部分),$s_{ub}$ (gt框与预测框最小面积并的关于最大区域的一致性测量) 和 $s_{inb}$ (预测框内部分的关于最大区域的不一致性测量)。然后依次计算$IoU, s_{ub}, s_{inb}$,最终得到GIoU为$1 - \frac{|(C_g\bigcap C_p)|}{|C_g \bigcup C_p|} + \lambda*(s_{ub} + s_{inb})$,其中$C_g$是真实框集合,$C_p$是预测框集合,$\lambda$是调整权重的超参数。

总之,GIoU能够更好地考虑bounding box之间的相似性,并在目标检测中获得了很好的效果,被广泛应用于许多当前流行的目标检测算法中,如YoloV5、MMDetection、PaddleDetection等。

  • Copyrights © 2023-2025 LegendLeo Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信