〖open-mmlab: MMDetection〗解析文件:mmdet/models/losses/cross_entropy_loss.py
目录
- 深入解析MMDetection中的CrossEntropyLoss及其应用
- 1. 概述
- 2. 核心函数
- 2.1 cross_entropy
- 2.1.1 函数定义和参数说明
- 2.1.2 函数体
- 2.1.3 总结
- 2.2 binary_cross_entropy
- 2.2.1 `_expand_onehot_labels`函数
- 2.2.2 `binary_cross_entropy`函数
- 2.2.3 总结
- 2.3 mask_cross_entropy
- 2.3.1函数定义和参数说明
- 2.3.2函数体
- 2.3.3总结
- 3. CrossEntropyLoss类
- 3.1 CrossEntropyLoss 类详解
- 3.1.1 类定义
- 3.1.2 初始化方法
- 3.1.3 属性设置
- 3.1.4 `extra_repr` 方法
- 3.1.5 前向传播方法
- 3.1.6 内部逻辑
- 3.2 示例
- 4. 应用示例
- 5. 总结
- 参考文献
深入解析MMDetection中的CrossEntropyLoss及其应用
在目标检测和分类任务中,交叉熵损失(CrossEntropyLoss)是评估模型预测与真实标签差异的关键指标。MMDetection框架提供了灵活的损失函数实现,以支持不同的训练需求。本文将详细解析CrossEntropyLoss
及其在MMDetection中的应用,并探讨其在模型训练中的作用。
1. 概述
CrossEntropyLoss
是MMDetection中用于计算交叉熵损失的模块。它支持多种配置选项,包括对数损失的权重、忽略的标签索引等,以适应不同的训练场景。
2. 核心函数
2.1 cross_entropy
cross_entropy
函数是计算交叉熵损失的核心函数。它接收模型预测、真实标签和其他可选参数,并返回计算得到的损失值。
cross_entropy
函数是用于计算交叉熵损失的函数,通常用于多分类问题。在深度学习中,交叉熵损失是衡量模型预测概率分布与真实标签概率分布差异的常用方法。以下是对这个函数的详细逐行解析。
2.1.1 函数定义和参数说明
def cross_entropy(pred, label, weight=None, reduction='mean', avg_factor=None, class_weight=None, ignore_index=-100, avg_non_ignore=False):
pred
: 预测值,形状为(N, C)
的张量,其中N
是批次大小,C
是类别数量。label
: 真实标签,形状为(N,)
的张量,每个元素是对应样本的类别索引。weight
: 每个样本的损失权重,形状为(N,)
的张量。reduction
: 指定损失计算后的缩减方式,可以是 “none”、“mean” 或 “sum”。avg_factor
: 用于平均损失的因子,通常用于在损失中考虑无效(如填充)的样本。class_weight
: 每个类别的权重,用于加权损失计算。ignore_index
: 忽略的标签索引,对于这个索引的样本不计入损失计算。avg_non_ignore
: 是否仅在非忽略目标上平均损失。
2.1.2 函数体
ignore_index = -100 if ignore_index is None else ignore_index
- 这行代码设置
ignore_index
的默认值为 -100,如果用户没有指定ignore_index
,则使用默认值。
loss = F.cross_entropy(pred,label,weight=class_weight,reduction='none',ignore_index=ignore_index)
- 使用 PyTorch 的
F.cross_entropy
函数计算每个样本的交叉熵损失。这里设置reduction='none'
以获取每个样本的损失,而不是直接求平均或求和。
if (avg_factor is None) and avg_non_ignore and reduction == 'mean':avg_factor = label.numel() - (label == ignore_index).sum().item()
- 如果
avg_factor
未指定,且avg_non_ignore
为 True,且reduction
为 “mean”,则计算平均因子。这里,avg_factor
是用来计算损失的平均值时考虑的有效样本数量。
if weight is not None:weight = weight.float()
- 如果指定了每个样本的损失权重,则将其转换为浮点数。
loss = weight_reduce_loss(loss, weight=weight, reduction=reduction, avg_factor=avg_factor)
- 使用
weight_reduce_loss
函数应用样本权重,并根据reduction
参数指定的方法缩减损失。avg_factor
用于在平均损失时考虑有效样本数量。
return loss
- 返回计算得到的损失。
2.1.3 总结
cross_entropy
函数是计算多分类问题交叉熵损失的关键函数。它支持对损失进行加权、忽略特定标签的样本,并根据指定的方法缩减损失。这些特性使得该函数在处理不平衡数据集或需要特殊处理某些样本时非常有用。
2.2 binary_cross_entropy
binary_cross_entropy
函数用于计算二元交叉熵损失,特别适用于目标检测中正负样本的分类。
这两个函数是MMDetection中用于处理标签和计算二元交叉熵损失的关键工具。下面将逐行解析这两个函数。
2.2.1 _expand_onehot_labels
函数
def _expand_onehot_labels(labels, label_weights, label_channels, ignore_index):"""Expand onehot labels to match the size of prediction."""
- 这个函数用于将标签扩展为与预测尺寸相匹配的一位有效编码(one-hot encoding)形式。
bin_labels = labels.new_full((labels.size(0), label_channels), 0)
- 创建一个形状为
(labels.size(0), label_channels)
的全零张量,用于存储一位有效编码的标签。
valid_mask = (labels >= 0) & (labels != ignore_index)
- 创建一个有效掩码,其中标签值大于或等于0且不等于
ignore_index
的位置为True。
inds = torch.nonzero(valid_mask & (labels < label_channels), as_tuple=False)
- 找到所有有效且小于
label_channels
的标签索引。
if inds.numel() > 0:bin_labels[inds, labels[inds]] = 1
- 如果存在有效的索引,则在
bin_labels
张量中将这些索引对应的位置设置为1。
valid_mask = valid_mask.view(-1, 1).expand(labels.size(0),label_channels).float()
- 将
valid_mask
重塑并扩展到与bin_labels
相同的形状,并转换为浮点数。
if label_weights is None:bin_label_weights = valid_maskelse:bin_label_weights = label_weights.view(-1, 1).repeat(1, label_channels)bin_label_weights *= valid_mask
- 如果没有给定
label_weights
,则使用valid_mask
作为权重;否则,将label_weights
扩展并与valid_mask
相乘。
return bin_labels, bin_label_weights, valid_mask
- 返回扩展后的一位有效编码标签、标签权重和有效掩码。
2.2.2 binary_cross_entropy
函数
def binary_cross_entropy(pred, label, weight=None, reduction='mean', avg_factor=None, class_weight=None, ignore_index=-100, avg_non_ignore=False):
- 这个函数用于计算二元交叉熵损失。
ignore_index = -100 if ignore_index is None else ignore_index
- 设置
ignore_index
的默认值为-100。
if pred.dim() != label.dim():label, weight, valid_mask = _expand_onehot_labels(label, weight, pred.size(-1), ignore_index)else:valid_mask = ((label >= 0) & (label != ignore_index)).float()if weight is not None:weight = weight * valid_maskelse:weight = valid_mask
- 如果
pred
和label
的维度不同,则调用_expand_onehot_labels
函数扩展标签和权重;否则,创建有效掩码并根据需要调整weight
。
if (avg_factor is None) and avg_non_ignore and reduction == 'mean':avg_factor = valid_mask.sum().item()
- 如果需要在非忽略元素上平均损失,则计算平均因子。
weight = weight.float()loss = F.binary_cross_entropy_with_logits(pred, label.float(), pos_weight=class_weight, reduction='none')
- 将权重转换为浮点数,然后使用
torch.nn.functional.binary_cross_entropy_with_logits
计算未缩减的元素级损失。
loss = weight_reduce_loss(loss, weight, reduction=reduction, avg_factor=avg_factor)
- 使用
weight_reduce_loss
函数根据reduction
参数指定的方法对损失进行缩减。
return loss
- 返回计算得到的损失。
2.2.3 总结
这两个函数是处理标签和计算损失的关键步骤,特别是在处理不平衡数据集或需要忽略某些标签时非常有用。_expand_onehot_labels
函数负责将标签转换为适合损失计算的形式,而binary_cross_entropy
函数则负责实际的损失计算。通过这些函数,MMDetection能够灵活地处理各种复杂的训练场景。
2.3 mask_cross_entropy
mask_cross_entropy
函数用于计算掩码的交叉熵损失,常用于实例分割任务中。
在目标检测和实例分割任务中,mask_cross_entropy
函数用于计算预测掩码与真实掩码之间的交叉熵损失。这个函数特别适用于处理每个目标的二进制掩码。下面是对这个函数的逐行解析。
2.3.1函数定义和参数说明
def mask_cross_entropy(pred, target, label, reduction='mean', avg_factor=None, class_weight=None, ignore_index=None, **kwargs):
pred
: 预测的掩码,形状为(N, C, *)
,其中N
是样本数量,C
是类别数,*
表示任意维度的形状。target
: 真实掩码标签,形状为(N, *)
,与pred
的非类别维度相同。label
: 每个目标的类别标签,用于从pred
中选择对应类别的掩码。reduction
: 指定损失计算后的缩减方式,可以是 “none”、“mean” 或 “sum”。avg_factor
: 用于平均损失的因子,通常用于在损失中考虑无效(如填充)的样本。class_weight
: 每个类别的权重,用于加权损失计算。ignore_index
: 忽略的标签索引,在此函数中不支持。
2.3.2函数体
assert ignore_index is None, 'BCE loss does not support ignore_index'
- 这行代码确保
ignore_index
参数为None
,因为二元交叉熵损失(BCE loss)不支持忽略特定索引。
assert reduction == 'mean' and avg_factor is None
- 这行代码确保
reduction
参数为 “mean” 且avg_factor
为None
。这是为了简化实现,避免处理复杂的缩减逻辑。
num_rois = pred.size()[0]
- 获取预测掩码的数量(即样本数量)。
inds = torch.arange(0, num_rois, dtype=torch.long, device=pred.device)
- 创建一个从0到
num_rois
的整数序列,用于索引pred
。
pred_slice = pred[inds, label].squeeze(1)
- 从
pred
中选择每个样本对应类别的预测掩码。label
包含了每个样本的类别索引,squeeze(1)
用于去除长度为1的维度,使pred_slice
的形状为(N, *)
。
return F.binary_cross_entropy_with_logits(pred_slice, target, weight=class_weight, reduction='mean')[None]
- 使用
torch.nn.functional.binary_cross_entropy_with_logits
计算二元交叉熵损失。这里pred_slice
是预测值,target
是真实值,weight
是类别权重(如果有的话)。 reduction='mean'
指定损失的平均方式。[None]
用于将输出转换为形状(1,)
的张量,以符合 MMDetection 中损失函数的输出格式。
2.3.3总结
mask_cross_entropy
函数是一个专门用于计算预测掩码与真实掩码之间交叉熵损失的函数。它通过选择每个样本对应类别的预测掩码,并计算与真实掩码的二元交叉熵损失。这个函数在实例分割任务中非常有用,尤其是在需要对每个目标的掩码进行分类的场景中。
3. CrossEntropyLoss类
CrossEntropyLoss
类封装了交叉熵损失的计算逻辑,使其可以作为模型的一个组件被轻松集成。
@MODELS.register_module()
class CrossEntropyLoss(nn.Module):def __init__(self, use_sigmoid=False, use_mask=False, reduction='mean', class_weight=None, ignore_index=None, loss_weight=1.0, avg_non_ignore=False):...
3.1 CrossEntropyLoss 类详解
CrossEntropyLoss
类是用于计算交叉熵损失的一个自定义PyTorch模块。它可以适应多种场景下的分类任务,包括多分类、二分类以及掩码损失。下面我们将通过具体的例子来详细解析该类的实现及其工作原理。
3.1.1 类定义
@MODELS.register_module()
class CrossEntropyLoss(nn.Module):
这里 @MODELS.register_module()
是一个装饰器,通常用于注册自定义模块,使得该模块可以在配置文件中被方便地引用和实例化。
3.1.2 初始化方法
def __init__(self,use_sigmoid=False,use_mask=False,reduction='mean',class_weight=None,ignore_index=None,loss_weight=1.0,avg_non_ignore=False):
use_sigmoid
: 布尔值,指示输出是否使用sigmoid激活函数,默认为False,意味着使用softmax。use_mask
: 布尔值,指示是否使用掩码交叉熵损失,默认为False。reduction
: 字符串,指定损失函数的缩减方式,默认为’mean’,即计算平均损失。可选值还有’none’(不缩减)和’sum’(求和)。class_weight
: 列表或数组,每个类别的权重,默认为None,即所有类别权重相同。ignore_index
: 整数或None,需要忽略的标签索引,默认为None。loss_weight
: 浮点数,损失函数的整体权重,默认为1.0。avg_non_ignore
: 布尔值,决定是否只在非忽略的目标上平均损失,默认为False。
3.1.3 属性设置
在初始化方法中,设置了多个类属性,并根据传入的参数选择不同的交叉熵损失计算方法:
cls_criterion
: 根据use_sigmoid
和use_mask
的值来选择具体的损失计算函数。可能的函数有binary_cross_entropy
、mask_cross_entropy
或cross_entropy
。
3.1.4 extra_repr
方法
def extra_repr(self):s = f'avg_non_ignore={self.avg_non_ignore}'return s
该方法返回一个额外的表示字符串,通常用于打印类的额外信息。在这个例子中,返回的是 avg_non_ignore
的状态。
3.1.5 前向传播方法
def forward(self,cls_score,label,weight=None,avg_factor=None,reduction_override=None,ignore_index=None,**kwargs):
cls_score
: 模型的预测输出。label
: 真实标签。weight
: 样本权重,默认为None。avg_factor
: 平均因子,默认为None。reduction_override
: 指定的缩减方式,默认为None,表示使用初始化时指定的方式。ignore_index
: 需要忽略的标签索引,默认为None,表示使用初始化时指定的值。**kwargs
: 其他关键字参数。
3.1.6 内部逻辑
-
参数验证
assert reduction_override in (None, 'none', 'mean', 'sum')
确保
reduction_override
参数的有效性。 -
确定缩减方式
reduction = (reduction_override if reduction_override else self.reduction)
根据
reduction_override
参数或初始化时设置的reduction
属性确定实际使用的缩减方式。 -
确定忽略索引
if ignore_index is None:ignore_index = self.ignore_index
如果
ignore_index
未被显式指定,则使用初始化时设置的值。 -
处理类别权重
if self.class_weight is not None:class_weight = cls_score.new_tensor(self.class_weight, device=cls_score.device) else:class_weight = None
如果提供了类别权重,将其转换为与
cls_score
相同设备上的张量。 -
计算损失
loss_cls = self.loss_weight * self.cls_criterion(cls_score,label,weight,class_weight=class_weight,reduction=reduction,avg_factor=avg_factor,ignore_index=ignore_index,avg_non_ignore=self.avg_non_ignore,**kwargs)
根据选择的交叉熵损失计算函数
cls_criterion
计算损失,并应用损失权重。 -
返回损失
return loss_cls
返回计算得到的损失值。
3.2 示例
假设我们有一个简单的二分类问题,其中 cls_score
是模型的输出,label
是真实的标签,我们想要计算交叉熵损失。
import torch
import torch.nn.functional as F# 假设的模型输出
cls_score = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
# 假设的真实标签
label = torch.tensor([0, 1])# 实例化 CrossEntropyLoss
loss_func = CrossEntropyLoss(use_sigmoid=True)# 计算损失
loss = loss_func(cls_score, label)
print("Loss:", loss.item())
在这个例子中,我们使用了sigmoid激活函数,并假设 cls_score
是两个样本的二分类概率预测。label
表示这两个样本的真实类别分别为0和1。loss_func
实例化了一个使用sigmoid的交叉熵损失函数,最后我们计算并打印了损失值。
通过以上分析,我们可以看到 CrossEntropyLoss
类是如何灵活地适应不同场景下的交叉熵损失计算需求的。
4. 应用示例
以下是如何在实际模型训练中使用CrossEntropyLoss
的示例。
# 初始化损失函数
criterion = CrossEntropyLoss(use_sigmoid=True, reduction='mean')# 假设有预测和标签
pred = torch.randn(10, 2) # 10个样本,2个类别
label = torch.empty(10, dtype=torch.long).random_(2)# 计算损失
loss = criterion(pred, label)
5. 总结
CrossEntropyLoss
是MMDetection中实现交叉熵损失的关键组件,它支持多种配置选项,以适应不同的训练需求。通过合理配置,可以有效地优化模型在目标检测和分类任务中的表现。
参考文献
- PyTorch官方文档
本文详细介绍了CrossEntropyLoss
的实现及其在MMDetection中的应用,希望对目标检测和分类任务的研究者和开发者有所帮助。
相关文章:
〖open-mmlab: MMDetection〗解析文件:mmdet/models/losses/cross_entropy_loss.py
目录 深入解析MMDetection中的CrossEntropyLoss及其应用1. 概述2. 核心函数2.1 cross_entropy2.1.1 函数定义和参数说明2.1.2 函数体2.1.3 总结 2.2 binary_cross_entropy2.2.1 _expand_onehot_labels函数2.2.2 binary_cross_entropy函数2.2.3 总结 2.3 mask_cross_entropy2.3.…...
【PyTorch单点知识】torch.nn.Embedding模块介绍:理解词向量与实现
文章目录 0. 前言1. 基础介绍1.1 基本参数1.2 可选参数1.3 属性1.4 PyTorch源码注释 2. 实例演示3. embedding_dim的合理设定4. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但…...

