DensePose最早由Facebook AI Research提出,目标是把一张普通的RGB人物照片映射到3D人体表面模型上,为每个像素标注出它对应人体哪个部位。后来Stable Diffusion爆火之后,ControlNet作者张吕敏把DensePose作为其中一种控制条件引入,形成ControlNet DensePose模型。它的价值在于:普通姿态控制(比如OpenPose骨架)只能约束十几个关节点的位置,而DensePose能约束整个人体的轮廓和表面细节,生成的人物在体型、服装贴合度上都更接近真实效果,这也是它在服装试穿、换装、人物重绘等任务中备受青睐的原因。

DensePose的原理:从2D像素到3D人体表面
DensePose的核心思想是在2D图像与3D人体模型之间建立密集对应关系。研究者预先定义了一个参数化的人体模板(基于SMPL模型),把人体表面切分成24个部件,比如头部、躯干、左右手臂、左右腿等,每个部件内部再用U、V两个坐标描述具体位置。这样,照片中属于人体的每一个像素,都可以被标注成"第几个部件 + 部件内的UV坐标",相当于给人体表面铺了一张经纬网。
相比OpenPose输出的17到18个关键点骨架,DensePose提供的是稠密的像素级信息。骨架图只能告诉模型"手在哪里",DensePose则能告诉模型"整条手臂的朝向、粗细、弯曲弧度是什么样"。这种差异在生成宽松衣物或者需要精确贴合身体曲线的服装时体现得尤为明显。骨架控制下生成的裙子可能形状飘忽不定,而DensePose控制下生成的裙子轮廓会严格跟随人体表面走向。
DensePose的检测网络通常基于检测框架改进而来,输入一张图片后,输出三张关键图:人体区域分割图(区分哪些像素属于人)、部件索引图(每个像素属于24个部件中的哪一个)以及UV坐标图。在ControlNet中使用时,这三张信息会被合成为一张可视化图,常见的形式是用不同颜色区分部件索引,用明暗变化表示UV坐标,模型文件通常命名为control_sd15_densepose.safetensors之类。
ControlNet如何利用DensePose信息引导生成
ControlNet的整体架构思路是:复制Stable Diffusion UNet编码器的一部分作为可训练分支,把控制条件图(这里是DensePose图)经过一个小型卷积网络编码后,注入到这个分支中。训练时锁定原始UNet的权重,只训练ControlNet分支,这样模型既能学习"根据姿态生成图像"的能力,又不会破坏原本学到的图像先验知识。
推理阶段的流程可以概括为三步:先用DensePose检测器处理原始人物照片得到姿态图;再把这张姿态图和文本提示词一起送入ControlNet;最后ControlNet输出的特征残差被加到UNet的中间层,逐步引导去噪过程,让最终图像中的人物严格遵循给定的体型和姿态。控制强度(control weight / guidance scale)决定了姿态约束的松紧,数值越高人物轮廓越贴合姿态图,但太高也可能让画面僵硬、丢失细节。
实际部署时需要注意预处理器和控制模型的配对关系。在WebUI中应选择DensePose预处理器配合DensePose模型,不要混用OpenPose的预处理器输出,两者信息格式完全不同,混用会导致生成结果异常。如果显卡显存有限,可以启用低显存模式或把控制模型精度降到fp16,DensePose控制图的信息密度较高,对显存的占用会比骨架控制略大一些。
服装虚拟试穿的完整实践流程
虚拟试穿是DensePose最典型的落地场景。整体思路是:保留模特照片中的人体姿态和体型信息(来自DensePose),再通过提示词更换服装描述,生成穿着新衣服的同一姿态人物。下面给出一段基于diffusers库的调用示例,展示如何加载DensePose控制的Stable Diffusion管线。
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch
from PIL import Image
# 加载DensePose控制模型
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/control_v11p_sd15_densepose",
torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
# densepose_map 是预处理器输出的姿态控制图
densepose_map = Image.open("densepose_map.png")
prompt = "a woman wearing a red evening dress, full body, studio lighting, high detail"
negative_prompt = "lowres, bad anatomy, deformed hands, blurry"
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=densepose_map,
num_inference_steps=30,
controlnet_conditioning_scale=1.0 # 控制强度,建议0.8到1.2之间调整
).images[0]
image.save("tryon_result.png")这段代码中controlnet_conditioning_scale是影响效果的关键参数。做换装任务时建议从1.0开始,如果生成的衣服没有贴合身体,说明约束太弱可以往上加;如果人脸和手部出现扭曲,则适当往下调。提示词的写法也有讲究,描述服装时尽量具体到材质、颜色、款式,同时用负面提示词排除肢体畸变,能让试穿结果稳定不少。
预处理器部分可以调用ControlNet辅助库一键完成。安装controlnet_aux之后,用DenseposeDetector处理原始照片即可得到控制图。注意输入照片最好是无遮挡或遮挡较少的全身照,侧身、背面姿势DensePose也能识别,但如果人物被桌子、栏杆大面积挡住,部件分割会出错,后续生成的体型也会跟着失真。对于背景复杂的照片,建议先做一次抠图或背景简化,能明显提升试穿的干净程度。
常见问题与优化技巧
实践中最常见的问题有几类。一是生成的人物脸和原图不一致,这是因为DensePose只控制体型姿态,不包含身份信息,可以配合IP-Adapter或换脸工作流叠加使用,在ControlNet权重叠加时把DensePose设为主控制、人脸参考设为辅助。二是服装边缘出现模糊或重影,多数情况是控制强度过高加上采样步数不足造成的,可以提高到30步以上,并把控制强度降到0.9左右测试。三是多人合照场景效果差,目前的DensePose预处理对多人图的部件区分还不够稳,建议先裁剪成单人分别处理再拼合。
进阶优化方面,可以尝试把DensePose与深度图控制组合:DensePose负责人体结构,深度图负责空间层次,两个控制条件叠加后生成的人物立体感更强,特别适合有前后景遮挡的试穿场景。另外,针对服装细节保真需求高的商业项目,还可以在生成之后接一个图生图的低强度重绘(denoising strength设在0.3以下),专门强化布料纹理,整体链路跑通后基本能达到可用的试穿展示效果。
总的来说,ControlNet DensePose把稠密人体姿态信息引入扩散模型,解决了骨架控制下人体轮廓不稳的痛点,在虚拟试穿、服装展示、人物重绘等方向都有成熟的可玩性。掌握好预处理质量、控制强度和提示词这三点,就能稳定产出贴合人体的高质量换装图像。
ControlNetDensePose虚拟试穿修改时间:2026-09-10 15:42:40