当前位置: 首页 > article >正文

【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.2 YOLOv8:

2.定位损失

2.1 CIoU Loss

2.2 Distribution Focal Loss

2.2.1 前言

2.2.2 为什么使用Distribution Focal Loss?

2.2.3 原理

2.2.4 关于reg_max取值的补充


1.类别损失

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

BCE Loss 的计算公式如下:

BCE Loss

1.1 YOLOv5

\hat{p}_{i}(c) c 类别在 one-hot 向量中的标签值,如果未使用标签平滑技术就是非0即1

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

对于\hat{p}_{i}(c),p_i(c)的理解可以看下图:

YOLOv5类别损失

1.2 YOLOv8:

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

 YOLOv8类别损失

  \hat{p}_{i}(c):看该正样本预测框匹配到的 gt_box 的真实类别是什么,将其他类别的\hat{p}_{i}(c)置为 0 ,而正确类别的\hat{p}_{i}(c)的计算方法:先计算出该正样本预测框与匹配到的 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 完成归一化处理

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

2.定位损失

2.1 CIoU Loss

CIoU Loss的计算公式如下:

CIoU Loss = 1 - CIoU

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 中,针对每一个预测框的(l,t,r,b) 4 个值,网络输出 4 个值对应的长度为reg_max(YOLOv8中默认为16)的向量,下面已 l 举例:

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

损失函数设计

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


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

DFL损失函数设计

注意:

(1)S_i:标签值左边值应用Softmax后的值,S_{i+1}:标签值右边值应用Softmax后的值

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

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

DFL源码实现 

#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_maxdef __call__(self, pred_dist, target):'''Args:pred_dist: {Tensor:(6448,16)},存放1612个正样本的 ltrb 4个值对应的16个概率分布值6448 = 1612 x 416 :概率分布target: {Tensor:(1612,4)},存放1612个正样本对应的真实框的ltrb,其值已缩放到各自的feature map尺度下Returns:out:{Tensor:(1612,1)},存放每个正样本的DFL损失值'''#对正样本对应的真实框的ltrb作长度限制处理,限制在0-15target = 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] ,所以根据上面提到的计算公式可以发现 l,t,r,b ∈[0,reg_max−1] ,如果 reg_max = 16 ,在特征图上所能预测的最大预测框是 l,t,r,b 都取 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 作调整

相关文章:

【YOLOv8】损失函数

学习视频&#xff1a; yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失&#xff1a;BCE Loss 定位损失…...

ollama修改监听ip: 0.0.0.0

确认Ollama绑定IP地址 默认情况下&#xff0c;Ollama可能仅监听本地回环地址&#xff08;127.0.0.1&#xff09;。要允许外部访问&#xff0c;需将其配置为监听所有IP&#xff08;0.0.0.0&#xff09;或指定IP&#xff08;如10…19&#xff09;。 修改启动命令&#xff08;推荐…...

【Linux】【网络】Libevent 内部实现简略版

【Linux】【网络】Libevent 内部实现简略版 1 event_base结构–>相当于Reactor 在使用libevent之前&#xff0c;就必须先创建这个结构。 以epoll为例&#xff1a; 1.1evbase void* evbase-->epollop结构体&#xff08;以epoll为例&#xff09; libevent通过一个void…...

计算机网络抄手 运输层

一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...

MATLAB图像处理:图像分割方法

图像分割将图像划分为具有特定意义的子区域&#xff0c;是目标检测、医学影像分析、自动驾驶等领域的核心预处理步骤。本文讲解阈值分割、边缘检测、区域生长、聚类分割、基于图的方法等经典与前沿技术&#xff0c;提供MATLAB代码实现。 目录 1. 图像分割基础 2. 经典分割方…...

【机器学习】线性回归 多元线性回归

多元线性回归 V1.1多元线性回归一元线性回归与多元线性回归多元线性回归模型的误差衡量多元线性回归的最优解多元线性回归的解析解&#xff08;标准数学解法&#xff09;多元线性回归的解析解公式分析 多元线性回归的搜索解法 V1.1 加入链接会影响文章推荐权重&#xff0c;阅读…...

【VSCode】MicroPython环境配置

