图像生成模型研究笔记
简介
图像生成模型能够根据文本描述生成图像,主要包括扩散模型(Diffusion Models)和生成对抗网络(GAN)两大类。这是我研究图像生成模型时整理的笔记。
图像生成模型能够根据文本描述生成图像,主要包括扩散模型(Diffusion Models)和生成对抗网络(GAN)两大类。
主流模型
Stable Diffusion
- 类型: 潜在扩散模型(Latent Diffusion Model)
- 特点: 开源,可在消费级 GPU 运行
- 版本: SD 1.5, SD 2.1, SDXL
- 应用: 艺术创作、设计辅助
DALL-E 系列
DALL-E 2
- 开发公司: OpenAI
- 特点: 高质量图像生成
- API: 通过 OpenAI API 访问
DALL-E 3
- 改进版本
- 更好的文本理解
- 更安全的输出
Midjourney
- 类型: 专有模型
- 特点: 艺术风格强,质量高
- 访问: 通过 Discord 机器人
Imagen
- 开发公司: Google
- 特点: 高质量,但未公开
- 应用: Google 内部使用
技术原理
扩散模型(Diffusion Models)
前向过程(Forward Process)
逐步向图像添加噪声:
x₀ → x₁ → x₂ → ... → xₜ (纯噪声)
反向过程(Reverse Process)
从噪声生成图像:
xₜ (噪声) → xₜ₋₁ → ... → x₁ → x₀ (清晰图像)
潜在空间(Latent Space)
Stable Diffusion 在潜在空间操作,降低计算成本:
文本 → 编码器 → 潜在空间 → 解码器 → 图像
模型架构
U-Net
扩散模型的核心组件:
import torch.nn as nn
class UNet(nn.Module):
def __init__(self):
# 编码器(下采样)
# 解码器(上采样)
# 注意力机制
pass
VAE(Variational Autoencoder)
- 编码器: 图像 → 潜在表示
- 解码器: 潜在表示 → 图像
CLIP
文本-图像对齐模型:
import clip
model, preprocess = clip.load("ViT-B/32")
text_features = model.encode_text(clip.tokenize(["a cat"]))
image_features = model.encode_image(image)
使用示例
Stable Diffusion
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 landscape, mountains, sunset"
image = pipe(prompt).images[0]
image.save("output.png")
DALL-E API
import openai
response = openai.Image.create(
prompt="a cat sitting on a windowsill",
n=1,
size="1024x1024"
)
image_url = response['data'][0]['url']
参数调优
采样器(Sampler)
- DDPM: 原始扩散采样
- DDIM: 确定性采样,可逆
- DPM++: 改进的采样方法
- Euler: 快速采样
采样步数
- 20-30: 标准范围
- 50+: 高质量,但慢
- <20: 快速,但质量下降
CFG Scale
- 7-9: 标准范围
- 10-12: 更严格遵循 prompt
- <7: 更创意
种子值(Seed)
generator = torch.Generator().manual_seed(42)
image = pipe(prompt, generator=generator).images[0]
高级技术
ControlNet
精确控制生成图像的构图:
from diffusers import ControlNetModel, StableDiffusionControlNetPipeline
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny"
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet
)
# 使用边缘图控制
image = pipe(prompt, image=edge_image).images[0]
LoRA 微调
轻量级模型微调:
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("base-model")
pipe.load_lora_weights("path/to/lora")
image = pipe("prompt with lora style").images[0]
Inpainting
局部重绘:
from diffusers import StableDiffusionInpaintPipeline
pipe = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting"
)
image = pipe(
prompt="a red car",
image=original_image,
mask_image=mask_image
).images[0]
Img2Img
图像到图像转换:
from diffusers import StableDiffusionImg2ImgPipeline
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5"
)
image = pipe(
prompt="anime style",
image=original_image,
strength=0.75
).images[0]
Prompt 工程
结构
[主体], [动作/状态], [环境], [风格], [质量], [参数]
风格关键词
- 艺术风格: watercolor, oil painting, sketch
- 摄影风格: photorealistic, cinematic, bokeh
- 数字艺术: digital art, 3D render, concept art
质量标签
masterpiece, best quality, highly detailed, 8k, sharp focus
负面提示
blurry, low quality, distorted, watermark, text
性能优化
内存优化
# 使用 CPU offload
pipe.enable_model_cpu_offload()
# 使用注意力切片
pipe.enable_attention_slicing()
# 使用 VAE 切片
pipe.enable_vae_slicing()
速度优化
# 使用 xFormers
pipe.enable_xformers_memory_efficient_attention()
# 使用编译
pipe.unet = torch.compile(pipe.unet)
量化
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16 # 半精度
)
评估指标
客观指标
- FID (Fréchet Inception Distance): 图像质量
- IS (Inception Score): 图像质量和多样性
- CLIP Score: 文本-图像对齐度
主观评估
- 人工评分
- A/B 测试
- 用户反馈
应用场景
- 艺术创作: 概念设计、插画
- 内容生成: 社交媒体、营销素材
- 设计辅助: UI/UX 设计、产品设计
- 教育: 可视化教学材料
- 娱乐: 游戏资产、虚拟场景
最佳实践
- 详细描述: 越详细的 prompt 效果越好
- 迭代优化: 根据结果调整 prompt 和参数
- 批量生成: 生成多张图像并筛选
- 后处理: 使用图像编辑工具优化
- 版权注意: 注意生成内容的版权问题