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

目标检测中的损失函数

损失函数是用来衡量模型与数据的匹配程度的,也是模型权重更新的基础。计算损失产生模型权重的梯度,随后通过反向传播算法,模型权重得以更新进而更好地适应数据。一般情况下,目标损失函数包含两部分损失,一个是目标框分类损失,一个是目标框定位损失,两者共同构成目标检测问题的损失形式。


文章目录

  • 1、分类损失
    • 1.1 交叉熵损失函数CE Loss
    • 1.2 标签平滑label smooth
    • 1.3 Focal loss
  • 2. 目标定位损失
    • 2.1 均方误差MSE(L2损失)
    • 2.2 平均绝对误差MAE(L1损失)
    • 2.3 smooth L1
    • 2.4 IoU损失函数
    • 2.5 GIoU损失函数
    • 2.6 DIoU损失函数
    • 2.7 CIoU损失函数
    • 2.8 RIoU损失函数
    • 2.9 EIoU与Focal-EIoU损失函数
    • 2.10 α-IoU损失函数


目标检测算法通用损失函数可写作:
在这里插入图片描述
它主要由目标框分类损失和目标框回归损失两部分组成,其中目标框回归损失部分只有IoU大于阈值η的样本才参与损失计算。


1、分类损失

分类损失是用来评价预测类别与实际类别的偏离程度的,早期像YOLOv1和YOLOv2就简单采用MSE/L2损失。后面大多采用交叉熵损失(Cross-Entropy Loss)。为提高分类效率,也为了提高模型泛化能力,解决噪声标签上的过信度(标注数据存在噪声,标签过度自信)问题,提出了标签平滑(Label Smooth);为了解决类别不平衡和分类难度差异问题,设计了焦点损失(Focal loss)。这些改进都是在CE Loss的基础上进行改进的。

1.1 交叉熵损失函数CE Loss

交叉熵损失函数(Cross-Entropy Loss)是机器学习和深度学习中常用的一种损失函数。它在神经网络中通常与 softmax 函数结合使用。softmax 函数将模型的原始输出转换为概率分布,而交叉熵损失函数则计算这个预测概率分布与真实概率分布之间的差异。这种组合在多分类问题中非常有效。它基于信息论中的交叉熵概念,用于衡量模型预测概率分布与真实标签分布之间的差异。

介绍交叉熵先得从信息量,信息熵再到相对熵说起。热力学中的热熵是表示分子状态混乱程度的物理量。香农用信息熵的概念来描述信源的不确定度。信息是用来消除随机不确定性的,信息量的大小与信息发生的概率成反比。概率越大,包含的信息量越小,概率越小,包含的信息量越大。如“明天太阳从东边升起”,这条信息并没有减少不确定性,因为太阳肯定是从东边升起的,这是一句废话,信息量为0。“明天在天上能看见彩虹”,我们都知道,要想看见彩虹,需要一定条件的,比如要同时有水汽和阳光等,所以从直觉上,这条信息具有一定信息量的。

信息量
设某一件事发生的概率为p(x),其信息量为:I(x) = -log(p(x))
其中I(x)表示信息量,这里log表示以e为底的自然对数,以2为底则表示对应bit数的信息量。
信息熵
信息熵也被称为熵,用于表示某件事可能发生所包含的所有信息量的期望。这个期望的计算方式为每件事发生的概率乘以每件事的信息量之和。可用公式表示为:
在这里插入图片描述
比如我们要求得明天天气的信息熵,根据今天天气的情况,我们预测明天是晴天的概率为0.7,明天是雨天的概率是0.1,明天是阴天的概率是0.2,则明天的天气信息熵可计算为:
H(x) = -(0.7xlog(0.7))+0.1xlog(0.1)+0.2xlog(0.2))
相对熵(KL散度)
相对熵或者叫KL散度通常用于衡量同一个随机变量X的两个独立概率分布P(x)与Q(x)之间的差异,可用公式表示为:
在这里插入图片描述
由公式可知,当P(x)与Q(x)分布非常接近时,Dkl越接近于零,所以机器学习或者深度学习中可以利用KL散度作为损失函数,通过训练模型的预测分布Q(x),使其慢慢逼近训练数据分布P(x),进而使得两个分布的KL散度值达到最小。
交叉熵
将上面KL散度公式展开:
在这里插入图片描述
公式后面的H(p||q)即为分布P(x)与Q(x)的交叉熵,所以:
在这里插入图片描述
在机器学习有监督训练网络时,输入数据与标签常常是已经确定好的,所以训练数据的真实概率分布P(x)其实是已知的,那么对应的信息熵H(x)就可以计算出来,是一个常量;前面我们介绍KL散度时已经表明KL散度值表示真实概率分布P(x)与模型预测概率分布Q(x)之间的差异,值越小代表两者差异越小,所以可以把最小化KL散度值当做模型优化的目标,而现在交叉熵等于KL散度值加一个常量(信息熵H(x)),而且交叉熵计算公式更简单,所以用最小化交叉熵代替最小化KL散度作为模型优化的目标函数是现在常用做法。


