【人工智能】【深度学习】④ Stable Diffusion核心算法解析:从DDPM到文本生成图像的飞跃

📖目录


前言

在AI绘画领域,Stable Diffusion的出现就像给"文字描述"装上了魔法画笔——只需简单输入"一只穿着燕尾服的猫在伦敦街头弹钢琴",就能生成令人惊叹的图像。但这项技术背后,究竟藏着怎样的数学魔法?为什么它能突破传统GAN模型的局限?本文将通过快递员拆包、乐高拼装等生活化类比,带您一步步揭开Stable Diffusion的神秘面纱。

为什么说这是AI绘画的革命?
想象一个场景:你打开快递系统,输入"请帮我送一份物品到XX街道XX号仓库,备注:通过货车运送"。传统快递员可能会机械地执行指令,而Stable Diffusion就像超级智能快递员——它不仅理解你的文字需求,还能从一片混乱中(噪声)逐步构建出完美符合描述的图像(披萨)。这种从"乱码到艺术品"的魔法,正是扩散模型的核心思想。让我们从一片雪花般的噪声开始,见证AI如何用数学公式构建出绚丽的艺术世界。

本文你将收获:

  1. 扩散模型的"拆包"艺术:用快递分拣过程类比前向/逆向扩散过程
  2. 三大核心组件解析:CLIP文本编码器(翻译文字)、VAE(图像压缩专家)、U-Net(智能拼图大师)
  3. 代码实战:从零开始实现图像生成的核心流程
  4. 对比分析:为什么Stable Diffusion能超越传统GAN模型?

适合读者:

  • 想理解AI绘画底层原理的开发者
  • 对扩散模型数学基础感兴趣的算法工程师
  • 希望将文本生成图像技术落地的实践者

1. 为什么Stable Diffusion是AI绘画革命的"超级快递员"?

还是送快递的场景,想象一下,你再给快递员发了一个简单的指令:“请把文件送到101号房间,记得带上蓝色的信封”。快递员不是简单地把文件送到101号房间,而是先拆解指令(“蓝色信封”、“101房间”),理解你的需求规划最优路线,然后精准送达

Stable Diffusion就是AI领域的"超级快递员"——它接收你的文本指令(比如"一只穿着燕尾服的猫在伦敦街头弹钢琴"),先理解指令的每个细节然后从一片混乱的噪声中(相当于"快递员刚收到的空白信封"),逐步构建出清晰的图像(相当于"蓝色信封里的精致画作")。

相比早期的GAN(生成对抗网络),Stable Diffusion就像从"快递员"升级为"智能物流系统":它不再简单地"模仿"现有图像,而是理解文本描述从噪声中一步步重建生成更符合描述的图像,且避免了GAN常见的模式崩溃问题(即生成的图像总是重复几种类型)。


2. 扩散模型:从"乱码"到"艺术品"的魔法

2.1 前向扩散过程:给图像"添乱"的"拆快递"艺术

想象你有一张清晰的风景照,但你不是简单地把它发给朋友,而是先给它加一层薄薄的雪花(噪声),再加一层薄薄的雾霾(更多噪声),如此反复,直到照片完全变成一片杂乱的噪点。这个过程就像拆快递时,先撕掉一层包装纸,再撕掉一层,直到露出里面的礼物。

2.1.1 数学原理

扩散模型的前向过程定义为:

q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(\mathbf{x}_t | \mathbf{x}_{t-1}) = \mathcal{N}(\mathbf{x}_t; \sqrt{1-\beta_t}\mathbf{x}_{t-1}, \beta_t\mathbf{I}) q(xt​∣xt−1​)=N(xt​;1−βt​​xt−1​,βt​I)

其中:

  • x t \mathbf{x}_t xt​ 是第 t t t 步的噪声图像
  • β t \beta_t βt​ 是第 t t t 步的噪声方差(控制噪声添加速度)
  • N \mathcal{N} N 表示正态分布

推导过程

