YOLO系列正传(四)YOLOv3论文精解(下)——损失函数推导与其他优化项
系列文章
YOLO系列基础
YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客
YOLO系列正传
YOLO系列正传(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客
YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53-CSDN博客
YOLO系列正传(三)神经网络的反向传播(back propagation)与公式推导-CSDN博客
目录
系列文章
YOLO系列基础
YOLO系列正传
背景
从YOLOv1的损失函数出发
YOLOv3损失函数loss代码详解
1. lbox部分损失函数详解
1.1 代码背景
1.2 CIOU公式
lbox的数学公式
2. lobj部分损失函数详解
2.1 lobj 的数学公式分析
2.1 lobj 计算步骤
2.3 lobj 损失函数的数学公式
3.lcls 部分损失函数详解
3.1 lcls 的数学公式分析
3.2 lcls 计算步骤
3.3 lcls 损失的数学公式
4. 最终的总损失公式
背景
随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚,本系列旨在从小白出发,给大家讲解清楚视觉检测算法的前世今生,并讲清楚YOLOv11版本算法的所有模块功能!
在YOLO系列基础中,我们对所有的基础知识进行了讲解和说明。
在上上篇内容中,我们详解了YOLOv3模型结构和FPN相关知识,本篇我们继续YOLOv3的论文详解!
从YOLOv1的损失函数出发
YOLOv1的论文精解如下,感兴趣的大家可以去看下。
YOLO系列基础(六)YOLOv1论文原理详解,清晰明了!-CSDN博客
其中YOLOv1的损失函数给出:
可以看到,YOLOv1大多采用了均方差损失函数的形式。损失函数主要包括以下几项:
- 存在物体时的检测框中心点坐标损失
- 存在物体时的检测框检测框长宽损失
- 存在物体时候的检测框置信度损失
- 不存在物体时的检测框置信度损失
- 存在物体时的cell各个类别损失
分别对应上面的1-5行。
有关于损失函数的详情解释可以查看以下博客:
YOLO系列基础(六)YOLOv1论文原理详解,清晰明了!-CSDN博客
YOLOv3损失函数loss代码详解
YOLOv3在YOLOv1的基础上作出了长足的进步!
主要有:
- 交叉熵损失函数的引入
有关于交叉熵损失函数可以查看以下内容:
YOLO系列正传(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客
- 类别损失与box绑定
以下是YOLOv3官方损失函数计算代码,增设了中文注释的部分。
class ComputeLoss:"""计算YOLO模型的总损失,包括分类损失、边框回归损失和目标置信度损失。"""sort_obj_iou = False # 是否根据IoU排序目标的置信度def __init__(self, model, autobalance=False):"""初始化ComputeLoss,获取模型设备和超参数,并设置是否自动平衡。"""device = next(model.parameters()).device # 获取模型参数所在的设备(CPU或GPU)h = model.hyp # 获取模型的超参数字典# 定义损失函数BCEcls = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["cls_pw"]], device=device)) # 分类损失函数BCEobj = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([h["obj_pw"]], device=device)) # 目标置信度损失函数# 标签平滑(Label Smoothing),参考:https://arxiv.org/pdf/1902.04103.pdfself.cp, self.cn = smooth_BCE(eps=h.get("label_smoothing", 0.0)) # positive和negative标签的BCE目标# 焦点损失(Focal Loss)g = h["fl_gamma"] # 焦点损失的gamma值if g > 0:BCEcls, BCEobj = FocalLoss(BCEcls, g), FocalLoss(BCEobj, g) # 应用焦点损失m = de_parallel(model).model[-1] # 获取模型的最后一层(检测模块)# 根据网络的层数(P3-P7)调整损失平衡因子self.balance = {3: [4.0, 1.0, 0.4]}.get(m.nl, [4.0, 1.0, 0.25, 0.06, 0.02]) # P3-P7的损失平衡self.ssi = list(m.stride).index(16) if autobalance else 0 # 如果自动平衡,获取stride为16的层的索引self.BCEcls, self.BCEobj, self.gr, self.hyp, self.autobalance = BCEcls, BCEobj, 1.0, h, autobalance # 初始化其他参数self.na = m.na # 锚框的数量self.nc = m.nc # 类别的数量self.nl = m.nl # 网络层数self.anchors = m.anchors # 锚框self.device = device # 模型设备(CPU或GPU)def __call__(self, p, targets):"""计算损失,给定预测和目标,返回类别损失、边框损失和目标损失。"""lcls = torch.zeros(1, device=self.device) # 类别损失初始化为0lbox = torch.zeros(1, device=self.device) # 边框损失初始化为0lobj = torch.zeros(1, device=self.device) # 目标置信度损失初始化为0tcls, tbox, indices, anchors = self.build_targets(p, targets) # 根据预测和目标构建目标信息# 计算各类损失for i, pi in enumerate(p): # 遍历每一层的预测(检测头的每一层)b, a, gj, gi = indices[i] # 获取每个目标的图像索引、锚框索引、网格的纵横坐标tobj = torch.zeros(pi.shape[:4], dtype=pi.dtype, device=self.device) # 目标置信度初始化为0n = b.shape[0] # 当前batch中的目标数量if n:# 获取目标的坐标和类别(只提取有效部分)pxy, pwh, _, pcls = pi[b, a, gj, gi].split((2, 2, 1, self.nc), 1) # 提取位置和类别信息# 回归损失(位置和大小)pxy = pxy.sigmoid() * 2 - 0.5 # Sigmoid激活函数计算xy坐标pwh = (pwh.sigmoid() * 2) ** 2 * anchors[i] # 计算宽高,并根据锚框进行调整pbox = torch.cat((pxy, pwh), 1) # 合并位置和宽高,得到预测框iou = bbox_iou(pbox, tbox[i], CIoU=True).squeeze() # 计算预测框与真实框的IoUlbox += (1.0 - iou).mean() # IoU损失(1 - IoU均值)# 目标置信度损失iou = iou.detach().clamp(0).type(tobj.dtype) # 计算IoU后,进行一些预处理if self.sort_obj_iou:j = iou.argsort() # 如果启用排序,按IoU从大到小排序b, a, gj, gi, iou = b[j], a[j], gj[j], gi[j], iou[j]if self.gr < 1:iou = (1.0 - self.gr) + self.gr * iou # 目标平衡tobj[b, a, gj, gi] = iou # 设置目标的IoU为目标置信度# 分类损失if self.nc > 1: # 如果类别数大于1,则计算分类损失t = torch.full_like(pcls, self.cn, device=self.device) # 初始化目标标签t[range(n), tcls[i]] = self.cp # 将目标类别对应的标签设置为正例lcls += self.BCEcls(pcls, t) # 计算并累加分类损失# 目标置信度损失obji = self.BCEobj(pi[..., 4], tobj) # 计算目标置信度损失lobj += obji * self.balance[i] # 按照损失平衡因子加权if self.autobalance:self.balance[i] = self.balance[i] * 0.9999 + 0.0001 / obji.detach().item() # 自动平衡损失# 自动平衡:根据stride为16的层调整其他层的平衡因子if self.autobalance:self.balance = [x / self.balance[self.ssi] for x in self.balance]# 根据超参数缩放损失lbox *= self.hyp["box"]lobj *= self.hyp["obj"]lcls *= self.hyp["cls"]bs = tobj.shape[0] # 获取batch sizereturn (lbox + lobj + lcls) * bs, torch.cat((lbox, lobj, lcls)).detach() # 返回总损失和各类损失
可以看出Loss是由三部分组成:
- lbox:检测框损失
- lobj:目标物体损失
- lcls:类别损失
1. lbox部分损失函数详解
1.1 代码背景
在 ComputeLoss
类中的 __call__
方法,lbox
是通过以下方式计算的:
# 计算回归损失(位置和大小)
pxy = pxy.sigmoid() * 2 - 0.5 # 归一化的中心坐标,范围[-0.5, 0.5]
pwh = (pwh.sigmoid() * 2) ** 2 * anchors[i] # 归一化的宽高,和锚框大小相乘
pbox = torch.cat((pxy, pwh), 1) # 合并位置和宽高,得到预测框
iou = bbox_iou(pbox, tbox[i], CIoU=True).squeeze() # 计算预测框与真实框的IoU
lbox += (1.0 - iou).mean() # IoU损失(1 - IoU均值)
pxy
是预测框的中心坐标(
,经过 Sigmoid 激活后映射到,
)
[-0.5, 0.5]
区间。pwh
是预测框的宽度和高度(
,也经过 Sigmoid 激活后映射到,
)
[0, 1]
区间,并乘以锚框大小进行调整。tbox[i]
是目标框的坐标和宽高(
。,
,
,
)
bbox_iou(pbox, tbox[i], CIoU=True)
计算了预测框与目标框之间的 CIOU(Complete IoU)。
1.2 CIOU公式
CIOU(Complete Intersection over Union)是对 IoU 的扩展,考虑了框的中心点距离、宽高比损失和最小外接矩形对角线的惩罚。其公式如下:
其中:
是传统的交并比(Intersection over Union),衡量预测框和目标框的重叠程度。
是预测框和目标框中心点之间的欧氏距离的平方,表示框中心的距离
其中 是预测框的中心,
是目标框的中心。
是包含预测框和目标框的最小外接矩形的对角线长度,计算公式为:
其中 和
分别是包含预测框和目标框的最小外接矩形的两个对角点。
是宽高比的惩罚系数,通常计算为
其中 是宽高比损失,计算公式为:
其中 是预测框的宽度和高度,
是目标框的宽度和高度。
lbox的数学公式
在代码中,lbox
是通过以下方式计算的:
lbox += (1.0 - iou).mean() # 计算损失为(1 - IoU)的均值
其中 iou
是通过 CIOU 计算得到的,那么 lbox
的计算公式可以表示为:
其中,CIOU 是通过以下步骤计算的:
-
计算预测框和目标框的中心点距离:
-
计算最小外接矩形的对角线长度:
-
计算宽高比损失
和参数
:
-
计算最终的CIOU:
-
lbox 损失:
这个公式表示的是通过 CIOU 衡量预测框和目标框之间的匹配程度,损失值越小,表示预测框和目标框越接近,反之损失值越大。
2. lobj部分损失函数详解
2.1 lobj
的数学公式分析
在 ComputeLoss
类中的 __call__
方法,lobj
是通过以下方式计算的:
# 计算目标框的物体存在性损失(即objectness loss)
tobj = torch.zeros(pi.shape[:4], dtype=pi.dtype, device=self.device) # 初始化目标框物体存在性损失
iou = bbox_iou(pbox, tbox[i], CIoU=True).detach().clamp(0).type(tobj.dtype) # 计算IoU并将其限制在[0,1]之间
tobj[b, a, gj, gi] = iou # 将IoU赋值给目标框的物体存在性
obji = self.BCEobj(pi[..., 4], tobj) # 计算物体存在性损失
lobj += obji * self.balance[i] # 加权物体存在性损失
lobj
是目标框的物体存在性损失,它的计算是基于预测框与目标框之间的 IoU,即物体是否存在的置信度。
2.1 lobj
计算步骤
我们逐步分析这一部分的计算过程:
-
物体存在性目标 (
tobj
):在计算
lobj
时,首先会计算每个预测框的物体存在性目标,即预测框与目标框之间的 IoU。tobj
用来存储这些目标值,表示每个位置上预测框是否包含物体:tobj = torch.zeros(pi.shape[:4], dtype=pi.dtype, device=self.device) # 初始化目标框的物体存在性
-
计算物体存在性目标值 (
tobj[b, a, gj, gi] = iou
):对于每一个预测框和目标框,计算它们的 CIOU 值,这里使用了
bbox_iou(pbox, tbox[i], CIoU=True)
进行计算。计算出的 IoU 之后会被映射为目标框tobj
的物体存在性标签。这些标签在物体存在时接近 1,在物体不存在时接近 0。iou = bbox_iou(pbox, tbox[i], CIoU=True).detach().clamp(0).type(tobj.dtype) # 计算物体存在性(IoU)
-
计算物体存在性损失 (
obji
):使用 BCEWithLogitsLoss(带有
sigmoid
的二元交叉熵损失)计算预测的物体存在性与目标存在性之间的损失。具体地,对于每个预测框的物体存在性输出(pi[..., 4]
),与目标值tobj
计算交叉熵损失:obji = self.BCEobj(pi[..., 4], tobj) # 计算物体存在性损失
其中:
pi[..., 4]
是预测框的物体存在性预测值,通常是通过 sigmoid 激活得到的一个值,表示该位置是否有物体的概率。tobj
是目标值(物体存在的标签),是通过计算 IoU 得到的值,通常会在物体存在时接近 1,而物体不存在时接近 0。
-
加权物体存在性损失:
最后,将计算出的物体存在性损失
obji
加权并累加到lobj
中。这里的加权是通过self.balance[i]
实现的,不同的层(对应不同尺度的预测框)可能有不同的加权策略。lobj += obji * self.balance[i] # 加权物体存在性损失
2.3 lobj
损失函数的数学公式
从上述代码可以总结出,lobj
损失的计算步骤大致如下:
-
计算预测框与目标框的 IoU
其中 IoU 计算的是预测框与目标框之间的重叠区域(交集)与它们的并集的比例。
-
计算物体存在性目标 (
tobj
):根据代码中的逻辑,
tobj
是基于 CIOU 计算的物体存在性标签:
其中 表示预测框,
表示目标框。
-
BCEWithLogitsLoss 计算物体存在性损失:
使用 BCEWithLogitsLoss 计算预测框物体存在性概率与目标之间的损失,损失函数的公式为:
其中:
是预测框的物体存在性概率,通过 sigmoid 激活得到。
是目标值,表示物体存在性(通过 IoU 计算得到)。
-
加权物体存在性损失:
最后,物体存在性损失会根据每一层的不同尺度加权:
其中 balance[i]
是加权系数,通常是针对不同预测尺度(例如 P3 到 P7)的不同权重,用来平衡各个尺度上的损失。
因此,lobj
损失的公式可以总结为:
其中:
- tobjt_{obj} 是通过 CIOU 计算得到的物体存在性目标(IoU值)。
- pobjp_{obj} 是预测框的物体存在性概率。
balance[i]
是层加权系数。
这个损失项的目标是使得预测框的物体存在性概率 更准确地与目标框的物体存在性标签
匹配,进而提高检测精度。
3.lcls
部分损失函数详解
3.1 lcls
的数学公式分析
在 ComputeLoss
类中的 __call__
方法,lcls
是通过以下方式计算的:
# 计算分类损失(即 lcls)
if self.nc > 1: # 如果类别数大于 1,则进行分类损失计算t = torch.full_like(pcls, self.cn, device=self.device) # 初始化目标分类标签t[range(n), tcls[i]] = self.cp # 将目标类别位置标记为正类标签lcls += self.BCEcls(pcls, t) # 计算分类损失并累加
lcls
是基于预测的类别概率与目标类别之间的 BCE(Binary Cross-Entropy)损失,即分类损失。具体来说,对于每个预测框的类别概率与目标类别进行比较,计算其交叉熵损失。
3.2 lcls
计算步骤
我们逐步分析这一部分的计算过程:
-
初始化目标分类标签 (
t
):首先,代码会创建一个与预测类别概率
pcls
相同形状的张量t
,并初始化为负类别标签(self.cn
)。self.cn
是负类标签的概率(通常为0,除非使用了标签平滑)。t = torch.full_like(pcls, self.cn, device=self.device) # 初始化目标分类标签
-
将目标类别位置标记为正类标签:
对于每个目标框
tcls[i]
,将目标类别的标签位置设置为正类标签self.cp
(self.cp
是正类标签的概率,通常为1)。t[range(n), tcls[i]] = self.cp # 将目标类别位置标记为正类标签
这里
tcls[i]
是目标类别的索引,n
是当前批次中目标框的数量。t
是目标的类别标签矩阵,其中self.cp
是目标类别的正类标签(通常是1),其余部分是负类标签。 -
计算分类损失:
然后,使用 BCEWithLogitsLoss(带有 sigmoid 激活函数的二元交叉熵损失)计算预测框的类别概率与目标类别标签之间的损失:
lcls += self.BCEcls(pcls, t) # 计算分类损失并累加
其中:
pcls
是预测的类别概率t
是目标类别标签
换句话说,
lcls
是通过二元交叉熵损失来衡量每个类别预测的概率与目标类别之间的差异。
3.3 lcls
损失的数学公式
从上述代码可以总结出,lcls
损失的计算步骤大致如下:
-
初始化目标类别标签
t
:对于每个目标框,将目标类别的标签位置设置为正类标签,其他位置为负类标签。设定目标标签矩阵
t
:
其中,tcls[i]
是目标框的类别索引,cp
是正类标签(通常为 1),cn
是负类标签(通常为 0)。
-
二元交叉熵损失(BCE Loss):
对于每个预测框的类别概率
pcls
和目标标签t
,计算交叉熵损失。分类损失的公式为:
其中
是预测的类别概率,表示预测框属于某个类别的概率。
是目标类别标签,表示实际类别(1 或 0)。
注意:这个损失函数是 BCEWithLogitsLoss,即在计算之前先对预测的类别概率进行 sigmoid 激活。
因此,lcls
损失的公式可以总结为
其中
是预测的类别概率,表示预测框属于某个类别的概率。
是目标类别标签,表示实际类别(1 或 0)。
这个损失项的目标是使得预测框的类别概率 更准确地与目标框的真实类别
匹配,从而提高分类准确性。
4. 最终的总损失公式
其中YOLOv3代码如下
lbox *= self.hyp["box"]
lobj *= self.hyp["obj"]
lcls *= self.hyp["cls"]
bs = tobj.shape[0] # batch sizereturn (lbox + lobj + lcls) * bs, torch.cat((lbox, lobj, lcls)).detach()
将这三个部分的损失加权合并,得到总损失:
其中:
是预定义的超参数,用来控制不同损失项的权重。
分别是边界框回归损失、物体存在性损失和分类损失。
在YOLOv3 train.py文件中给出如下代码
# Forwardwith torch.cuda.amp.autocast(amp):pred = model(imgs) # forwardloss, loss_items = compute_loss(pred, targets.to(device)) # loss scaled by batch_sizeif RANK != -1:loss *= WORLD_SIZE # gradient averaged between devices in DDP modeif opt.quad:loss *= 4.0# Backwardscaler.scale(loss).backward()
故还有如下工作:
在分布式训练中(RANK != -1
),需要对损失进行缩放:
如果 opt.quad
为真,损失会乘以 4.0:
事实上,在查阅很对资料的时候,博主发现很多其他博主or文章资料给出的公式,但是说实话,网上没有一个非常权威的公式(作者自己也没在论文中写)。
本博主自身能力也有限,给不了打包票的保证就一定不会错。但是上诉的公式均是博主自己查阅作者的官方代码一点点写出来的!最后还是求个赞吧!
相关文章:
YOLO系列正传(四)YOLOv3论文精解(下)——损失函数推导与其他优化项
系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53-C…...
【漏洞复现】CVE-2023-37461 Arbitrary File Writing
漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…...
【OpenCV计算机视觉】图像处理——平滑
本篇文章记录我学习【OpenCV】图像处理中关于“平滑”的知识点,希望我的分享对你有所帮助。 目录 一、什么是平滑处理 1、平滑的目的是什么? 2、常见的图像噪声 (1)椒盐噪声 编辑(2) 高斯噪声 &a…...
【java面向对象编程】第七弹----Object类、类变量与类方法
笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:javase 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 一、Object类 1.1equa…...
大模型微调---Prompt-tuning微调
目录 一、前言二、Prompt-tuning实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、Prompt-tuning微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 Prompt-tuning通过修改输入文本的提示(Prompt)来引导模型生…...
Connecting to Oracle 11g Database in Python
# encoding: utf-8 # 版权所有 2024 涂聚文有限公司 # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:python -m pip install oracledb # python -m pip install cx_Oracle --upgrade # pip install cx_Oracle # Autho…...
16.2、网络安全风险评估技术与攻击
目录 网络安全风险评估技术方法与工具 网络安全风险评估技术方法与工具 资产信息收集,可以通过调查表的形式把我们各类的资产信息进行一个统计和收集,掌握被评估对象的重要资产分布,进而分析这些资产关联的业务面临的安全威胁以及存在的安全…...
Windows脚本清理C盘缓存
方法一:使用power文件.ps1的文件 脚本功能 清理临时文件夹: 当前用户的临时文件夹(%Temp%)。系统临时文件夹(C:\Windows\Temp)。 清理 Windows 更新缓存: 删除 Windows 更新下载缓存࿰…...
ChromeOS 131 版本更新
ChromeOS 131 版本更新 1. ChromeOS Flex 自动注册 在 ChromeOS 131 中,ChromeOS Flex 的自动注册功能现已允许大规模部署 ChromeOS Flex 设备。与 ChromeOS 零接触注册类似,自动注册将通过组织管理员创建的注册令牌嵌入到 ChromeOS Flex 镜像中。这将…...
PDF24 Creator免费版
PDF点击上方"蓝字"关注我们 01、前言 >>> 官网:https://tools.pdf24.org/zh/creator PDF24 Creator完全免费,没有任何限制。企业也能免费用。 不可以,PDF24 Creator只能装在Windows系统上。目前不支持Linux和Mac。 PDF24…...
网络安全之访问控制
简介 同一分布式环境下,同一用户可能具有多个应用服务器的访问授权,同一应用服务器也有多个授权访问的用户,同一用户在一次事务中可能需要访问多个授权访问的应用服务器,应用服务器可能还需要对访问用户进行身份鉴别。为了实现这…...
vtie项目中使用到了TailwindCSS,如何打包成一个单独的CSS文件(优化、压缩)
在不依赖 Vite 或其他构建工具的情况下,使用 TailwindCSS CLI 快速生成独立的 CSS 文件是一种简单高效的方法,适合需要纯样式文件的场景。 这个项目中,使用到了tailwindCss, 需要把里面的样式打包出来,给其他项目用。 使用命令生…...
前端登录注册页面springboot+vue2全开发!
需求目标: 有“登录界面”和“注册界面”以及“功能操作界面”: 我们打开程序会自动进入“登录界面”,如果密码输入正确则直接进入“功能操作界面”,在“登录界面”我们可以点击注册进入“注册页面”,注册好了可以再跳…...
批量提取zotero的论文构建知识库做问答的大模型(可选)——含转存PDF-分割统计PDF等
文章目录 提取zotero的PDF上传到AI平台保留文件名代码分成20个PDF视频讲解 提取zotero的PDF 右键查看目录 发现目录为 C:\Users\89735\Zotero\storage 写代码: 扫描路径‘C:\Users\89735\Zotero\storage’下面的所有PDF文件,全部复制一份汇总到"C:\Users\89735\Downl…...
3 JDK 常见的包和BIO,NIO,AIO
JDK常见的包 java.lang:系统基础类 java.io:文件操作相关类,比如文件操作 java.nio:为了完善io包中的功能,提高io性能而写的一个新包 java.net:网络相关的包 java.util:java辅助类,特别是集合类 java.sql:数据库操作类 IO流 按照流的流向分…...
解决Apache/2.4.39 (Win64) PHP/7.2.18 Server at localhost Port 80问题
配置一下apache里面的配置文件:httpd.conf 和 httpd.vhosts.conf httpd.conf httpd-vhosts.conf 重启服务 展示: 浏览器中中文乱码问题:...
带有 Elasticsearch 和 Langchain 的 Agentic RAG
作者:来自 Elastic Han Xiang Choong 讨论并实现 Elastic RAG 的代理流程,其中 LLM 选择调用 Elastic KB。 更多阅读:Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索。 简介 代理是将 LLM 应用于实际用例的…...
【数据结构与算法】深度优先搜索:树与图的路径探寻之道
一、引言 在计算机科学领域,树与图的路径搜索是一个基础且重要的问题,而深度优先搜索算法(Depth First Search,简称 DFS)则是解决此类问题的经典算法之一。深度优先搜索算法通过从起始节点开始,沿着一条路径…...
vue3项目结合Echarts实现甘特图(可拖拽、选中等操作)
效果图: 图一:选中操作 图二:上下左右拖拽操作 本案例在echarts示例机场航班甘特图的基础上修改 封装ganttEcharts组件,测试数据 airport-schedule.jsonganttEcharts代码: 直接复制粘贴可测…...
【EXCEL 逻辑函数】AND、OR、XOR、NOT、IF、IFS、IFERROR、IFNA、SWITCH
目录 AND:当所有条件都为真时返回 TRUE,否则返回 FALSE OR:当任一条件为真时返回 TRUE,否则返回 FALSE XOR:当奇数个条件为真时返回 TRUE,否则返回 FALSE NOT :反转逻辑值 IF:根…...
单片机长耗时前后台任务优化
代码: void Task_10ms(void) {... }//改 void Task_2ms(void) {static uint8_t s_state 0switch(s_state){case 0:....s_state 1;break;case 1:....s_state 2;break;case 3:....s_state 1;break;default: //此段可以去除s_state 0;break; } } 参考链接 MCU长…...
java引入jedis并且关于开放redis端口问题
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. 引入jedis 编辑 2. 关于java客户端开放redis端口问题 3. 连接redis服务器 redis服务器在官网公开了使用的协议: resp…...
测试电脑是否真实多核CPU
测试电脑是否真实多核CPU 在CPU的描述上现在多数看到的是多核心/多内核,看上去就像是多CPU的样子。但核心是有分真实核心和虚拟核心。如果是真实的多核心,多线程是能够并行。如果不是多核心,多线程就只能够并发。 这里就直接采用多线程的应用…...
Ubuntu 安装实时内核指南
在运行需要高精度和低延迟响应的机器人驱动程序时,安装一个具备实时内核(Real-Time Kernel)的 Ubuntu 系统是至关重要的。若缺乏实时系统的支持,高频率的控制指令可能会导致机器人运动轨迹不流畅,甚至产生抖动现象。以…...
LeetCode:1387. 将整数按权重排序(记忆化搜索 Java)
目录 1387. 将整数按权重排序 题目描述: 实现代码与解析: 记忆化搜索 原理思路: 1387. 将整数按权重排序 题目描述: 我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数: 如果 x 是偶数ÿ…...
某音最新滑块3.5.68(Web/App皆可支持)
某音滑块核心是 captchaBody 参数 难度较大 h5_sdk_version - 代表验证码的版本 如何代表通过验证了呢? 1.web端 fp参数 - verify_m4zafhzb_yARRD6RZ_YwNj_4gjp_AdsL_yxw0thiqv0ub 2.移动端 did参数 - 1997744780462444 当该接口返回如下数据即通过验证码 该设…...
FFmpeg 框架简介和文件解复用
文章目录 ffmpeg框架简介libavformat库libavcodec库libavdevice库 复用(muxers)和解复用(demuxers)容器格式FLVScript Tag Data结构(脚本类型、帧类型)Audio Tag Data结构(音频Tag)V…...
观察者模式(sigslot in C++)
大家,我是东风,今天抽点时间整理一下我很久前关注的一个不错的库,可以支持我们在使用标准C的时候使用信号槽机制进行观察者模式设计,sigslot 官网: http://sigslot.sourceforge.net/ 本文较为详尽探讨了一种观察者模…...
git企业开发的相关理论(二)
目录 git企业开发的相关理论(一) 八.修改文件 九.版本回退 十.撤销修改 情况一(还没有add) 情况二(add后还没有commit) 情况三(commit后还没有push) 十一.删除本地仓库中的文件 方法一 方法二 十二.理解分支 1.常见的分支工作流程 2.合并冲…...
力扣-图论-70【算法学习day.70】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
jmeter中的prev对象
在jmeter中通过beanshell、JSR223的各种处理器编写脚本时,都会看到页面上有这样的说明 这些ctx、vars、props、OUT、sampler、prev等等都是可以直接在脚本中使用的对象,由jmeter抛出 今天主要讲一下prev的使用 SampleResult prev jmctx.getPreviousRe…...
机器学习中的密度聚类算法:深入解析与应用
在机器学习的广阔领域中,聚类算法作为一种无监督学习方法,扮演着至关重要的角色。其中,密度聚类算法以其独特的优势,在数据挖掘、图像分割、市场细分等多个领域得到了广泛应用。 一、密度聚类算法的基本原理 密度聚类算法是一种…...
简单分析一下 a,b,c=a+1,a+1,b+1 执行原理
在 Go 语言中,赋值表达式 a, b, c x, y, z 是同时进行的,但是其计算顺序是从左到右依次进行的。即在 a, b, c 被赋值之前,先计算 x, y, z 的值,并依次将它们赋值给 a, b, c。 例如:a, b, c a1, a1, b1,其…...
2025年前端面试热门题目——HTML|CSS|Javascript|TS知识
以下是对这些 HTML 面试问题的详细解答: 1. HTML 的 src 和 href 属性有什么区别? src (Source) 属性: 用于嵌入资源,例如图像、脚本或 iframe。加载资源时,当前页面的加载会暂停,直到资源加载完成。常用于 <img&g…...
将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?
随着科技的飞速发展,4G太阳能无线监控系统以其独特的优势在远程监控领域脱颖而出。这种系统结合了太阳能供电的环保特性和4G无线传输的便捷性,为各种环境尤其是无电或电网不稳定的地区提供了一种高效、可靠的视频监控解决方案。将这些视频流接入大屏显示…...
【102. 二叉树的层序遍历 中等】
题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例…...
文件包含tomato靶机通关
靶机地址:192.168.152.152 注:靶机打开后在 kali 中扫描一下就能得到 打开网站 第一步信息收集 将网址放到 dirb 中扫描一下 得到了三个目录 我们挨个访问一下 第一个是主目录 第二个是主页面 第三个报错 第二步 我们在主目录页面继续访问 我们进行…...
oracle dblink 的创建及使用
Oracle Database Link(DB Link)是Oracle提供的一种功能,允许你在一个数据库中直接访问另一个远程或本地数据库的对象(如表、视图、序列等)。DB Link的设置简化了跨数据库操作,使得数据的集成和同步变得更加…...
java开发入门学习五-流程控制
流程控制语句 if, if...else, if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式,使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…...
【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块
一、温度传感器模块 (1)资源介绍 🔅原理图 蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用; 图1 拓展接口 温度传感器模块电路原理图如下所示: 图2 …...
Zookeeper 底层原理解析
一、引言 在分布式系统的浩瀚星空中,Zookeeper 宛如一颗最为闪耀的导航星,为众多分布式应用指引方向、保驾护航。无论是大名鼎鼎的 Hadoop、HBase,还是其他各类复杂的分布式架构,Zookeeper 都扮演着不可或缺的关键角色。它如同一…...
面试题整理9----谈谈对k8s的理解1
谈谈对k8s的理解 1. Kubernetes 概念 1.1 Kubernetes是什么 Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的…...
PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering
“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型,将图像处理任务统一为视觉提示问答范式,在多个图像处理任务上展现出良好性能,为通用图像处理提供了新的思路和方法。 confe…...
chart文件结构
在 Helm 中,Chart 是一个用于定义、安装和升级 Kubernetes 应用程序的包。Chart 文件结构遵循一定的目录和文件组织方式,以下是典型的 Helm Chart 文件结构: 1. Chart 文件结构示例 mychart/ ├── Chart.yaml # 描述 Chart 的基…...
SQL优化
SQL优化 插入数据 insert优化 批量插入 insert into tb_test 2values(1, Tom), (2, Cat), (3, jerry); 手动提交事务 start transaction; insert into test1 values(4, Tom), (5, Cat), (6, jerry); insert into test1 values(7, Tom), (8, Cat), (9, jerry); insert int…...
输出1-100之间的随机数,控制输出格式,每行10个(注释有详解)
C 随机数生成与格式化输出 在编程中,随机数的生成是一个常见的需求,尤其是在游戏开发、模拟实验和数据分析等领域。本文将通过一个简单的 C 程序来演示如何生成随机数并进行格式化输出。我们将逐步解析代码,并讨论其工作原理及应用场景。 代…...
【数字化】华为数字化转型架构蓝图-2
目录 1、客户联结的架构思路 1.1 ROADS体验设计 1.2 具体应用场景 1.3 统一的数据底座 1.4 案例与成效 2、一线作战平台的架构思路 2.1 核心要素 2.2 关键功能 2.3 实施路径 2.4 案例与成效 3、能力数字化的架构思路 3.1 能力数字化的核心目标 3.2 能力数字化的实…...
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
MyBatis是什么? MyBatis是一个半自动的ORM持久层框架,内部封装了JDBC,mybatis是通过XML或注解的方式将需要执行的statement配置,支持定制化sql,存储过程以及高级映射。 解释 所谓的半自动ORM意思就是将JDBC的工作交…...
基础元器件的学习
1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负,然后下正上负。当二极管接到反向电压,二极管存在寄生电容,电压不能立刻突变,当输入频率变高时&#…...
GTID下复制问题和解决
环境介绍 数据库1主2从,mysql版本是v5.19 表结构 一、主库新增记录,从库提示主键冲突 模拟故障 1, master上关闭 sql_log_bin,删除id 103 后打开 2, 确认此时从库有id103,主库没有 3, master insert id103 主从异常…...