1.2 标签平滑label smooth

因为标签可能存在错误标注(噪声标签),为了避免过度信任噪声标签而导致模型过拟合,所以提出了标签平滑技术,即将hard label变成soft label,对于ont-hot编码,原来是1的位置变成1-α,其他原来为0的位置变成α/(k-1),α通常取值为0.1,k为类别数量。例如,一个3分类任务,且真实标签为q,预测概率p是由网络最后一层输出经过softmax变换得到,则交叉熵损失可表示为:
在这里插入图片描述
对于标签q=[0,1,0]通过标签平滑后,变成q’=[0.05, 0.9, 0.05],原来的交叉熵损失为:
CEori = -log(p1),而通过标签平滑后,交叉熵损失变成了:
CE = -(0.05log(p0)+0.9log(p1)+0.05log(p2))


1.3 Focal loss

Focal loss是在2017年目标检测论文RetinaNet中提出的,用于控制目标检测中正负样本框的平衡问题;RetinaNet指出,在单阶段密集目标检测算法中,例如SSD,有1万到10万个候选框,但是里面有目标的正样本占的比例非常少,剩余的全为负样本。正负样本不平衡会导致两个问题:一是模型学习不高效,可能学习到大量简单的负样本,这对于模型学习没有多大用处。二是简单的负样本会压制模型训练,导致模型能力退化。
Focal Loss是为one-stage的检测器的分类分支服务的,它支持0或者1这样的离散类别label。
目的是解决样本数量不平衡的情况:
1)正样本loss增加,负样本loss减小
2)难样本loss增加,简单样本loss减小
一般分类时,通常使用的交叉熵损失函数如下:
在这里插入图片描述
为了解决正负样本不平衡问题,通常在交叉熵损失前面加一个参数α,用于控制对应类别损失的大小。比如负样本多,那就减小负样本前面的参数以降低负样本的权重,正样本少,就增大正样本前面的参数以增加正样本的权重。用公式可表示为:
在这里插入图片描述
虽然通过增加参数α可以平衡了正样本/负样本的重要性,但它区分不了简单样本和困难样本,在单阶段目标检测算法中,有大量的简单样本,这就导致损失大部分其实是由简单样本所主导。所以作者提出,要重新构造损失函数以降低简单样本的权重,从而将训练重点放在困难负样本上。

Focal loss认为,易区分的简单样本(即置信度高的样本)对模型学习的贡献小,可以调低它们的权重,模型应该重点关注那些难以区分的困难样本(即置信度低的样本),公式如下:
在这里插入图片描述
为了同时平衡正负样本问题,Focal loss还结合了加权交叉熵的参数,所以两者结合后得到了最终的Focal loss为如下公式:
在这里插入图片描述


2. 目标定位损失

目标定位损失,用于优化位置和尺寸偏差,是目标检测算法中特有的损失函数,算法最终检测得准不准,很大程度上归功于目标框定位损失设计得好不好。目标框有四个角点一个中心点,早期像YOLOv1检测算法,就是通过直接回归目标框的四个角点得到定位损失的,后面改进到smooth L1,再到IoU损失,进一步出现GIoU,DIoU,CIoU,RIoU,EIoU等变体。

