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

【目标检测】SSD损失函数详解

最近看看这个古早的目标检测网络,看了好多文章,感觉对损失函数的部分讲得都是不很清楚得样子,所以自己捋一下。

首先,SSD 得损失函数由两部分得加权和,一部分是定位损失 L l o c L_{loc} Lloc,另一部分是分类置信率损失 L c o n f L_{conf} Lconf。公式一般写成: L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x,c,l,g) = \frac{1}{N}\left( L_{conf}(x, c) + \alpha L_{loc}(x, l, g) \right) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))总结来说,定位损失 L l o c L_{loc} Lloc 是使用 smooth L1 loss 来计算的,而分类置信率损失 L c o n f L_{conf} Lconf 是通过 softmax loss 来计算的。


定位损失 L l o c L_{loc} Lloc

接下来就分开讲讲两部分,首先是定位损失 L l o c L_{loc} Lloc, 它的公式可以写成: L l o c ( x , l , g ) = ∑ i ∈ P o s N ∑ m ∈ { c x , c y , w , h } x i j p ⋅ s m o o t h L 1 ( l i m − g ^ j m ) L_{loc}(x, l, g) = \sum_{i \in Pos}^{N} \sum_{m \in \left\{ cx, cy, w, h \right\}} x_{ij}^p \cdot \mathbf{smooth_{L1}}(l_i^m - \hat{g}_j^m) Lloc(x,l,g)=iPosNm{cx,cy,w,h}xijpsmoothL1(limg^jm)下昂西介绍一下里面的各种参数的含义:

  • i ∈ P o s i \in Pos iPos:第一个求和下的 P o s Pos Pos 是一个集合,我们知道在训练的时候,会根据 IOU(SSD 里好像是大于 0.5) 对 Default box(其实和 anchor 的含义一样)与 Ground truth box(后面统称 gt box)进行匹配,如果 第 i i i 个 default box 与 第 j j j 个 gt box 匹配上了,那么这个 default box i i i 就会被放入 P o s Pos Pos 的集合中,表示 positive,也就是被标记成了正样本。
  • N N N:是正样本集合 P o s Pos Pos 的总数,表示有 N N N 个 default box 与 gt box 匹配上了。
  • m ∈ { c x , c y , w , h } m \in \left\{ cx, cy, w, h \right\} m{cx,cy,w,h}:这四个值是 anchor 的位置参数,表示中心点的坐标和 anchor 的尺寸。
  • x i j p x_{ij}^p xijp:可以理解为唯一标识 flag,如果 default box i i i 与 gt box j j j 是匹配的,gt box 的类别是 p p p,则为1,否则 0。
  • l i m l_i^m lim:是预测值,也就是 bounding box 与 default box 的偏移值,不是真实的坐标,具体的转换在下面给出。
  • g ^ j m \hat{g}_j^m g^jm:是真实值,是 gt box 与 default box 的偏移值。

偏移值的计算

