Stable Diffusion - 图像生成与编辑
**前置知识**:需要先掌握 PyTorch基础
前置知识:需要先掌握 PyTorch基础
本文重点:Stable Diffusion原理与应用
一、Stable Diffusion概述
Stable Diffusion 原理:
核心组件:
1. VAE (变分自编码器)
- 编码器:图像 → 潜在空间
- 解码器:潜在空间 → 图像
2. U-Net
- 在潜在空间进行去噪
- 使用Cross-Attention注入文本条件
3. Text Encoder (CLIP)
- 文本 → 向量表示
工作流程:
噪声 → U-Net去噪 → VAE解码 → 图像
二、文生图
2.1 基础使用
from diffusers import StableDiffusionPipeline
import torch
# 加载模型
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
)
pipe = pipe.to("cuda")
# 生成图像
prompt = "a beautiful sunset over mountains, highly detailed, 4k"
image = pipe(prompt).images[0]
image.save("sunset.png")
# 带参数生成
image = pipe(
prompt=prompt,
negative_prompt="ugly, distorted, low quality",
num_inference_steps=30, # 去噪步数
guidance_scale=7.5, # CFG权重
width=512,
height=512,
num_images_per_prompt=4 # 生成多张
).images
2.2 使用不同模型
# SDXL (更高质量)
from diffusers import StableDiffusionXLPipeline
pipe = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16
).to("cuda")
# SD 2.1
pipe = StableDiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-2-1",
torch_dtype=torch.float16
).to("cuda")
三、图生图
from diffusers import StableDiffusionImg2ImgPipeline
from PIL import Image
# 加载模型
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
).to("cuda")
# 准备初始图像
init_image = Image.open("input.jpg").convert("RGB")
init_image = init_image.resize((512, 512))
# 图生图
prompt = "cyberpunk style, neon lights, futuristic city"
image = pipe(
prompt=prompt,
image=init_image,
strength=0.7, # 变化程度 (0-1)
num_inference_steps=30
).images[0]
四、ControlNet
4.1 边缘控制
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import cv2
import numpy as np
# 加载ControlNet
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
# 准备控制图像
image = Image.open("input.jpg")
np_image = np.array(image)
canny_image = cv2.Canny(np_image, 100, 200)
canny_image = Image.fromarray(canny_image)
# 生成
output = pipe(
prompt="a modern building",
image=canny_image,
num_inference_steps=20
).images[0]
4.2 姿势控制
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
# OpenPose ControlNet
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-openpose",
torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
# 使用OpenPose图像
pose_image = Image.open("pose.png")
output = pipe(
prompt="a person dancing",
image=pose_image
).images[0]
五、Inpainting
from diffusers import StableDiffusionInpaintPipeline
pipe = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting",
torch_dtype=torch.float16
).to("cuda")
# 准备图像和掩码
image = Image.open("image.jpg").resize((512, 512))
mask = Image.open("mask.png").resize((512, 512)) # 白色区域会被重绘
# Inpainting
output = pipe(
prompt="a cat sitting on the grass",
image=image,
mask_image=mask
).images[0]
六、LoRA微调
# 加载LoRA
pipe.load_lora_weights("./lora_weights")
# 使用LoRA生成
image = pipe(
prompt="a photo of sks dog in the park",
num_inference_steps=30
).images[0]
参考资源
返回:多模态大模型 最后更新: 2026年4月20日
讨论与反馈