Jedis 操作 Redis 数据结构全攻略
Jedis 操作 Redis 数据结构全攻略 一 . 认识 RESP二 . 前置操作2.1 创建项目2.2 关于开放 Redis 端口的问题2.2.1 端口转发?2.2.2 端口配置 2.3 连接到 Redis 服务器 三 . 通用命令3.1 set 和 get3.2 exists 和 del3.3 keys3.4 expire、ttl、type 三 . string 相关命令3.1 mse…...

ctf.show靶场ssrf攻略
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 web351 解析:post传入url参数他就会访问。 解法: hackbar传入url参数写入https://127.0.0.1/flag.php web352 解析:post传入url参数,不能是127.0.0.1和localhost 解法:缩写127.1传入 web353 解析…...
在 PyTorch 中,如何使用 `pack_padded_sequence` 来提高模型训练的效率?
在PyTorch中,pack_padded_sequence 是一个非常有用的函数,它可以用来提高模型训练的效率,特别是在处理变长序列数据时。这个函数的主要作用是将填充后的序列数据打包,以便循环神经网络(RNN)可以更高效地处理…...
Gossip协议
主要用在Redis Cluster 节点间通信 Gossip协议,也称为流行病协议(Epidemic Protocol),是一种在分布式系统中用于信息传播和故障探测的算法。 一、工作原理 随机选择传播对象 每个节点会定期随机选择一些其他节点作为传播对象。这…...
数据结构————双向链表
内存泄漏: 内存泄漏(Memory Leak)是指程序中已动态分配的内存由于某种原因程序未释放或无法释放,导致系统内存的浪费,严重时会导致程序运行缓慢甚至崩溃。这种情况在长时间运行的程序或大型系统中尤为常见,…...
55 - I. 二叉树的深度
comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9855%20-%20I.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%B7%B1%E5%BA%A6/README.md 面试题 55 - I. 二叉树的深度 题目描述 输入一棵二叉树的根节点…...

