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

YOLOv10-1.1部分代码阅读笔记-utils.py

utils.py

ultralytics\nn\modules\utils.py

目录

utils.py

1.所需的库和模块

2.def _get_clones(module, n): 

3.def bias_init_with_prob(prior_prob=0.01): 

4.def linear_init(module): 

5.def inverse_sigmoid(x, eps=1e-5): 

6.def multi_scale_deformable_attn_pytorch(value: torch.Tensor, value_spatial_shapes: torch.Tensor, sampling_locations: torch.Tensor, attention_weights: torch.Tensor,) -> torch.Tensor: 


1.所需的库和模块

# Ultralytics YOLO 🚀, AGPL-3.0 license
"""Module utils."""import copy
import mathimport numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.nn.init import uniform_# 这段代码定义了一个名为 __all__ 的元组,它包含了一系列的类名。这个元组通常用于Python模块中,以明确指出该模块对外公开的接口或类。当某个模块被导入时,如果使用了 from module import * 这样的导入语句, __all__ 元组中列出的名称将会被导入。
__all__ = "multi_scale_deformable_attn_pytorch", "inverse_sigmoid"

2.def _get_clones(module, n): 

# 这段代码定义了一个名为 _get_clones 的类,它用于创建指定模块( module )的多个副本,并返回这些副本组成的列表。这个函数通常在深度学习中用于复制相同的模块多次,以构建序列模型或实现特定的网络结构。
# 定义了一个名为 _get_clones 的函数,它接受两个参数。
# 1.module :是一个神经网络模块。
# 2.n :是一个整数,表示要复制模块的次数。
def _get_clones(module, n):# 从给定的模块创建克隆模块列表。"""Create a list of cloned modules from the given module."""#  这行代码执行了实际的复制操作,并返回一个结果。# copy.deepcopy(module) :使用 copy 模块的 deepcopy 函数来创建 module 的一个深拷贝。深拷贝意味着创建一个新的对象,并递归复制其所有元素,确保新对象和原始对象完全独立。# for _ in range(n) :这是一个列表推导式,用于生成一个列表,其中包含 n 个 module 的深拷贝。 _ 是一个占位符,表示我们不关心循环的索引,只关心迭代的次数。# nn.ModuleList([...]) :将上述生成的列表包装成一个 ModuleList 对象。 ModuleList 是PyTorch中的一个类,用于存储一个模块列表,并且可以像常规Python列表一样进行索引和迭代,但它还具有一些额外的功能,比如在模型的参数中注册每个模块的参数。return nn.ModuleList([copy.deepcopy(module) for _ in range(n)])
# _get_clones 函数的作用是复制一个神经网络模块 n 次,并返回一个包含所有复制模块的 ModuleList 。这在深度学习中很有用,比如在实现某些特定的网络结构时,可能需要多个相同的模块。通过这种方式,可以确保每个模块都有独立的参数,同时便于管理和使用。

3.def bias_init_with_prob(prior_prob=0.01): 

# 这段代码定义了一个名为 bias_init_with_prob 的函数,它用于计算和返回一个初始化偏置值,这个值通常用于神经网络中偏置项的初始化。
# 定义了一个名为 bias_init_with_prob 的函数,它接受一个参数。
# 1.prior_prob :是一个浮点数,默认值为 0.01 ,表示某个事件发生的先验概率。
def bias_init_with_prob(prior_prob=0.01):# 根据给定的概率值初始化 conv/fc 偏差值。"""Initialize conv/fc bias value according to a given probability value."""# 计算并返回一个浮点数,这个数是根据 prior_prob 计算得到的初始化偏置值。# 1 - prior_prob :计算 prior_prob 的补数,即不发生该事件的概率。# (1 - prior_prob) / prior_prob :计算不发生该事件的概率与发生该事件的概率之比。# -np.log(...) :计算上述比值的负对数。这里使用的是自然对数 np.log ,它是 NumPy 库中的一个函数,用于计算自然对数(以 e 为底的对数)。# float(...) :将计算结果转换为浮点数,以确保返回值的类型是 float 。return float(-np.log((1 - prior_prob) / prior_prob))  # return bias_init
# bias_init_with_prob 函数根据给定的先验概率 prior_prob 计算一个初始化偏置值。这个值通常用于初始化神经网络中的偏置项,以便在训练开始时对特定事件的发生概率进行调整。通过设置偏置项,可以影响网络的输出,使其更倾向于或更不倾向于激活某个神经元。这种方法在处理类别不平衡问题时特别有用,因为它可以帮助模型在训练过程中更加关注少数类别。

4.def linear_init(module): 