2.1 均方误差MSE(L2损失)

均方误差(Mean Square Error, MSE)通常用于回归损失函数中,它表示预测值f(x)与真实目标值y之间差值平方和的均值,可用如下公式表示:
在这里插入图片描述
MSE曲线如下图所示,在f(x)等于y时,损失值最小为0。
在这里插入图片描述
它的优点是曲线连续光滑,处处可导。缺点是不太稳定,由于平方的原因,会将误差放大,容易受到异常值影响,当函数的输入值(f(x)-y)偏离中心点较远时,梯度会变得非常大,在训练初期不稳定;在接近于真实值的时候即(f(x)-y)值接近于0时,曲线却变得十分的平缓,甚至可能会出现梯度趋向于0的情况,这就造成训练速度变慢。
均方误差在很多地方也被称为L2损失,和误差平方和损失(Sum Square Error, SSE)也是一样的效果。
下图是YOLOv1的损失函数构成:
在这里插入图片描述
可以看到YOLOv1的损失由三部分组成,localization loss,objectness loss和classification loss,它们均采用L2损失。


2.2 平均绝对误差MAE(L1损失)

平方绝对误差也是常用于回归的一种损失函数,MAE用于衡量预测值f(x)与真实目标值y的误差绝对值之和,对于一组预测值,通常求它们的平均绝对误差,用下面公式可表示为:
在这里插入图片描述
它的导数是常数,当f(x)-y大于0时,导数为1,当f(x)-y小于0时,导数为-1,当f(x)-y等于0时,不可导。
在这里插入图片描述
它的优点是拥有稳定的梯度,对于异常值没有L2损失那么敏感,因为MAE计算的是误差的绝对值,对于任意大小的误差,MAE对误差的惩罚都是一样的。缺点是导数为常数,在训练后期,x 很小时(对应上图f(x)-y值很小), 如果学习率不变,损失函数会在最优值附近波动,很难收敛到最优值。MAE也经常被叫做L1损失函数。


2.3 smooth L1

从梯度求解及模型收敛方面考虑,MSE是优于MAE的,因为MSE处处可导,且梯度值是动态变化的,能达到快速收敛的目的。对于异常值敏感度方面考虑,MAE是优与MSE的,它不会由于误差大而加大对异常值的惩罚,从而让模型更新偏向于拟合异常值。结合两者的优势,就是smooth L1了,顾名思义,smooth L1就是平滑的L1损失函数,公式如下:
在这里插入图片描述
SmoothL1曲线如下图所示,可以看到对比L1损失曲线,在0点处,SmoothL1更平滑,它优化了L1损失函数在0点处不可导的缺点,并保持了L1损失函数对异常值不敏感的优点。
在这里插入图片描述
在Fast RCNN的定位损失中作者采用了Smooth L1损失,公式如下:
在这里插入图片描述
作者指出,Smooth L1是更鲁棒的L1,相比于R-CNN以及SPPnet中使用的L2损失,当回归目标框无边界时,具有L2损失的训练可能需要仔细调整学习梯度,以防止梯度爆炸。但是Smooth L1由于保持了L1对异常值不敏感的优势,避免了这个问题。
所以Smooth L1相对于L1损失而言,它可以收敛得更快,误差小时,梯度会减小,不会产生震荡;相对于L2损失而言,对于异常值不敏感,梯度变化稳定,训练时不易产生梯度爆炸。


2.4 IoU损失函数

