【Hugging Face 开源库】Diffusers 库 —— 扩散模型
- Diffusers 的三个主要组件
- 1. DiffusionPipeline:端到端推理工具
- `__call__` 函数
- `callback_on_step_end` 管道回调函数
- 2. 预训练模型架构和模块
- UNet
- VAE(Variational AutoEncoder)
- 图像尺寸与 UNet 和 VAE 的关系
- EMA(Exponential Moving Average)
- 3. 调度器(Schedulers)
Diffusers 是 Hugging Face 开源的 Python 库,专门用于加载、训练和推理扩散模型(Diffusion Models)。
扩散模型是一类生成式模型,它们通过添加和去除噪声来生成高质量图像、音频和视频。
《从零开始学扩散模型》
Diffusers 的三个主要组件
1. DiffusionPipeline:端到端推理工具
DiffusionPipeline
是 Diffusers 库的核心组件之一,它提供了一个高层 API,帮助用户快速从预训练的扩散模型中生成样本,而无需深入了解底层实现。
示例:使用 Stable Diffusion 生成图像
from diffusers import StableDiffusionPipeline
import torch# 加载预训练的 Stable Diffusion 模型
pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipeline.to("cuda") # 使用 GPU 加速# 生成图像
prompt = "a futuristic city at sunset, high detail, digital painting"
image = pipeline(prompt).images[0]# 显示图像
image.show()
- 通过
from_pretrained()
加载 Hugging Face Hub 上的 Stable Diffusion 预训练模型。unwayml/stable-diffusion-v1-5
是 Stable Diffusion v1.5 预训练模型的 权重(weights),它被托管在 Hugging Face Hub 上,供用户下载并进行推理或微调。
在 Diffusers 库中,from_pretrained("runwayml/stable-diffusion-v1-5")
其实是加载该模型的预训练参数,包括:- UNet(去噪网络)
- VAE(变分自编码器,用于图像编码和解码)
- Text Encoder(如 CLIP,用于处理文本输入)
- 调度器(Scheduler,用于指导去噪过程)
这些组件的权重都是从
runwayml/stable-diffusion-v1-5
仓库中下载的。 - 只需输入
prompt
(文本描述),就能生成相应的图像。
__call__
函数
在 Python 中,
__call__
是一个特殊的方法,它 允许一个对象像函数一样被调用。当你调用一个对象时,Python 实际上是调用了这个对象的__call__
方法。
在 diffusers 库中,所有的管道对象(如 StableDiffusionPipeline)都实现了一个 __call__
方法,用于处理图像生成任务,所以说 管道(pipeline)对象可以像函数一样被调用。
让我们实现一个 简单的管道对象(Pipeline),用来模拟 Diffusers 的 __call__
方法是如何工作的。这个管道将接受一个文本 prompt,然后通过一个简单的 UNet 模型 生成一个伪图像(这里只是模拟,不是实际的图像生成)。
示例:实现一个简单的 DiffusionPipeline
import torch
import torch.nn as nnclass SimpleUNet(nn.Module):""" 一个简单的 UNet 模型模拟去噪过程 """def __init__(self):super().__init__()self.fc = nn.Linear(100, 100) # 简化的全连接层def forward(self, x):return self.fc(x) # 这里只是简单的线性变换class SimplePipeline:""" 一个简单的管道对象,模拟 DiffusionPipeline 的 __call__ 方法 """def __init__(self):self.unet = SimpleUNet() # 预训练的去噪模型self.device = "cuda" if torch.cuda.is_available() else "cpu"self.unet.to(self.device)def __call__(self, prompt: str):""" 模拟调用管道进行图像生成 """print(f"Processing prompt: {prompt}")# 1. 生成随机噪声作为输入noise = torch.randn(1, 100).to(self.device)# 2. 通过 UNet 进行处理output = self.unet(noise)# 3. 模拟图像输出return output.detach().cpu().numpy()# 使用管道
pipeline = SimplePipeline()
generated_image = pipeline("A beautiful sunset over the ocean") # 通过 __call__ 触发
print("Generated image shape:", generated_image.shape)
-
SimpleUNet
:- 这里用一个简单的 全连接层 代替真正的 UNet(通常是 CNN)。
- 这个网络用于处理随机噪声,模拟去噪过程。
-
SimplePipeline
:__init__
方法:创建一个 UNet 模型并加载到 GPU(如果可用)。__call__
方法:- ① 接收文本提示
prompt
(但这里的代码没有真正解析文本,仅模拟处理)。 - ② 生成随机噪声,作为输入。
- ③ 通过 UNet 处理,得到输出。
- ④ 返回最终“生成的图像”(其实只是一个数值数组)。
- ① 接收文本提示
-
如何使用
__call__
方法:pipeline("A beautiful sunset over the ocean")
直接调用 实例,会自动触发__call__
方法。- 这样 对象本身就像一个函数一样可以调用,符合 Diffusers 设计风格。
可以在 __call__
方法中 添加真正的 VAE、文本编码器、调度器 来让它更接近 Diffusers 的 DiffusionPipeline
。
这样,pipeline("prompt")
的行为就类似于 StableDiffusionPipeline(prompt)
了! 🚀
在实际的 diffusers 库中,管道对象的
__call__
方法会处理各种输入嵌入、噪声调度器、生成模型等,最终生成高质量的图像。例如,在 StableDiffusionPipeline 中,__call__
方法会接受提示、图像嵌入等,并通过扩散模型逐步生成图像。
callback_on_step_end
管道回调函数
callback_on_step_end
允许我们在 扩散管道的每一步去噪迭代结束时 执行 自定义回调函数。
这样,可以 动态修改管道的属性或调整张量,而 无需修改 Diffusers 库的底层代码。
举个栗子,使用回调函数 在去噪的不同阶段动态调整 guidance_scale
(引导比例),让模型在去噪的前几步加强条件引导(更遵循 prompt
),后几步减少 guidance_scale
以生成更自然的图像。
import torch
from diffusers import StableDiffusionPipeline, DDIMScheduler# 加载 Stable Diffusion 管道
pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipeline.scheduler = DDIMScheduler.from_config(pipeline.scheduler.config) # 切换 DDIMScheduler 作为调度器
pipeline.to("cuda")# 定义回调函数
def dynamic_guidance_callback(pipe, i, latents):"""在去噪过程的每一步,动态修改 guidance_scale:param pipe: 当前管道对象:param i: 当前去噪步数:param latents: 当前的潜变量"""total_steps = pipe.scheduler.config.num_train_timestepsif i < total_steps * 0.3: # 在前 30% 的步数里,增加 guidance_scalepipe.guidance_scale = 10.0 elif i < total_steps * 0.6: # 在 30% - 60% 的步数里,降低 guidance_scalepipe.guidance_scale = 7.5 else: # 在最后 40% 的步数里,进一步减少pipe.guidance_scale = 5.0 print(f"Step {i}: guidance_scale set to {pipe.guidance_scale}")# 生成图像
prompt = "A futuristic city with neon lights at night"# 在 pipeline() 调用时传递 callback_on_step_end
image = pipeline(prompt, callback_on_step_end=dynamic_guidance_callback).images[0]# 显示图像
image.show()
这个回调函数在 每次去噪步骤结束后执行,并动态调整 guidance_scale
:
-
前 30% 的步数:使用 更高的
guidance_scale = 10.0
,让生成的图像更符合prompt
描述。 -
30% - 60% 步数:降低
guidance_scale
到 7.5,让图像稍微放松对prompt
的严格约束。 -
最后 40% 步数:进一步降低到 5.0,让图像更自然,减少过度引导导致的“过拟合”问题。
Pipeline callbacks
除了动态调整guidance_scale
,还可以用callback_on_step_end
进行:
- 添加自定义去噪步骤(比如在中间步骤插入额外的图像操作)
- 修改
latents
变量(例如,在某些步数中加入额外的噪声或调整颜色分布)- 记录或可视化去噪过程(比如,每隔 10 步保存当前的潜变量图像,观察去噪演化)
2. 预训练模型架构和模块
Diffusers 提供了许多 预训练的模型组件,可以用来构建新的扩散系统,例如:
- UNet(去噪神经网络)
- VAE(Variational Autoencoder)(用于图像编码和解码)
- Text Encoder(例如 CLIP,用于理解文本提示)
示例:使用 UNet 作为去噪模型
from diffusers import UNet2DModel# 定义一个 UNet 模型
unet = UNet2DModel(sample_size=64, # 图像大小in_channels=3, # RGB 颜色通道out_channels=3,layers_per_block=2,block_out_channels=(64, 128, 256),
)# 查看模型参数
print(unet)
UNet2DModel
是扩散模型的核心组件之一,负责在训练和推理过程中去噪。- 这里的 UNet 结构可以自定义,如通道数、块的层数等。
UNet
U-Net: Convolutional Networks for Biomedical Image Segmentation
Unet 最初设计用于生物医学图像分割。
UNet 是一种 卷积神经网络 架构,结构类似于一个对称的 U 字形,由 编码器(下采样)和解码器(上采样) 组成。
- 编码器逐步提取图像特征并缩小空间维度,
- 解码器则将这些特征还原到原始的空间维度,同时逐步增加分辨率。
UNet 的关键特性:
- 对称结构:编码器和解码器对称分布。
- 跳跃连接:直接将编码器的中间层输出传递到解码器的对应层,保留了高分辨率特征。
- 多尺度特征提取:在不同尺度上提取特征,提升了网络对细节的捕捉能力。
VAE(Variational AutoEncoder)
VAE(Variational AutoEncoder) 变分自编码器是一种生成模型,通过学习输入数据的潜在表示来生成新数据。
VAE 由编码器和解码器组成:
- 编码器:将 输入图像 转换为 潜在空间的分布(均值和方差)。
- 解码器:从潜在空间的采样生成 新图像。
VAE 的关键特性:
- 概率模型:VAE 学习输入数据的概率分布,从而生成多样化的样本。
- 连续潜在空间:潜在空间中的小变化会导致生成图像的小变化,具有很好的连续性。
图像尺寸与 UNet 和 VAE 的关系
在图像生成任务中,输入图像的尺寸需要匹配 UNet 和 VAE 的预期输入输出尺寸。
在 diffusers 库的 MimicBrushPipeline
(或类似的图像生成管道)中,默认的输入图像尺寸是通过以下代码计算的:
height = height or self.unet.config.sample_size * self.vae_scale_factor
width = width or self.unet.config.sample_size * self.vae_scale_factor
Stable Diffusion 生成图像时,涉及 VAE(变分自编码器) 和 UNet(去噪网络):
-
VAE 作用:将高清图像 压缩 成一个 低维潜空间(latent space),然后再 解码 回原始尺寸。
-
UNet 作用:在潜空间中 去噪,逐步优化潜变量,使其接近真实图像的潜变量。
关键点:VAE 会对图像进行 vae_scale_factor
倍缩放。举个栗子吧,
-
输入 VAE 的图像:
512×512
-
经过 VAE 编码后:
512/8 = 64×64
(缩小 8 倍) -
UNet 处理的就是
64 × 64
的潜变量。
所以:
height=64×8=512
width=64×8=512
这确保了:
-
UNet 处理
64 × 64
潜变量时尺寸正确。 -
VAE 进行解码时,最终输出的是
512 × 512
的图像。
EMA(Exponential Moving Average)
EMA(指数移动平均)是一种 平滑技术,在深度学习中,常用于 存储模型可学习参数的局部平均值。
可以把它看作一个“影子模型”,它的参数不是简单地复制原模型,而是随着训练 以指数衰减的方式 逐步向原模型靠拢。
为什么要使用 EMA?
- 提高模型稳定性:在训练过程中,模型参数可能会剧烈波动,EMA 平均化了参数,使其更稳定。
- 提升泛化能力:直接使用 EMA 计算的参数进行推理,通常比原始参数表现更好,尤其是在 少量训练步数 下。
- 适用于生成模型(如 Diffusion Models):Diffusers 库中的 Stable Diffusion 训练时 使用 EMA 来平滑 UNet 权重,使生成的图像更加稳定。
- 在半监督学习中常用:如 Mean Teacher 方法,使用 EMA 计算的模型作为“教师”模型指导学生模型学习。
EMA 在累积历史信息的同时,更关注最近的更新,从而对新数据变化更敏感,而不会受太早的参数扰动。
假设:
- θ t \theta_t θt 是第 t t t 轮训练的模型参数
- θ EMA , t \theta_{\text{EMA},t} θEMA,t 是第 t t t 轮的 EMA 计算的影子参数
- α \alpha α 是 EMA 衰减系数(通常取 0.99 ~ 0.999)
EMA 参数的更新方式:
θ EMA , t = α ⋅ θ EMA , t − 1 + ( 1 − α ) ⋅ θ t \theta_{\text{EMA},t} = \alpha \cdot \theta_{\text{EMA},t-1} + (1 - \alpha) \cdot \theta_t θEMA,t=α⋅θEMA,t−1+(1−α)⋅θt
这意味着:
- 较早的参数影响力逐渐减弱(因为乘以了 α \alpha α)。
- 最近的参数更新权重更大(乘以 1 − α 1 - \alpha 1−α)。
- 选择 较大的 α \alpha α(如
0.999
),EMA 更新较慢,适用于平滑长时间的变化。
为什么较早的参数影响力逐渐减弱?
我们可以将 EMA 当前参数展开,看看它是如何由历史所有参数的加权平均组成的:
θ EMA , t = ( 1 − α ) ⋅ θ t + α ( 1 − α ) ⋅ θ t − 1 + α 2 ( 1 − α ) ⋅ θ t − 2 + α 3 ( 1 − α ) ⋅ θ t − 3 + … \theta_{\text{EMA},t} = (1 - \alpha) \cdot \theta_t + \alpha (1 - \alpha) \cdot \theta_{t-1} + \alpha^2 (1 - \alpha) \cdot \theta_{t-2} + \alpha^3 (1 - \alpha) \cdot \theta_{t-3} + \dots θEMA,t=(1−α)⋅θt+α(1−α)⋅θt−1+α2(1−α)⋅θt−2+α3(1−α)⋅θt−3+…
这说明:
- 最近的参数 θ t \theta_t θt 乘以 1 − α 1 - \alpha 1−α(即 0.01),虽然数值小,但它是最新的更新,影响直接而强烈。
- 较早的参数 θ t − 1 , θ t − 2 \theta_{t-1}, \theta_{t-2} θt−1,θt−2 乘以 α , α 2 \alpha, \alpha^2 α,α2 等次幂,影响力随着时间推移呈指数级衰减。
- 老的参数贡献依然存在,但比重越来越小,这使得 EMA 更关注近期变化,而不会被早期的不稳定训练步骤影响太多。
💡直觉理解 EMA 的本质是一种带有“记忆衰减”的平滑机制:
- 老的参数不会立刻丢失,但它的影响会随着时间逐步减弱,让新数据有更大的话语权。
- 虽然最近参数的权重(
1 - α = 0.01
)看似小,但它不会被 EMA 继续削弱,因此它的相对影响力更大。- 较早的参数影响力会随着 α t \alpha^t αt 指数级减少,长期来看其贡献会趋近于 0。
如果 α = 0.99 \alpha = 0.99 α=0.99,那么过去 5 个时间步的参数贡献依次为:
Step t : ( 1 − α ) = 0.01 Step t − 1 : 0.99 × 0.01 = 0.0099 Step t − 2 : 0.9 9 2 × 0.01 = 0.009801 Step t − 3 : 0.9 9 3 × 0.01 = 0.00970299 Step t − 4 : 0.9 9 4 × 0.01 = 0.0096059601 \begin{aligned} \text{Step } t: & \quad (1 - \alpha) = 0.01 \\ \text{Step } t-1: & \quad 0.99 \times 0.01 = 0.0099 \\ \text{Step } t-2: & \quad 0.99^2 \times 0.01 = 0.009801 \\ \text{Step } t-3: & \quad 0.99^3 \times 0.01 = 0.00970299 \\ \text{Step } t-4: & \quad 0.99^4 \times 0.01 = 0.0096059601 \\ \end{aligned} Step t:Step t−1:Step t−2:Step t−3:Step t−4:(1−α)=0.010.99×0.01=0.00990.992×0.01=0.0098010.993×0.01=0.009702990.994×0.01=0.0096059601
下面是一个简单的 PyTorch EMA 代码示例,展示如何在训练过程中维护一个 EMA 版本的模型参数。
import torch
import torch.nn as nnclass EMA:"""指数移动平均(EMA),用于平滑模型参数"""def __init__(self, model, decay=0.999):self.model = modelself.decay = decay # EMA 影子参数衰减系数self.shadow = {name: param.clone().detach() for name, param in model.named_parameters()}def update(self):"""更新 EMA 影子模型参数"""for name, param in self.model.named_parameters():if param.requires_grad:self.shadow[name] = self.decay * self.shadow[name] + (1 - self.decay) * param.detach()def apply_shadow(self):"""使用 EMA 参数更新原模型(推理时调用)"""for name, param in self.model.named_parameters():if param.requires_grad:param.data.copy_(self.shadow[name])# 创建简单的神经网络
class SimpleModel(nn.Module):def __init__(self):super().__init__()self.fc = nn.Linear(10, 1)def forward(self, x):return self.fc(x)# 初始化模型和 EMA 影子模型
model = SimpleModel()
ema = EMA(model, decay=0.99)# 模拟训练过程
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for step in range(100):# 训练步骤(假设 x 是输入数据)x = torch.randn(16, 10)loss = model(x).mean()optimizer.zero_grad()loss.backward()optimizer.step()# 更新 EMA 影子模型ema.update()if step % 10 == 0:print(f"Step {step}: loss={loss.item():.4f}")# 在推理时应用 EMA 参数
ema.apply_shadow()
-
EMA
类- 维护了
shadow
(影子模型参数)。 - 通过
update()
逐步更新 EMA 版本的参数。 apply_shadow()
用于推理时将 EMA 参数应用到原模型上。
- 维护了
-
训练过程中
- 每次模型参数更新后,调用
ema.update()
,让影子模型参数缓慢跟随原模型更新。
- 每次模型参数更新后,调用
-
推理时
ema.apply_shadow()
把 EMA 版本的参数复制到模型,通常能获得 更好的性能。
在 diffusers 库中,EMA 主要用于 训练 UNet(去噪网络):
- 训练过程中,EMA 版本的 UNet 逐步更新。
- 在推理时,使用 EMA 版本的 UNet 进行采样,以 提高图像质量。
Diffusers 使用 EMAModel 进行 EMA 计算:
from diffusers.models import EMAModel # 初始化 EMA 模型 ema_unet = EMAModel(pipeline.unet.parameters(), decay=0.999) # 在训练后更新 EMA 影子模型 ema_unet.step(pipeline.unet.parameters()) # 复制 EMA 参数到 UNet(推理时) ema_unet.copy_to(pipeline.unet.parameters())
3. 调度器(Schedulers)
Scheduler,中文译为“调度器”,在扩散模型中负责控制噪声的添加和去除过程。
它定义了 在每个扩散步骤中,向数据添加多少噪声,以及在去噪过程中如何逐步恢复原始数据。
Diffusers 库提供了多种调度器,例如:
DDIMScheduler
(去噪扩散隐变量模型)PNDMScheduler
(更快的推理)DPMSolverMultistepScheduler
(更稳定的采样)
示例:使用不同调度器进行推理
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler# 加载 Stable Diffusion 并更换调度器
pipeline = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)# 生成图像
prompt = "a magical forest with glowing trees"
image = pipeline(prompt).images[0]
image.show()
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(...)
切换不同的去噪调度器。- 不同的调度器会影响生成速度和图像质量,比如 DPMSolver 可以加快采样,同时保持高质量输出。
相关文章:
【Hugging Face 开源库】Diffusers 库 —— 扩散模型
Diffusers 的三个主要组件1. DiffusionPipeline:端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE(Variational AutoEncoder)图像尺寸与 UNet 和 VAE 的关系EMA(Exponential Moving…...
TypeScript(TS) 的使用初识
我将详细讲解 TypeScript(TS) 的使用。TypeScript 是由微软开发的一种开源编程语言,它是 JavaScript 的超集,通过引入静态类型和面向对象编程特性,增强了 JavaScript 的开发体验和代码质量。TypeScript 最终会被编译成…...
QTcpSocket多线程连接慢问题
20250325记录 环境:Qt5.14.2 64位 msvc编译 在多线程环境下,使用QTcpSocket实现客户端,发现在少部分电脑上,连接时间过长,定时器检查套接字状态时,发现连接处于QAbstractSocket::ConnectingState状态。 …...
Vue的实例
Every Vue application starts with a single Vue component instance as the application root. Any other Vue component created in the same application needs to be nested inside this root component. 每个 Vue 应用都以一个 Vue 组件实例作为应用的根开始。在同一个应…...
[AI绘图] ComfyUI 中自定义节点插件安装方法
ComfyUI 是一个强大的 AI 图像生成工具,支持自定义节点插件扩展其功能。本文介绍 ComfyUI 中安装自定义节点插件的三种方法,包括 Git Clone 方式、插件管理器安装方式,以及手动解压 ZIP 文件的方法,并分析它们的优缺点。 1. Git Clone 方法 使用 git clone 是最稳定且推荐…...
数据库第二周作业
数据库约束、常见语句等 数据库约束 主键约束 #创建表,把id设为主键 mysql> create table test02(-> id int primary key, #----主键约束-> name varchar(50)-> ); Query OK, 0 rows affected (0.02 sec) #插入数据测试 mysql> insert into te…...
Appium Inspector使用教程
1.下载最新版本 https://github.com/appium/appium-inspector/releases 2.本地启动一个Appium服务 若Android SDK已安装Appium服务,则在任意terminal使用appium启动服务即可 3.Appium Inspector客户端配置连接到Appium服务 Configuring and Starting a Session…...
【QT继承QLabel实现绘制矩形、椭圆、直线、多边形功能,并且支持修改大小,移动位置,复制,粘贴,删除功能】
文章目录 介绍绘制一个矩形(椭圆)roi绘制一个多边形roi对矩形roi的缩放:对多边形rio的缩放(移动点的位置) 介绍 绘制矩形,椭圆,直线实际用的都是是同一个思路:鼠标第一次点击就确定…...
Elasticsearch未授权访问漏洞
1、编辑elasticsearch.yml配置文件,添加认证相关配置 vim elasticsearch.ymlxpack.security.enabled: true xpack.license.self_generated.type: basic xpack.security.transport.ssl.enabled: true2、重启ElasticSearch # 重启方式可能略微不同 systemctl restar…...
怎么处理 Vue 项目中的错误的?
一、错误类型 任何一个框架,对于错误的处理都是一种必备的能力 在Vue 中,则是定义了一套对应的错误处理规则给到使用者,且在源代码级别,对部分必要的过程做了一定的错误处理。 主要的错误来源包括: 后端接口错误代码中本身逻辑错误二、如何处理 后端接口错误 通过axi…...
Elasticsearch原生linux部署集群 和docker部署集群
Easticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文检索、实时数据分析等场景。为了满足高可用性和高性能的需求,Elasticsearch 通常以集群的方式部署。部署 Elasticsearch 集群时,可以选择两种主要方式:原生 L…...
缓存设计模式
缓存设计模式(Cache Design Pattern)是一种用于存储和管理频繁访问数据的技术,旨在提高系统性能、降低数据库或后端服务的负载,并减少数据访问延迟。以下是几种常见的缓存设计模式,并用 Python Redis 进行示例代码实现…...
详解TCP的四次握手和三次挥手,以及里面每个阶段的状态
TCP 三次握手(连接建立) TCP 连接建立通过三次握手完成,确保双方同步初始序列号并确认可达性。 阶段说明 第一次握手 客户端 → 服务器:发送 SYN(同步请求),携带初始序列号 seq x。客户端状态…...
Linux文件目录管理指令详解(上篇)
Linux文件目录管理指令详解(上篇) 在Linux操作系统中,文件目录管理是基础且重要的技能。通过一系列指令,用户可以高效地浏览、创建、修改和删除文件及目录。本文将详细介绍Linux中常用的文件目录管理类指令,包括pwd、…...
BCC-应用程序组件分析
libbpf-tools/gethostlatency 追踪glibc中的getaddrinfo、gethostbyname、gethostbyname2函数用时 # /usr/share/bcc/libbpf-tools/gethostlatency TIME PID COMM LATms HOST 14:58:32 8418 curl 313.635 www.taobao.com以# cur…...
无参数读文件和RCE
什么是无参数? 无参数(No-Argument)的概念,顾名思义,就是在PHP中调用函数时,不传递任何参数。我们需要利用仅靠函数本身的返回值或嵌套无参数函数的方式,达到读取文件或远程命令执行࿰…...
SpringMVC_day02
一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点:确保版本兼容性(如 Spring 5.x 与 MyBatis 3.5.x)。 配置类 SpringConfig:扫描 Service 层、启用事务管理、导入…...
在Linux、Windows系统上安装开源InfluxDB——InfluxDB OSS v2并设置开机自启的保姆级图文教程
一、进入InfluxDB下载官网 InfluxData 文档https://docs.influxdata.com/Install InfluxDB OSS v2 | InfluxDB OSS v2 Documentation...
LinkedIn数据抓取零风险指南:亮数据住宅代理实现企业级合规采集
亮数据住宅代理实现企业级合规采集 一、前言二、尝试使用三、使用体验高效稳定易用性:合规与安全:技术支持: 四、适用场景五、推荐程度六、试用地址 一、前言 最近一位猎头小伙伴找到我,说目前很多公司的出海业务都在招人&#x…...
ROS2的发展历史、核心架构和应用场景
以下是对**ROS2(Robot Operating System 2)**的发展历史、核心架构和应用场景的详细解析,覆盖其技术演变、关键特性和生态系统: 一、ROS2的诞生背景:从ROS1到ROS2 1. ROS1的历史与局限 ROS1的起源: 2007年…...
PHP eval 长度限制绕过与 Webshell 获取
在 PHP 代码中,如果 eval($param); 存在且长度受限,并且过滤了 eval 和 assert,仍然可以通过多种方法绕过限制,获取 Webshell。 源码 <?php $param $_REQUEST[param]; if(strlen($param)<17 && stripos($param,…...
自然语言处理(14:处理时序数据的层的实现)
系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设,共现矩阵,向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...
Pytest的Fixture使用
概述 Pytest中的Fixture可以使得测试代码高度复用,同时对资源进行安全的管理,以及在复杂的测试场景用进行灵活的组合。 概念 Fixture:可重用的函数,用@pytest.fixture来进行装饰,用于为测试提供数据、环境或者服务作用域:控制Fixture的生命周期,默认是function,可设置…...
【蓝桥杯】每日练习 Day13
前言 今天做了不少题,但是感觉都太水了,深思熟虑之下主播决定拿出两道相对不那么水的题来说一下(其实还是很水)。 两道问题,一道是日期问题(模拟),一道是区间合并问题。 日期差值 …...
Vue3 中使用 vuedraggable 实现拖拽排序功能,分组拖拽
Vue3 中使用 vuedraggable 实现拖拽排序功能,分组拖拽 安装draggable npm install vuedraggablenext --save基础用法示例 <template><div class"app-container"><draggable v-model"list" item-key"id":group"…...
husky的简介以及如果想要放飞自我的解决方案
husky 是一个 Git Hooks 管理工具,它的主要作用是 在 Git 提交(commit)、推送(push)等操作时执行自定义脚本,比如代码检查(Lint)、单元测试(Test)、格式化代码…...
Maven工具学习使用(四)——仓库
仓库分类 对于Mavne来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标查询寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后…...
【BFS】《单源、多源 BFS:图搜索算法的双生力量》
文章目录 前言单源BFS例题一、迷宫中离入口最近的出口二、 最小基因变化三、单词接龙四、为高尔夫比赛砍树 多源BFS例题一、 01 矩阵二、飞地的数量三、地图中的最高点四、地图分析 结语 前言 什么是单源、多源BFS算法问题呢? BFS(Breadth - First Sear…...
批量取消 PDF 文档中的所有超链接
在 PDF 文档中我们可以插入各种各样的文本也可以给文本设置字体,颜色等多种样式,同时还可以给文字或者图片添加上超链接,当我们点击超链接之后,就会跳转到对应的网页。有时候这会对我们的阅读或者使用形成一定的干扰,今…...
13.2 kubelet containerRuntime接口定义和初始化
本节重点总结 : containerRuntime 需要实现3类接口 管理容器的接口管理镜像的接口Streaming API 用于客户端与容器进行交互 type KubeGenericRuntime interface {kubecontainer.Runtimekubecontainer.StreamingRuntimekubecontainer.CommandRunner }containerRun…...
使用 gone.WrapFunctionProvider 快速接入第三方服务
项目地址:https://github.com/gone-io/gone 本文中源代码: esexamples/es 文章目录 1. gone.WrapFunctionProvider 简介2. 配置注入实现3. 实战示例:Elasticsearch 集成4. 使用方式5. 最佳实践6. 总结 在如何给Gone框架编写Goner组件…...
git 标签学习笔记
目录 轻量级标签 带注释的标签(推荐) 给指定 commit 打标签 推送单个标签,需要单独推送,代码推送不会推送标签 推送所有标签 删除标签 轻量级标签 git tag v1.0.0 只是简单地给当前 commit 打上 v1.0.0 标签。 带注释的标…...
【论文阅读】基于思维链提示的大语言模型软件漏洞发现与修复方法研究
这篇文章来自于 Chain-of-Thought Prompting of Large Language Models for Discovering and Fixing Software Vulnerabilities 摘要 软件安全漏洞在现代系统中呈现泛在化趋势,其引发的社会影响日益显著。尽管已有多种防御技术被提出,基于深度学习&…...
企业在人工智能创新与安全之间走钢丝
2025 年全球 AI/ML 工具使用量将激增,企业将 AI 融入运营之中,员工也将 AI 嵌入日常工作流程中。报告显示,企业对 AI/ML 工具的使用同比增长 3,000% 以上,凸显了各行各业迅速采用 AI 技术,以提升生产力、效率和创新水平…...
CSS动画
目录 一、核心概念与语法 1. keyframes 关键帧 2. animation 属性 二、动画调速函数(animation-timing-function) 1. 预设值 2. 贝塞尔曲线 3. 步进函数(steps()) 三、动画控制与交互 1. 暂停与恢复 2. JavaScript 控制…...
计算机视觉(CV)技术的优势和挑战
计算机视觉(CV)技术是人工智能领域中的一个重要分支,它主要通过让机器学会“看”和“理解”图像或视频来模拟人类视觉系统。以下是计算机视觉技术的一些优势和挑战: 优势: 自动化:计算机视觉技术可以实现…...
动态IP与静态IP该如何选?
一、当IP地址成为"网络身份" 2023年亚马逊封号潮中,某杭州卖家因登录IP频繁切换(早8点在纽约,午间瞬移到东京),触发平台风控导致账号冻结。这类"时空错乱症"揭示了跨境电商的生存法则:…...
Vue.js 完全指南:从入门到精通
1. Vue.js 简介 1.1 什么是 Vue.js? Vue.js(通常简称为 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。所谓"渐进式",意味着 Vue 的设计是由浅入深的,你可以根据自己的需求选择使用它的一部分或全部功能。 Vue 最初由尤雨溪(Evan You)在 2014 年创…...
《TypeScript 7天速成系列》第3天:TypeScript高级类型通关秘籍:泛型+联合+交叉类型实战
TypeScript 的类型系统是其最强大的特性之一,但也是许多开发者感到困惑的地方。今天我们就来破解 TypeScript 中最难的类型系统,掌握泛型、联合类型和交叉类型的使用技巧。 一、泛型函数与泛型接口 泛型是 TypeScript 中创建可重用组件的重要工具&…...
Python----数据分析(足球运动员数据分析)
一、数据展示 1.1、数据 1.2、列名 字段名备注Name姓名Nationality国籍National_Position国家队位置National_Kit国家队号码Club所在俱乐部Club_Position所在俱乐部位置Club_Kit俱乐部号码Club_Joining加入俱乐部时间Contract_Expiry合同到期时间Rating评分Height身高Weight体…...
音视频 三 看书的笔记 MediaPlayer的C/S架构
MediaPlayer在运行时分为Client和Server两部分 Client层:位于Java层,用户通过调用Java层的API(如setDataSource)来操作MediaPlayer。 Server层:位于C层,负责实际的媒体处理工作。Server层通过Binder机…...
Elasticsearch:使用 AI SDK 和 Elastic 构建 AI 代理
作者:来自 Elastic Carly Richmond 你是否经常听到 AI 代理(AI agents)这个词,但不太确定它们是什么,或者如何在 TypeScript(或 JavaScript)中构建一个?跟我一起深入了解 AI 代理的概…...
echarts添加坐标轴点击事件
echarts添加坐标轴点击事件 chart.on(click, (params) > {if(params.componentType yAxis && this.type ! 1){console.log(params);// 检查是否点击了系列数据console.log(你点击了 ${params.name} 的数据点,值为 ${params.value}); this.$bus.$emi…...
如何在linux中部署dns服务 主备dns (详细全过程)
环境centos 7.9 主DNS:192.168.60.131 备DNS:192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…...
GitLab 中文版17.10正式发布,27项重点功能解读【二】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
matplotlib——南丁格尔玫瑰
南丁格尔玫瑰图(Nightingale Rose Chart),是一种特殊形式的柱状图,它以南丁格尔(Florence Nightingale)命名,她在1858年首次使用这种图表来展示战争期间士兵死亡原因的数据。 它将数据绘制在极坐…...
WPF 与 C# 融合开发:从基础到高级应用(一)
WPF 与 C# 融合开发:从基础到高级应用 一、C# 语言基础回顾 1.1 C# 语言概述 C# 是微软开发的一种现代、面向对象的编程语言,它融合了 C、C 和 Java 等语言的优点,具有简洁、安全、高效等特点。C# 广泛应用于 Windows 平台的应用开发&…...
ref和reactive区别
在 Vue 3 中,ref 和 reactive 是两种创建响应式数据的主要 API,但它们的适用场景和使用方式有所不同。以下是它们的核心区别和示例: 一、核心区别 特性refreactive适用数据类型所有类型(基本类型、对象、数组)仅对象或…...
精选10个好用的WordPress免费主题
10个好用的WordPress免费主题 1. Astra Astra 是全球最受欢迎的 WordPress 主题。它功能丰富,易于使用,SEO友好,是第一个安装量突破100万的非默认主题,并获得了5000多个五星好评。 它完美集成了Elementor、Beaver,古…...
DerpNStink: 1靶场渗透
DerpNStink: 1 来自 <DerpNStink: 1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.213 3,对靶机进行端…...