# 这段代码定义了一个名为 linear_init 的函数,它用于初始化线性层(例如全连接层)的权重和偏置。
# 定义了一个名为 linear_init 的函数,它接受一个参数。
# 1.module :指的是一个线性层模块,比如 PyTorch 中的 nn.Linear 。
def linear_init(module):# 初始化线性模块的权重和偏差。"""Initialize the weights and biases of a linear module."""# 计算了一个边界值 bound ,用于初始化权重。# module.weight.shape[0] :获取线性层权重矩阵的第一个维度的大小,即输入特征的数量。# 1 / math.sqrt(...) :计算输入特征数量的平方根的倒数,这个值将用作权重初始化的范围的边界。这是一种常见的权重初始化策略,称为 Xavier/Glorot 初始化,它有助于保持激活函数输出的方差在网络的各层之间相对一致。bound = 1 / math.sqrt(module.weight.shape[0])# torch.nn.init.uniform_(tensor, a=0.0, b=1.0)# 在PyTorch中, nn.init.uniform_() 是一个用于初始化张量参数的函数,它将张量中的元素值从均匀分布中随机采样。这个函数通常用于初始化神经网络中的权重和偏置参数。# 参数 :# tensor  ( torch.Tensor ): 需要被初始化的张量。# a ( float , 可选): 均匀分布的下限,默认为0.0。# b ( float , 可选): 均匀分布的上限,默认为1.0。# 功能 :# nn.init.uniform_() 函数的主要功能是为张量提供一个随机的初始值,这些值是从指定的均匀分布中采样的。# 这种初始化方法可以帮助打破对称性,使得神经网络的权重在训练开始时具有不同的值,从而有助于训练过程的收敛。均匀初始化是一种常用的初始化方法,特别是在没有特定先验知识的情况下。# 使用均匀分布来初始化权重。# uniform_(...) :这是一个函数,用于将张量(Tensor)的元素值从均匀分布中随机采样。# module.weight :指定要初始化的权重张量。# -bound 和 bound :指定均匀分布的下限和上限,即权重的取值范围。uniform_(module.weight, -bound, bound)# 检查线性层是否有偏置项,并且偏置项是否不为 None 。 hasattr 函数用于检查对象是否有指定的属性, module.bias 检查是否存在偏置项。if hasattr(module, "bias") and module.bias is not None:# 如果存在偏置项,使用与权重相同的均匀分布范围来初始化偏置项。uniform_(module.bias, -bound, bound)
# linear_init 函数用于对线性层的权重和偏置进行初始化。权重使用 Xavier/Glorot 初始化策略,即从 [-bound, bound] 范围内的均匀分布中采样,其中 bound 是根据权重矩阵的输入特征数量计算得到的。如果线性层有偏置项,偏置项也会被以相同的方式初始化。这种初始化方法有助于在训练神经网络时保持激活函数输出的稳定性。

5.def inverse_sigmoid(x, eps=1e-5): 

# 这段代码定义了一个名为 inverse_sigmoid 的函数,它用于计算输入 x 的 Sigmoid 函数的逆函数。
# 定义了一个名为 inverse_sigmoid 的函数,它接受两个参数。
# 1.x :是输入值。
# 2.eps 是一个很小的数,用于防止除以零的错误,默认值为 1e-5 。
def inverse_sigmoid(x, eps=1e-5):# 计算张量的逆 sigmoid 函数。"""Calculate the inverse sigmoid function for a tensor."""# torch.clamp(input, min=None, max=None)# torch.clamp() 是 PyTorch 库中的一个函数,用于将张量中的元素限制在指定的范围内。如果元素超出了这个范围,它们将被设置为范围的上限或下限。# 参数 :# input :要进行裁剪的输入张量。# min :元素的最小值。默认为 None ,表示不设置下界。# max :元素的最大值。默认为 None ,表示不设置上界。# 返回值 :# 返回一个新的张量,其中的元素被限制在 [min, max] 范围内。# 注意事项 :# torch.clamp() 函数返回的是新张量,原始输入张量不会被修改。# 如果需要在原地修改张量,可以使用 clamped_() 方法,例如 tensor.clamp_(0, 3) 。# torch.clamp() 可以用于多维张量,并且可以指定不同的 min 和 max 值用于不同的维度。# min 和 max 参数也可以是标量值,或者与输入张量形状相同的张量,用于对不同元素应用不同的限制。# 使用 clamp 方法将 x 的值限制在 [0, 1] 范围内。这是因为 Sigmoid 函数的输出值应该在这个区间内, clamp 方法确保即使输入值超出这个范围,函数也能正常工作。x = x.clamp(min=0, max=1)# 再次使用 clamp 方法,将 x 的值限制在 [eps, 1] 范围内。这是为了防止在计算 x1 / x2 时, x 接近 0 导致除以一个非常小的数,从而产生数值不稳定。x1 = x.clamp(min=eps)# 计算 1 - x 并将结果限制在 [eps, 1] 范围内。这是出于与 x1 相同的理由,确保在计算 x1 / x2 时, 1 - x 接近 0 也不会导致除以一个非常小的数。x2 = (1 - x).clamp(min=eps)# 计算 x1 除以 x2 的自然对数,并返回结果。这个计算实际上是 Sigmoid 函数的逆操作。Sigmoid 函数将任意实数映射到 (0, 1) 区间,其逆函数可以将 (0, 1) 区间内的值映射回原始的实数空间。return torch.log(x1 / x2)
# inverse_sigmoid 函数计算输入 x 的 Sigmoid 逆值。它首先确保输入值在 [0, 1] 区间内,然后计算 x 和 1 - x 的值,并将它们限制在一个非常小的正数 eps 以上,以避免数值计算中的不稳定。最后,它返回 x 和 1 - x 的比值的自然对数,这个值是 x 的 Sigmoid 逆值。这种逆 Sigmoid 转换在某些机器学习任务中很有用,比如在处理经过 Sigmoid 函数的输出时,需要将其转换回原始的预测值。