论文:UnitBox: An Advanced Object Detection Network
IoU损失首次出现是在2016年的UnitBox论文中,用于人脸检测。作者提到作为对比的DenseBox人脸检测算法利用特征图的每个像素来回归一个4-D的距离向量(当前像素与包含它的候选对象的四个边界之间的距离)。然而,DenseBox采用的L2损失,违背了矩形框四个点是相关的,作者认为应该联合回归。此外,DenseBox为了平衡不同尺度的边界框,还要求将训练图像补丁调整为固定比例。因此,DenseBox必须对图像金字塔进行检测,这不可避免地影响了框架的效率。于是作者提出了更高效的IoU损失函数。两个框的IoU以及L2距离计算方式如下:
在这里插入图片描述
因为IoU的大小分布是[0,1]这一特性,所以我们可以把IoU看作是从伯努利分布中一种随机抽样的变量,论文中采用的损失函数是把IoU当做交叉熵的输入:
在这里插入图片描述
与L2 loss相比,可以看到IoU loss将边界框视为一个整体变量,而不是像L2 loss那样独立优化四个坐标。
现在用得更多是IoU损失是 LIoU = 1-IoU
IoU代表预测框和真实框的交集与并集之比,当预测框与真实框完全重合时,IoU就等于1,这时LIoU就等于0,优化LIoU,使其越小,说明预测框越来越接近真实框。
总之,IoU损失相对于L2损失有如下优势:
1、L2损失把预测框坐标当做互相独立的四个变量进行训练,而IoU损失将预测框作为一个整体进行训练,这样得到的结果更准确;
2、无论输入的样本是什么样子,IoU的值均介于 [0,1],这种天然的归一化的损失使模型具有更强的处理多尺度图像的能力。
3、相对于L2损失,IoU损失收敛速度更快,相同误识率下,召回率更高,如下图所示:
在这里插入图片描述
4、L2损失对多尺度敏感,但IoU损失对于多尺度不敏感。如下图所示:
在这里插入图片描述

IoU作为损失函数也存在如下问题:
1、如果预测框和真实框没有重叠,则两者的IoU值为零,这并不能反映两者之间的距离。
2、当两个框不重叠时,IoU损失为1,为常数,则梯度为0,无法进行参数优化更新。


2.5 GIoU损失函数

论文:Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression
由于IoU作为损失函数存在框不重叠情况下无法优化的问题,所以作者提出了通用IoU损失,即GIoU(Generalized Intersection over Union),使得即使预测框与真实框不重叠的情况下,依然能计算损失,依然能让预测框尽可能朝着真实框的位置移动,GIoU的计算方式如下:
在这里插入图片描述
相对于IoU,GIoU需要找出框A与框B的最小闭包矩形框C,当两个框A,B不重叠时,IoU等于0,则可以通过闭包框C和AB并集的差集与闭包框C的比值来计算损失值大小。如下图,各个值代表的区域如下:
在这里插入图片描述
上图中红框代表框A与框B的最小闭包框C,GIoU主要解决框AB不重叠情况下,无法更新的问题,可以看到,当框AB不重叠情况下,GIoU = 0-|C-AUB|/|C|,随着,框A与框B的距离越来越远,GIoU会越来越接近-1。所以GIoU不仅可以关注框的重叠区域大小,而且还可以关注其他非重叠区域大小,能较好反映出两个框直接的距离。
GIoU也有不足之处:
1、对每一对预测框与真实框均需要计算最小闭包框,整个计算过程比IoU增加了耗时,而且收敛慢。
2、当一个框完全包含另一个框时,GIoU退化成了IoU,还是不能反映两个框的距离远近。

而GIoU损失,论文参考常用的IoU损失,采用了1-GIoU作为损失函数,即:
LGIoU = 1-GIoU
由于GIoU的范围是[-1, 1],所以GIoU损失LGIoU的取值范围是[0, 2]。


2.6 DIoU损失函数