我们可以将前向过程视为一个马尔可夫链,每一步的噪声添加只依赖于上一步。通过递归展开,我们可以得到:

x t = α ˉ t x 0 + 1 − α ˉ t z t \mathbf{x}_t = \sqrt{\bar{\alpha}_t}\mathbf{x}_0 + \sqrt{1-\bar{\alpha}_t}\mathbf{z}_t xt​=αˉt​​x0​+1−αˉt​​zt​

其中:

  • α ˉ t = ∏ s = 1 t ( 1 − β s ) \bar{\alpha}_t = \prod_{s=1}^t(1-\beta_s) αˉt​=∏s=1t​(1−βs​)
  • z t ∼ N ( 0 , I ) \mathbf{z}_t \sim \mathcal{N}(0,\mathbf{I}) zt​∼N(0,I) 是标准正态噪声

这表明,第 t t t 步的噪声图像 x t \mathbf{x}_t xt​可以表示为原始图像 x 0 \mathbf{x}_0 x0​和随机噪声 z t \mathbf{z}_t zt​的线性组合。当 t t t 足够大时, α ˉ t \bar{\alpha}_t αˉt​ 接近 0, x t \mathbf{x}_t xt​ 几乎完全由噪声 z t \mathbf{z}_t zt​ 决定。

2.1.2 大白话解释

想象你有一盒完整的乐高积木(原始图像),快递员每次拆快递时都会"不小心"掉几块积木(加噪声)。第一层包装拆开时掉了1块,第二层掉了3块,第三层掉了5块…直到最后一层拆完,只剩下一堆散落的零件(纯噪声)。这个过程就是前向扩散。

数学公式(简化版):
噪声图像 = α t × 原始图像 + 1 − α t × 随机噪声 \text{噪声图像} = \sqrt{\alpha_t} \times \text{原始图像} + \sqrt{1-\alpha_t} \times \text{随机噪声} 噪声图像=αt​​×原始图像+1−αt​​×随机噪声

图示(Mermaid流程图):

完整乐高第一次加噪声第二次加噪声第三次加噪声完全散落的零件

类比生活
就像你给快递员发指令:“请把这份文件送到101号房间,记得带上蓝色的信封”。快递员不是直接送达,而是先拆掉外包装(加噪声),再拆掉内层包装(再加噪声),直到最后只剩下一团乱七八糟的纸张(纯噪声)。


2.2 逆扩散过程:从"乱码"到"艺术品"的"拼图"艺术

现在,我们有一张完全混乱的噪点图( x T \mathbf{x}_T xT​),我们的目标是通过模型预测每一步添加的噪声逐步恢复出原始图像( x 0 \mathbf{x}_0 x0​)。

2.2.1 数学原理

逆扩散过程的目标是学习:

p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_\theta(\mathbf{x}_t, t), \Sigma_\theta(\mathbf{x}_t, t)) pθ​(xt−1​∣xt​)=N(xt−1​;μθ​(xt​,t),Σθ​(xt​,t))

其中, μ θ \mu_\theta μθ​ 是模型预测的均值, Σ θ \Sigma_\theta Σθ​ 是预测的方差。

推导过程

通过最小化前向过程和逆过程之间的KL散度,我们可以得到:

L = E q ( x t − 1 ∣ x t ) [ log ⁡ q ( x t − 1 ∣ x t ) ] − E q ( x t ∣ x 0 ) [ log ⁡ p θ ( x t − 1 ∣ x t ) ] \mathcal{L} = \mathbb{E}_{q(\mathbf{x}_{t-1} | \mathbf{x}_t)}[\log q(\mathbf{x}_{t-1} | \mathbf{x}_t)] - \mathbb{E}_{q(\mathbf{x}_t | \mathbf{x}_0)}[\log p_\theta(\mathbf{x}_{t-1} | \mathbf{x}_t)] L=Eq(xt−1​∣xt​)​[logq(xt−1​∣xt​)]−Eq(xt​∣x0​)​[logpθ​(xt−1​∣xt​)]

