0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

YOLOv8中的损失函数解析

新机器视觉 来源:小白玩转python 2024-11-05 17:15 次阅读

来源:小白玩转python

介绍

YOLO长期以来一直是目标检测任务的首选模型之一。它既快速又准确。此外,其API简洁易用。运行训练或推断作业所需的代码行数有限。在2023年下半年,YOLOv8在框架中引入了姿态估计后,该框架现在支持最多四个任务,包括分类、目标检测、实例分割和姿态估计。

ec19b69a-90b3-11ef-a511-92fbcf53809c.png

在本文中,我们将详细介绍YOLOv8中使用的五个损失函数。请注意,我们将仅讨论YOLOv8仓库中配置的默认损失函数。此外,我们还将仅关注代表性参数,跳过一些标量和常数以进行归一化或缩放,以便更好地理解。YOLOv8中对应的任务和损失函数可见于图1。接下来我们将分别对每一个进行讨论。

IoU损失

ec490b52-90b3-11ef-a511-92fbcf53809c.png

cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1)  # convex (smallest enclosing box) width
ch = b1_y2.maximum(b2_y2) - b1_y1.minimum(b2_y1)  # convex height


if CIoU or DIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1
  c2 = cw ** 2 + ch ** 2 + eps  # convex diagonal squared
  rho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4  # center dist ** 2
  
  if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47
     v = (4 / math.pi ** 2) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)).pow(2)
     with torch.no_grad():
       alpha = v / (v - iou + (1 + eps))
     return iou - (rho2 / c2 + v * alpha)  # CIoU

当考虑评估边界框准确度的方式时,交并比(IoU)指标可能是大多数人首先想到的一个指标。IoU度量了预测的边界框与实际边界框之间的重叠程度。它也可以作为一个损失函数,只需将IoU转换为1-IoU。

在YOLOv8中,修订后的版本,完全IoU(CIoU)¹被应用于衡量预测边界框与实际边界框之间的差异。CIoU是一个综合性指标,它考虑了边界框之间的三个属性:

重叠比

中心点之间的距离

长宽比

CIoU的方程可在图2右侧找到。重叠比、中心点距离和长宽比这三个因素分别由方程中的各项表示。方程中涉及的关键参数在左侧的图中进行了说明,其中p和g表示预测和实际情况,b、w和h分别是相应边界框的中心、宽度和高度。参数c是包围边界框的对角线(灰色虚线矩形)而ρ是欧氏距离。除了分类任务外,IoU损失在YOLOv8中的所有其他任务中都会应用。

分布焦点损失(DFL)

def _df_loss(pred_dist, target):
    """Return sum of left and right DFL losses."""
    # Distribution Focal Loss (DFL) proposed in Generalized Focal Loss https://ieeexplore.ieee.org/document/9792391
    tl = target.long()  # target left
    tr = tl + 1  # target right
    wl = tr - target  # weight left
    wr = 1 - wl  # weight right
    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)

另一个与边界框相关的损失函数是分布焦点损失(DFL)²。DFL关注的是边界框回归的分布差异。YOLOv8中的网络不是直接预测边界框,而是预测边界框的概率分布。它旨在解决边界模糊或部分遮挡的挑战性对象。

关键点损失

ec706378-90b3-11ef-a511-92fbcf53809c.png

loss[1] += self.keypoint_loss(pred_kpt, gt_kpt, kpt_mask, area)


area:bounding box area


class KeypointLoss(nn.Module):


  def forward(self, pred_kpts, gt_kpts, kpt_mask, area):
        """Calculates keypoint loss factor and Euclidean distance loss for predicted and actual keypoints."""
        d = (pred_kpts[..., 0] - gt_kpts[..., 0]) ** 2 + (pred_kpts[..., 1] - gt_kpts[..., 1]) ** 2
        kpt_loss_factor = (torch.sum(kpt_mask != 0) + torch.sum(kpt_mask == 0)) / (torch.sum(kpt_mask != 0) + 1e-9)
        # e = d / (2 * (area * self.sigmas) ** 2 + 1e-9)  # from formula
        e = d / (2 * self.sigmas) ** 2 / (area + 1e-9) / 2  # from cocoeval
        return kpt_loss_factor * ((1 - torch.exp(-e)) * kpt_mask).mean()