6.def multi_scale_deformable_attn_pytorch(value: torch.Tensor, value_spatial_shapes: torch.Tensor, sampling_locations: torch.Tensor, attention_weights: torch.Tensor,) -> torch.Tensor: 

# 这段代码定义了一个名为 multi_scale_deformable_attn_pytorch 的函数,它实现了多尺度可变形注意力机制(Multi-Scale Deformable Attention),这是一种在计算机视觉任务中,特别是在目标检测和图像分割中使用的高级注意力机制。
# 定义了函数 multi_scale_deformable_attn_pytorch ,它接受四个参数。
# 1.value :值特征图。
# 2.value_spatial_shapes :不同尺度值特征图的空间形状。
# 3.sampling_locations :采样位置。
# 4.attention_weights :注意力权重
# 返回一个 torch.Tensor 类型的输出。
def multi_scale_deformable_attn_pytorch(value: torch.Tensor,value_spatial_shapes: torch.Tensor,sampling_locations: torch.Tensor,attention_weights: torch.Tensor,
) -> torch.Tensor:# 多尺度可变形注意力。"""Multiscale deformable attention.https://github.com/IDEA-Research/detrex/blob/main/detrex/layers/multi_scale_deform_attn.py"""# 从 value 张量中提取出 批量大小 bs 、 多头注意力的头数 num_heads 和 嵌入维度 embed_dims 。bs, _, num_heads, embed_dims = value.shape# 从 sampling_locations 张量中提取出 查询的数量 num_queries 、 多头注意力的头数 num_heads 、 尺度级别 num_levels 和 每个查询点的采样点数 num_points 。_, num_queries, num_heads, num_levels, num_points, _ = sampling_locations.shape# 将 value 张量按照 value_spatial_shapes 中的形状分割成多个子张量,每个子张量对应不同尺度的特征图。value_list = value.split([H_ * W_ for H_, W_ in value_spatial_shapes], dim=1)# 这行代码是将采样位置从某种归一化的坐标系转换到 grid_sample 函数所需要的坐标系。在 PyTorch 中, grid_sample 函数期望的输入坐标范围是 [-1, 1] ,这对应于输入特征图的归一化坐标,其中 -1 表示特征图的最左边(或最顶部), 1 表示最右边(或最底部)。# sampling_locations :这是一个包含采样位置的张量,其坐标可能是相对于特征图的中心点归一化的,范围在 [0, 1] 之间。例如,如果 sampling_locations 中的值为 0 ,则表示特征图的中心点; 0.5 表示特征图的右边缘(或下边缘); -0.5 表示特征图的左边缘(或上边缘)。# 2 * sampling_locations - 1 :这个表达式将 [0, 1] 范围的坐标转换为 [-1, 1] 范围。具体来说,它首先将坐标乘以 2 ,这样原来 [0, 1] 的范围就变成了 [0, 2] ,然后减去 1 ,使得范围最终变为 [-1, 1] 。# 这种转换是必要的,因为 grid_sample 函数使用 [-1, 1] 范围的坐标来确定采样点在特征图上的位置。通过这种方式,采样点的坐标可以正确地映射到特征图的边界上,从而允许 grid_sample 函数进行双线性插值并获取正确的像素值。sampling_grids = 2 * sampling_locations - 1# 初始化一个空列表,用于存储每个尺度的采样值。sampling_value_list = []# 这段代码是多尺度可变形注意力机制中的一部分,用于对每个尺度的特征图进行采样。# 开始一个循环,遍历每个尺度的特征图。 level 是当前尺度的索引, (H_, W_) 是当前尺度特征图的高度和宽度。for level, (H_, W_) in enumerate(value_spatial_shapes):# bs, H_*W_, num_heads, embed_dims -># bs, H_*W_, num_heads*embed_dims -># bs, num_heads*embed_dims, H_*W_ -># bs*num_heads, embed_dims, H_, W_# 对当前尺度的特征图进行一系列变换。# flatten(2) :将 value_list[level] 的最后两个维度( num_heads 和 embed_dims )合并。# transpose(1, 2) :交换合并后的维度和 H_*W_ 维度的位置。# reshape(bs * num_heads, embed_dims, H_, W_) :将张量重塑为 (batch_size * num_heads, embed_dims, H_, W_) 的形状,以适应 grid_sample 函数的输入要求。value_l_ = value_list[level].flatten(2).transpose(1, 2).reshape(bs * num_heads, embed_dims, H_, W_)# bs, num_queries, num_heads, num_points, 2 -># bs, num_heads, num_queries, num_points, 2 -># bs*num_heads, num_queries, num_points, 2# 对当前尺度的采样网格进行变换。# sampling_grids[:, :, :, level] :选择当前尺度的采样网格。# transpose(1, 2) :交换 num_heads 和 num_queries 维度。# flatten(0, 1) :将 batch_size 和 num_heads 维度合并,并与 num_queries 维度一起展平。sampling_grid_l_ = sampling_grids[:, :, :, level].transpose(1, 2).flatten(0, 1)# torch.nn.functional.grid_sample(input, grid, mode='bilinear', padding_mode='zeros', align_corners=None)# torch.nn.functional.grid_sample 是 PyTorch 中的一个函数,它用于根据给定的坐标网格对输入张量进行采样。这个函数常用于图像变形、数据增强等任务。# 参数说明 :# input : 输入张量,可以是 4D 张量(N, C, H, W)或 5D 张量(N, C, D, H, W),分别代表批量图像或体积数据。# grid : 坐标网格张量,用于指定采样位置。对于 4D 输入, grid 的形状为(N, H_out, W_out, 2),对于 5D 输入, grid 的形状为(N, D_out, H_out, W_out, 3)。# mode : 采样模式,可以是 'bilinear'(双线性插值)或 'nearest'(最近邻插值)。# padding_mode : 填充模式,可以是 'zeros'(用 0 填充)或 'border'(用边界值填充)。# align_corners : 布尔值,指示是否将网格坐标与输入张量的角点对齐。如果设置为 True,则网格坐标被视为指向像素的角点;如果设置为 False,则网格坐标被视为指向像素之间的中心点。默认值为 None,此时与 align_corners=False 相同。# 功能描述 :# F.grid_sample 函数根据 grid 中的坐标网格对 input 张量进行采样。坐标网格的值通常在 [-1, 1] 之间,(-1, -1) 表示输入张量左上角的元素,(1, 1) 表示右下角的元素。该函数可以使用双线性插值或最近邻插值来计算采样点的值。# 返回值 :# 返回采样后的输出张量,其形状为(N, C, H_out, W_out)或(N, C, D_out, H_out, W_out),取决于输入张量和网格的形状。# bs*num_heads, embed_dims, num_queries, num_points# 使用 grid_sample 函数对当前尺度的特征图 value_l_ 进行采样,采样位置由 sampling_grid_l_ 指定。采样模式为双线性插值( bilinear ),填充模式为零( zeros ),并且不使用对齐角( align_corners=False )。sampling_value_l_ = F.grid_sample(value_l_, sampling_grid_l_, mode="bilinear", padding_mode="zeros", align_corners=False)# 将当前尺度的采样值 sampling_value_l_ 添加到列表 sampling_value_list 中。sampling_value_list.append(sampling_value_l_)# 这个循环对每个尺度的特征图进行采样,得到每个查询点的采样值。这些采样值将用于后续的加权求和,以生成最终的注意力输出。通过在每个尺度上进行采样,模型能够捕捉到不同尺度的特征信息,从而提高对空间关系的感知能力。# 这段代码是多尺度可变形注意力机制中的最后几步,用于计算最终的输出。# (bs, num_queries, num_heads, num_levels, num_points) -># (bs, num_heads, num_queries, num_levels, num_points) -># (bs, num_heads, 1, num_queries, num_levels*num_points)# 对注意力权重进行转置和重塑,以适应后续的计算。# attention_weights.transpose(1, 2) :将 attention_weights 张量进行转置,交换 num_queries 和 num_heads 维度的位置。# reshape(bs * num_heads, 1, num_queries, num_levels * num_points) :将转置后的张量重塑为新的维度,其中 bs * num_heads 是批量大小和头数的乘积, 1 是一个额外的维度, num_queries 是查询的数量, num_levels * num_points 是所有级别的采样点总数。attention_weights = attention_weights.transpose(1, 2).reshape(bs * num_heads, 1, num_queries, num_levels * num_points)# 计算加权和,并将结果重塑为最终输出的形状。# torch.stack(sampling_value_list, dim=-2) :将 sampling_value_list 中的张量沿着倒数第二个维度堆叠起来,形成一个新维度。# flatten(-2) :将堆叠后的张量在倒数第二个维度上展平,即将 num_levels 和 num_points 合并。# * attention_weights :将展平后的采样值张量与 attention_weights 张量相乘,执行逐元素的乘法。# .sum(-1) :沿着最后一个维度(即 num_levels * num_points )对乘积进行求和,将所有采样点的贡献聚合起来。# .view(bs, num_heads * embed_dims, num_queries) :将求和后的张量重塑为最终的输出形状,其中 bs 是批量大小, num_heads * embed_dims 是合并后的嵌入维度, num_queries 是查询的数量。output = ((torch.stack(sampling_value_list, dim=-2).flatten(-2) * attention_weights).sum(-1).view(bs, num_heads * embed_dims, num_queries))# 将输出张量进行转置,并确保其在内存中是连续的,然后返回,形状为 (batch_size, num_queries, num_heads * embed_dims) 。# output.transpose(1, 2) :将输出张量再次转置,交换 num_heads * embed_dims 和 num_queries 维度的位置。# .contiguous() :确保张量在内存中是连续存储的,这对于某些 PyTorch 操作是必要的,特别是当张量需要被传递给 CUDA 时。return output.transpose(1, 2).contiguous()# 这段代码将不同尺度的采样值与对应的注意力权重相乘,然后对所有采样点的贡献进行求和,最后将结果重塑并转置为最终的输出张量。这个输出张量包含了每个查询在所有尺度上的加权特征表示,可以用于后续的网络层。
# multi_scale_deformable_attn_pytorch 函数实现了多尺度可变形注意力机制,它通过在不同尺度的特征图上采样并加权,生成最终的输出。这种机制能够捕捉到不同尺度的特征信息,增强模型对空间关系的感知能力。