论文:Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression
DIoU(Distance-IoU)通过简单地在IoU损失上添加一个惩罚项,直接最小化两个边界框中心点之间的归一化距离,可以得到比GIoU损失更快的收敛速度,如下图所示:
在这里插入图片描述
用GIoU loss优化,预测框通常会首先被增大用于覆盖真实框,然后随着迭代次数增加再慢慢减小预测框。而DIoU loss优化是直接最小化两个框中心点的归一化距离。
除了收敛快的优点,DIoU还解决了上一节提到的GIoU在两个框存在包含问题时退化成IoU不能体现两者距离的问题,如下图所示:
在这里插入图片描述
上图中真实框完全包含预测框时,即使预测框在真实框内部三个不同位置处,IoU大小也是一样的,同样,GIoU此时退化成IoU,其大小也和IoU一样,即两个框存在包含关系时,IoU、GIoU无法体现两个框的位置远近关系。而DIoU却能得到不一样的数值用于体现两个框的位置远近关系。
DIoU也可以应用在NMS中,在抑制冗余预测方面比原有NMS具有更高的鲁棒性。
作者基于IoU损失新增加了一个惩罚项,如下:
在这里插入图片描述
其中R(B, Bgt)代表新增加的基于预测框B和真实框Bgt的惩罚项
作者定义的DIoU计算公式为:
在这里插入图片描述
其中b和bgt代表预测框B和真实框Bgt的中心点,ρ(.)代表求欧式距离,c代表两个框的最小外接矩形的对角线长度。如下图所示:
在这里插入图片描述
所以DIoU损失函数定义如下:
在这里插入图片描述
作者认为一个好的边界框回归损失函数应该考虑三个重要的几何因素,即重叠面积、中心点距离和宽高比。通过统一边界框坐标,IoU损失考虑了重叠区域,GIoU损失严重依赖于IoU损失,等同于只考虑了重叠区域。DIoU损失是同时考虑边界框的重叠面积和中心点距离。然而,边界框宽高比的一致性也是一个重要的几何因素,这点DIoU损失没有考虑到,如下图,当预测框在真实框内部,且两者中心点距离一致时,DIoU大小是一样的,这样就无法体现谁回归得好了。
在这里插入图片描述


2.7 CIoU损失函数

CIoU损失和DIoU损失是在同一篇论文提出的,是对DIoU损失的一个改进,改进了DIoU损失没有考虑到矩形框宽高比的情况,CIoU的计算公式如下:
在这里插入图片描述
可以看到CIoU的计算方式是在DIoU的基础上增加了αν,其中α是一个平衡参数,ν表示宽高比一致性评估指标,其公式如下:
在这里插入图片描述
α参数定义如下:
在这里插入图片描述
所以CIoU损失函数的计算公式如下:
在这里插入图片描述
CIoU损失和DIoU损失对比GIoU以及IoU损失可以明显加快收敛速度,如下图,是作者做的实验对比,可以看到CIoU和DIoU在50次迭代就基本收敛到很小的值了,而GIoU和IoU需要迭代大量的次数,IoU迭代200次甚至不能得到一个较小的误差。
在这里插入图片描述
作者在论文的实验部分,将YOLOv3,SSD,Faster R-CNN的损失函数由IoU、GIoU替换成DIoU和CIoU以及CIoU with DIoU NMS,结果表明均带来性能提升。

通过αν的公式可以看出,CIoU依然存在不足之处:
1、若预测框和真实框的宽高比相同时,则αν这个新增的惩罚项为0,CIoU将退化成DIoU,存在不合理之处。
2、从论文中给出的ν对w和h的求导公式可以看出,如下图,w和h是一对相反数,无法同时增大或减小,这抑制了模型的优化。
在这里插入图片描述
即:
在这里插入图片描述
3、由于ν只反映了两个框宽高比的差异,所以CIoU损失可能以不合理的方式优化相似性。比如:CIoU可能只关注两个框之间宽高比的相似性,而忽略两个框实际大小的差异。如下图所示,随着迭代次数增加,预测框(红框)与真实框(蓝框)的距离在拉进,且预测框的宽高比也在逐渐趋近于真实框的宽高比,但是预测框的大小还是没有趋近于真实框的大小,还得通过增加迭代次数进一步优化。
在这里插入图片描述


2.8 RIoU损失函数

论文:Single-Shot Two-Pronged Detector with Rectified IoU Loss
作者在文中指出,现如今的检测算法大多采用特征金字塔用于缓解目标实例间尺度变化的问题。这些目标检测器通过自上而下的路径和横向连接来增强特征,主要是为了丰富底层特征的语义信息,但是忽略了高层特征的增强。这可能导致不同级别特征之间的不平衡,特别是高层级特征中严重缺乏底层详细信息,这使得难以获得准确的边界框。所以作者在网络中引入了双向转换思想,从前向和后向两个方向探索不同层之间的关系,从而丰富了低层特征的语义信息和高层特征的细节信息。作者设计的网络被命名为TPNet( Two-Pronged Network)。