通过优化,我们可以得到:

L simple = E x 0 , z t , t [ ∥ z t − ϵ θ ( x t , t ) ∥ 2 ] \mathcal{L}_{\text{simple}} = \mathbb{E}_{\mathbf{x}_0, \mathbf{z}_t, t}[\|\mathbf{z}_t - \epsilon_\theta(\mathbf{x}_t, t)\|^2] Lsimple​=Ex0​,zt​,t​[∥zt​−ϵθ​(xt​,t)∥2]

其中, ϵ θ ( x t , t ) \epsilon_\theta(\mathbf{x}_t, t) ϵθ​(xt​,t) 是模型预测的噪声。

这表明,模型的目标是预测每一步添加的噪声然后通过减去预测的噪声逐步恢复原始图像

2.2.2 大白话解释

现在你有一堆乱七八糟的乐高零件(噪声图像),AI就像一个超级聪明的拼图大师。它会一步步拼接:先找到最大的底座(预测主要轮廓),再拼接墙壁(添加细节),最后加上小装饰(细化纹理),直到拼出完整的城堡(原始图像)。

数学公式(简化版):
去噪图像 = 当前噪声 − 1 − α t × 预测噪声 α t \text{去噪图像} = \frac{\text{当前噪声} - \sqrt{1-\alpha_t} \times \text{预测噪声}}{\sqrt{\alpha_t}} 去噪图像=αt​​当前噪声−1−αt​​×预测噪声​

图示(Mermaid流程图):

纯噪声第一步去噪: 找到底座第二步去噪: 添加墙壁第三步去噪: 细化纹理完整城堡

类比生活
就像你收到一团乱麻的快递,AI快递员会一步一步拆解:先找出最重要的文件(主要轮廓),再整理信封(添加细节),最后还原所有附件(细化纹理),直到恢复完整的快递内容。


3. Stable Diffusion架构:整合三大"超级英雄"的智能系统

Stable Diffusion的核心架构可以看作是由三个"超级英雄"组成的团队:

  1. CLIP文本编码器:理解你的指令(“穿着燕尾服的猫在伦敦街头弹钢琴”)
  2. VAE编码器/解码器:压缩/解压图像,减少计算量
  3. 条件U-Net:从噪声中重建图像,理解文本描述

3.1 架构总览(Mermaid架构图)

VAE解码器条件U-NetVAE编码器CLIP文本编码器文本提示初始噪声解压图像VAE解码器多步去噪条件U-Net压缩图像VAE编码器分词CLIP文本编码器嵌入向量用户输入生成图像


3.2 CLIP文本编码器:理解指令的"语言专家"

CLIP(Contrastive Language-Image Pretraining)是OpenAI开发的模型,用于将文本和图像映射到同一语义空间。

工作原理

  • 将文本提示编码为向量(如"穿着燕尾服的猫" → [0.1, 0.2, …, 0.8])
  • 通过对比学习,使相似语义的文本和图像向量在空间中更接近
# 加载CLIP文本编码器和分词器from transformers import CLIPTextModel, CLIPTokenizer import torch tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-base-patch32") text_encoder = CLIPTextModel.from_pretrained("openai/clip-vit-base-patch32")# 编码文本提示 prompt ="A futuristic cityscape at sunset" inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True) text_embeddings = text_encoder(**inputs).last_hidden_state # 获取文本嵌入向量

3.3 VAE编码器/解码器:图像压缩与解压缩的"压缩专家"

VAE(Variational Autoencoder)用于将图像压缩到潜在空间,减少计算量。

工作原理

  • 编码器:将高维图像(256x256)压缩到低维潜在表示(64x64)
  • 解码器:将低维潜在表示解码回高维图像
# VAE编码器(压缩图像)from diffusers import AutoencoderKL vae = AutoencoderKL.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="vae") image = torch.randn(1,3,256,256)# 生成随机图像 latent = vae.encode(image).latent_dist.sample()# 压缩图像# VAE解码器(解压图像) reconstructed_image = vae.decode(latent).sample # 重建图像