相关文章:

YOLOv10-1.1部分代码阅读笔记-utils.py

utils.py ultralytics\nn\modules\utils.py 目录 utils.py 1.所需的库和模块 2.def _get_clones(module, n): 3.def bias_init_with_prob(prior_prob0.01): 4.def linear_init(module): 5.def inverse_sigmoid(x, eps1e-5): 6.def multi_scale_deformable_attn_py…...

JDK8源码分析Jdk动态代理底层原理

本文侧重分析JDK8中jdk动态代理的源码,若是想看JDK17源码分析可以看我的这一篇文章 JDK17源码分析Jdk动态代理底层原理-CSDN博客 两者之间有着略微的差别,JDK17在JDK8上改进了不少 目录 源码分析 过程 生成的代理类大致结构 本文侧重分析JDK8中jdk…...

springboot配置并使用RestTemplate

目录 一、RestTemplate配置 1、将RestTemplate初始化为Bean 2、使用HttpClient作为RestTemplate客户端 (1)引入HttpClient依赖 (2)修改RestTemplate配置类 3、设置拦截器 (1)新增拦截器类 &#xf…...

【MySQL关于数据库和表结构的增删查改】

数据库和表结构的基本语法 数据库命令关于字符集语法 表操作语法创建表查看表结构修改表修改表名增加字段同时修改字段名和字段数据类型仅修改字段数据类型删除字段 删除表 备份和恢复备份恢复 mysql -h 127.0.0.1 -P 3306 -u root -p mysql -u root -h 和 -p 默认 进入MySQL程…...

