1. 项目概述:AI绘画新手指南
作为一名从零开始玩转AI绘画的过来人,我深刻理解新手面对Stable Diffusion时的困惑。记得我第一次打开WebUI界面时,满屏的参数和选项让我直接懵圈。但现在,我已经能轻松生成各种风格的图像,从二次元头像到写实风景都不在话下。这篇文章就是要把我踩过的坑、总结的经验,毫无保留地分享给你。
Stable Diffusion作为目前最流行的开源AI绘画模型,最大的优势就是完全免费且能在本地运行。不像某些在线AI绘画平台需要付费订阅,SD让你真正拥有创作自由。我的旧笔记本(GTX 1060显卡)都能跑,虽然速度慢点,但生成质量丝毫不打折。
2. 核心组件深度解析
2.1 模型文件:AI的"大脑"
模型文件(.ckpt或.safetensors格式)决定了AI的"画风"。就像不同的画家有不同的风格偏好,模型文件训练时使用的数据集不同,生成的图像风格也会天差地别。
常见的基础模型有:
- Stable Diffusion 1.5:通用性强,适合新手入门
- Stable Diffusion XL:分辨率更高,细节更丰富
- 各种社区微调模型:如专门画动漫的AnythingV3,专注真实照片的RealESRGAN
选择模型时要注意:
- 文件大小:基础模型通常2-4GB,过大可能是假模型
- 发布时间:越新的模型通常效果越好
- 用户评价:在Civitai等平台查看其他用户的生成效果
2.2 VAE:画质增强的秘密武器
VAE(变分自编码器)负责将AI生成的"模糊草图"解码成清晰图像。好的VAE能显著提升画面细节和色彩表现。
推荐几个优质VAE:
- vae-ft-mse-840000:官方优化版,通用性强
- WD1.3-VAE:Waifu Diffusion专用,适合动漫风格
- kl-f8-anime:专门为二次元图像优化
使用技巧:
- 在WebUI的设置中切换VAE非常方便
- 不同模型可能需要搭配特定VAE才能发挥最佳效果
- 如果生成的图像发灰或细节模糊,第一个要检查的就是VAE设置
2.3 LoRA:风格微调神器
LoRA(低秩适应)是一种轻量级的模型微调方式,可以理解为给AI安装"风格插件"。相比全模型微调,LoRA有三大优势:
- 文件小(通常50-200MB)
- 训练快(1-2小时就能出效果)
- 组合灵活(可以同时使用多个LoRA)
常见应用场景:
- 特定角色风格(如自己的动漫形象)
- 特殊画风(如吉卜力风格、赛博朋克)
- 物体特征(如特定款式的服装)
3. 提示词工程实战指南
3.1 正面提示词构建技巧
好的提示词就像给AI的精确指令。以下是我的提示词模板,按重要性分层:
-
质量标签(必须)
- masterpiece, best quality, ultra-detailed
- 4k, 8k, high resolution
-
主体描述
- 1girl/1boy(数量+性别)
- looking at viewer(视角)
- upper body/close-up(构图)
-
细节修饰
- (detailed eyes:1.3)(眼部特写)
- (beautiful face:1.2)(面部优化)
- (flowing hair:1.1)(头发细节)
-
风格设定
- anime style/manga style(动漫风)
- realistic/photography(写实风)
- oil painting/watercolor(艺术风格)
-
环境氛围
- soft lighting/studio lighting(光线)
- depth of field/bokeh(景深)
- clean background(背景)
3.2 负面提示词黑名单
负面提示词就像"防翻车保险"。这是我的通用负面模板:
code复制(worst quality, low quality:1.4),
(deformed, distorted:1.3),
bad anatomy, extra fingers, fewer fingers,
(mutated hands:1.3), (poorly drawn hands:1.3),
blurry, (bad proportions:1.2),
extra limbs, disfigured, missing limbs,
(deformed face:1.2), (ugly:1.2),
duplicate, morbid, mutilated,
(out of frame:1.1), extra heads,
(signature, watermark, text:1.3),
lowres, bad hands, bad face,
cropped, jpeg artifacts
3.3 权重与语法进阶技巧
-
括号加权:
- (keyword:1.2) - 增加20%权重
- [keyword] - 减少10%权重
-
交替语法:
- [cat|dog] - 随机选择其中一个
- [cat:dog:0.3] - 30%概率选cat,70%选dog
-
分步渲染:
- [from:to:when] - 在指定步数后切换提示词
- 例如:"[from:young girl:to:old woman:when:20]"表示前20步画年轻女孩,之后变成老妇人
4. 安装部署全方案
4.1 懒人一键包方案
秋叶aaaki的整合包是最适合新手的方案,优点包括:
- 内置中文界面
- 预装常用插件(ControlNet、ADetailer等)
- 自动依赖安装
- 支持多版本模型管理
安装步骤:
- 下载整合包(约10GB)
- 解压到英文路径
- 运行"启动器.exe"
- 等待自动安装完成(首次运行较慢)
- 浏览器打开http://127.0.0.1:7860
4.2 手动安装专业版
适合有一定技术基础的用户,可以更灵活地定制环境。
Ubuntu系统安装示例:
bash复制# 安装依赖
sudo apt update
sudo apt install -y python3 python3-pip python3-venv git wget
# 创建虚拟环境
python3 -m venv sd-env
source sd-env/bin/activate
# 克隆WebUI
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui
# 安装依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install -r requirements.txt
# 下载模型
mkdir -p models/Stable-diffusion
wget -O models/Stable-diffusion/v1-5-pruned-emaonly.safetensors https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
# 启动
python launch.py --listen --xformers
4.3 Docker部署方案
最适合需要干净环境或频繁部署的场景。
Dockerfile示例:
dockerfile复制FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
RUN apt-get update && \
apt-get install -y --no-install-recommends \
python3 python3-pip git wget && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git .
RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
RUN pip install -r requirements.txt
RUN mkdir -p models/Stable-diffusion && \
wget -O models/Stable-diffusion/v1-5-pruned-emaonly.safetensors \
https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
EXPOSE 7860
CMD ["python", "launch.py", "--listen", "--xformers", "--enable-insecure-extension-access"]
构建与运行命令:
bash复制docker build -t sd-webui .
docker run --gpus all -p 7860:7860 -v $(pwd)/models:/app/models -v $(pwd)/outputs:/app/outputs sd-webui
5. 实战图像生成技巧
5.1 头像生成参数详解
python复制{
"prompt": "masterpiece, best quality, 1girl, looking at viewer, (detailed eyes:1.3), (beautiful face:1.2), school uniform, soft lighting, depth of field",
"negative_prompt": "worst quality, low quality, deformed, blurry, bad anatomy, extra fingers",
"width": 512,
"height": 512,
"steps": 28,
"cfg_scale": 7,
"sampler": "DPM++ 2M Karras",
"seed": -1,
"clip_skip": 2,
"hires_fix": True,
"hires_upscaler": "Latent",
"hires_steps": 10,
"denoising_strength": 0.5
}
关键参数解析:
- steps:20-30适合头像,太低会粗糙,太高耗时且提升有限
- cfg_scale:5-9之间,越高越贴近提示词但可能失去创意
- sampler:DPM++ 2M Karras平衡速度和质量
- clip_skip:1-2可以提升风格化表现
5.2 壁纸生成进阶技巧
高分辨率壁纸生成的最大挑战是显存限制。我的解决方案:
-
分块渲染(Tiled Diffusion)
- 启用Tiled Diffusion和Tiled VAE
- 设置Tile大小为512x512
- Overlap设为64-128像素
-
高清修复(Hires.fix)参数:
python复制{
"hires_fix": True,
"hires_upscaler": "4x-UltraSharp",
"hires_steps": 15,
"denoising_strength": 0.3,
"upscale_by": 2
}
- 多阶段生成:
- 首先生成512x512的基础图
- 使用Extras标签页进行2倍放大
- 最后用img2img微调细节
5.3 ControlNet精准控制
ControlNet可以让AI严格按照你的线稿或姿势生成图像。最常用的预处理器:
- canny - 边缘检测,保留构图
- depth - 深度图,控制景深
- openpose - 人体姿势
- scribble - 手绘草图
- lineart - 精细线稿
使用示例:
python复制from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch
from PIL import Image
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")
# 生成边缘图
input_image = Image.open("input.jpg").convert("RGB")
control_image = pipe.processor(input_image, detect_resolution=512, image_resolution=512)
# 生成图像
image = pipe(
prompt="a beautiful castle on a cliff, fantasy style, highly detailed",
negative_prompt="blurry, low quality, deformed",
image=control_image,
num_inference_steps=30,
guidance_scale=7.5
).images[0]
6. 问题诊断与解决方案
6.1 多手指/少手指问题
解决方案:
- 在负面提示词中加入:
code复制extra fingers, fewer fingers, (bad hands:1.3), (mutated hands:1.3) - 使用ADetailer插件自动修复手部
- 在img2img中局部重绘问题区域
- 尝试不同的模型(有些模型对手部理解更好)
6.2 面部崩坏问题
面部修复技巧:
- 启用CodeFormer或GFPGAN面部修复
- 使用ADetailer的face_yolov8n模型
- 在提示词中强调:
code复制(perfect face:1.3), (beautiful detailed eyes:1.2), symmetrical face - 降低CFG Scale(高值可能导致面部扭曲)
6.3 色彩发灰问题
色彩增强方法:
- 更换VAE(推荐vae-ft-mse-840000)
- 在提示词中加入:
code复制vibrant colors, high contrast, saturated - 后期处理中使用Color Correction
- 尝试不同的模型(有些模型色彩表现更好)
6.4 构图混乱问题
构图控制技巧:
- 使用ControlNet的depth或canny
- 在提示词中明确构图:
code复制centered composition, rule of thirds, professional photography - 尝试不同的采样器(Euler a通常更稳定)
- 适当提高CFG Scale(7-9之间)
7. LoRA训练全流程
7.1 数据集准备最佳实践
-
图像数量:20-50张高质量图片
-
图像要求:
- 统一主体(如特定人物或风格)
- 多样化的角度和表情
- 分辨率至少512x512
- 背景尽量简单
-
预处理脚本:
python复制from PIL import Image
import os
def process_dataset(input_dir, output_dir, size=512):
os.makedirs(output_dir, exist_ok=True)
for i, file in enumerate(os.listdir(input_dir)):
if file.lower().endswith(('.jpg', '.jpeg', '.png')):
try:
img = Image.open(os.path.join(input_dir, file))
img = img.convert('RGB')
# 中心裁剪
width, height = img.size
crop_size = min(width, height)
left = (width - crop_size) // 2
top = (height - crop_size) // 2
img = img.crop((left, top, left + crop_size, top + crop_size))
# 调整大小
img = img.resize((size, size), Image.LANCZOS)
# 保存
img.save(os.path.join(output_dir, f"{i:04d}.jpg"), quality=95)
except Exception as e:
print(f"Error processing {file}: {e}")
7.2 标签自动化处理
使用BLIP自动生成标签:
python复制from transformers import BlipProcessor, BlipForConditionalGeneration
from PIL import Image
processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-large")
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-large")
def generate_caption(image_path, trigger_word):
image = Image.open(image_path)
inputs = processor(image, return_tensors="pt")
out = model.generate(**inputs, max_length=50)
caption = processor.decode(out[0], skip_special_tokens=True)
return f"{trigger_word}, {caption}"
# 批量处理
for img_file in os.listdir("dataset"):
if img_file.lower().endswith(('.jpg', '.jpeg', '.png')):
caption = generate_caption(f"dataset/{img_file}", "my_style")
with open(f"dataset/{os.path.splitext(img_file)[0]}.txt", "w") as f:
f.write(caption)
7.3 训练参数优化
推荐训练配置(使用Kohya_SS GUI):
python复制{
"model_name": "my_lora",
"pretrained_model": "runwayml/stable-diffusion-v1-5",
"train_data_dir": "dataset",
"output_dir": "output",
"resolution": 512,
"train_batch_size": 2,
"max_train_epochs": 10,
"save_every_n_epochs": 2,
"learning_rate": 1e-4,
"unet_lr": 1e-4,
"text_encoder_lr": 5e-5,
"lr_scheduler": "cosine_with_restarts",
"lr_warmup_steps": 100,
"rank": 64,
"alpha": 32,
"optimizer": "AdamW8bit",
"mixed_precision": "fp16",
"save_precision": "fp16",
"cache_latents": True,
"gradient_checkpointing": True,
"clip_skip": 2
}
7.4 模型测试与优化
训练后测试脚本:
python复制from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
).to("cuda")
# 加载LoRA
pipe.unet.load_attn_procs("output/my_lora.safetensors")
# 测试生成
prompt = "<lora:my_lora:0.8>, my_style, 1girl, beautiful detailed eyes"
image = pipe(prompt, num_inference_steps=30).images[0]
image.save("lora_test.png")
优化建议:
- 如果风格不够明显,尝试提高LoRA权重(1.0-1.2)
- 出现过拟合时,减少训练epoch或增加数据集多样性
- 配合不同的基础模型测试效果
8. 效率提升技巧
8.1 WebUI快捷键大全
自定义快捷键配置(保存为javascript/shortcuts.js):
javascript复制document.addEventListener('keydown', (e) => {
// Ctrl+Enter - 立即生成
if (e.ctrlKey && e.key === 'Enter') {
e.preventDefault();
document.getElementById('generate').click();
}
// X - 快速切换模型
if (e.key === 'x') {
e.preventDefault();
const modelDropdown = document.querySelector('#model_select select');
if (modelDropdown) {
const current = modelDropdown.selectedIndex;
modelDropdown.selectedIndex = (current + 1) % modelDropdown.options.length;
modelDropdown.dispatchEvent(new Event('change'));
}
}
// S - 保存当前设置
if (e.key === 's' && e.ctrlKey) {
e.preventDefault();
localStorage.setItem('quickSave', JSON.stringify(getCurrentSettings()));
toastr.success('设置已保存');
}
// L - 加载设置
if (e.key === 'l' && e.ctrlKey) {
e.preventDefault();
const saved = localStorage.getItem('quickSave');
if (saved) {
applySettings(JSON.parse(saved));
toastr.success('设置已加载');
}
}
});
8.2 预设管理系统
高级预设管理脚本:
python复制import json
from datetime import datetime
class PresetManager:
def __init__(self, file_path='presets.json'):
self.file_path = file_path
self.presets = self.load_presets()
def load_presets(self):
try:
with open(self.file_path, 'r') as f:
return json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
return {}
def save_presets(self):
with open(self.file_path, 'w') as f:
json.dump(self.presets, f, indent=2)
def add_preset(self, name, prompt, negative, settings):
self.presets[name] = {
'prompt': prompt,
'negative': negative,
'settings': settings,
'created': datetime.now().isoformat(),
'last_used': None
}
self.save_presets()
def get_preset(self, name):
if name in self.presets:
self.presets[name]['last_used'] = datetime.now().isoformat()
self.save_presets()
return self.presets[name]
return None
def list_presets(self):
return sorted(self.presets.keys(),
key=lambda x: self.presets[x].get('last_used') or '',
reverse=True)
# 使用示例
manager = PresetManager()
manager.add_preset(
name='anime_portrait',
prompt='masterpiece, best quality, 1girl, anime style',
negative='worst quality, low quality, deformed',
settings={'steps': 28, 'cfg_scale': 7, 'sampler': 'DPM++ 2M Karras'}
)
8.3 批量生成工作流
自动化批量生成脚本:
python复制import os
import csv
import random
from tqdm import tqdm
def batch_generate(pipe, base_prompt, variations, output_dir):
os.makedirs(output_dir, exist_ok=True)
log = []
for i, (prompt_mod, settings) in enumerate(tqdm(variations)):
full_prompt = f"{base_prompt}, {prompt_mod}"
try:
generator = torch.Generator("cuda").manual_seed(random.randint(0, 2**32-1))
image = pipe(
prompt=full_prompt,
negative_prompt="worst quality, low quality",
generator=generator,
**settings
).images[0]
filename = f"batch_{i:04d}.png"
image.save(os.path.join(output_dir, filename))
log.append({
'filename': filename,
'prompt': full_prompt,
'settings': settings,
'seed': generator.initial_seed()
})
except Exception as e:
print(f"Error generating {i}: {e}")
# 保存日志
with open(os.path.join(output_dir, 'batch_log.csv'), 'w') as f:
writer = csv.DictWriter(f, fieldnames=['filename', 'prompt', 'settings', 'seed'])
writer.writeheader()
writer.writerows(log)
return log
# 使用示例
variations = [
("anime style, vibrant colors", {'steps': 30}),
("realistic, professional photography", {'steps': 40}),
("oil painting, classical art", {'steps': 35}),
("cyberpunk, neon lights", {'steps': 30})
]
batch_generate(pipe, "1girl, beautiful face", variations, "batch_output")
8.4 自动化后处理流程
图像后处理脚本:
python复制from PIL import Image, ImageFilter, ImageEnhance
import os
def post_process(input_dir, output_dir):
os.makedirs(output_dir, exist_ok=True)
for file in os.listdir(input_dir):
if file.lower().endswith(('.png', '.jpg', '.jpeg')):
try:
img = Image.open(os.path.join(input_dir, file))
# 锐化
img = img.filter(ImageFilter.UnsharpMask(radius=2, percent=150, threshold=3))
# 色彩增强
enhancer = ImageEnhance.Color(img)
img = enhancer.enhance(1.2)
# 对比度调整
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(1.1)
# 保存
img.save(os.path.join(output_dir, f"enhanced_{file}"), quality=95)
except Exception as e:
print(f"Error processing {file}: {e}")
# 使用示例
post_process("batch_output", "enhanced_output")