Redis——初识Redis
初识Redis Redis认识Redis 分布式系统单机架构为什么要引入分布式理解负载均衡数据库的读写分离引入主从数据库 引入缓存数据库分库分表业务拆分——微服务常见概念了解 Redis背景介绍特性应用场景Redis不能做的事情Redis客户端redis客户端的多种形态 Redis 认识Redis 存储数…...

Xshell or Xftp提示“要继续使用此程序,您必须应用最新的更新或使用新版本”
Xshell提示“要继续使用此程序,您必须应用最新的更新或使用新版本”,笔者版本是xshell 6 方法一:更改系统时间 对于Windows 10用户,首先找到系统日期,右键点击并选择“调整时间/日期”。将日期设定为上一年。完成调整后&#x…...

table用position: sticky固定多层表头,滑动滚动条border边框透明解决方法
问题:我发现,这个上下滑动有内容经过就会出现如图的情况。 解决的方法:用outline(轮廓)替代border,以达到我们想要的样式。 outline主要是在元素边框的外围设置轮廓,outline不占据空间,绘制于…...

基于飞桨paddle2.6.1+cuda11.7+paddleRS开发版的目标提取-道路数据集训练和预测代码
基于飞桨paddle2.6.1cuda11.7paddleRS开发版的目标提取-道路数据集训练和预测代码 预测结果: 预测影像: (一)准备道路数据集 下载数据集地址: https://aistudio.baidu.com/datasetdetail/56961 mass_road.zip …...
数学建模笔记—— 整数规划和0-1规划
数学建模笔记—— 整数规划和0-1规划 整数规划和0-1规划1. 模型原理1.1 基本概念1.2 线性整数规划求解1.3 线性0-1规划的求解 2. 典型例题2.1 背包问题2.2 指派问题 3. matlab代码实现3.1 背包问题3.2 指派问题 整数规划和0-1规划 1. 模型原理 1.1 基本概念 在规划问题中&am…...