此外,由于单阶段检测器中难易样本的分布不平衡,定位损失梯度往往被定位精度较差的难样本(即IoU小的样本)所主导。这将使模型偏向于学习难样本而导致难以收敛。因此,在TPNet中,提出了一种基于自适应IoU的定位损失,称为RIoU(Rectified IoU)损失,对每一类样本的梯度进行整流。RIoU损失增大了高IoU样本的梯度,抑制了低IoU样本的梯度,从而提高了模型的整体定位精度。
TPNet的整体框架如下,主要包含T block和Fusion block两种模块,作用是促进了低层特征和高层特征的特征融合,这里不展开陈述了。
在这里插入图片描述
这里聊聊RIoU损失函数,作者意识到在单阶段中存在大量的难样本,这里的难样本是anchor boxes与真实标注框存在较低的IoU值,大量的难样本会贡献大部分的梯度用来模型优化,这就导致模型训练不稳定,难以收敛的问题。因为IoU值小的困难样本是占大多数的,IoU值大的简单样本只占少部分,作者的想法是直接根据IoU值大小自适应调整样本梯度的贡献量,将简单样本(IoU值大)的梯度增大,让网络更关注这些样本,而将难样本(IoU值小)的梯度抑制。这样会使得每种类型的样本的贡献更均衡,训练过程更高效和稳定。
已知IoU损失函数公式如下:
在这里插入图片描述
对IoU求导得到:
在这里插入图片描述
从IoU损失函数对IoU求导结果可以看出,IoU损失对IoU值大的简单样本和对IoU值小的困难样本得到的梯度都是一样的,一视同仁,而通常情况下,低IoU值的样本数量大于高IoU值的样本数量。所以在训练阶段,困难样本就会主导localization loss的梯度,进而影响坐标框回归的优化。

作者的想法是随着IoU值增大,增加样本梯度的权重,但是也不能一味的增大,比如当IoU值为1时,即anchor box与真实框完全重合时,这个时候样本贡献的梯度应该为0。所以,作者给出了IoU值与梯度的关系如下图所示:
在这里插入图片描述
上图红色曲线即为RIoU损失的梯度形式,它随着IoU值增加,梯度值也增加,待IoU增大到β后(文中β取值为0.95),梯度值急剧下降。红色曲线是双曲线函数,可通过a,b,c,k四个参数定义如下:
在这里插入图片描述
对上式进行积分并结合边框回归损失的性质可得到RIoU损失的公式为:
在这里插入图片描述
RIoU与IoU损失曲线如下图所示,当IoU<β时曲线是凸型,当IoU>β时曲线是凹型。
在这里插入图片描述
最后作者也在SSD检测算法上验证了RIoU损失函数的效果:
在这里插入图片描述


2.9 EIoU与Focal-EIoU损失函数

论文:Focal and Efficient IOU Loss for Accurate Bounding Box Regression
该论文指出现如今边界框回归损失函数存在的两点不足:
1、基于L2范数的损失函数和基于IoU的损失函数都不能有效地描述边界框回归的目标,从而导致收敛缓慢和回归结果不准确。
2、大多数边界框回归损失函数都忽略了样本不平衡问题,因为大部分的anchor boxes与真实框仅有小部分重叠,但是会贡献大部分的边框回归优化梯度,这是不合理的。
EIoU也是同时考虑了重叠面积,中心点距离和宽高比三个因素,公式如下:
在这里插入图片描述
其中wc与hc分别代表两个框最小外接矩形C的宽和高,与CIoU损失不同的是,EIoU直接减小了预测框与真实框宽度和高度的差值,使得收敛速度更快,定位效果更好。
下面是GIoU、CIoU、EIoU三个损失函数定义以及迭代收敛速度对比:
在这里插入图片描述
在这里插入图片描述
可以看到,在迭代150次以内,EIoU能快速收敛到最佳。