3.4 条件U-Net:从噪声中重建图像的"图像修复师"

U-Net是Stable Diffusion的核心,用于预测每一步的噪声。

工作原理

  • 输入:当前噪声图像 + 时间步 t t t + 文本嵌入
  • 输出:预测的噪声 ϵ θ ( x t , t ) \epsilon_\theta(\mathbf{x}_t, t) ϵθ​(xt​,t)
# 条件U-Net(核心模型)from diffusers import UNet2DConditionModel unet = UNet2DConditionModel.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="unet", torch_dtype=torch.float16 ) unet = unet.to("cuda")# 假设我们有噪声图像、时间步和文本嵌入 noise = torch.randn(1,4,64,64)# 随机噪声 timestep = torch.tensor([500], device="cuda")# 时间步 text_embeddings = torch.randn(1,77,768)# 文本嵌入# 预测噪声 predicted_noise = unet(noise, timestep, text_embeddings).sample 

3.5 代码整合(大白话注释)

# 加载CLIP文本编码器(相当于快递员的通讯设备)from transformers import CLIPTextModel, CLIPTokenizer tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-base-patch32") text_encoder = CLIPTextModel.from_pretrained("openai/clip-vit-base-patch32")# 编码文本提示(翻译成快递员能听懂的密码) prompt ="A futuristic cityscape at sunset" inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True) text_embeddings = text_encoder(**inputs).last_hidden_state # 获取嵌入向量# VAE编码器(把图像压缩成快递包裹)from diffusers import AutoencoderKL vae = AutoencoderKL.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="vae") image = torch.randn(1,3,256,256)# 随机生成图像 latent = vae.encode(image).latent_dist.sample()# 压缩成潜在表示# 条件U-Net(AI快递员配送)from diffusers import UNet2DConditionModel unet = UNet2DConditionModel.from_pretrained("CompVis/stable-diffusion-v1-4", subfolder="unet", torch_dtype=torch.float16 ) unet = unet.to("cuda")# 预测噪声(快递员检查包裹) predicted_noise = unet(noise, timestep, text_embeddings).sample # VAE解码器(拆快递) reconstructed_image = vae.decode(latent).sample 

3.6 大白话解释

  • CLIP文本编码器:把你的文字指令翻译成AI能听懂的"密码"(嵌入向量)
  • VAE编码器:把图像压缩成"快递包裹",节省运输空间
  • 条件U-Net:AI快递员,根据"密码"和"包裹"一步步还原图像
  • VAE解码器:把压缩的"快递包裹"还原成完整图像

类比生活,就像你网购时

  1. 先写好收货地址和商品要求(文本提示)
  2. 商家把商品打包(VAE编码)
  3. 快递员根据地址和包裹信息配送(条件U-Net)
  4. 你收到快递后拆包(VAE解码)

4. 从零开始实现Stable Diffusion核心功能

下面,我将提供一个简化版的Stable Diffusion实现,展示从噪声到图像的核心流程。

