做c语言的题目的网站,用wordpress做音乐网站,国外设计网站pinterest下载,沈阳seo关键词排名优化软件一、本文介绍
本文记录的是改进YOLOv11的损失函数#xff0c;将其替换成Slide Loss#xff0c;并详细说明了优化原因#xff0c;注意事项等。Slide Loss函数可以有效地解决样本不平衡问题#xff0c;为困难样本赋予更高的权重#xff0c;使模型在训练过程中更加关注困难样…一、本文介绍
本文记录的是改进YOLOv11的损失函数将其替换成Slide Loss并详细说明了优化原因注意事项等。Slide Loss函数可以有效地解决样本不平衡问题为困难样本赋予更高的权重使模型在训练过程中更加关注困难样本。若是在自己的数据集中发现容易样本的数量非常大而困难样本相对稀疏可尝试使用Slide Loss来提高模型在处理复杂样本时的性能。 文章目录 一、本文介绍二、Slide Loss原理2.1 IoU含义2.2 原理2.2 优势 三、Slide Loss的实现代码四、添加步骤4.1 修改ultralytics/utils/loss.py4.2 Slide Loss的调用 二、Slide Loss原理
2.1 IoU含义
IoU(P, G) area(P∩G) / area(G)其中P是预测框G是真实框ground truth。IoU的值在[0, 1]之间。
IoU是预测框与真实框的交集面积与并集面积之比。它用于衡量预测框与真实框的重合程度。
2.2 原理
样本分类依据 Slide Loss函数基于预测框和真实框的IoU大小来区分容易样本和困难样本。为了减少超参数将所有边界框的IoU值的平均值作为阈值µ小于µ的被视为负样本大于µ的为正样本。 强调边界样本 但处于边界附近的样本由于分类不明确往往会遭受较大损失。为了解决这个问题希望模型能够学习优化这些样本并更充分地利用这些样本训练网络。首先将样本通过参数µ分为正样本和负样本然后通过一个加权函数Slide来强调处于边界的样本。Slide加权函数表达式为 f ( x ) { 1 x ≤ μ − 0.1 e 1 − μ μ x μ − 0.1 e 1 − x x ≥ u f(x) \begin{cases} 1x\leq\mu - 0.1\\ e^{1-\mu}\mu x \mu - 0.1\\ e^{1 - x}x\geq u \end{cases} f(x)⎩ ⎨ ⎧1e1−μe1−xx≤μ−0.1μxμ−0.1x≥u 2.2 优势
解决样本不平衡问题 在大多数情况下容易样本的数量非常大而困难样本相对稀疏Slide Loss函数可以有效地解决样本不平衡问题使模型在训练过程中更加关注困难样本。 自适应学习阈值 通过自动计算所有边界框的IoU值的平均值作为阈值µ减少了人为设置超参数的难度提高了模型的适应性。 提高模型性能 根据论文实验结果Slide函数在中等难度和困难子集上提高了模型的性能使模型能够更好地学习困难样本的特征提高了模型的泛化能力。 论文https://arxiv.org/pdf/2208.02019 源码https://github.com/Krasjet-Yu/YOLO-FaceV2/blob/d9c8f24d5dba392ef9d6b350a7c50b850051b32b/utils/loss.py#L16 三、Slide Loss的实现代码
Slide Loss的实现代码如下
import math
class SlideLoss(nn.Module):def __init__(self, loss_fcn):super(SlideLoss, self).__init__()self.loss_fcn loss_fcnself.reduction loss_fcn.reductionself.loss_fcn.reduction none # required to apply SL to each elementdef forward(self, pred, true, auto_iou0.5):loss self.loss_fcn(pred, true)if auto_iou 0.2:auto_iou 0.2b1 true auto_iou - 0.1a1 1.0b2 (true (auto_iou - 0.1)) (true auto_iou)a2 math.exp(1.0 - auto_iou)b3 true auto_ioua3 torch.exp(-(true - 1.0))modulating_weight a1 * b1 a2 * b2 a3 * b3loss * modulating_weightif self.reduction mean:return loss.mean()elif self.reduction sum:return loss.sum()else: # nonereturn loss四、添加步骤
4.1 修改ultralytics/utils/loss.py
此处需要修改的文件是ultralytics/utils/loss.py
loss.py中定义了模型的损失函数和计算方法我们想要加入新的损失函数就只需要将代码放到这个文件内即可。
Slide Loss添加后如下 4.2 Slide Loss的调用
在loss.py中的v8DetectionLoss函数中添加如下代码使模型调用此Slide Loss函数。
self.bce SlideLoss(nn.BCEWithLogitsLoss(reductionnone))此时再次训练模型便会使用Slide Loss计算模型的损失函数。