SMPLicit:用隐式生成模型统一表示不同拓扑的服装(CVPR 2021)
SMPLicit:用隐式生成模型统一表示不同拓扑的服装
Corona, Pumarola, Alenyà, Pons-Moll, Moreno-Noguer. SMPLicit: Topology-aware Generative Model for Clothed People, CVPR 2021 (arXiv:2103.06871v2)。
SMPLicit 是穿衣人体重建这条线上一个非常关键的分水岭式工作,也是 4D-DRESS 服装重建 benchmark 里"生成式拟合"这一派的代表 baseline。它想回答的问题很朴素:能不能用一个统一的生成模型,同时表示 T 恤、无袖背心、连帽衫、敞开的夹克、裤子、裙子、鞋、头发这些拓扑完全不同的服装,并且只用几个可解释的低维参数控制它们的款式和剪裁? 之前的方法几乎都是"每种衣服训一个模型",SMPLicit 第一次把这件事做成了一个模型说了算。
一句话结论
SMPLicit 把服装建模成一个隐式距离场 $C(p, \beta, z_{\text{cut}}, z_{\text{style}}) \to \mathbb{R}^+$:它预测 T-pose 下空间中任意点 $p$ 到服装表面的无符号距离(unsigned distance),用 Marching Cubes 抽等值面就得到网格。模型受三样东西控制——SMPL 体型 $\beta$(决定"穿得贴不贴")、剪裁潜码 $z_{\text{cut}}$(决定"覆盖身体的哪些区域",由身体 UV 遮挡图编码而来)、款式潜码 $z_{\text{style}}$(决定松紧、褶皱、领子等细节)。因为用的是距离场而不是固定顶点数,它天然不受拓扑限制;因为全程可微,它能直接塞进下游 3D 重建的端到端优化里;而且它是在 T-pose 定义、再用 SMPL 蒙皮 pose 出去,所以既能生成又能重姿态。
一、要解决什么问题
穿衣人体的标准做法,是把服装几何表示成 SMPL 身体网格上的加性位移(additive displacement / offset)。这条路线的死穴在于:服装的拓扑变化太大——上半身可能是无袖背心、长袖连帽衫,也可能是敞开的夹克。固定顶点数、固定拓扑的顶点模型(vertex-based model)根本装不下这些差异,于是只能给每类衣服单独训一个模型(Multi-Garment Net 等),实际用起来很麻烦。
另一条路是物理仿真数据训练(DRAPE、GarNet、TailorNet),精度受仿真质量限制,而且底层还是"从模板出发的位移图(displacement map)",同样做不出不同拓扑。近期 BCNet、Vidaurre、Shen 开始处理拓扑偏离 SMPL 网格的服装(裙子、连衣裙),但要么每种衣服训一个模型,要么表示太复杂、没法用几个参数控制。
SMPLicit 的定位(论文 Table 1 的对比):同时具备 Body Pose Variations、Body Shape Variations、Topology、Low-Dimension Latent Vector、Model is public 这五项——表里只有 SMPLicit 五项全勾。
| 能力 | TailorNet | BCNet | Shen | SMPLicit |
|---|---|---|---|---|
| 姿态变化 | ✓ | ✓ | ✓ | ✓ |
| 体型变化 | ✓ | ✓ | ✓ | ✓ |
| 不同拓扑 | ✗ | ✓ | ✓ | ✓ |
| 低维潜向量 | ✓ | ✓ | ✓ | ✓ |
| 模型公开 | ✗ | ✗ | ✗ | ✓ |
它把服装按两个大簇分别建模:upper body(无袖背心、T 恤、连帽衫、夹克)和 lower body(裤子、短裤、裙子),另外 shoes 和 hair 各算独立类别。注意不是所有衣服共用一个模型——跨簇插值没意义,所以只在大簇内部统一。
二、核心公式:SMPLicit-Core
整个模型的分工是:一个 image encoder $f$ 把身体遮挡图编码成剪裁潜码,一个 decoder 网络 $C$ 预测无符号距离。核心映射:
$$C(p,\ \beta,\ z_{\text{cut}},\ z_{\text{style}}) \mapsto \mathbb{R}^+$$
完整版(加姿态变形的 SMPLicit,见式 (3))输出 posed 网格 $G$:
$$C'(\theta,\ \beta,\ z_{\text{cut}},\ z_{\text{style}}) \mapsto G$$
潜码是拼起来的:$z = [z_{\text{cut}},\ z_{\text{style}}] \in \mathbb{R}^N$,合起来完整描述一件衣服的剪裁加款式。
2.1 剪裁潜码 $z_{\text{cut}}$:用身体 UV 遮挡图定义"剪裁"
作者把剪裁(cut)定义成"被服装遮住的身体区域"。具体做法很巧:对训练集里每一对(服装,身体),计算一张 body UV occlusion image $U$——把 SMPL 的 UV map 上每个像素设成 1(该身体顶点被衣服挡住)或 0。然后训一个图像编码器
$$f: U \mapsto z_{\text{cut}} \in \mathbb{R}^D$$
用的是一个预训练的 ResNet-18 精调。这样"短袖 / 长袖 / 敞开 / 覆盖到哪里"就自然编码进了 $z_{\text{cut}}$ 里。推理时直接丢掉编码器 $f$,只用 $z_{\text{cut}}$ 控制模型——所以图像编码器只是训练期用来"造"潜空间的脚手架。
2.2 款式潜码 $z_{\text{style}}$:补足遮挡图说不清的细节
不同的衣服可能有相同的遮挡图 $U$,但松紧、低频褶皱、领口细节却不一样。所以再加一组参数 $z_{\text{style}}$(论文里也写成 $z_c$),初始化为零向量,用 auto-decoder 方式(Park et al. 的 DeepSDF 套路)与网络联合训练。
2.3 体型条件:身体相对编码 $P_\beta$
关键设计:不用全局坐标做 occupancy,而是把点相对身体来编码。对每件衣服,先找出离真值模型近的 SMPL 顶点(比如上半身衣服取躯干顶点),聚成 $K$ 个在 T-pose 下均匀分布在身体上的顶点簇 $v_k \in \mathbb{R}^3$。然后把空间点 $p$ 映射成一个 身体相对编码矩阵:
$$P_\beta \in \mathbb{R}^{K \times 3}, \qquad P_{\beta,k} = p - v_k$$
即逐行存"点到第 $k$ 个簇的位移"。这是个过参数化表示,让网络能"感知身体边界"。作者实测它比欧氏距离或重心坐标(Barycentric)距离效果好。这里的 $K = 500$。
2.4 输出:为什么是无符号距离场
学 3D 生成服装模型的一大难题是训练数据的配准(registration)——顶点模型必须先把所有服装注册到统一拓扑,而这本身是个硬问题(Alldieck 等、ClothCap 都头疼)。隐式表示不需要配准,但 occupancy / signed distance 要求封闭曲面,而服装是开放曲面(open surface)。
于是 SMPLicit 学无符号距离场(unsigned distance field),跟随 Neural Unsigned Distance Fields(Chibane et al., NeurIPS 2020)的思路:给定查询点 $p$、编码 $P_\beta$ 和服装参数 $z$,网络 $C$ 预测到真值服装表面的无符号距离 $D(p)$。
2.5 训练损失
要学三块东西:剪裁编码器参数 $w_1$、每件训练样本的款式潜码 $z_{\text{style}}$、解码器参数 $w_2$。单个训练样本、单个采样点 $p$ 的距离损失:
$$\mathcal{L}d = \big|\, C\big(P\beta,\ f(U; w_1),\ z_{\text{style}};\, w_2\big) - D(p) \,\big|$$
采点策略:在身体 bounding box 内均匀采,同时也在真值表面附近采。为了让潜空间平滑、便于插值,约束 $z$ 服从正态分布:
$$\mathcal{L}_z = |z|$$
另外在训练前向传播时,给服装表示加零均值、单位协方差的高斯噪声 $z_\sigma \sim \mathcal{N}(0, \sigma_n I)$,即输入 $C(P_\beta,\ z + z_\sigma)$——对数据量很少的服装类别特别有用(数据少时相当于一种正则/数据增强)。总损失:
$$\mathcal{L}_d + \lambda_z \mathcal{L}_z$$
2.6 推理:抽等值面
推理时在 T-pose 身体周围稠密采样,评估 $C(\cdot)$ 得到距离场,在阈值 $t_d$ 处用 Marching Cubes 抽等值面。流程四步:
- 采样 $z \sim \mathcal{N}(\mu^ \mathbf{1},\ \sigma^ I)$($\mu, \sigma \in \mathbb{R}$ 从训练潜空间统计得到,所有分量共用);
- 对身体周围 T-pose 点计算 $P_\beta$,评估 $C(P_\beta, z)$;
- 对距离场做阈值化;
- Marching Cubes 出网格。
一个重要的实现取舍:因为 $C$ 预测的是无符号距离且阈值 $t_d = 0.1\,\text{mm} > 0$,重建出来的网格体积略大于真值。作者认为这仍然比"为了训练把衣服封口、要做体素化"要好。想要更薄的表面可以用 Neural Distance Fields,但留作未来工作。
三、姿态相关变形(SMPLicit 完整版)
SMPLicit-core 只能把衣服"披"在 T-pose 的 SMPL 上,不预测姿态相关变形。为了能用于动画,作者又训了一个姿态变形模型,思路和 TailorNet 类似:在 canonical T-pose 上学变形,再用 SMPL 学到的蒙皮(skinning)把网格 pose 出去。
具体借用了公开的 TailorNet 仿真服装数据集(200 个 shirt 和 pants 实例),学第二个网络:
$$P:\ p \times \theta \times z_\theta \mapsto d \in \mathbb{R}^3$$
输入身体姿态 $\theta$ 和一个可学潜变量 $z_\theta$(同样 auto-decoder 式学习),输出逐点位移。训练时只在T-pose 服装表面模板上采点评估。推理时只对 SMPLicit-core 恢复出的网格顶点评估 $P$,做 $p \mapsto p + d$ 得到变形后的(仍是 T-pose 的)网格,然后再对身体和服装同时施加 SMPL 完成 pose。服装每个顶点用的是最近的 SMPL 身体顶点的蒙皮变形。这一步定义了式 (3) 的 $C'(\cdot)$。
四、生成属性与潜空间编辑
PCA 分析:潜空间 $z = [z_{\text{cut}}, z_{\text{style}}]$ 维度很小(4 到 18,为了更好解耦)。对 $z_{\text{cut}}$ 做 PCA 发现:
- 第 1 主成分控制袖长(sleeve length);
- 第 2 主成分:上半身衣服控制整体长度,裤子/裙子控制腰线高度(waist boundary height)。
作者也坦白:剪裁和款式无法完美解耦——比如网络学到"tops 往往比 T-shirts 更松"。
原型(Prototypes):从训练数据里挑出有意思的原型(敞开夹克、连帽衫、tops),存它们的平均款式潜向量。Fig. 3-(B) 展示了从 T-shirt 平滑过渡到这些原型的插值——从短袖一路平滑过渡到敞开的夹克。
体型重定向(Body Shape):同一件 T-shirt 重定向到差异很大的体型上。
五、实验一:拟合 3D 扫描
用 Sizer 数据集(带服装分割的 3D 扫描)拟合,核心目标:让 SMPLicit-core 在去姿态(unposed)后的扫描点处取值为 0。
设 $q \in \mathbb{R}^3$ 是 posed 扫描空间里的点,$d = \text{dist}(q, \mathcal{S})$ 是它到扫描的距离。因为 SMPLicit-core 定义在 T-pose,先用可微 SMPL 参数把 $q$ unpose 回去(关联到最近 SMPL 顶点),得到依赖形状和姿态的身体相对编码 $P_\beta(\theta, \beta)$,然后约束:
$$\mathcal{L}(\beta, \theta, z) = \big|\, C\big(P_\beta(\theta, \beta),\ z\big) - d \,\big|$$
优化时还对这个人身上穿的所有衣服的服装参数一起优化。额外损失:扫描点与 SMPL 顶点间的 Chamfer 距离、SMPL 关节与预测扫描关节的 MSE、SMPL prior 损失、以及 $z$ 的正则项。用了调度策略:先优化 pose 和 shape,最后所有参数联合优化。
结果(Table 2,误差单位 mm,越低越好):
| 方法 | 短袖 Lower-Body | 短袖 Upper-Body | 长袖 Lower-Body | 长袖 Upper-Body |
|---|---|---|---|---|
| CAPE [37] | 1.15 | 0.87 | 1.09 | 1.35 |
| TailorNet [44] | — | 0.32 | 0.48 | 0.41 |
| SMPLicit | 0.78 | 0.46 | 0.58 | 0.52 |
关键点:SMPLicit 用单个模型同时处理长袖和短袖,而两个 baseline 是分别为每种拓扑单独训的。即便如此,SMPLicit 的误差和 TailorNet 相当,并明显优于 CAPE(CAPE 不提供独立的服装网格,只形变 SMPL 顶点)。定性上,SMPLicit 能用一个模型从连帽衫一直表示到背心(tank top)。
六、实验二:从图像重建穿衣人体
这是全文最有分量的应用。整体类似"给不穿衣服的身体做 SMPL"的套路,但 SMPLicit 提供了对服装的鲁棒性和语义知识,特别能扛严重遮挡、困难姿态、低分辨率、噪声。
Pipeline:先用 [52](SPIN 类)检测人、估计每个人的姿态和形状,再用 [67] 做 2D 服装语义分割,然后对每个检测拟合 SMPLicit,得到分层的 3D 服装(layered 3D clothing)。
逐点损失:对每件检测到的服装,在 T-posed SMPL 周围均匀采点,把点变形到目标 SMPL 姿态($p \mapsto \bar{p}$),剔除被自身身体形状遮挡的点。每个 posed 点 $\bar{p}$ 投影到语义分割像素 $(u, v)$,看它是否匹配服装类:$s_p = 1$(匹配)或 $s_p = 0$(其他类/背景)。单点损失:
$$
\mathcal{L}I(z) =
\begin{cases}
\big|C(P\beta, z) - d_{\max}\big|, & s_p = 0 \[4pt]
\min_i \big|C(P_\beta^i, z)\big|, & s_p = 1
\end{cases}
$$
- $s_p = 0$:把点推离表面,强制预测距离场的截断最大值 $d_{\max}$;
- $s_p = 1$:把点拉到表面上,强制预测距离为 0。
$\min_i(\cdot)$ 的讲究:因为沿相机射线有很多点 $\bar{p}_i$ 可能投影到同一个像素 $(u, v)$,只取距离最小的那个点(离当前服装表面估计最近的)。作者说这在实践中能防止衣服被"加厚"——这一点在重建多层服装时尤其重要。整体损失为 $\mathcal{L}_I + \mathcal{L}_z$。
对比:单人在任意姿态的 in-the-wild 图像上,对比 PIFuHD [55] 和 Tex2Shape [4](PIFuHD 前先用 [50] 去背景;Tex2Shape 需要 DensePose 分割)。
- SMPLicit 稳定优于其他方法,尤其是 PIFuHD——一旦姿态偏离直立就失败;
- Tex2Shape 视觉上很逼真,但无法正确恢复所有服装的几何;
- SMPLicit 能在最后一行的例子里重建不同层的服装(T 恤 + 夹克);
- 重建完后可直接当虚拟试穿用:改服装款式、重置身体姿态。
多人场景:在 MPII [6] 数据集上,对每个 SMPL 检测投影到图像、把别人的分割 mask 掉。即便有极端遮挡也能做,但整体成功依赖于每个子模块。失败案例(Fig. 6 右下):服装语义分割把衬衫和夹克混在一起,导致 SMPLicit 错误地优化出两件相似的、相互穿插的夹克——分割误差会一路传播到重建结果。
在 4D-DRESS 中的位置:4D-DRESS 把 SMPLicit 当作"生成式拟合"baseline。它不面向也不训练于真实多视数据,因此在真实数据上的单视图服装重建指标偏弱(4D-DRESS Table 5 里 SMPLicit 约 2.6 mm / 0.62 的 Chamfer / normal 类误差),典型失败是服装尺寸普遍不准(没有效利用图像信息做引导)和缺少褶皱细节。但它的生成式先验让宽松外套(outer garment)更鲁棒——这正是"数据驱动 vs 生成式拟合"两条路线互补的缩影。
七、实现细节(可复现清单)
- 潜空间维度:$|z| = 18$(upper-body、pants、skirts、hair)、$|z| = 4$(shoes);姿态变形参数 $|z_\theta| = 128$;
- 身体相对编码簇数 $K = 500$;等值面阈值 $t_d = 0.1\,\text{mm}$;无符号距离场截断 $d_{\max} = 10\,\text{mm}$;
- 网络结构:三个 2 层 MLP 分别编码 $z_{\text{cut}}$、$z_{\text{style}}$、$P_\beta$ 成中间表示,最后接一个 5 层 MLP 预测无符号距离场;
- 优化:Adam,初始学习率 $10^{-3}$,$\beta_1 = 0.9$,$\beta_2 = 0.999$,训练 1M iterations,0.5M 后学习率线性衰减;batch size $= 12$;噪声 $\sigma_n = 10^{-2}$;
- 图像编码器:精调预训练 ResNet-18;
- 归一化:用 weight normalization 而非 batch normalization(跟随 DeepSDF)。
八、训练数据
- 主体:BCNet 数据集的长袖 T 恤(88797)、裤子(44265)、裙子(44435);
- Blender 增强:手工切出不同袖长,扩展到 800k T 恤、973k 裤子、933k 裙子;
- 网上下载的 3D 服装模型:夹克 23、jumpers 6、suits 2、连帽衫 5、tops 12、鞋 28、靴 3、凉鞋 3。这些先调到 canonical body $\beta = 0$,训练时再迁移到随机采样的体型上(每个顶点用最近 SMPL 顶点的 shape-dependent 位移变形);
- 头发:USC-HairSalon 数据集,343 个高密度头发点云,多为长发;
- 类别不均衡处理:上半身类别极不均衡,所以每次训练迭代以概率 0.5 采样一个"下载模型",否则用 BCNet 的衣服;
- 姿态变形:用 TailorNet 的 200 个 shirt/pants 仿真;其余服装(鞋除外)用 Blender 手工 warp 的数据,只由 $z_\theta$ 参数化。
九、局限与评价
- 无符号距离的代价:重建网格体积略大于真值($t_d > 0$ 导致);更薄的表面要留给 NDF。
- 姿态变形不是重点:SMPLicit-core 不管姿态变形,姿态部分靠额外的 TailorNet 数据 + 蒙皮补,且鞋不做进一步变形。
- 类别间不共享:upper/lower/shoes/hair 各自单独训模型,跨簇不能插值。
- 剪裁/款式无法完全解耦:PCA 上能看出泄漏(如 tops 与 T-shirts 的松紧耦合)。
- 误差传导:图像 pipeline 强依赖 SMPL 估计和服装分割,分割错误会直接毁掉重建(两件穿插夹克的失败案例)。
- 对真实数据的适配:训练主要来自仿真/合成 + 少量网上下载模型,真实多视数据上的尺寸与褶皱细节仍是短板(4D-DRESS 的 benchmark 结论)。
对研究方向的实用评价:SMPLicit 的核心价值不在"精度刷榜",而在表示范式——用"身体相对编码 + 无符号距离场 + 低维语义潜码"把不同拓扑的服装塞进同一个生成模型,并且在 T-pose 定义、靠蒙皮 pose 出去。对 3D 视觉 / 服装重建方向,它给三点可迁移的启发:(1) 潜空间解耦 + PCA 找语义轴(袖长、衣长)是编辑和虚拟试穿的现成接口;(2) 把生成先验当作拟合的正则,能补上数据驱动方法在宽松外衣上的短板;(3) 它的失败模式(尺寸、褶皱、分割误差传导)恰好就是 4D-DRESS 之后这一波工作的选题清单。
术语表 / Key Terms
- topology — 拓扑;服装网格的连接结构,短袖/敞开夹克/裙子的拓扑彼此不同,本论文的核心卖点
- topology-aware — 拓扑感知的;模型能表示不同拓扑的服装而不需换模型
- garment — 服装、衣物(一件具体的衣服)
- clothed people / clothed human — 穿衣的人;相对于只重建 SMPL 身体
- implicit function / implicit model — 隐式函数 / 隐式模型;用连续函数表示曲面(这里预测距离场)
- unsigned distance field (UDF) — 无符号距离场;开放曲面无法用有符号距离,只能预测到表面的最小距离
- signed distance field (SDF) — 有符号距离场;要求封闭曲面,服装不适用
- occupancy — 占据(场);另一种隐式表示(点在体内/体外),要求封闭曲面
- iso-surface — 等值面;距离场里取值等于阈值的曲面,就是重建出的表面
- Marching Cubes — 行进立方体;从体素化距离场抽等值面生成三角网格的经典算法
- unposed space / posed space — 去姿态空间 / 姿态空间;服装在 T-pose(unposed)定义,再 pose 出去
- canonical T-pose — 标准 T 姿势;服装模型的参考姿态
- latent code / latent vector / latent space — 潜码 / 潜向量 / 潜空间;低维可解释的参数表示
- $z_{\text{cut}}$ — 剪裁潜码;由身体 UV 遮挡图编码,控制"挡住哪些身体区域"
- $z_{\text{style}}$ — 款式潜码;补足遮挡图说不清的松紧、褶皱、领口细节,auto-decoder 学得
- cut — 剪裁;本文定义为"被服装遮挡的身体区域"
- style — 款式(连帽衫 vs 非连帽衫等)
- tightness / looseness — 紧身度 / 宽松度
- auto-decoder — 自解码器;把潜码当自由参数直接优化(DeepSDF 范式),无需编码器
- body-relative encoding $P_\beta$ — 身体相对编码;存"点到身体顶点簇的位移",比欧氏/重心距离更好
- vertex cluster — 顶点簇;均匀分布在身体上的 $K$ 个代表点(本文 $K=500$)
- over-parameterized — 过参数化的;用比必要更多的量表示信息,帮助网络推理
- UV map / UV occlusion image — UV 贴图 / UV 遮挡图 $U$;把"身体顶点是否被衣服挡住"编码成图像
- image encoder $f$ — 图像编码器;把遮挡图映射成 $z_{\text{cut}}$,推理时丢弃
- decoder $C$ — 解码器;从编码和潜码预测距离场的主网络
- displacement / offset — 位移 / 偏移;相对身体网格的加性形变(旧范式)
- displacement map — 位移图;从模板出发逐点存偏移的表示
- registration — 配准;把不同服装对齐到统一拓扑,顶点模型必须做、隐式表示可跳过
- skinning — 蒙皮;SMPL 的线性混合蒙皮,用来把 T-pose 网格 pose 出去
- skinning weights — 蒙皮权重;每个顶点受哪些关节影响
- closest SMPL vertex — 最近的 SMPL 顶点;服装顶点借它的蒙皮参数做 pose
- pose-dependent deformation — 姿态相关变形;衣服随姿态产生的额外形变(本文的第二个网络)
- garment prototype — 服装原型;训练数据里有代表性的款式(敞开夹克、连帽衫、tops)
- principal component analysis (PCA) — 主成分分析;用来在潜空间里找语义方向(第 1 主成分=袖长)
- sleeve length — 袖长;PCA 第 1 主成分控制
- waist boundary height — 腰线高度;裤子/裙子 PCA 第 2 主成分控制
- disentanglement — 解耦;让不同潜维度控制不同属性,本文承认做不到完美
- interpolation — 插值;在潜空间里平滑过渡(T 恤→夹克)
- retargeting — 重定向;把同一件衣服套到不同体型上
- multi-layer / layered clothing — 多层 / 分层服装;如 T 恤外面再套夹克
- Chamfer distance — 倒角距离;两个点集间的双向最近点距离,衡量拟合/重建
- semantic segmentation — 语义分割;图像里逐像素区分服装类别(upper-clothes、coat、pants…)
- self-occlusion — 自遮挡;身体/服装自己挡住自己
- in-the-wild — 真实场景(非棚拍、未受控的照片)
- virtual try-on — 虚拟试穿;换款式、改姿态的应用
- DensePose — 稠密姿态;把像素映射到 SMPL 表面的表示(Tex2Shape 需要)
- weight normalization — 权重归一化;本文取代 batch normalization 的归一化手段
- baseline — 基线方法;用于对比参照的方法(4D-DRESS 把 SMPLicit 当服装重建 baseline)
- generative fitting — 生成式拟合;用生成模型的先验去拟合观测,对宽松外衣更鲁棒
- domain gap — 域间差距;合成/仿真训练数据与真实数据之间的分布差异
浙公网安备 33010602011771号