学习记录Stable Diffusion v1.5部署后,不换模型也能提升图像中人体细节的几个策略;
模型用的是
runwayml/stable-diffusion-v1-5
,显卡够用,核心目标是改善手、脸、姿势等人体细节,但不换模型、不训练大模型。具体搭建可以看:
深度学习项目记录·Stable Diffusion从零搭建、复现笔记-CSDN博客
从全灰到清晰图像:我的 Stable Diffusion 多尺度优化学习记录-CSDN博客
常见问题图像:手指多、姿势奇怪、脸不清楚等,下面是我生成的一些效果不好比较典型的图:
可以看到手部细节问题很明显,这就需要优化模型。
目录
✔ 方法三:自动图像增强(比如 GFPGAN/Real-ESRGAN)
🧩 5. ControlNet 加姿势图:让“人形”不再崩坏
🧠 1. 提示词优化:用“语言”控制细节表现
核心逻辑:Stable Diffusion 其实是个“视觉翻译器”,它对提示词的理解程度决定了生成质量,尤其在人类身体结构这类“高翻车区”。
✅ 提示词写法建议:
-
尽量具体、结构化,举个例子:
❌ A person standing ✅ A young woman standing in a natural pose, detailed hands with slender fingers, realistic face with expressive eyes, wearing a flowing dress
-
加入风格+渲染信息:比如
photorealistic, cinematic lighting, high detail, sharp focus
这些词能显著提升图像质感。 -
细节点名法:直接点名
hands with 5 fingers, expressive eyes, anatomically correct body
等。
❗负面提示词也别忽略:
negative_prompt = (
"low quality, blurry, distorted hands, extra fingers, missing limbs, unnatural poses, deformed face"
)
⚙️ 2. 生成参数微调:让模型更“认真画”
🔧 推荐设置:
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=50, # 步数越高,细节越好
guidance_scale=10, # 强化提示词引导
height=768, width=768 # 分辨率越高,细节越丰富(前提是显卡带得动)
).images[0]
默认512x512比较糊,建议换成768甚至1024,配合步数拉满,效果很可观。
🔁 3. 后处理技巧:不改模型,也能增强细节
✔ 方法一:LANCZOS 插值放大
from PIL import Image
image = image.resize((1024, 1024), Image.LANCZOS)
image.save(save_path)
✔ 方法二:导入图像编辑器(Photoshop、GIMP)
手动修补五指、眼睛等部位,适合精修作品。
✔ 方法三:自动图像增强(比如 GFPGAN/Real-ESRGAN)
后续可以考虑集成这些工具,做批量图像增强。
🧪 4. img2img 二次生成:低成本“打磨”细节
核心逻辑:用第一张图当“草稿”,通过 img2img
再生成一版精细图,优势是能保留构图,同时改善局部缺陷。
🔧 实现方式:
from diffusers import StableDiffusionImg2ImgPipeline
img2img_pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
model_id, torch_dtype=torch.float16
).to("cuda")
refined_image = img2img_pipe(
prompt=prompt + ", highly detailed hands and face",
negative_prompt=negative_prompt,
image=init_image,
strength=0.3, # 改变程度,越小越保守
num_inference_steps=50
).images[0]
strength
建议控制在0.2 ~ 0.4
之间,防止改得面目全非。
🧩 5. ControlNet 加姿势图:让“人形”不再崩坏
如果需要更精细控制人物姿势(比如指定一个标准站姿/手势),可以用 ControlNet + OpenPose:
🔧 集成方式:
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose", torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
model_id, controlnet=controlnet, torch_dtype=torch.float16
).to("cuda")
control_image = Image.open("pose_image.png").convert("RGB")
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=control_image,
num_inference_steps=50
).images[0]
补充:OpenPose 可以生成骨架图,用于“指定人物站姿/动作”。
💡 推荐组合(低资源下最稳的配置)
for i, prompt in enumerate(prompts, 1):
print(f"生成第 {i} 张图像: {prompt}")
negative_prompt = "low quality, blurry, distorted hands, extra fingers, missing limbs, unnatural poses"
# Step1: 初始图
init_image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=50,
guidance_scale=10
).images[0]
# Step2: img2img 二次优化
refined_image = img2img_pipe(
prompt=prompt + ", highly detailed hands and face",
negative_prompt=negative_prompt,
image=init_image,
strength=0.3,
num_inference_steps=50
).images[0]
filename = f"image_{i:03d}.png"
save_path = os.path.join(save_dir, filename)
refined_image.save(save_path)
✅ 总结:在不换模型前提下,这些是我觉得性价比最高的操作
操作 | 作用 | 难度 | 推荐程度 |
---|---|---|---|
提示词优化 + 负面词补充 | 提高理解准确度 | ⭐ | 🔥🔥🔥🔥🔥 |
提高 steps 和 scale | 增强细节控制 | ⭐⭐ | 🔥🔥🔥🔥 |
使用 img2img | 修补草图 | ⭐⭐ | 🔥🔥🔥🔥 |
ControlNet | 精准控制姿势 | ⭐⭐⭐ | 🔥🔥🔥 |
微调模型 | 定制化生成 | ⭐⭐⭐⭐ | 🔥🔥 |