【VSCode】MicroPython环境配置 RT-Thread MicroPython 插件安装MicroPython 库文件配置结束语 RT-Thread MicroPython 插件安装 在 VSCode 拓展中搜索 “RT-Thread MicroPython” 并安装&#xff0c;详细配置步骤&#xff08;修改 VSCode 默认终端、MicroPython 代码补全&…...

【python】网页批量转PDF

安装wkhtmltopdf 网站&#xff1a;wkhtmltopdf wkhtmltopdf http://www.baidu.com/ D:website1.pdf 安装pdfkit库 pip install pdfkit 批量转换代码 import os import pdfkit path_wkthmltopdf rE:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe config pdfkit.configu…...

基于Flask的租房信息可视化系统的设计与实现

【Flask】基于Flask的租房信息可视化系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展&#xff0c;租房市场日益繁荣&#xff0c;信息量急剧增加&#xff…...

Scrapy安装,创建Scrapy项目,启动Scrapy爬虫

Scrapy安装&#xff0c;创建Scrapy项目&#xff0c;启动Scrapy爬虫 1. 安装 Python2. 安装 Scrapy3. 验证安装4. 创建 Scrapy 项目5. 启动爬虫5.1 示例 总结 Scrapy 的安装方式比较简单&#xff0c;下面是基于 Python 环境的安装流程&#xff1a; 1. 安装 Python 首先&#x…...

C++项目:高并发内存池_上

目录 1. 项目介绍 2. 内存池概念 2.1 池化技术 2.2 内存池和内存碎片 2.3 细看malloc 3. 定长内存池的实现 ObjectPool.hpp 4. 高并发内存池框架 5. thread cache测试 5.1 thread cache框架 5.2 ConcurrentAlloc.hpp 6. central cache测试 6.1 central cache框架 …...

人工智能驱动的自动驾驶:技术解析与发展趋势

&#x1f30d; 人工智能&#xff08;AI&#xff09;正在彻底变革自动驾驶技术。 从感知到决策&#xff0c;从定位到控制&#xff0c;AI 的发展让汽车越来越接近真正的无人驾驶。本文将详细解析 AI 在自动驾驶中的核心应用&#xff0c;深入探讨各个关键技术&#xff0c;并展望未…...

手机控制电脑远程关机

远程看看软件兼容iOS和Android设备&#xff0c;该软件除了能通过电脑远程关闭另一台电脑外&#xff0c;您还可以通过它在手机上远程关闭公司的电脑。您可以按照以下步骤进行操作以实现电脑远程关机&#xff1a; 步骤1.在手机应用商店搜索“远程看看”进行软件安装&#xff0c;…...

IO模型与NIO基础--NIO网络传输选择器--字符编码

放进NIO体系进行网络编程的工作流程&#xff1a; Selector的创建 通过调用Selector.open()方法创建一个Selector&#xff0c;如下&#xff1a; Selector selector Selector.open(); 向Selector注册通道 通过Channel.register()方法来实现&#xff0c; 注意&#xff1a;Chan…...

【亚马逊开发者账号02】终审问题SA+review_Pre-review+Doc.xlsx

1.终审问题 你好感谢您在此过程中的回复和协作。所有想要构建具有受限 SP-API 角色的公开可用应用程序的开发人员都必须与我们的解决方案架构师团队一起完成架构审核。 这将需要详细说明应用程序的数据流、个人身份信息 &#xff08;PII&#xff09; 的数据保护控制&#xff0…...

基于STM32与BD623x的电机控制实战——从零搭建无人机/机器人驱动系统

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、为什么选择这两个芯片&#xff1f;1.1 STM32微控制器1.2 ROHM BD623x电机驱动 二、核心控制原理详解2.1 H桥驱动奥…...

c++标准io与线程,互斥锁

封装一个 File 类&#xff0c; 用有私有成员 File* fp 实现以下功能 File f "文件名" 要求打开该文件 f.write(string str) 要求将str数据写入文件中 string str f.read(int size) 从文件中读取最多size个字节&#xff0c; 并将读取到的数据返回 析构函数 #…...

leetcode刷题第十三天——二叉树Ⅲ

本次刷题顺序是按照卡尔的代码随想录中给出的顺序 翻转二叉树 226. 翻转二叉树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*总体思路就是&#xff0c;对于每一个结点&…...

