目录

【YOLOv8】损失函数

学习视频:

yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili

yolov8 | 损失函数 之 6、定位损失 CIoU + DFL_哔哩哔哩_bilibili

2.13、yolov8损失函数_哔哩哔哩_bilibili


YOLOv8 的损失函数由类别损失和定位损失构成

类别损失:BCE Loss

定位损失:CIoU Loss + DFL(Distribution Focal Loss)

损失函数计算公式如下:

YOLOv8 损失函数

**注意:**YOLOv8 只需要计算正样本的损失值,负样本不参数损失计算


目录

1.类别损失

[1.1 YOLOv5](#1.1 YOLOv5)

[1.2 YOLOv8:](#1.2 YOLOv8:)

2.定位损失

[2.1 CIoU Loss](#2.1 CIoU Loss)

[2.2 Distribution Focal Loss](#2.2 Distribution Focal Loss)

[2.2.1 前言](#2.2.1 前言)

[2.2.2 为什么使用Distribution Focal Loss?](#2.2.2 为什么使用Distribution Focal Loss?)

[2.2.3 原理](#2.2.3 原理)

[2.2.4 关于reg_max取值的补充](#2.2.4 关于reg_max取值的补充)


1.类别损失

YOLOv8 的类别损失使用的依旧是 BCE Loss ,与 YOLOv5 一致,但类别的 one-hot 标签值的设置有区别,下面会作两者的对比

BCE Loss 的计算公式如下:

BCE Loss

1.1 YOLOv5

: c 类别在 one-hot 向量中的标签值,如果未使用标签平滑技术就是非0即1

:正样本预测框的对于 c 类别的预测概率值应用 Sigmoid 函数后的值

对于的理解可以看下图:

YOLOv5类别损失

1.2 YOLOv8:

下面同样举的例子是未使用标签平滑技术

YOLOv8类别损失

:看该正样本预测框匹配到的 gt_box 的真实类别是什么,将其他类别的置为 0 ,而正确类别的的计算方法:先计算出该正样本预测框与匹配到的 gt_box 的 align_metric,然后再对得到的 align_metric 作归一化, align_metric 值的计算公式如下:

align_metric计算公式

上式中的 bbox_score 是正样本预测框对于正确类别的预测概率, CIoU 值即该正样本预测框与匹配到的 gt_box 计算得到

align_metric 的归一化方法: YOLOv8 源码中是取出当前 batch 中所有正样本预测框中的最大CIoU 值 max_CIoU 和最大 align_metric 值 max_align_metric ,对上面得到的原始 align_metric 值先乘以 max_CIoU 再除以 max_align_metric 完成归一化处理

:正样本预测框的对于 c 类别的预测概率值应用 Sigmoid 函数后的值

2.定位损失

2.1 CIoU Loss

CIoU Loss的计算公式如下:

2.2 Distribution Focal Loss

论文名称:《Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection》, DFL 只是该论文中的其中一个

论文地址:https://arxiv.org/pdf/2006.04388

2.2.1 前言

在以往的目标检测任务中, bounding box 坐标的网络预测结果服从狄拉克分布,简单理解就是网络针对预测框的坐标值只会输出一个确定的值,预测出的那个值概率为 1 ,其他值的概率为 0 ,因为只输出了这一个结果。而在 YOLOv8 中,首次使用 Distribution Focal Loss 参与其损失函数计算,网络模型针对(l、t、r、b)输出多个值,这多个值服从一般分布和任意分布,每个值都有它们自己对应的概率,不像狄拉克分布只预测出一个值,概率为 1

2.2.2 为什么使用Distribution Focal Loss?

先看下面两张图片。左图中,滑板被海水给模糊掉了,所以导致滑板边界模糊不确定;右图中,第一只大象的身体被严重遮挡了,所以导致大象的边界也不是很清晰

在复杂的场景中,通常会存在边界模糊和不确定的情况。在这种前提情况下,如果目标检测模型使用狄拉克分布,即针对预测框的坐标值只输出一个确定值是非常不灵活和不准确的,没有考虑真实框边界的模糊性和不确定性,因此可以使用 Distribution Focal Loss ,这也是 Distribution Focal Loss 提出的原因

2.2.3 原理

作者提出直接回归一个任意分布,对边界框的坐标进行建模。后面我们按照 YOLOv8 的源码实现展开讲解

在 YOLOv8 中,针对每一个预测框的的 4 个值,网络输出 4 个值对应的长度为reg_max(YOLOv8中默认为16)的向量,下面已 举例:

需要注意的是, 4 个值各自的长度为 16 的向量是做了Softmax处理的, 16 个值的和为 1

损失函数设计

**思路:**作者发现对于那些非常清晰明确的边界,它们的分布会像上图中的 top、right、bottom 比较尖锐和集中。而对于那些比较模糊不确定的边界,它们的分布会像上图中的 left 比较平,而且有时候会出现双峰的情况。所以作者想要模型来学习像上图中的 top、right、bottom 比较集中的、尖锐的分布


实现:设计损失函数时,尽可能增加真实值左边和右边两个值的概率,使得网络快速的聚焦于这个真实值附近的值,这样就可以把分布给学习成集中的、尖锐的样子,所以设计 DFL 损失函数时只有标签值左右两个值的概率参与计算,其他值的概率不参与计算

DFL损失函数设计

注意:

(1):标签值左边值应用Softmax后的值,:标签值右边值应用Softmax后的值

(2)计算 DFL Loss损失函数时left、top、right、bottom 标签值需要将其转换为在 feature map 尺度下的值,并且需要作长度限制,0< < reg_max (YOLOv8中为 reg_max = 16)

YOLOv8 中 DFL 损失函数的代码实现在 ultralytics/utils/loss.py 的 Class DFLoss :

DFL源码实现

python 复制代码
#DFL Loss计算
class DFLoss(nn.Module):
    """Criterion class for computing DFL losses during training."""
    def __init__(self, reg_max=16) -> None:
        """Initialize the DFL module."""
        super().__init__()
        self.reg_max = reg_max
    def __call__(self, pred_dist, target):
        '''
        Args:
            pred_dist: {Tensor:(6448,16)},存放1612个正样本的 ltrb 4个值对应的16个概率分布值
                6448 = 1612 x 4
                16 :概率分布
            target: {Tensor:(1612,4)},存放1612个正样本对应的真实框的ltrb,其值已缩放到各自的feature map尺度下

        Returns:
            out:{Tensor:(1612,1)},存放每个正样本的DFL损失值
        '''
        
        #对正样本对应的真实框的ltrb作长度限制处理,限制在0-15
        target = target.clamp_(0, self.reg_max - 1 - 0.01)
        
        tl = target.long()#tl:{Tensor:(1612,4)},标签值左边的值
        tr = tl + 1#tr:{Tensor:(1612,4)},标签值右边边的值
        wl = tr - target#wl:{Tensor:(1612,4)},左边值的权重
        wr = 1 - wl#wr:{Tensor:(1612,4)},右边值的权重

        #损失值计算,{Tensor:(1612,4)} -> mean(-1) ->{Tensor:(1612,1)}
        return (
            F.cross_entropy(pred_dist, tl.view(-1), reduction="none").view(tl.shape) * wl
            + F.cross_entropy(pred_dist, tr.view(-1), reduction="none").view(tl.shape) * wr
        ).mean(-1, keepdim=True)

2.2.4 关于reg_max取值的补充

参考笔记:https://zhuanlan.zhihu.com/p/702085780

由于 Softmax 的取值范围为 [0,1] ,所以根据上面提到的计算公式可以发现 ∈[0,reg_max−1] ,如果 reg_max = 16 ,在特征图上所能预测的最大预测框是 都取 15 时,此时预测框的高度和宽度是 w_max = 30,h_max = 30 ,由于特征图相对于原始 image 的下采样倍数 stride ∈ [8,16,32],如果取最大下采样倍数 stride = 32 ,则在原图上所能预测的最大 bbox 高度和宽度为 w_max,h_max = 30 * 32 = 960 ,那么如果图像中的原始目标的宽度或者高度过大,则会出现预测框小于原始目标的情况。下面举个例子理解

目标过大时的YOLOv8的GT框与预测框

图片中有一个目标其 gt_box 的宽度为 1000 ,但我们实际能预测的最大宽度是 w_max = 960 ,这就会导致预测不精准,此时则需要根据具体情况对 reg_max 作调整

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
2401_897930063 小时前
BERT 模型是什么
人工智能·深度学习·bert
风筝超冷4 小时前
GPT - 多头注意力机制(Multi-Head Attention)模块
gpt·深度学习·attention
吴法刚7 小时前
14-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))
人工智能·深度学习·自然语言处理·分类·langchain·bert·langgraph
龙萱坤诺8 小时前
GPT-4o-image模型:开启AI图片编辑新时代
人工智能·深度学习
乌旭9 小时前
AI芯片混战:GPU vs TPU vs NPU的算力与能效博弈
人工智能·pytorch·python·深度学习·机器学习·ai·ai编程
知来者逆10 小时前
YOLO目标检测应用——基于 YOLOv8目标检测和 SAM 零样本分割实现指定目标分割
yolo·目标检测·计算机视觉·图像分割·sam·yolov8
神经星星12 小时前
【vLLM 学习】API 客户端
数据库·人工智能·机器学习
啊哈哈哈哈哈啊哈哈13 小时前
R3打卡——tensorflow实现RNN心脏病预测
人工智能·深度学习·学习
量子-Alex13 小时前
顶刊【遥感目标检测】【TGRS】LSKF-YOLO:面向高分辨率卫星遥感影像电力塔检测的大规模选择性核特征融合网络
人工智能·yolo·目标检测
知来者逆13 小时前
计算机视觉——深度学习图像处理中目标检测平均精度均值(mAP)与其他常用评估指标
图像处理·深度学习·目标检测·计算机视觉·map