回到前面提到的偏移值,如果 default box i i i 的位置参数是 { d i c x , d i c y , d i w , d i h } \{ d_i^{cx}, d_i^{cy}, d_i^{w}, d_i^{h} \} {dicx,dicy,diw,dih},gt box j j j 的位置参数是 { g j c x , g j c y , g j w , g j h } \{ g_j^{cx}, g_j^{cy}, g_j^{w}, g_j^{h} \} {gjcx,gjcy,gjw,gjh},我们就可以算出真实值对应的偏移量 { g ^ j c x , g ^ j c y , g ^ j w , g ^ j h } \{ \hat{g}_j^{cx}, \hat{g}_j^{cy}, \hat{g}_j^{w}, \hat{g}_j^{h} \} {g^jcx,g^jcy,g^jw,g^jh}
g ^ j c x = ( g j c x − d i c x ) d i w g ^ j w = log ⁡ ( g j w d i w ) g ^ j c y = ( g j c y − d i c y ) d i h g ^ j h = log ⁡ ( g j h d i h ) \begin{align*} \hat{g}_j^{cx} = \frac{(g_j^{cx} - d_i^{cx})}{d_i^w} & \space\space\space\space\space\space\space\space\space \hat{g}_j^{w} = \log\left( \frac{g_j^w}{d_i^w} \right)\\ \hat{g}_j^{cy} =\frac{ (g_j^{cy} - d_i^{cy})}{d_i^h} & \space\space\space\space\space\space\space\space\space \hat{g}_j^{h} = \log\left( \frac{g_j^h}{d_i^h} \right) \end{align*} g^jcx=diw(gjcxdicx)g^jcy=dih(gjcydicy)         g^jw=log(diwgjw)         g^jh=log(dihgjh)同理,我们也可以通过预测得到的 bounding box 参数 { b i c x , b i c y , b i w , b i h } \{b_i^{cx}, b_i^{cy}, b_i^{w}, b_i^{h} \} {bicx,bicy,biw,bih} ,来计算得到 bounding box 的偏移量,也就是预测值 l l l l i c x = ( b i c x − d i c x ) d i w l i w = log ⁡ ( b i w d i w ) l i c y = ( b i c y − d i c y ) d i h l i h = log ⁡ ( b i h d i h ) \begin{align*} l_i^{cx} = \frac{(b_i^{cx} - d_i^{cx})}{d_i^w} & \space\space\space\space\space\space\space\space\space l_i^{w} = \log\left( \frac{b_i^w}{d_i^w} \right)\\ l_i^{cy} =\frac{ (b_i^{cy} - d_i^{cy})}{d_i^h} & \space\space\space\space\space\space\space\space\space l_i^{h} = \log\left( \frac{b_i^h}{d_i^h} \right) \end{align*} licx=diw(bicxdicx)licy=dih(bicydicy)         liw=log(diwbiw)         lih=log(dihbih)

中心点的偏移量计算是很好理解的,为什么宽高的偏移量要用 log 函数来算呢?

smooth L1 loss