SIM盾构建安全底座的可行性分析

一、背景 1.1安全需求现状 在数字化时代&#xff0c;信息安全面临着日益严峻的挑战。各类网络攻击手段层出不穷&#xff0c;如数据泄露、恶意软件攻击、网络诈骗等&#xff0c;给个人、企业和社会带来了巨大的损失。为了保障信息系统的安全性&#xff0c;需要构建一个可靠的安…...

全新的Android UI框架Jetpack Compose

Jetpack Compose 概述Compose API设计原则Compose 和 View 的关系Compose预览 概述 Jetpack Compose 是Android新一代UI框架&#xff0c;采用了 声明式 的开发范式&#xff0c;基于Kotlin DSL打造&#xff0c;并且可以和现有的Android View 体系共存。 Compose API设计原则 …...

在高流量下保持WordPress网站的稳定和高效运行

随着流量的不断增加&#xff0c;网站的稳定和高效运行变得越来越重要&#xff0c;特别是使用WordPress搭建的网站。流量过高时&#xff0c;网站加载可能会变慢&#xff0c;甚至崩溃&#xff0c;直接影响用户体验和网站正常运营。因此&#xff0c;我们需要采取一些有效的措施&am…...

Cython学习笔记1:利用Cython加速Python运行速度

Cython学习笔记1&#xff1a;利用Cython加速Python运行速度 CythonCython 的核心特点&#xff1a;利用Cython加速Python运行速度1. Cython加速Python运行速度原理2. 不使用Cython3. 使用Cython加速&#xff08;1&#xff09;使用pip安装 cython 和 setuptools 库&#xff08;2&…...

Django 5实用指南(五)模板系统

Django5的模板系统是其核心功能之一&#xff0c;允许开发者将动态数据嵌入到HTML模板中&#xff0c;并根据不同的业务需求渲染页面。Django模板系统基于 Django模板语言&#xff08;DTL&#xff09;&#xff0c;它提供了一些强大的功能&#xff0c;如模板标签、过滤器、条件语句…...

基于深度学习进行呼吸音检测的详细示例

以下是一个基于深度学习进行呼吸音检测的详细示例&#xff0c;我们将使用Python语言以及一些常见的深度学习库&#xff08;如TensorFlow、Keras&#xff09;和数据处理库&#xff08;如numpy、pandas&#xff09;&#xff0c;同时会用到音频处理库librosa。整个流程包括数据加载…...

iOS 中使用 FFmpeg 进行音视频处理

在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …...

web的分离不分离:前后端分离与不分离全面分析

让我们一起走向未来 &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[1504566…...

记录一个ES分词器不生效的解决过程

问题背景 商城项目,其中商品查询检索使用的是ES, 但存在某些商品查询不到的问题 例如:某商品名包含AA_BBB这样的关键词,但是搜索"AA"不能查询到该商品,但是将商品名修改为AA BBB后就能查询到了. 怀疑是分词的问题,但看代码,在创建ES索引时在对应字段上也定义了分词器…...

高性能内存对象缓存Memcached详细实验操作

目录 前提准备&#xff1a; cache1&#xff0c;2&#xff1a; 客户端cache-api&#xff08;一定得是LAMP环境&#xff09; memcache实现主主复制以及高可用(基于以上完成) cache1,2: memcachekeepalived(基于以上完成) cache1,2: 前提准备&#xff1a; 1. 准备三台cent…...

css之display:grid布局改块级元素布局

1.问题&#xff1a; div是块级元素&#xff0c;一个div元素占一行&#xff0c;但是&#xff0c;今天测试样式时&#xff0c;总是会有两个div并占一行&#xff0c;很困惑&#xff0c;结果发现是app这个样式 在main.css里 #app样式布局在main.ts里被应用 2.原因以及样式分析 im…...

高效率:转换效率高达 96%,可有效减少能源损耗

WD5030 的特点 高效率&#xff1a;转换效率高达 96%&#xff0c;可有效减少能源损耗&#xff0c;降低设备发热&#xff0c;提高能源利用效率&#xff0c;延长电池供电设备的续航时间135。 精准输出电压&#xff1a;内置可调线路补偿和可调输出电压功能&#xff0c;输出电压精度…...