import torch import torch.nn as nn import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt # 设置随机种子,确保可重复性 torch.manual_seed(42) np.random.seed(42)# 1. 定义扩散参数 T =1000# 总步数 beta = torch.linspace(0.0001,0.02, T)# 噪声方差序列 alpha =1- beta # 每一步的保留比例 alpha_bar = torch.cumprod(alpha, dim=0)# 累积乘积# 2. 前向扩散过程:从图像添加噪声defforward_diffusion(x0, t):""" 添加噪声到图像 :param x0: 原始图像 [batch, channels, height, width] :param t: 时间步 [batch] :return: 添加噪声后的图像 [batch, channels, height, width] """# 从alpha_bar中获取t步的累积噪声比例 sqrt_alpha_bar = torch.sqrt(alpha_bar[t]).view(-1,1,1,1)# 从标准正态分布中生成噪声 z = torch.randn_like(x0)# 添加噪声 xt = sqrt_alpha_bar * x0 + torch.sqrt(1- alpha_bar[t]).view(-1,1,1,1)* z return xt, z # 3. 逆扩散过程:从噪声恢复图像defreverse_diffusion(xt, t, model):""" 从噪声图像恢复原始图像 :param xt: 添加噪声后的图像 [batch, channels, height, width] :param t: 时间步 [batch] :param model: 预测噪声的模型 :return: 重建的图像 [batch, channels, height, width] """# 获取噪声预测 predicted_noise = model(xt, t)# 计算去噪后的图像 sqrt_alpha = torch.sqrt(alpha[t]).view(-1,1,1,1) sqrt_one_minus_alpha = torch.sqrt(1- alpha[t]).view(-1,1,1,1)# 重建图像 x0_recon =(xt - sqrt_one_minus_alpha * predicted_noise)/ sqrt_alpha return x0_recon # 4. 简化的U-Net模型(实际应用中会更复杂)classSimpleUNet(nn.Module):def__init__(self):super().__init__()# 简化版U-Net,仅用于演示 self.conv1 = nn.Conv2d(4,64, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(64,64, kernel_size=3, padding=1) self.conv3 = nn.Conv2d(64,4, kernel_size=3, padding=1)defforward(self, x, t):# 简化处理:忽略时间步t x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = self.conv3(x)return x # 5. 主函数:从随机噪声生成图像defgenerate_image():# 1. 生成随机噪声图像 xT = torch.randn(1,4,64,64)# 随机噪声 [batch, channels, height, width]# 2. 初始化U-Net模型 model = SimpleUNet().to("cuda") model = model.eval()# 设置为评估模式# 3. 逐步去噪for t inreversed(range(T)):# 3.1 转换为张量 t_tensor = torch.tensor([t], device="cuda")# 3.2 预测噪声 predicted_noise = model(xT, t_tensor)# 3.3 去噪 sqrt_alpha = torch.sqrt(alpha[t]).view(-1,1,1,1) sqrt_one_minus_alpha = torch.sqrt(1- alpha[t]).view(-1,1,1,1)# 3.4 计算去噪后的图像 xT =(xT - sqrt_one_minus_alpha * predicted_noise)/ sqrt_alpha # 3.5 添加随机噪声(如果t>0)if t >0: xT += torch.sqrt(beta[t])* torch.randn_like(xT)# 4. 重建图像(此处省略VAE解码步骤)return xT # 6. 生成图像并显示if __name__ =="__main__":# 生成图像 generated_image = generate_image().cpu().detach()# 为了可视化,将图像转换为[0, 1]范围 generated_image =(generated_image - generated_image.min())/(generated_image.max()- generated_image.min())# 显示图像 plt.figure(figsize=(6,6)) plt.imshow(generated_image[0].permute(1,2,0).numpy()) plt.axis('off') plt.title("Generated Image from Noise") plt.savefig("generated_image.png") plt.show()print("图像已保存为 generated_image.png")

代码解读

  1. 扩散参数:我们定义了1000步的扩散过程,每一步的噪声方差从0.0001逐渐增加到0.02。
  2. 前向扩散:将原始图像逐步添加噪声,直到变成随机噪声。
  3. 逆扩散:从随机噪声开始,逐步预测并移除噪声,重建原始图像。
  4. 简化U-Net:一个非常简单的神经网络,用于预测噪声。
  5. 生成图像:从随机噪声开始,通过1000步去噪,生成图像。

5. Stable Diffusion的实际应用:从文本到图像的"魔法"

让我们使用Hugging Face的diffusers库来生成一张真实的图像。