[001-03-007].第26节:分布式锁迭代3->优化基于setnx命令实现的分布式锁-防锁的误删
我的博客大纲 我的后端学习大纲 1、问题分析: 1.1.问题: 1.锁的超时释放,可能会释放其他服务器的锁 1.2.场景: 1.如果业务逻辑的执行时间是7s。执行流程如下 1.index1业务逻辑没执行完,3秒后锁被自动释放。2.index…...

【Unity踩坑】为什么有Rigidbody的物体运行时位置会变化
先上图,不知你有没有注意过这个现象呢? 一个物体加上了Rigidbody组件,当勾选上Use Gravity时,运行后,这个物体的位置的值会有变化。这是为什么呢? 刚体由物理系统处理,因此它会对重力、碰撞等做…...

NGINX开启HTTP3,给web应用提个速
环境说明 linuxdockernginx版本:1.27 HTTP3/QUIC介绍 HTTP3是由IETF于2022年发布的一个标准,文档地址为:https://datatracker.ietf.org/doc/html/rfc9114 如rfc9114所述,http3主要基于QUIC协议实现,在具备高性能的同时又兼备了…...
秋招季!别浮躁!
好久没写了,今天兴致来了,众所周知我一旦想说话,就来这里疯狂写。 最近,我去了一家国企的研究院,听着是不是贼高大上,呵——这玩意儿把我分配到三级机构,我一个学计算机的,它不把我…...

Java的时间复杂度和空间复杂度和常见排序
目录 一丶时间复杂度 二丶空间复杂度 三丶Java常见排序 1. 冒泡排序(Bubble Sort) 2.插入排序(Insertion Sort) 3.希尔排序(Shell Sort) 4.选择排序(Selection Sort) 5.堆排序&am…...

Qt 学习第十天:标准对话框 页面布局
系统标准对话框 错误对话框 //错误对话框connect(createPro, &QAction::triggered, this, []{//参数1 父亲 参数2 标题 参数3 对话框内显示文本内容 。。。QMessageBox::critical(this, "报错!", "没加头文件!");}); 【运行结果】 信息对话框 co…...
体育数据API纳米足球数据API:足球数据接口文档API示例⑩
纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口,无请求次数限制,可按需购买,接口稳定高效; 覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。纳米数据API2.0版本…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...