目录
[🚧 0. 背景说明](#🚧 0. 背景说明)
[🎯 1. 提示词优化(Prompt Engineering)](#🎯 1. 提示词优化(Prompt Engineering))
[✅ 人体细节强化](#✅ 人体细节强化)
[✅ 加艺术风格标签](#✅ 加艺术风格标签)
[✅ 细节权重增强](#✅ 细节权重增强)
[🧪 2. 参数调优:细节质量提升靠步数和采样器](#🧪 2. 参数调优:细节质量提升靠步数和采样器)
[✅ 提升推理步数 + 引导权重](#✅ 提升推理步数 + 引导权重)
[✅ 使用高质量采样器(Euler A)](#✅ 使用高质量采样器(Euler A))
[🦴 3. ControlNet:加骨架图控制姿势,超有用](#🦴 3. ControlNet:加骨架图控制姿势,超有用)
[✅ 安装 ControlNet 辅助模块](#✅ 安装 ControlNet 辅助模块)
[✅ 利用 OpenPose 提取骨架图](#✅ 利用 OpenPose 提取骨架图)
[✅ 加载 ControlNet + 生成图像](#✅ 加载 ControlNet + 生成图像)
[🔧 4. 后处理:高清+修复双保险](#🔧 4. 后处理:高清+修复双保险)
[✅ 超分辨率增强(ESRGAN)](#✅ 超分辨率增强(ESRGAN))
[✅ 面部/手部修复(GFPGAN)](#✅ 面部/手部修复(GFPGAN))
[🧠 5. 一些进阶技巧(内存优化/模型混合)](#🧠 5. 一些进阶技巧(内存优化/模型混合))
[✅ 模型混合(适用于长提示词或风格融合)](#✅ 模型混合(适用于长提示词或风格融合))
[✅ 显存优化配置](#✅ 显存优化配置)
[🧪 6. 完整示例:ControlNet + 超分辨率全流程](#🧪 6. 完整示例:ControlNet + 超分辨率全流程)
[🔍 7. 方法效果对照表](#🔍 7. 方法效果对照表)
[✅ 小结:不换模型也能稳住质量](#✅ 小结:不换模型也能稳住质量)
✍️ 本篇记录一下我在使用
runwayml/stable-diffusion-v1-5
模型时,优化人物生成细节(尤其是脸部、手部、姿态等)的一些有效方法。目标是不换模型、不大改结构,仅通过提示词+参数+控制模块+后处理来提升质量。
🚧 0. 背景说明
具体搭建可以看:
深度学习项目记录·Stable Diffusion从零搭建、复现笔记-CSDN博客
从全灰到清晰图像:我的 Stable Diffusion 多尺度优化学习记录-CSDN博客
基础模型(v1.5)生成人物图像时容易出问题,比如手指多、姿势奇怪、脸不清楚。虽然直接换 SDXL 或人像优化版模型是最简单的办法,但这次不打算换模型------纯靠调参搞定。
生成动物等效果还行,但一到人物会出现各种细节问题:
🎯 1. 提示词优化(Prompt Engineering)
关键词就两个字:堆料。
✅ 人体细节强化
prompt = "portrait of a person, highly detailed face, perfect anatomy, realistic hands, intricate hair details, sharp focus, 8k, professional photography"
negative_prompt = "deformed, distorted, disfigured, poorly drawn hands, blurry, low resolution, bad anatomy"
✅ 加艺术风格标签
prompt += ", realistic, hyperrealism, by greg rutkowski, artstation trending"
✅ 细节权重增强
prompt = "(perfect hands:1.3), (detailed eyes:1.2), (sharp focus:1.1)"
🔧 注:小括号控制词权重 (词语:权重)
,比单纯加词精细多了。
🧪 2. 参数调优:细节质量提升靠步数和采样器
✅ 提升推理步数 + 引导权重
image = pipe(
prompt,
negative_prompt=negative_prompt,
num_inference_steps=50, # 默认30,提升到50-80
guidance_scale=8.0, # 控制提示词权重,推荐 7-12
).images[0]
✅ 使用高质量采样器(Euler A)
from diffusers import EulerAncestralDiscreteScheduler
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
🦴 3. ControlNet:加骨架图控制姿势,超有用
这部分适合控制人体结构不自然、姿势崩坏的问题。
✅ 安装 ControlNet 辅助模块
pip install controlnet_aux
✅ 利用 OpenPose 提取骨架图
from controlnet_aux import OpenposeDetector
openpose = OpenposeDetector.from_pretrained("lllyasviel/ControlNet")
pose_image = openpose("path_to_reference_image.jpg")
✅ 加载 ControlNet + 生成图像
from diffusers import ControlNetModel, StableDiffusionControlNetPipeline
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")
image = pipe(prompt, image=pose_image, negative_prompt=negative_prompt, num_inference_steps=50).images[0]
🔧 4. 后处理:高清+修复双保险
图出来之后还不够锐,就得靠工具增强一下。
✅ 超分辨率增强(ESRGAN)
from realesrgan import RealESRGANer
upscaler = RealESRGANer(scale=4)
enhanced_image = upscaler.enhance(image)
✅ 面部/手部修复(GFPGAN)
from gfpgan import GFPGANer
restorer = GFPGANer(model_path="weights/GFPGANv1.4.pth")
restored_image = restorer.enhance(image)
🧠 5. 一些进阶技巧(内存优化/模型混合)
✅ 模型混合(适用于长提示词或风格融合)
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
custom_pipeline="lpw_stable_diffusion",
torch_dtype=torch.float16
)
✅ 显存优化配置
pipe.enable_attention_slicing() # 显存更省
pipe.enable_xformers_memory_efficient_attention() # 加速生成
🧪 6. 完整示例:ControlNet + 超分辨率全流程
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from controlnet_aux import OpenposeDetector
from realesrgan import RealESRGANer
import torch
# 初始化 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 = OpenposeDetector.from_pretrained("lllyasviel/ControlNet")
pose_image = openpose("reference_pose.jpg")
# 生成图像
prompt = "a person standing, detailed face, perfect hands, 8k"
image = pipe(prompt, image=pose_image, num_inference_steps=50, guidance_scale=8.0).images[0]
# 超分辨率
upscaler = RealESRGANer(scale=4)
enhanced_image = upscaler.enhance(image)
enhanced_image.save("enhanced_result.png")
🔍 7. 方法效果对照表
方法 | 用途 | 提升方向 |
---|---|---|
Prompt 优化 | 所有场景 | 人体结构、纹理清晰 |
ControlNet(OpenPose) | 姿势异常/结构不对 | 姿势合理、比例正常 |
高步数+好采样器 | 细节模糊、脸崩等情况 | 清晰度、面部还原度 |
超分辨率+细节修复 | 图像锯齿、分辨率低 | 整体锐度、细节层次 |
显存优化 | 显存爆炸、加载慢 | 运行效率、兼容性提升 |
✅ 小结:不换模型也能稳住质量
只要搭配好提示词 + ControlNet + 超分 + 修复,哪怕是 v1.5 的基础模型,也能生成高质量人物图。成本低、实现快,适合轻量部署和离线实验。