# 1. 安装必要的库(如果未安装)# pip install torch torchvision transformers diffusers# 2. 加载预训练的Stable Diffusion模型from transformers import CLIPTextModel, CLIPTokenizer from diffusers import StableDiffusionPipeline import torch # 加载CLIP文本编码器和分词器 tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-base-patch32") text_encoder = CLIPTextModel.from_pretrained("openai/clip-vit-base-patch32")# 加载Stable Diffusion模型 model_id ="CompVis/stable-diffusion-v1-4" pipeline = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16) pipeline = pipeline.to("cuda")# 将模型移至GPU# 3. 生成图像 prompt ="A futuristic cityscape at sunset, neon lights, cyberpunk style" num_images_to_generate =1# 生成图像 generated_images = pipeline( prompt, num_images_to_generate=num_images_to_generate, guidance_scale=7.5# 控制生成图像与提示的匹配度).images # 4. 保存或显示生成的图像 generated_images[0].save("futuristic_cityscape.png") generated_images[0].show()print("图像已保存为 futuristic_cityscape.png")

运行结果

  • 生成一张"未来城市景观,霓虹灯,赛博朋克风格"的图像
  • 通过调整guidance_scale,可以控制图像与提示的匹配度

6. Stable Diffusion的优势:为什么它是AI绘画的"新标准"?

优势说明与GAN的对比
高质量生成生成图像分辨率高(1024x1024),细节丰富GAN生成的图像容易模糊或有伪影
语义理解理解文本描述,生成符合描述的图像GAN只能"模仿"现有图像,无法理解语义
避免模式崩溃不会重复生成相同图像GAN容易出现模式崩溃,生成图像类型单一
计算效率通过潜在扩散模型(LDM)减少计算量传统扩散模型计算量大
可控性通过调整guidance_scale控制生成质量GAN难以控制生成内容

7. 总结与展望

Stable Diffusion通过整合扩散模型CLIP文本编码器U-Net架构,实现了从文本到图像的高质量生成。它的工作原理可以类比为一个超级智能的快递系统:

  1. 你写好详细的收货地址和商品要求(文本提示)
  2. 商家把商品压缩打包(VAE编码)
  3. 快递员根据地址和包裹信息,一步步配送(条件U-Net)
  4. 你收到快递后拆包,得到完整商品(VAE解码)

这个系统的优势在于:

  • 能理解复杂的文字要求(CLIP文本编码)
  • 节省运输成本(潜在空间处理)
  • 精准还原商品细节(多步去噪)
  • 可控性强(调整参数控制结果)

8. 下一篇预告

【人工智能】【深度学习】⑤ 一文讲清Transformer工作原理:从自注意力到大语言模型的革命

在下一篇文章中,我将深入解析Transformer的核心机制,包括:

  • 自注意力机制(Self-Attention)的数学原理
  • 多头注意力(Multi-Head Attention)的并行计算
  • 位置编码(Positional Encoding)如何解决序列顺序问题
  • 与RNN/LSTM的对比:为什么Transformer成为大语言模型的标准架构

通过这个系列,你将掌握从基础到前沿的深度学习核心技术,成为AI领域的真正专家。


9. 附:系列博文链接

  1. 【人工智能】人工智能发展历程全景解析:从图灵测试到大模型时代(含CNN、Q-Learning深度实践)
  2. 【人工智能】【深度学习】① RNN核心算法介绍:从循环结构到LSTM门控机制
  3. 【人工智能】【深度学习】② 从Q-Learning到DQN:强化学习的革命
  4. 【人工智能】【深度学习】③ GAN核心算法解析:生成对抗网络的原理与应用

技术极客小毅:专注于深度学习与AI前沿技术,致力于将复杂的技术用简单易懂的方式分享给读者。欢迎关注我的博客,一起探索AI的无限可能!

Read more

Flutter 三方库 discord_interactions 的鸿蒙化适配指南 - 在 OpenHarmony 打造高效的社交机器人交互底座