SSD 是用到 smooth L1 loss 来计算真实值与预测值之间的差异: s m o o t h L 1 ( x ) = { 0.5 x 2 if  ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise  \mathbf{smooth_{L1}}(x) =\begin{cases} 0.5x^2 & \text{ if } |x|< 1 \\ |x| -0.5 & \text{ otherwise } \end{cases} smoothL1(x)={0.5x2x0.5 if x<1 otherwise 

这篇文章我觉得解释得挺清晰的,比较了 L1 loss, L2 loss 和 smooth L1 loss 三者之间的优劣。也提到了 loc loss 的演进。

bounding box 回归损失函数,也就是用于定位边界框的损失函数,其演进线路如下:

Smooth L1 loss
IOU loss
GIOU loss
DIOU loss
CIOU loss

我记得 YOLOv1 的损失函数,在计算位置损失的时候,还是使用的欧式距离,也就是所谓的 L2 loss。

L1 loss 是求两个数之间的绝对值距离,导数是常数(小于 0 则为 -1,大于等于 0 则为 1),在零点处是不平滑的;

L2 loss 是两个数之间差的平方,导数是 2 x 2x 2x(也可以看出,受到 x x x 的影响很大),但是在零点处是平滑的。多个 L2 loss 求和再平均也叫做 MSE loss (Mean Square Error)。

而我们的主角 smooth L1 loss,如名字所见,是平滑版的 L1 loss,导数为: d s m o o t h L 1 ( x ) d x = { x if  ∣ x ∣ < 1 ± 1 otherwise  \frac{ \mathrm{d} \space \mathbf{smooth_{L1}}(x)}{\mathrm{d}x} =\begin{cases} x & \text{ if } |x|< 1 \\ \pm1 & \text{ otherwise } \end{cases} dxd smoothL1(x)={x±1 if x<1 otherwise  在零点附近都是平滑的,而且在其它区间都是常数,也不会出现 L2 loss 随着 x x x 的增大而在损失函数中占据主导地位。


置信率损失 L c o n f L_{conf} Lconf

下面就讲一下分类的置信率损失 L c o n f L_{conf} Lconf,完整的公式如下: L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j p log ⁡ c ^ i p − ∑ i ∈ N e g log ⁡ c ^ i 0 where     c ^ i p = exp ⁡ ( c i p ) ∑ p exp ⁡ ( c i p ) L_{conf}(x, c) = - \sum_{i \in Pos}^N x_{ij}^p\log{\hat{c}_i^p} - \sum_{i\in Neg} \log{\hat{c}_i^0} \space\space\space\space \text{where} \space\space\space\space \hat{c}_i^p=\frac{\exp{(c_i^p)}}{\sum_p \exp{(c_i^p)}} Lconf(x,c)=iPosNxijplogc^ipiNeglogc^i0    where    c^ip=pexp(cip)exp(cip),从公式的形态,可以看出来是二元交叉熵。没错,其实 softmax loss 就相当于交叉熵和 softmax 的组合,先看看最后的 softmax 公式: c ^ i p = exp ⁡ ( c i p ) ∑ p exp ⁡ ( c i p ) \hat{c}_i^p=\frac{\exp{(c_i^p)}}{\sum_p \exp{(c_i^p)}} c^ip=pexp(cip)exp(cip)

  • c i p c_i^p cip: 对于分类的部分,一般网络的全连接层会输出 P P P 个类别的向量,在 SSD 因为要考虑背景(背景是分类 0),这个长度为 P + 1 P+1 P+1 的向量经过 softmax 之后,所有值的和会被限制为 1。其中置信率最大的值即是 c i p c_i^p cip(目前这个值还没经过归一化),这表示 anchor i i i 是的类别是 p p p 的可能性最大。
  • c ^ i p \hat{c}_i^p c^ip:是通过对 c i p c_i^p cip 进行 softmax 而得到的,表示 anchor i i i 是分类 p p p 的概率,值是位于 0~1 之间的。

然后就是主公式的各个参数的具体含义:

  • x i j p x_{ij}^p xijp:含义同上面位置损失提到的,如果 anchor i i i 与 gt box j j j 是匹配的,gt box 的类别是 p p p,则为1,否则 0。
  • c ^ i 0 \hat{c}_i^0 c^i0:就是背景的分类概率(负样本)。

其实这个公式也没什么难理解的。


大致就是这么多了,如果大家有什么不清楚的地方或者是文章哪里写错了,欢迎评论留言。

相关文章:

【目标检测】SSD损失函数详解

文章目录 定位损失 L l o c L_{loc} Lloc​偏移值的计算smooth L1 loss 置信率损失 L c o n f L_{conf} Lconf​ 最近看看这个古早的目标检测网络&#xff0c;看了好多文章&#xff0c;感觉对损失函数的部分讲得都是不很清楚得样子&#xff0c;所以自己捋一下。 首先&#x…...

C【整数正序分解】

// 整数正序分解 #include <stdio.h> #include <stdlib.h>int main() {int x;scanf("%d", &x);// 13425/10000->1(int一个d)// 13425%10000->3425(这是x)// 10000/10-.1000(这是mask)int mask 1;int t x;while (t > 9){t / 10;mask * 10;…...

基于springboot实现高校党务平台管理系统【项目源码】计算机毕业设计

基于springboot实现高校党务平台管理系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#x…...

Day24力扣打卡

打卡记录 寻找峰值&#xff08;二分法&#xff09; class Solution { public:int findPeakElement(vector<int> &nums) {int left -1, right nums.size() - 1; // 开区间 (-1, n-1)while (left 1 < right) { // 开区间不为空int mid left (right - left) / …...

5G-A 商用加速,赋能工业互联网

2019 年 6 月&#xff0c;中国工业和信息化部发放 5G 商用牌照。同年 10 月&#xff0c;三大运营商公布 5G 商用套餐&#xff0c;11 月 1 日正式上线 5G 商用套餐&#xff0c;标志中国正式进入 5G 商用新纪元。今年是 5G 商用的第五年&#xff0c;在当前数字经济蓬勃发展的催化…...

代码随想录day2

目录 vscode 自定义代码模板Reference vscode 自定义代码模板 select User snippets from Settings on the bottom left corner. select a certain language for example: cpp create your own snippets 格式如下&#xff0c;防着写 第一行"cpp template",模板…...

UML/SysML建模工具更新(2023.10)(1)StarUML、Software Ideas Modeler

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本&#xff1a;Software Ideas Modeler 14.02 更新时间&#xff1a;2023年10月9日 工具简介 轻量级建模工具&#xff0c;支持UML、BPMN、SysML。 平台&#xff1a;Windo…...

kubectl 资源管理命令-陈述式

目录 一、kubectl陈述式资源管理&#xff1a; 二、kubectl陈述式对象管理&#xff1a; 1.基础命令使用&#xff1a; 1.1 帮助手册&#xff1a; 1.2 查看版本信息&#xff1a; ​编辑 1.3 查看资源对象简写: 1.4 查看集群信息: 1.5 配置kubectl自动补全: 1.6 node节点查看日志…...

【紫光同创国产FPGA教程】——【PGL22G第九章】HDMI环路实验例程

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 适用于板卡型号&#xff1a; 紫光同创PGL22G开发平台&#xff08;盘古22K&#xff09; 一&#xff1a;盘古22K开发板&#xff08;紫光同创PGL22G开…...

IDEA Plugin插件开发相关踩坑

1 前言 最近在研究IDEA插件开发&#xff0c;踩了不少坑&#xff0c;特意在这里记录一下…… 2 Java相关类找不到 照着网上一些资料&#xff0c;想要实现代码审计自动提示功能&#xff0c;需要继承AbstractBaseJavaLocalInspectionTool 结果import一片爆红&#xff0c;找不到相…...

汽车标定技术(八)--MPC57xx是如何支持标定的页切换

目录 1.页切换的概念 1.1 标定常量的理解 1.2 页切换 2.MPC57xx的Overlay模块 3.小结 1.页切换的概念 在汽车标定测量中&#xff0c;有一个概念我想很多人都听过&#xff0c;但是实际上在项目里没有用到过&#xff0c;那就是今天要讲的页切换概念。在讲页切换的时候&#…...

Ubuntu中增加交换内存

前言 在运行一些代码编译或者clang-format会占用大量的内存&#xff0c;此时可能会出现电脑卡死的情况&#xff0c;在ubuntu中可以通过增加交换内存来临时解决这个问题&#xff0c;相对于硬件改动成本更低&#xff0c;但是性能不如物理内存。 实践 查看当前的交换内存大小 …...

一文带您了解云渲染

很多刚刚接触云渲染的网友可能还不太了解云渲染&#xff0c;不知道云渲染是什么&#xff0c;不知道如何选择云渲染&#xff0c;不知道云渲染怎么收费&#xff0c;今天小编归纳总结了一些网友比较关心的问题&#xff0c;在本文中一一为大家解答。 云渲染是什么&#xff1f; 云…...

分享4个MSVCP100.dll丢失的解决方法

msvcp100.dll是一个重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。如果计算机系统中msvcp100.dll丢失或者损坏&#xff0c;就会导致软件程序无法启动运行&#xff0c;会…...

国际腾讯云服务器流量收费准分析!!

腾讯云是腾讯公司供应的云核算服务&#xff0c;包含云服务器、云存储、数据库、CDN、安全等服务。本文将对腾讯云服务器流量收费标准进行具体的分析&#xff0c;协助用户了解腾讯云服务器的运用本钱。 腾讯云服务器流量收费标准首要分为包年包月、按需付费和按流量付费三种办法…...

Redis系列-四种部署方式-单机部署+主从模式+哨兵模式【7】

目录 Redis系列-四种部署方式-单机部署主从模式【7】redis-四种部署模式单机模式主从模式数据同步的方式全量数据同步增量数据同步 Redis哨兵模式总结缺点&#xff1a;哨兵模式应用sentinel.conf配置项 REF 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持…...

Webpack 的作用和工作原理是什么?

Webpack 是一个现代的静态模块打包工具&#xff0c;它的作用是将前端应用程序的各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;视为模块&#xff0c;并将它们打包成可以在浏览器中运行的静态文件。它的主要功能包括模块打包、资源优化、代码分割、加载器转换等。…...

ros1 实现Server端自定义四 Topic模式控制海龟运动

一、服务模型 Server端本身是进行模拟海龟运动的命令端&#xff0c;它的实现是通过给海龟发送速度&#xff08;Twist&#xff09;的指令&#xff0c;来控制海龟运动&#xff08;本身通过Topic实现&#xff09;。 Client端相当于海龟运动的开关&#xff0c;其发布Request来控制…...

IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何找回被 Drop Commit 的提交记录

本心、输入输出、结果 文章目录 IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何找回被 Drop Commit 的提交记录前言查询 reflog 日志通过 Git Reset HEAD (hard) 找回已经 Drop Commit 的提交记录Git Reset HEAD (hard) 模式和 mixed 模式有啥区别git reset --h…...

C# 压缩PDF文件

PDF 文件可以包含文本、图片及各种媒体元素&#xff0c;但如果文件太大则会影响传输效果同时也会占用过多磁盘空间。通过压缩PDF文件&#xff0c;能够有效减小文件大小&#xff0c;从而提高传输效率并节省存储空间。想要通过C#代码快速有效地压缩 PDF 文件&#xff0c;下面是实…...

零基础快速开发eBPF程序

eBPF&#xff08;extended Berkeley Packet Filter&#xff09;是Linux内核中的一项革命性技术&#xff0c;允许开发者在不修改内核源码的情况下安全运行沙盒化程序。对于零基础开发者&#xff0c;使用BCC框架是最简单的入门方式。以下是详细的开发步骤&#xff1a;一、环境准备…...

TF-Agents:构建端到端强化学习流水线的工业级框架

1. 项目概述&#xff1a;当强化学习遇上工业级框架如果你在深度学习和机器人控制领域摸爬滚打过一阵子&#xff0c;大概率会听过或者用过OpenAI的Gym、Stable-Baselines3这些工具。它们确实好用&#xff0c;让研究者能快速验证算法想法。但当你真的想把一个强化学习&#xff08…...

易语言本地网络验证系统源码免服务器

带简单的防破解和加密解密。 需要的自己下载吧。 我用夸克网盘分享了「本地验证l例程.zip」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/d97…...

从科研到临床:手把手教你用Python实现fNIRS脑网络的图论分析(附代码与数据)

从科研到临床&#xff1a;手把手教你用Python实现fNIRS脑网络的图论分析&#xff08;附代码与数据&#xff09; 在神经科学研究的前沿领域&#xff0c;功能近红外光谱技术&#xff08;fNIRS&#xff09;正逐渐成为探索大脑奥秘的重要工具。这种非侵入式成像方法通过监测大脑皮层…...

如何高效使用PostCSS Input:源文件信息与位置跟踪完整指南

如何高效使用PostCSS Input&#xff1a;源文件信息与位置跟踪完整指南 【免费下载链接】postcss Transforming styles with JS plugins 项目地址: https://gitcode.com/gh_mirrors/po/postcss PostCSS作为一款强大的CSS转换工具&#xff0c;其Input模块在处理源文件信息…...

如何快速搭建Foundation Sites本地文档服务器:新手必备指南

如何快速搭建Foundation Sites本地文档服务器&#xff1a;新手必备指南 【免费下载链接】foundation-sites The most advanced responsive front-end framework in the world. Quickly create prototypes and production code for sites that work on any kind of device. 项…...

可复用Agent开发框架、多智能体协同系统、安全管控方案

可复用Agent开发框架、多智能体协同系统、安全管控方案 目录 可复用Agent开发框架、多智能体协同系统、安全管控方案 一、核心概念定义与通俗解读 1. 可复用Agent开发框架 2. 多智能体协同系统(Multi-Agent System, MAS) 3. Agent安全管控方案 二、2026年行业头部方案详解 1…...

肝了三天三夜!最详尽的漏洞扫描工具实战笔记

GobyAWVS 漏洞扫描 提示提示&#xff1a; 本文里面很多工具都是网址&#xff0c;还有站长之家之类的&#xff0c;csdn一直判断成暗链&#xff0c;可以去我自己博客查看完整全文&#xff1a; 多说一句&#xff1a;csdn对网安真的不友好&#xff0c;全文链接都不让放。。。》[好淘…...

量子-经典混合编排难题全解析,基于MCP 2026标准的4类典型故障诊断与容错加固指南

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;量子-经典混合编排的MCP 2026标准演进与核心约束 MCP 2026&#xff08;Mixed Classical-Quantum Orchestration Protocol&#xff09;标志着量子计算基础设施从实验性调度迈向生产级协同编排的关键转折…...

怎样高效部署ClearerVoice-Studio:专业级AI语音处理工具包全面指南

怎样高效部署ClearerVoice-Studio&#xff1a;专业级AI语音处理工具包全面指南 【免费下载链接】ClearerVoice-Studio An AI-Powered Speech Processing Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Enhancement, Separation, and Target Speaker Extr…...