Linux 服务器启用 DNS 加密

DNS 加密的常用协议包括 DNS over HTTPS (DoH)、DNS over TLS (DoT) 和 DNSCrypt。以下是实现这些加密的步骤和工具建议: 1. 使用 DoH (DNS over HTTPS) 工具推荐: cloudflared(Cloudflare 提供的客户端)doh-client(…...

2025年,测试技能支棱起来。

你是否曾为提升自己的测试技能而烦恼?在这个日新月异的技术时代,2025年已经悄然而至,软件测试行业的需求和挑战也在不断变化。那么,如何在这个竞争激烈的环境中脱颖而出,成为一名更加优秀的测试工程师呢? …...

HTML5实现好看的二十四节气网页源码

HTML5实现好看的新年春节元旦网站源码 前言一、设计来源1.1 主界面1.2 关于我们界面1.3 春季节气界面1.4 夏季节气界面1.5 秋季节气界面1.6 冬季节气界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的二十四节气网页源码,春季节气&#xf…...

每天你好20250103(距离春节26天!!!)

亲爱的朋友们,大家早上好! 🌞 今天是 1 月 3 日,星期五,2025 年的第三天,同时也是第 1 周的第五天,农历乙巳[蛇]年十一月十四日。祥龙辞岁去,瑞蛇迎春来,在这曙光初照的…...

【音频伴奏分离】UVR5软件介绍

Ultimate Vocal Remover 5 (UVR5) 是一款功能强大的AI人声伴奏音频分离软件,它能够利用深度学习模型从音频文件中分离出人声和伴奏。UVR5在音乐制作、音频编辑、学习等多种场景中都非常有用。以下是UVR5的一些主要特点和使用方法: 主要特点:…...

安卓触摸事件的传递

setOnTouchListener()返回值的副作用(触摸事件是否继续往下或往后传递)如下: 返回值效果是否往下层view传递是否往当前view的后续监听传递true该pointer离开屏幕前的后续所有触摸事件都会传递给该TouchListener否否false该pointer离开屏幕前…...

51c视觉~合集40

我自己的原文哦~ https://blog.51cto.com/whaosoft/12951385 #SparX 港大提出SparX:强化Vision Mamba和Transformer的稀疏跳跃连接机制 本文分享香港大学计算和数据科学学院俞益洲教授及其研究团队发表于 AAAI 2025 的论文——SparX,一种强化 Visio…...

25年1月更新。一图流Windows 上搭建 Python 开发环境:Python + PyCharm 安装全攻略(文中有安装包不用官网下载)

引言 随着 Python 在数据科学、Web 开发、自动化脚本等多个领域的广泛应用,越来越多的开发者选择它作为首选编程语言。而 PyCharm 作为一个功能强大的集成开发环境(IDE),为 Python 开发者提供了极大的便利。本文将详细介绍如何在 …...

C# 设计模式的六大原则(SOLID)

C# 设计模式的六大原则(SOLID) 引言 在面向对象编程中,设计模式提供了高效、可复用和可维护的代码结构。SOLID原则是软件设计中的一组重要原则,用于确保代码具有良好的可维护性、可扩展性和灵活性。SOLID是五个设计原则的首字母…...

MQ-导读

什么是MQ? MQ是一款消息中间件,通常被称为"消息队列",用于分布式架构中上下文的异步通信。 举个例子 就拿登录来说,用户在登录的时候需要去进行一些其他的操作,比如风控、短信、记录日志,如果采用同步的方式…...

Spring MVC的@ResponseBody与@RequestBody

ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。 RequestBody注解用于读取http请求的内容(字符串),通过springmv…...

常见硬件及其对应的驱动模块列表

常见硬件及其对应的驱动模块列表 1. 电机类 硬件设备驱动模块功能步进电机ULN2003、A4988、DRV8825提供电流和电压,控制步进和方向直流电机L298N、L293D、TB6612FNG提供双向电流控制,实现正反转和调速伺服电机无(直接 PWM 控制)控…...

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示: 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范,可以帮忙本地自动扫描出不符合开发者规范的代码,甚至是代码漏洞提示。 右击项目,选择《编码规约扫描》,可以进行本地代码规范扫…...

系统架构师考试-ABSD基于架构的设计方法

概念 ABSD是体系结构驱动,是指构成体系结构的软件构件和类的组合驱动的。 ABSD强调由商业、质量和功能需求的组合驱动软件架构设计。使用ABSD方法,设计活动可以从项目总体功能框架明确就开始,并且设计活动的开始并不意味着需求抽取和分析活…...

Node.js入门html,css,js 30年了nodejs环境 09年出现 15

Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题: 【锦上添花】让我们前端工程师拥有了后端开发能力(开接口,访问数据库) - 大公司BFF(50)【✔️】前端工程…...

2025跨年倒计时

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>2025年跨年倒计时</title><style>/* 页…...

淘宝京东电商商品SKU信息抓取API测试实战指南

在电商平台的商品管理中&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;信息扮演着至关重要的角色。它不仅关乎商品的库存管理&#xff0c;还直接影响到消费者的购买决策。为了高效地获取并验证电商平台&#xff08;如淘宝、京东&#xff09;上…...

SAP财务凭证的更改、冲销的方式

文章目录 一、财务凭证更改二、财务凭证冲销 【SAP系统研究】 #SAP #FICO #SAP财务 一、财务凭证更改 &#xff08;1&#xff09;已经过账的财务凭证 FB02&#xff1a;过完帐的允许更改的地方有限&#xff0c;只有凭证抬头文本、参照、分配、文本、原因代码等。 &#xff0…...

RepPoints: Point Set Representation for Object Detection

CornerNet论文阅读整理-CSDN博客 可变形卷积(Deformable Conv)原理解析与torch代码实现-CSDN博客 RepPoints(本质是可变形卷积DCN)再理解-CSDN博客 简介&#xff1a; 时间&#xff1a;2019 会议&#xff1a;ICCV 作者&#xff1a;Ze Yang&#xff0c;Shaohui Liu&#xff0c…...

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及&#xff0c;即便是零编程基础或基础薄弱的用户&#xff0c;也可以借助AI完成许多技术任务。然而&#xff0c;要高效地使用AI完成编程任务&#xff0c;关键在于如何清晰表达需求&#xff0c;并逐步引导AI实现目标。 在本文中&#xff0c;我们将通过开发…...

Linux命令——RPM与yum

文章目录 一、RPM包命令1.安装和升级包2.删除包3.查询包信息4.验证和检查5.其他操作 二、yum安装器1.安装包2.更新包3.卸载包4.查询和搜索5.清理缓存6.其他操作 一、RPM包命令 1.安装和升级包 命令解释rpm -ivh package.rpm安装一个 RPM 包&#xff0c;显示详细信息和进度条r…...

C++软件设计模式之责任链模式

责任链模式的动机与意图 动机&#xff1a; 在软件开发中&#xff0c;经常会遇到需要处理一系列请求或事件的情况。这些请求可能需要经过多个处理对象&#xff0c;每个对象根据其职责决定是否处理请求或将其传递给下一个对象。责任链模式&#xff08;Chain of Responsibility P…...

Spring Cloud Security集成JWT 快速入门Demo

一、介绍 JWT (JSON Web Token) 是一种带有绑实和信息的简单标准化机制&#xff0c;在信息通信中用于验证和信息传递。尤其在应用中使用Spring Cloud实现分布式构建时&#xff0c;JWT可以作为一种无状态验证原理的证明。 本文将进一步描述如何在Spring Cloud Security中集成JW…...

Python 爬虫

一、创建项目 1.双击打开pycharm&#xff0c;点击新建项目 2.项目设置- 勾选[继承全局站点软件包]- 勾选[可用于所有项目]- 取消勾选[创建main.py欢迎脚本]- 点击创建 3.项目名称右键--新建--python文件 4.输入文件名--回车二、编辑代码 # 导入请求模块 import requests # 如…...

【PCIe 总线及设备入门学习专栏 4.1 -- PCI 总线的地址空间分配】

文章目录 Overview 本文转自&#xff1a;https://blog.chinaaet.com/justlxy/p/5100053219 Overview PCI 总线具有32位数据/地址复用总线&#xff0c;所以其存储地址空间为 2324GB。也就是PCI上的所有设备共同映射到这4GB上&#xff0c;每个PCI设备占用唯一的一段PCI地址&…...

虚拟电厂搭建指南:绿虫仿真设计软件的助力

在虚拟电厂的搭建中&#xff0c;绿虫仿真设计软件起着重要作用。 绿虫光伏仿真软件是一款综合性辅助工具&#xff0c;能为虚拟电厂中的光伏项目提供精准数据支持。它所提供的项目选址地气象数据&#xff0c;涵盖海拔、辐照、风速、温度等&#xff0c;数据源为 Meteonorm &…...

开源漏洞管理工具--Faraday

前言 在现代安全领域&#xff0c;面临着两个主要的挑战&#xff1a;一是设计出智能化的方式来获取新信息&#xff0c;二是有效地跟踪和管理发现的内容&#xff0c;以便不断改善修复工作。为了解决这些问题&#xff0c;Faraday应运而生&#xff0c;它能够帮助您专注于漏洞的发现…...

一、EF框架的Database First开发模式(数据库优先)

Database First开发模式(数据库优先) ‌Database First‌是Entity Framework&#xff08;EF&#xff09;的三种开发模式之一&#xff0c;适用于在已有数据库的情况下进行开发。其核心思想是从现有数据库中逆向生成实体类和映射文件&#xff0c;然后在此基础上进行开发。 官方…...

Datawhale AI冬令营(第二期)动手学AI Agent task2--学Prompt工程,优化Agent效果

目录 如何写好Prompt&#xff1f; 工具包神器1&#xff1a;Prompt框架——CO-STAR 框架 工具包神器2&#xff1a;Prompt结构优化 工具包神器3&#xff1a;引入案例 案例&#xff1a;构建虚拟女友小冰 1. 按照 CO-STAR框架 梳理目标 2. 撰写Prompt 3. 制作对话生成应用&…...

Go IO之文件处理,TCPUDP讲解

文章目录 1 文件处理1.1 打开和关闭文件1.2 读取文件1.2.1 简单示例1.2.2 中文乱码1.2.2.1 bufio1.2.2.2 ioutil 1.3 写入文件1.3.1 Write 和 WriteString1.3.2 fmt.Fprintln1.3.2.1 写入文件1.3.2.2 写入标准输出 1.3.3 bufio.NewWriter1.3.4 ioutil.WriteFile 2 TCP&UDP2…...

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析

目录 [卫星遥感] 解密卫星目标跟踪&#xff1a;挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波&#xff08;Kalman …...

U盘提示格式化?原因、恢复方案与预防措施全解析

一、U盘提示格式化现象概述 在日常使用U盘的过程中&#xff0c;我们有时会遇到一个令人头疼的问题——U盘插入电脑后&#xff0c;系统却弹出一个提示框&#xff0c;告知我们U盘需要格式化才能访问。这个提示往往伴随着数据的潜在丢失风险&#xff0c;让我们不禁为之心焦。U盘提…...

Vuex中dispatch的用法

在 Vuex 中&#xff0c;dispatch 是用于触发 actions 的方法&#xff0c;它的主要作用是调用一个 action 并可以传递一些参数。以下是关于 dispatch 的详细解释&#xff1a; 基本语法 dispatch(type, payload)type&#xff1a;要调用的 action 的名称&#xff0c;它是一个字符…...

Agent系列:AppAgent v2-屏幕智能Agent(详解版)

引言 简介 方法 Agent 框架 Agent 交互 探索阶段 部署阶段 文档生成 高级功能 实验结果 总结 局限性 未来工作 1. 引言 大语言模型&#xff08;LLM&#xff09;如 ChatGPT 和 GPT-4 显著提升了自然语言处理能力&#xff0c;并且推动了智能体在自主决策中的应用。…...

Word如何插入图片并移动到某个位置

Word如何插入图片并移动到某一个位置 新建word→插入→图片 选择合适的位置→选择图片→打开 点击图片→布局选项→选择文字环绕下的任意一个→固定在页面上 点击图片就可以将图片移动到任意位置...

[CTF/网络安全] 攻防世界 upload1 解题详析

姿势 在txt中写入一句话木马<?php eval($_POST[qiu]);?> 回显如下&#xff1a; 查看源代码&#xff1a; Array.prototype.contains function (obj) { var i this.length; while (i--) { if (this[i] obj) { return true; } } return false; } function …...

golang:微服务架构下的日志追踪系统(二)

背景 在使用Gin框架进行服务开发时&#xff0c;我们遇到了一个日志记录的问题。由于Gin的上下文&#xff08;*gin.Context&#xff09;实现了context.Context接口&#xff0c;在调用日志记录器的Info、Warn、Error等方法时&#xff0c;直接传递Gin的上下文通常不会导致编译错误…...

单片机的存储器类型

单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种将计算机的主要部分集成在一个芯片上的微型计算机。它集成了处理器(CPU)、存储器、输入输出接口等必要的功能模块&#xff0c;广泛应用于各种嵌入式系统中。单片机的存储器结构对于理解和使用单片机至关重要&…...

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(一)

sql语句分为两大类&#xff1a;查询&#xff08;select&#xff09;、增删改----修改&#xff08;update&#xff09; select语句的执行流程 执行sql语句的流程&#xff1a;连接数据库、缓存查询、解析器、优化器、执行器、存储引擎操作数据 客户端&#xff1a;图形界面工具…...

java常见的面试题

目录 一、 spring的配置文件的哪四处? 1.数据源&#xff08;Data Source&#xff09;配置 2.事务管理器&#xff08;Transaction Manager&#xff09;配置 3. 扫描组件&#xff08;Component Scanning&#xff09;配置 4. AOP&#xff08;面向切面编程&#xff09;配置&…...

2025吉林大学软件学院研究生人工智能原理真题

选择题 5题共10分 5.以下模型不需要训练过程的是&#xff1f; A.支持向量机 B.决策树 C.KNN近邻算法 D.卷积神经网络 简答题 4题35分 1.大模型是否已经通过图灵测试 2.三个近二十年来的机器学习模型和应用案例 3.LDA原理和算法流程 4.CNN原理和算法流程 证明题 谓词逻辑15…...

Qt判别不同平台操作系统调用相应动态库读取RFID

本示例使用的读卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b8jdyXi&ftt&id562957272162 #include <QDebug> #include "mainwindow.h" #include "./ui_mainwindow.h" #include "QLibrary"…...

智慧工地系统:建筑施工智能化管理的全新模式

智慧工地概述 智慧工地是将互联网的理念和和物联网的技术引入建筑工地&#xff0c;依托物联网、互联网、大数据、5G技术&#xff0c;建立云端数据平台&#xff0c;形成大数据的业务体系&#xff0c;打通一线操作与远程监管的链条&#xff0c;实现劳务、安全、环境、材料等各个…...

js将object整个实体对象作为参数传递

①将object实体转化成json字符串传递&#xff1a; JSON.stringify(obj) ②将json字符串转化成JSON对象值&#xff1a;JSON.parse(json) 实际应用&#xff1a; <div id"div_notice" stylefont-size:14px; width:100%; height:200px; overflow-y:auto;></di…...

shell的循环结构

1、思维导图 2、定义一个find函数&#xff0c;查找ubuntu和root的gid并使用变量接收结果 #!/bin/bash #第二题查找gid并返回结果 find() {u_gidid -g ubuntur_gidid -g rootecho "root-gid$r_gid"echo "ubuntu-gid$u_gid" } ret$(find) echo $ret3、定义一…...

STM32-笔记29-蓝牙遥控插座项目

一、实验前期准备 手机通过蓝牙模块远程遥控风扇。&#xff08;插座的原理就是继电器&#xff0c;所以控制继电器就是控制插座电源&#xff09; 二、项目实现 复制项目文件夹32-蓝牙模块实现&#xff0c;重命名33-蓝牙遥控插座项目 找到一个继电器项目&#xff0c;把继电器复…...