和上一节RIoU一样,EIoU的作者也意识到了边框回归中存在的样本不均衡问题,即高质量的IoU值大的样本只占少部分,而大部分均是低质量低IoU值的困难样本,模型更新梯度被大部分低质量样本所主导,作者想提升高质量样本梯度所占的权重,于是提出了Focal-EIoU损失,其公式如下:
在这里插入图片描述
公式中γ是一个超参数,用于控制对低IoU值困难样本的抑制程度,作者做了消融实验得出γ=0.5时,性能最佳,如下图所示。因为IoU值是[0, 1]的小数,γ越大,则IoUγ值越小,且对较小IoU值抑制越强;较大的γ值对困难样本的抑制作用较强,可能会减慢收敛速度。这也是当γ = 2.0时,性能比较差的原因。
在这里插入图片描述
下图是各种IoU损失随着迭代次数增加边框回归损失减小和学习样本的分布情况,可以看出,Focal-EIoU收敛最快且随着迭代次数增加,倾向于学习高IoU值的样本。
在这里插入图片描述
下表是作者基于RetinaNet(ResNet-50+FPN)为基准,评估各个IoU损失的消融实验:
在这里插入图片描述


2.10 α-IoU损失函数

论文:Alpha-IoU: A Family of Power Intersection over Union Losses for Bounding Box Regression

相关文章:

目标检测中的损失函数

损失函数是用来衡量模型与数据的匹配程度的&#xff0c;也是模型权重更新的基础。计算损失产生模型权重的梯度&#xff0c;随后通过反向传播算法&#xff0c;模型权重得以更新进而更好地适应数据。一般情况下&#xff0c;目标损失函数包含两部分损失&#xff0c;一个是目标框分…...

list库实现

list库实现的要点&#xff1a; 构建list类时&#xff0c;需要同时构建struct Node来存储节点信息&#xff0c;list类中只存储哨兵位节点信息&#xff0c;迭代器类需要template<T,Ptr,Ref>来构建const和非const迭代器&#xff0c;迭代器中也是存储节点信息。反向迭代器也…...

MFC工控项目实例二十三模拟量输入设置界面

承接专栏《MFC工控项目实例二十二主界面计数背景颜色改变》 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Construction public:SenSet(CWnd* pParent NULL); //…...

排序算法总结(三)希尔排序

访问www.tomcoding.com网站&#xff0c;学习Oracle内部数据结构&#xff0c;详细文档说明&#xff0c;下载Oracle的exp/imp&#xff0c;DUL&#xff0c;logminer&#xff0c;ASM工具的源代码&#xff0c;学习高技术含量的内容。 如果你在网上搜一下希尔排序&#xff0c;都会告…...

如何迁移 Linux 服务器 第一部分 - 系统准备

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 在许多情况下&#xff0c;您可能需要将数据和操作需求从一个服务器迁移到另一个服务器。您可能需要在新的数据中心实施解决方案&a…...

网络IO模型都有哪些

“网络IO模型有BIO、NIO、AIO ” “他们分别代表什么&#xff0c;有什么区别吗&#xff1f; BIO&#xff1a;同步阻塞IO。 NIO&#xff1a;同步非阻塞IO。 AIO&#xff1a;异步非阻塞IO。 “BIO为什么是同步阻塞IO&#xff0c;他阻塞的是谁跟谁之间的关联&#xff1f;”。 首先…...

数据结构: 数组在算法中的应用

数组是计算机科学中的一种基础数据结构&#xff0c;它在算法中有着广泛的应用&#xff0c;其关键要素是索引与索引对应的值。 请注意&#xff0c;这些代码示例需要适当的辅助函数&#xff08;如 swap &#xff09;和主函数来运行。此外&#xff0c;一些算法&#xff08;如KMP算…...

js快速转换时间(时间戳转换成年月日时分秒)