在YOLOv8中,首次将姿态估计任务纳入到框架中。姿态由一组关键点的坐标和顺序定义。关键点损失监控了预测和实际关键点之间的相似性。两个对应关键点之间的欧几里得距离是关键点损失的主要组成部分。此外,每个关键点都带有一个权重σ,定义了关键点的重要性,默认值为1/关键点数。例如,如果姿态有四个关键点,则所有关键点的权重为1/4 = 0.25。

关键点目标损失

ec82b956-90b3-11ef-a511-92fbcf53809c.png

import torch.nn as nn
loss[2] = nn.BCEWithLogitsLoss(pred_kpt[..., 2], kpt_mask.float())

在大多数姿态估计训练中,我们可以定义每个关键点的可见性。Python脚本中的参数kpt_mask携带了我们在标签中定义的可见性(1/0)。关键点目标损失计算关键点存在的距离。在YOLOv8中,距离由预测值和实际值的二元交叉熵(BCE)测量。

分类损失和掩码损失

eca756da-90b3-11ef-a511-92fbcf53809c.png

import torch.nn as nn


loss[3] = nn.BCEWithLogitLoss(pred_scores, target_scores.to(dtype)).sum() / target_scores_sum  # BCE

分类损失是涉及到所有任务的唯一损失函数。无论我们是在进行分类、目标检测、分割还是姿态估计,图像或特定对象的类别(例如猫、狗、人等)的推断结果之间的距离都是通过二元交叉熵(BCE)计算的。

它还适用于实例分割中的掩码损失。掩码损失将每个像素视为一个对象,并计算相关的BCE值。在图5中计算了一个3x3的预测掩码和相应的掩码损失。

总损失

# yolo/cfg/default.yaml
...
box: 7.5  # box loss gain
cls: 0.5  # cls loss gain (scale with pixels)
dfl: 1.5  # dfl loss gain
pose: 12.0  # pose loss gain
kobj: 1.0  # keypoint obj loss gain
...

好了,以上我们已经介绍了所有六个损失。在网络应用反向传播并更新其参数之前,将损失与相应的权重相加。权重在配置文件default.yaml中定义,如上所示。如果您想在训练阶段动态调整权重,您可以考虑直接在存储库中使用下面提供的代码片段。

loss[0] *= self.hyp.box  # box gain
loss[1] *= self.hyp.pose / batch_size  # pose gain
loss[2] *= self.hyp.kobj / batch_size  # kobj gain
loss[3] *= self.hyp.cls  # cls gain
loss[4] *= self.hyp.dfl  # dfl gain


return loss.sum() * batch_size, loss.detach()

总结

YOLO是一个为目标检测任务而知名的框架。除了在效率和准确性方面的表现之外,它还在不断更新最新的研究成果。这是一个让计算机视觉从业者跟踪和学习入选技术的好框架。损失函数在模型训练中起着重要作用,并决定了最终的准确性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4353

    浏览量

    63289
  • 目标检测
    +关注

    关注

    0

    文章

    213

    浏览量

    15721
  • python
    +关注

    关注

    56

    文章

    4813

    浏览量

    85299

