目标检测定位损失函数:Smooth L1 loss 、IOU loss及其变体

Smooth L1 Loss

概述

Smooth L1 Loss(平滑 L1 损失),是一个在回归任务,特别是计算机视觉中的目标检测领域(如 Faster R-CNN, SSD)非常核心的损失函数。

xxx 表示模型的预测值,yyy 表示真实值,z=x−yz = x - yz=xy 表示预测值与真实值之间的差异。常用的 L1 loss、L2 Loss 和 smooth L1 loss 定义分别为
L1 loss(MAE):
LL1(x,y)=∣x−y∣=∣z∣L_{L1}(x,y) = |x - y| = |z|LL1(x,y)=xy=z
L2 loss(MSE):
LL2(x,y)=0.5(x−y)2=0.5z2L_{L2}(x,y) = 0.5(x - y)^2 =0.5z^2LL2(x,y)=0.5(xy)2=0.5z2
Smooth L1 Loss:
LsmoothL1(x,y)={0.5(x−y)2=0.5z2,if ∣x−y∣<1∣x−y∣−0.5=∣z∣−0.5,otherwiseL_{smoothL1}(x,y)=\begin{cases} 0.5(x-y)^2 = 0.5z^2, & \text{if } |x-y|<1 \\|x-y|-0.5= |z|-0.5, & \text{otherwise} \end{cases}LsmoothL1(x,y)={0.5(xy)2=0.5z2,xy0.5=z0.5,if xy<1otherwise
函数坐标图如下:横轴为z,纵坐标为损失loss
smooth_L1_loss

  • L1 loss 在零点处不可导(梯度不连续),且收敛速度较慢。L1 loss 对 zzz的导数为常数,在训练后期,误差值zzz很小时,如果 learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。
  • L2 loss 当预测值与真实值差距很大时,由于平方项的存在,损失值会变得非常大,梯度也很大,容易导致训练不稳定(梯度爆炸)
  • Smooth L1 Loss 的设计目的就是为了避开了 L1 loss 和 L2 loss 的缺点。它在误差较小的区域使用像 L2 loss这样的二次函数,保证梯度平滑且逐渐减小;而在误差较大的区域使用像 L1 loss这样的线性函数,限制梯度的大小,从而对异常值不那么敏感。

Smooth L1 Loss 的梯度函数是:
ddzsmoothL1={z,if ∣z∣<1+1或−1,otherwise\frac{d}{dz} {smoothL1}=\begin{cases} z, & \text{if } |z|<1 \\+1 或-1, & \text{otherwise} \end{cases}dzdsmoothL1={z,+11,if z<1otherwise

  • 小误差∣z∣<1|z|<1z<1时,即当预测值接近真实值时,梯度很小,参数更新幅度小,有利于模型收敛和精细化。且梯度是连续变化的,训练过程非常稳定。
  • 大误差∣z∣≥1|z| \geq 1z1时,即使预测结果非常离谱,梯度也不会爆炸(不会像L2 loss那样变化巨大),避免了因个别异常样本而导致训练过程剧烈波动,增强了训练的鲁棒性。

目标检测中的应用

在目标检测中,网络需要预测目标边界框(Bounding Box)的精确坐标(中心点 x, y,宽 w, 高 h)。这是一个典型的回归任务。

  • 如果使用 L2 Loss,当某个坐标的预测初值离真实值很远时,会产生巨大的损失和梯度,这会主导整个训练过程,使得模型难以收敛到好的结果。
  • Smooth L1 Loss 对初值不准的预测框更加宽容,提供了稳定且有限的梯度,使得模型能够逐步修正框的位置,而不是被异常值带偏。Faster R-CNN 和 SSD 等经典模型都使用了 Smooth L1 Loss 作为边界框回归的损失函数。

Smooth L1 Loss 完美地权衡了训练的稳定性(对抗异常值)和收敛的有效性(小误差时梯度精细),使其成为需要高精度回归任务(如目标检测)的理想选择。

函数接口

在 PyTorch 中,Smooth L1 Loss 通过 nn.SmoothL1Loss 类实现

torch.nn.SmoothL1Loss(size_average=None,reduce=None,reduction='mean',beta=1.0
)
  • reduction (str, optional): 指定损失的聚合方式,可选 ‘none’、‘mean’(默认值)或 ‘sum’。
  • beta (float, optional): 一个超参数,指定从二次函数切换到线性函数的阈值。默认值为 1.0,即上面公式中的切换点。修改 beta 可以调整损失函数对“大误差”和“小误差”的定义。
import torch
import torch.nn as nn# 创建损失函数
# reduction='mean':计算所有元素损失的平均值
smooth_l1_loss = nn.SmoothL1Loss(reduction='mean')# 假设预测值和真实值
# 例如:预测了4个边界框的偏移量
predictions = torch.tensor([1.6, 0.2, -2.0, 0.8])
targets = torch.tensor([1.0, 0.0, -1.0, 1.0])# 计算损失
loss = smooth_l1_loss(predictions, targets)
print(loss)# 手动计算验证:
# x = predictions - targets = [0.6, 0.2, -1.0, -0.2]
# |x| = [0.6, 0.2, -1.0, 0.2] -> 全部小于beta(1.0),所以都用 0.5*x^2
# loss = (0.5*0.6^2 + 0.5*0.2^2 + 0.5*(-1.0)^2 + 0.5*(-0.2)^2) / 4
#      = (0.18 + 0.02 + 0.5 + 0.02) / 4
#      = 0.72 / 4 = 0.18

IOU loss

概述

在目标检测中,最常用的评估模型好坏的指标就是 IOU。它衡量的是预测边界框(Bounding Box)与真实边界框之间的重叠程度。

传统的L1 loss,L2 loss,Smooth L1 loss存在如下问题:

  • 通过优化边界框的坐标(x, y, w, h)来间接优化IOU,但坐标误差最小并不总是等同于 IOU 最大化,这样就导致了不一致性。
  • 通过4个点回归坐标框的方式是假设 4个坐标点是相互独立的,没有考虑其相关性,而实际上 4个坐标点具有一定的相关性。
  • 基于 L1 和 L2 距离的 loss 不具有尺度不变性

IOU Loss 的解决方案:既然最终评估标准是 IOU,那就直接使用 IOU 作为损失函数来指导模型的优化方向。使模型的训练目标(损失最小化)
最终的评估目标(IOU 最大化) 实现统一。

IOU loss的计算

对于两个区域(通常是预测框 B_pred 和真实框 B_gt)
IOU计算如下:
IOU=Area of OverlapArea of Union=Bpred∩BgtBpred∪Bgt\text{IOU} = \frac{\text{Area of Overlap}}{\text{Area of Union}} = \frac{B_{pred} \cap B_{gt}}{B_{pred} \cup B_{gt}}IOU=Area of UnionArea of Overlap=BpredBgtBpredBgt

IOU 的取值范围是 [0, 1]:1表示两个框完全重合;0表示两个框没有交集

IOU loss 就是将IOU 转化为损失。损失越低越好,IOU越高越好,所以IOU loss如下计算:
LIOU=1−IOU\mathcal{L}_{IOU} = 1 - IOULIOU=1IOU

IOU = 1(完美预测)时,损失为 0。IOU = 0(毫无交集)时,损失为 1

优点

  • 尺度不变性:IOU 是一个比值,它只关心重叠区域的比例,而不关心框的绝对大小。这意味着它对大小不同的目标物是公平的。
  • 与评估指标一致:直接优化 IOU 使得模型训练过程更直接地对最终的评价指标负责。

缺点

  • 最核心问题是无法处理不相交的情况。如果两个框没有交集,则 IOU = 0,损失恒为 1。此时梯度为 0,无法为模型提供如何移动预测框以与真实框相交的梯度信息,导致模型无法学习。
  • 无法区分不同方式的重合不良。IOUIOUIOU值不能反映两个框是如何相交的,即使两个框的 IOUIOUIOU值是相同的,其相交方式也可能很不一样。只要 IOU 相同,损失就是相同的。
def calculate_iou(box1, box2):"""计算两个框的IoUArgs:box1: (tensor) [x1, y1, x2, y2]box2: (tensor) [x1, y1, x2, y2]Returns:iou: (tensor) scalar"""# 计算交集区域的坐标x1 = torch.max(box1[0], box2[0])y1 = torch.max(box1[1], box2[1])x2 = torch.min(box1[2], box2[2])y2 = torch.min(box1[3], box2[3])# 计算交集面积intersection_area = torch.clamp(x2 - x1, min=0) * torch.clamp(y2 - y1, min=0)# 计算各自面积box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1])box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1])# 计算并集面积union_area = box1_area + box2_area - intersection_area# 避免除零iou = intersection_area / (union_area + 1e-6)return ioudef iou_loss(pred_boxes, target_boxes):"""计算IoU LossArgs:pred_boxes: (tensor) [N, 4] (x1, y1, x2, y2)target_boxes: (tensor) [N, 4] (x1, y1, x2, y2)Returns:loss: (tensor) scalar"""ious = torch.stack([calculate_iou(pred, tgt) for pred, tgt in zip(pred_boxes, target_boxes)])loss = 1 - iousreturn loss.mean() # 使用mean reduction# 使用示例
preds = torch.tensor([[100, 100, 200, 200], [50, 50, 150, 150]], dtype=torch.float32)
targets = torch.tensor([[110, 110, 210, 210], [60, 60, 160, 160]], dtype=torch.float32)loss = iou_loss(preds, targets)
print(f"IoU Loss: {loss}")

IOU loss的变体

为解决IOU loss 的缺陷,在原始IOU 基础上提出了一系列先进的变体。如GIOU,DIOU,CIOU等等。

通常以IOU为基础的变体IOU loss可以定义为
L=1−IoU+R(B,Bgt)L =1- IoU + R(B, B_{gt})L=1IoU+R(B,Bgt)
其中:

  • BBB : 表示预测框
  • BgtB_{gt}Bgt :表示目标框
  • R(B,Bgt)R(B, B_{gt})R(B,Bgt) : 表示预测框 BBB 和 目标框 BgtB_{gt}Bgt 的惩罚项

GIOU loss

即使两个框不相交,也需要提供一个梯度方向。GIOU 在 IOU 的基础上引入了一个最小封闭矩形框 C(能够同时包含预测框和真实框的最小矩形),它不仅考虑了边界框之间的重叠程度,还考虑了bboxes 之间的位置和尺寸。
GIoU=IoU−C−(A∪B)∣C∣GIoU = IoU - \frac{C - (A \cup B)}{|C|}GIoU=IoUCC(AB) ,其中,C 是 A 和 B 的外接矩形框面积
GIoULoss=1−GIoUG{IoU Loss} = 1- GIoUGIoULoss=1GIoU
即 :
LGIoU=1−IoU+C−(A∪B)∣C∣L_{GIoU} = 1 - IoU + \frac{C - (A \cup B)}{|C|}LGIoU=1IoU+CC(AB)

其中:
0≤=IoU<=10≤= IoU <=10≤=IoU<=1
0<=C−(A∪B)C<10 <= \frac{C - (A \cup B)}{C} <10<=CC(AB)<1

  • 当 A 和 B 完全重合时:
    IoU=1,  C−(A∪B)C=0IoU = 1, \; \frac{C - (A \cup B)}{C} =0IoU=1CC(AB)=0 →\rightarrow GIoU=1,GIoU_Loss=0GIoU = 1, GIoU\_Loss=0GIoU=1GIoU_Loss=0
  • 当 A,B 完全不重叠时( A,B 距离无穷远的时候):
    IoU=0,C−(A∪B)C趋近于1IoU=0,\frac{C - (A \cup B)}{C}趋近于 1IoU=0CC(AB)趋近于1 →\rightarrow GIoU=−1,GIoU_Loss=2GIoU = -1, GIoU\_Loss=2GIoU=1GIoU_Loss=2

优点
解决了不相交时梯度为 0 的问题。即使不相交,模型也会学习朝着最小封闭框 C 的中心移动预测框,以减小附加项,从而促使两个框先发生交集。
GIOU 是 IOU 的一个下界,GIOU≤IOU\text{GIOU} \leq \text{IOU}GIOUIOU
缺点
当两个框包含(如一个框在另一个框内部)时,GIOU 会退化成 IOU,此时提供的移动方向仍然比较模糊。

DIOU loss

DIOU loss 直接最小化两个框中心点之间的距离。这样可以为模型的优化提供一个非常明确且高效的方向。
DIOU loss的计算公式如下:
LDIoU=1−IoU+ρ2(b,bgt)c2 L_{DIoU} = 1 - IoU + \frac{\rho^2(b, b_{gt})}{c^2} LDIoU=1IoU+c2ρ2(b,bgt)
其中:
ρ(b,bgt)\rho(b, b_{gt})ρ(b,bgt) 表示预测框与真实框中心点之间的欧式距离。
b,bgtb, b_{gt}b,bgt 分别表示预测框的中心点,真实框的中心点。
ccc 表示真实框与预测框的最小外接矩形框的对角线长度。

优点

  • 具有尺度不变性 : 由于ρ2(b,bgt)c2\frac{\rho ^2(b, b_{gt})}{c^2}c2ρ2(b,bgt)是一个相对度量,不直接依赖于框的具体宽度和高度,所以在不同尺度下仍能保持一致的度量标准,这种尺度不变性有助于提高检测的准确性和鲁棒性。
  • 当两个框完全重合时,LIoU=LGIoU=LDIoU=0L_{IoU} = L_{GIoU} = L_{DIoU} = 0LIoU=LGIoU=LDIoU=0
  • 当两个框不相交时,DIoU Loss 可以直接优化 2个框之间的距离,比 GIoU Loss 收敛速度更快
  • 对于两个框包含的情况,DIoU Loss 可以收敛的很快,而 GIoU Loss此时退化为IoU Loss收敛速度较慢

缺点
DIoU 能够直接最小化预测框和真实框的中心点距离加速收敛,但是未考虑到高宽比。
如下图所示:红色为预测框,蓝色为真实框。三个红框的面积相同,红框与蓝框中心点重合,但是红框的长宽比不一样,三种情况下的DIoU相同,但显然中间的更拟合真实框。
在这里插入图片描述

CIOU loss

由于DIOU loss忽略了宽高比的一致性,CIoU 在 DIoU 的基础上增加了一个惩罚项,同时考虑重叠面积、中心点距离和宽高比。
LCIoU=1−IoU+ρ2(b,bgt)c2+αv L_{CIoU} = 1 - IoU + \frac{\rho^2(b, b_{gt})}{c^2} + \alpha v LCIoU=1IoU+c2ρ2(b,bgt)+αv
其中:
vvv 衡量长宽比一致性的参数 : v=4π2(arctanwgthgt−arctanwh)2v = \frac{4}{\pi^2}(arctan \frac{w_{gt}}{h_{gt}} - arctan \frac{w}{h})^2v=π24(arctanhgtwgtarctanhw)2
α\alphaα 是权重平衡因子,调整长宽比的影响 : α=v(1−IoU)+v\alpha = \frac{v}{(1-IoU)+v}α=(1IoU)+vv

优点
考虑影响因素相对全面,考虑到了定位损失的三个重要的因素 : 重叠面积、中心点距离、高宽比。

缺点
αv\alpha vαv这一项的设计,导致拖累了收敛速度。

  • vvv 仅反映了高宽比的差异性,高宽比一致则v=0v=0v=0,这样的设计存在缺陷。 比如真实框的 wgt=8,hgt=4,wgthgt=2w_{gt}=8,h_{gt}=4,\frac{w_{gt}}{h_{gt}}=2wgt=8,hgt=4hgtwgt=2 ,而预测出的 w=6,h=3,wh=2w=6,h=3, \frac{w}{h}=2w=6,h=3,hw=2 ,此时v=0v=0v=0
  • vvv只反映了高宽比的差异,并没有分别反映出 wgtw_{gt}wgtwww 之间的关系,以及 hgth_{gt}hgthhh 之间的关系,这导致其收敛方向不够明确,CIOU损失可能会向不合理的方向优化。
  • vvvwwwhhh 的偏导数分别如下 :
    ∂v∂w=8π2(arctanwgthgt−arctanwh)∗hw2+h2\frac{\partial v}{\partial w} = \frac{8}{\pi^2}(arctan \frac{w_{gt}}{h_{gt}}- arctan \frac{w}{h}) * \frac{h}{w^2+h^2}wv=π28(arctanhgtwgtarctanhw)w2+h2h
    ∂v∂h=−8π2(arctanwgthgt−arctanwh)∗ww2+h2\frac{\partial v}{\partial h} = - \frac{8}{\pi^2}(arctan \frac{w_{gt}}{h_{gt}}- arctan \frac{w}{h}) * \frac{w}{w^2+h^2}hv=π28(arctanhgtwgtarctanhw)w2+h2w
    由2个偏导数,可以得出 : ∂v∂w=−hw⋅∂v∂h\frac{\partial v}{\partial w} = -\frac{h}{w} \cdot \frac{\partial v}{\partial h}wv=whhv
    ∂v∂w\frac{\partial v}{\partial w}wv∂v∂h\frac{\partial v}{\partial h}hv 的符号是相反的,只要 wwwhhh 其中一个的值增加,另一个就会减小,即宽高是相互耦合的。当w<wgt    且    h<hgtw \lt w^{gt} \;\; 且 \;\;h \lt h^{gt}w<wgth<hgt时或者 w>wgt    且    h>hgtw \gt w^{gt} \;\; 且 \;\;h \gt h^{gt}w>wgth>hgt 时可能无法快速收敛。

EIOU loss

EIoU Loss 将 CIoU 中的宽高比损失项 vvv 解耦,直接拆分为分别针对宽度和高度的损失。
LEIoU=LIoU+Ldis+Lasp=1−IoU+ρ2(b,bgt)(wc)2+(hc)2+ρ2(w,wgt)(wc)2+ρ2(h,hgt)(hc)2\begin{align} L_{EIoU} &= L_{IoU} + L_{dis} + L_{asp}\notag \\ \notag \\&= 1-IoU + \frac{\rho^2 (b,b_{gt})}{(w_c)^2+(h_c)^2} + \frac{\rho^2(w,w_{gt})}{(w_c)^2} + \frac{\rho^2(h,h_{gt})}{(h_c)^2} \notag \\ \end{align}LEIoU=LIoU+Ldis+Lasp=1IoU+(wc)2+(hc)2ρ2(b,bgt)+(wc)2ρ2(w,wgt)+(hc)2ρ2(h,hgt)
其中:

  • bbbbgtb_{gt}bgt :分别表示预测框的中心点和真实框的中心点
  • ρ(b,bgt)\rho (b, b_{gt})ρ(b,bgt):表示真实框与预测框中心点之间的欧式距离
  • wcw_cwchch_chc:分别表示最小外接矩形框的宽度和高度

优点:

  • 更直接的收敛目标:直接最小化宽度和高度的差异,为模型提供了更清晰、更直接的优化方向。
  • 更快的收敛速度:由于梯度计算更直接,EIoU 通常比 CIoU 收敛得更快。
  • 更高的定位精度:在许多基准测试中,EIoU 都展现出了比 CIoU 更优的边界框回归精度。

Focal-EIoU loss

Focal-EIoU Loss 的思想源于 Focal Loss(最初用于解决分类中的类别不平衡问题)。在目标检测中,也存在“样本不平衡”问题:简单样本(IOU 高的样本)和困难样本(IOU 低的样本)的数量不平衡。

问题:在一个训练批次中,大部分边界框回归样本是“简单”的(即 IoU 已经较高),只有少数是“困难”的(IoU 低)。标准的 IoU 损失对所有这些样本一视同仁,导致简单样本的损失贡献主导了总损失,模型难以集中精力去学习那些困难的、回归得不好的样本。
思路:借鉴 Focal Loss 的思路,降低简单样本的权重,让损失函数更加关注难以回归的样本。
Focal-EIoU Loss 在 EIoU Loss 的基础上增加了一个聚焦系数
LFocal−EIoU=IoUγ⋅LEIoU{L}_{Focal-EIoU} = IoU^{\gamma} \cdot {L}_{EIoU}LFocalEIoU=IoUγLEIoU

其中:
LEIoU{L}_{EIoU}LEIoU:计算的 EIoU 损失。
γ\gammaγ:聚焦参数(通常 γ>0\gamma > 0γ>0),用于调节权重衰减的速率。
IoUγIoU^{\gamma}IoUγ:聚焦因子,IoUIoUIoU 的值在 [0, 1] 之间。

工作机制

  • 对于一个困难样本(IoU → 0):IoUγ≈0IoU^{\gamma} \approx 0IoUγ0,但 LEIoU{L}_{EIoU}LEIoU 很大(接近 1)。最终的损失 LFocal−EIoU{L}_{Focal-EIoU}LFocalEIoU 仍然很大,模型会重点关注这个样本。
  • 对于一个简单样本(IoU → 1):IoUγ≈1IoU^{\gamma} \approx 1IoUγ1,但 LEIoU{L}_{EIoU}LEIoU 很小(接近 0)。最终的损失 LFocal−EIOU{L}_{Focal-EIOU}LFocalEIOU 会变得更小,从而降低了简单样本在总损失中的权重。

优点:

  • 解决回归样本不平衡:显著提升模型对困难样本的回归能力。
  • 进一步提升性能:在 EIOU 的基础上,通常能获得更高的检测精度(mAP)。
  • 即插即用:Focal 的思想可以迁移到其他 IOU 变体(如 Focal-CIOU)进行结合使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97810.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发之fileprovider配置路径path详细说明

第一步在清单文件配置fileprovider属性<providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.fileprovider"android:exported"false"android:grantUriPermissions"true"><meta-d…

【ComfyUI】图像描述词润色总结

在 ComfyUI 的工作流中&#xff0c;图像反推描述词能帮我们从图像里抽取语义信息&#xff0c;但这些原始描述往往还显得生硬&#xff0c;缺乏创意或流畅性。为了让提示词更自然、更有表现力&#xff0c;就需要“润色”环节。润色节点的任务&#xff0c;不是重新生成描述&#x…

java面试中经常会问到的IO、NIO问题有哪些(基础版)

文章目录一、IO 基础与分类二、NIO 核心组件与原理三、NIO 与 BIO 的实战对比四、AIO 与 NIO 的区别五、Netty 相关&#xff08;NIO 的高级应用&#xff09;总结Java 中的 IO&#xff08;输入输出&#xff09;和 NIO&#xff08;非阻塞 IO&#xff09;是面试中的重要考点&#…

时序数据库选型指南:如何为工业场景挑选最强“数据底座”

工业4.0时代&#xff0c;工厂化身为巨大的数据生产中心。数以万计的传感器、PLC和设备每时每刻都在产生着海量的时间序列数据&#xff08;Time-Series Data&#xff09;&#xff1a;温度、压力、流速、振动、设备状态……这些带时间戳的数据是工业互联网的血液&#xff0c;蕴含…

【排序算法】冒泡 选排 插排 快排 归并

一、冒泡排序// 冒泡排序var bubbleSort function (arr) {const len arr.length;for (let i 0; i < len; i) {let isSwap false;for (let j 0; j < len - 1; j) {// 每一次遍历都要比较相邻元素的大小&#xff0c;如果满足条件就交换位置if (arr[j] > arr[j 1])…

电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(中)

语言学特征刻画(特征库) 句法特征 句法特征是识别 SYN 类电子病历空缺句的核心语言学维度,其量化分析通过构建依存句法结构的形式化指标,实现对语法不完整性的客观描述。该类特征主要包括依存树不完备指标、谓词-论元覆盖率及从属连词未闭合三类核心参数,共同构成 SYN 类…

InnoDB存储引擎-事务

1. 事务概述事务可由一条简单的SQL语句组成,也可以由一组复杂的SQL语句组成. 事务是访问并更新数据库中各种数据项的一个程序执行单元. 在事务中的操作, 要么都做修改, 要么都不做. 对于 InnoDB存储引擎而言, 其默认的事务隔离级别 RR , 完全遵循和满足了事务的 ACID 特性. 1.1…

web项目的目录结构

web项目的目录结构 WEB-INF 存放class文件、jar文件和配置文件&#xff0c;对于用户来说该文件夹是不可见的WEB-INF/web.xml web应用程序的描述文件&#xff0c;用来配置资源&#xff0c;如servlet、过滤器、监听器等WEB-INF/classes 用于存放class文件&#xff0c;也是该web应…

数据结构_队列Queue(C语言实现)

一、队列的基本概念 1.队列定义 队列是一种先进先出的线性表数据结构&#xff08;First in First out&#xff09;,现实中的例子就是&#xff0c;排队购票&#xff0c;先排队的先购票&#xff0c;购完票之后直接从这个队中离开&#xff0c;后来的在这个队后面排队&#xff0c;这…

C++对CPU缓存的合理利用

缓存体系 在计算机的体系结构中,存储速度是分了好几层: CPU缓存,又分成了L1/L2/L3等多层缓存,我们暂时看成同一层。访问速度最快 内存,访问速度次之,大概是CPU缓存的几十分之一 硬盘,访问速度最慢,是内存访问速度的几十分之一 所以,在计算机体系结构中,把下一层的数…

贝叶斯定理:理解概率更新与实际场景应用

贝叶斯定理及其应用&#xff1a;从基础到实战 贝叶斯定理&#xff08;Bayes’ Theorem&#xff09;是概率论中最基础也是最强大的工具之一。它通过将先验知识与新证据结合&#xff0c;能够帮助我们在不确定的情况下做出更加精准的判断。本文将从贝叶斯定理的核心概念、公式开始…

组件之间的传递参数传递(常用父向子传递)

现在&#xff0c;有子组件<MdsWxSourceDetailref"mdsWx":rank-obj"activeRankObj":media-name"activeObj.mediaName" :error-info"activeErrorInfo" ></MdsWxSourceDetail>以上代码在MdsIndexRankDetail&#xff0…

java毕业设计-基于springboot区块链的电子病历数据共享平台设计与实现(附源码数据库文档资料)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【新启航】3D 逆向抄数的三维能力架构:数据采集工具操作 × 几何处理算法应用 × 行业场景适配技能

摘要3D 逆向抄数的落地效果依赖多维度能力协同&#xff0c;本文提出 “数据采集工具操作 - 几何处理算法应用 - 行业场景适配技能” 的三维能力架构。通过拆解各维度核心要素&#xff0c;分析数据采集工具&#xff08;激光、结构光等&#xff09;的操作要点&#xff0c;解析几何…

RocksDB 在 macOS M 系列 上运行时报错的解决方案

问题现象 项目中引入可Kafka Stream &#xff0c;Windows下启动不报错 &#xff0c;但是在 macOS M系列 环境下就会报错&#xff0c;初步定位是使用 Java 项目调用 RocksDB 时&#xff0c;运行过程中出现以下报错&#xff1a; UnsatisfiedLinkError: no rocksdbjni in java.lib…

深度学习之第五课卷积神经网络 (CNN)如何训练自己的数据集(食物分类)

简介 之前一直使用的是现有人家的数据集&#xff0c;现在我们将使用自己的数据集进行训练。 基于卷积神经网络 (CNN) 的 MNIST 手写数字识别模型 一、训练自己数据集 1.数据预处理 我们现在有这样的数据集如下图&#xff1a; 每一个文件夹里面有着对应的图片。我们要将这些…

【Big Data】AI赋能的ClickHouse 2.0:从JIT编译到LLM查询优化,下一代OLAP引擎进化路径

目录 1. 什么是ClickHouse&#xff1f; 2. 诞生背景与发展历程 3. 架构设计解析 3.1 存储引擎&#xff1a;MergeTree家族 3.2 分布式模型&#xff1a;分片与副本 3.3 执行流程&#xff1a;向量化与并行计算 4. 解决的问题与适用场景 4.1 典型问题 4.2 适用场景 5. 关…

Vue实践篇-02,AI生成代码

问题描述这个是需求&#xff1a;动态表格、表格里边下拉框&#xff0c;弹框选择基础的列表&#xff0c;还行&#xff0c;这种真的是一时不知如何是好。打算晚上吃了饭找前端同事&#xff0c;帮忙看看。晚饭前&#xff0c;AI一下看看。结果&#xff0c;惊为天人&#xff01;&…

2025-08-28-zabbix5.0创建监控项通过脚本简单实现监控oracle11g的磁盘组和表空间的使用量

title: zabbix5.0创建监控项通过脚本简单实现监控oracle11g的磁盘组和表空间的使用量 authors: Loong date: 2025-08-28使用SQLPLUS配合crontab任务 用来执行sql获取信息的脚本 /home/oracle/zabbix_oracle_check.sh #!/bin/bash #用于zabbix agent被动模式的 非入侵性的检测 #…

MySQL-Redo Log(重做日志)

MySQL 的 Redo Log&#xff08;重做日志&#xff09;是 InnoDB 存储引擎的核心组件之一&#xff0c;是保证数据库持久性&#xff08;Durability&#xff09; 和崩溃恢复&#xff08;Crash Recovery&#xff09; 的关键机制。1. 什么是 Redo Log&#xff1f;它的核心作用是什么&…