Flutter 三方库 discord_interactions 的鸿蒙化适配指南 - 在 OpenHarmony 打造高效的社交机器人交互底座

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 discord_interactions 的鸿蒙化适配指南 - 在 OpenHarmony 打造高效的社交机器人交互底座 在现代社交应用与办公协同工具的开发中,集成强大的机器人(Bot)交互能力是提升活跃度的关键。discord_interactions 库为 Flutter 开发者提供了一套完整的、遵循 Discord 官方协议的交互模型,涵盖了从 Slash Commands(斜杠命令)到 Webhook 签名验证的核心功能。本文将深入解析如何在 OpenHarmony(鸿蒙)环境下,结合鸿蒙的安全机制与网络特性,完美适配 discord_interactions 到你的鸿蒙应用中。 前言 随着鸿蒙系统(HarmonyOS)进入原生应用开发的新纪元,跨平台社交工具的适配需求日益增长。discord_interactions 作为一个纯

【图文】Windows + WSL + Ubuntu 安装 OpenClaw 全套流程(飞书机器人 + 百炼模型)

目录 * 一、安装 WSL * 二、安装基础组件 * 三、安装 Node.js(通过 nvm) * 1 安装 nvm * 2 安装 Node * 四、安装 OpenClaw * 五、OpenClaw 初始化配置 * 六、Hooks 配置(重要) * 七、打开 Web UI * 八、安装飞书插件 * 九、第三方飞书插件(备用方案) * 十、飞书权限配置(注意先做好飞书机器人设置,再配置channel) * 十一、配置飞书channel * 十二、配置飞书回调事件 * 十三、重启 OpenClaw * 十四、配置百炼模型

目标检测数据集——无人机视觉VisDrone数据集

目标检测数据集——无人机视觉VisDrone数据集

随着无人机技术的飞速发展,无人机在航拍、监控、农业、物流等领域的应用日益广泛。与此同时,无人机视角下的视觉任务,如目标检测、目标跟踪和场景理解,也成为了计算机视觉研究的热点。然而,相比传统的地面视角数据集,无人机视角下的图像具有高度变化、小目标密集、复杂背景等独特挑战,这对现有算法提出了更高的要求。 为了应对这些挑战并推动无人机视觉技术的发展,天津大学机器学习与数据挖掘实验室推出了 VisDrone数据集。作为一个大规模、标注精细的无人机视觉数据集,VisDrone 不仅涵盖了丰富的场景和多样化的目标类别,还为研究人员提供了一个极具挑战性的测试平台。无论是小目标检测的精度提升,还是密集场景下的鲁棒性优化,VisDrone 都成为了学术界和工业界不可或缺的资源。该数据集采集自中国14个不同城市,覆盖复杂城市场景、交通枢纽、密集人群等多种环境。 VisDrone官方Github下载渠道可点击访问: https://github.com/VisDrone/VisDrone-Dataset?tab=readme-ov-file 下载的数据集为VisDrone2019-DET-train

【滤波跟踪】机器人未知测量噪声的扩展卡尔曼滤波同时定位与地图绘制【含Matlab源码 15186期】含报告

【滤波跟踪】机器人未知测量噪声的扩展卡尔曼滤波同时定位与地图绘制【含Matlab源码 15186期】含报告

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥 🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀 🔊博主简介:985研究生,Matlab领域科研开发者; 🚅座右铭:行百里者,半于九十。 🏆代码获取方式: ZEEKLOG Matlab武动乾坤—代码获取方式 更多Matlab信号处理仿真内容点击👇 ①Matlab信号处理(进阶版) ⛳️关注ZEEKLOG Matlab武动乾坤,更多资源等你来!! ⛄一、机器人未知测量噪声的扩展卡尔曼滤波同时定位与地图绘制 1 扩展卡尔曼滤波(EKF-SLAM)概述 扩展卡尔曼滤波(EKF)是解决同时定位与地图绘制(SLAM)问题的经典方法。EKF-SLAM通过非线性系统的高斯近似,将机器人位姿和地图特征的状态估计联合在一个概率框架中。当测量噪声未知时,需采用自适应或鲁棒方法增强滤波器性能。 2 未知测