原文标题:YOLOv8中的损失函数解析

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用sophon-demo_v0.1.8_dbb4632_20231116下面的YOLOv8yolov8_bmcv历程出现段错误的原因?

    使用sophon-demo_v0.1.8_dbb4632_20231116下面的YOLOv8yolov8_bmcv历程,出现段错误: 定位到代码中出错的函数是 picDec(h,
    发表于 05-30 07:37

    使用YOLOv8做目标检测和实例分割的演示

    YOLOv8是来自Ultralytics的最新的基于YOLO的对象检测模型系列,提供最先进的性能。
    的头像 发表于 02-06 10:11 7834次阅读

    YOLOv8自定义数据集训练到模型部署推理简析

    如果你只是想使用而不是开发,强烈推荐通过pip安装方式获取YOLOv8包!YOLOv8安装命令行
    的头像 发表于 03-24 09:27 4819次阅读

    在AI爱克斯开发板上用OpenVINO™加速YOLOv8目标检测模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 分类模型》介绍了在 AI 爱克斯开发板上使用 OpenVINO 开发套件部署并测评 YOLOv8 的分类模型,本文将介绍在 AI 爱克斯开发板上使用 OpenVINO 加速
    的头像 发表于 05-12 09:08 1447次阅读
    在AI爱克斯开发板上用OpenVINO™加速<b class='flag-5'>YOLOv8</b>目标检测模型

    YOLOv8版本升级支持小目标检测与高分辨率图像输入

    YOLOv8版本最近版本又更新了,除了支持姿态评估以外,通过模型结构的修改还支持了小目标检测与高分辨率图像检测。原始的YOLOv8模型结构如下。
    的头像 发表于 05-16 11:14 1.3w次阅读
    <b class='flag-5'>YOLOv8</b>版本升级支持小目标检测与高分辨率图像输入

    AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检测模型

    《在AI爱克斯开发板上用OpenVINO加速YOLOv8分类模型》介绍了在AI爱克斯开发板上使用OpenVINO 开发套件部署并测评YOLOv8的分类模型,本文将介绍在AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检
    的头像 发表于 05-26 11:03 1427次阅读
    AI爱克斯开发板上使用OpenVINO加速<b class='flag-5'>YOLOv8</b>目标检测模型

    一文彻底搞懂YOLOv8【网络结构+代码+实操】

    从上面可以看出,YOLOv8 主要参考了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关设计,本身的创新点不多,偏向工程实践,主推的还是 ultralytics 这个框架本身。
    的头像 发表于 06-15 17:15 1.3w次阅读
    一文彻底搞懂<b class='flag-5'>YOLOv8</b>【网络结构+代码+实操】

    教你如何用两行代码搞定YOLOv8各种模型推理

    大家好,YOLOv8 框架本身提供的API函数是可以两行代码实现 YOLOv8 模型推理,这次我把这段代码封装成了一个类,只有40行代码左右,可以同时支持YOLOv8对象检测、实例分割
    的头像 发表于 06-18 11:50 3290次阅读
    教你如何用两行代码搞定<b class='flag-5'>YOLOv8</b>各种模型推理

    目标检测算法再升级!YOLOv8保姆级教程一键体验

    YOLO作为一种基于图像全局信息进行预测的目标检测系统,始终保持着极高的迭代更新率,从YOLOv5到YOLOv8,本次升级主要包括结构算法、命令行界面、PythonAPI等。具体到YOLOv8,它可
    的头像 发表于 02-28 11:16 2963次阅读
    目标检测算法再升级!<b class='flag-5'>YOLOv8</b>保姆级教程一键体验

    三种主流模型部署框架YOLOv8推理演示

    深度学习模型部署有OpenVINO、ONNXRUNTIME、TensorRT三个主流框架,均支持Python与C++的SDK使用。对YOLOv5~YOLOv8的系列模型,均可以通过C++推理实现模型
    的头像 发表于 08-06 11:39 2879次阅读

    解锁YOLOv8修改+注意力模块训练与部署流程

    很多人也想跟修改YOLOv5源码一样的方式去修改YOLOv8的源码,但是在github上面却发现找到的YOLOv8项目下面TAG分支是空的
    的头像 发表于 08-11 14:14 4730次阅读
    解锁<b class='flag-5'>YOLOv8</b>修改+注意力模块训练与部署流程

    如何修改YOLOv8的源码

    很多人也想跟修改YOLOv5源码一样的方式去修改YOLOv8的源码,但是在github上面却发现找到的YOLOv8项目下面TAG分支是空的,然后就直接从master/main下面把源码克隆出来一通
    的头像 发表于 09-04 10:02 2217次阅读
    如何修改<b class='flag-5'>YOLOv8</b>的源码

    YOLOv8实现任意目录下命令行训练

    当你使用YOLOv8命令行训练模型的时候,如果当前执行的目录下没有相关的预训练模型文件,YOLOv8就会自动下载模型权重文件。这个是一个正常操作,但是你还会发现,当你在参数model中指定已有
    的头像 发表于 09-04 10:50 1256次阅读
    <b class='flag-5'>YOLOv8</b>实现任意目录下命令行训练

    基于YOLOv8的自定义医学图像分割

    YOLOv8是一种令人惊叹的分割模型;它易于训练、测试和部署。在本教程,我们将学习如何在自定义数据集上使用YOLOv8。但在此之前,我想告诉你为什么在存在其他优秀的分割模型时应该使用YOLO
    的头像 发表于 12-20 10:51 933次阅读
    基于<b class='flag-5'>YOLOv8</b>的自定义医学图像分割

    基于OpenCV DNN实现YOLOv8的模型部署与推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署在Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 2060次阅读
    基于OpenCV DNN实现<b class='flag-5'>YOLOv8</b>的模型部署与推理演示