1&#xff1a;js转换 1728270833000 转换为 2024-10-07 11:13:53 var date new Date(1728270833000); // 参数需要毫秒数&#xff0c;所以这里将秒数乘于 1000 Y date.getFullYear() -; M (date.getMonth()1 < 10 ? 0(date.getMonth()1) : date.getMonth()1) -; D…...

LeetCode15.三数之和

题目链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 1.常规解法&#xff08;会超时&#xff09; 由于这道题需要排除相同的三元组&#xff0c;则可以先将目标数组从小到大排序&#xff0c;再遍历数组找到每个符合条件的三元组&#xff0c;若结果中不包…...

SpringBoot3.3 优雅启停定时任务

定时任务是非常常见的功能,在一个复杂的应用程序中,如何优雅地管理这些定时任务的启动与停止尤为重要。 Spring Boot 提供了强大的任务调度支持,通过@Scheduled注解可以轻松地创建定时任务,并且可以通过配置来灵活地管理这些任务的执行环境。在本文中,我们将深入探讨如何…...

数据结构之二叉搜索树(key模型与key_value模型)

二叉搜索树&#xff08;key模型与key_value模型&#xff09; 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3. ⼆叉搜索树的插⼊4. ⼆叉搜索树的查找5. ⼆叉搜索树的删除6. ⼆叉搜索树的实现代码7. ⼆叉搜索树key和key/value使⽤场景7.1 key搜索场景&#xff1a;7.2 key/value搜…...

图说几何学2300年重大错误:附着在直线z上的直线段必是z的一部分

黄小宁 用泡沫塑料和油漆制成的铅球与真正的铅球&#xff0c;两者有不同的内部形状。同样&#xff0c;数学有长度相同但内部形状不同的伪≌直线段。 几何学有史2300年来一直认定附着在直线z上的直线段一定是z的一部分。其实这是2300年肉眼直观错觉——百年病态集论的症结。 …...

汽车网关(GW)技术分析

一、引言 在现代汽车电子系统中&#xff0c;汽车网关&#xff08;Gateway&#xff0c;简称 GW&#xff09;扮演着至关重要的角色。随着汽车电子技术的不断发展&#xff0c;汽车内部的电子控制单元&#xff08;Electronic Control Unit&#xff0c;简称 ECU&#xff09;数量不断…...

Telnet命令详解:安装、用法及应用场景解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…...

C++之LIST模拟实现(代码纯享版)

目录 文章目录 前言 一、代码 总结 前言 本文主要展示了模拟List的代码实现 一、代码 #pragma once #include<iostream> #include<assert.h> using namespace std; namespace zlh {template<class T>struct list_node{T _data;list_node<T>* _next;l…...

华为OD机试 - 括号匹配 - 栈(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…...

打破欧美10年芯片垄断,杨振宁教授关门弟子,仅用三年创造奇迹

有这么一位超级厉害的中国人&#xff0c;硬是把欧美那边垄断了十年的芯片技术给“撬”开了&#xff01;说起来&#xff0c;这才是我们该追的真正明星啊&#xff01;那么&#xff0c;这位大神到底是谁&#xff1f;又是怎么让欧美芯片圈儿里的人听到她的名字就心里发怵的呢&#…...

OpenCV视频I/O(20)视频写入类VideoWriter之用于将图像帧写入视频文件函数write()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::VideoWriter::write() 函数用于将图像帧写入视频文件。 该函数/方法将指定的图像写入视频文件。图像的大小必须与打开视频编写器时指定的大…...

音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现

一、引言 在《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中对Script Tag进行了简介&#xff0c;本文讲述FFmpeg源码中是怎样解码FLV文件的Script Tag&#xff0c;拿到里面的信息。 二、flv_read_packet函数 从《音视频入门基础&#x…...

小猿口算APP脚本(协议版)

小猿口算是一款专注于数学学习的教育应用,主要面向小学阶段的学生。它提供多种数学练习和测试,包括口算、速算、应用题等。通过智能化的题目生成和实时批改功能,帮助学生提高数学计算能力。此外,它还提供详细的学习报告和分析,帮助家长和教师了解学生的学习进度和薄弱环节…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...