PIFu 精读:像素对齐隐式函数——从一张照片重建高分辨率穿衣人体
Saito, Huang, Natsume, Morishima, Kanazawa, Li. PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization, ICCV 2019.
这是单视图穿衣人体重建这条线上绕不开的奠基工作。它提出的 Pixel-Aligned Implicit Function(PIFu),把"逐像素的局部图像特征"和"3D 全局坐标"对齐,第一次让一张照片直接长出带纹理、高分辨率、任意拓扑的完整人体——包括看不见的背面和自遮挡区域。后来的 PIFuHD、Geo-PIFu、ECON、ICON 几乎都站在它肩膀上。
一句话结论
用像素对齐的隐式函数做 3D 表示:给定 3D 点 $X$、它在图上的投影 $x=\pi(X)$、以及沿相机射线的深度 $z$,用一个 MLP 预测该点"在表面内还是外"。因为它把图像的局部细节空间对齐到了 3D 形状上,所以既能保住皱纹、发丝这类高频细节,又能在没见过的区域推理出合理几何;而且省显存、支持任意拓扑、还能自然扩展到任意数量的多视图输入。
一、要解决什么问题
单视图穿衣人体重建,本质是"信息不够、还得猜"的问题。之前的几条路各有死穴:
| 路线 | 代表 | 死穴 |
|---|---|---|
| 参数化人体模型 | SMPL 等 | 只能出不穿衣服的身体,衣服、头发、配件全丢 |
| 体素(voxel) | BodyNet、VRN | 完整但显存爆炸,分辨率上不去,细节糊 |
| 全局特征隐式函数 | IM-GAN | 一张图一个全局向量,无法保证输入图的细节被保留,重建和原图对不齐 |
| 多视图立体/视觉凸包 | MVS、Visual Hull | 需要棚拍、标定,凹区域(腋下、裙摆)处理不了 |
PIFu 的破题点很明确:在像素级,把局部特征与整个物体的全局 3D 上下文对齐。fully-convolutional 地做,但不像体素那样吃内存;局部特征保证细节,3D 感知的隐式表示保证能从单视图推理出整体。
二、核心:PIFu 的公式
整个方法由一个全卷积图像编码器 $g$ 和一个 MLP 表示的连续隐函数 $f$ 组成。曲面定义为隐函数的等值面:
$$f\big(F(x),\,z(X)\big)=s,\qquad s\in\mathbb{R}$$
- $X\in\mathbb{R}^3$:空间中任意查询点;
- $x=\pi(X)$:$X$ 的 2D 投影;
- $F(x)=g(I(x))$:该像素处的图像特征,用双线性采样取(因为投影坐标是连续的,不落在整像素上);
- $z(X)$:相机坐标系下的深度。
做表面重建时,$s$ 是"在表面内/外"的概率,真值定义为:
$$f_v^*(X)=1 \ \text{若 } X \text{ 在网格内,否则 } 0$$
损失就是最朴素的 MSE:
$$L_V=\frac{1}{n}\sum_{i=1}^{n}\big|\,f_v(F_V(x_i),z(X_i))-f_v^*(X_i)\,\big|^2$$
推理时在 3D 空间稠密采样,用 Marching Cubes 在 $0.5$ 阈值提取等值面,得到网格。
为什么深度 $z$ 是命门? 论文专门做了个消融:把 $z$ 从输入里拿掉、只保留图像特征融合的那个网络,直接命名为 Huang et al.(视觉凸包式退化)。结果说明——对 3D 坐标的显式条件化(depth conditioning)才是单视图能推出 3D 形状的关键,光靠图像特征聚合不够。
三、采样策略:一个绕不开的工程细节
PIFu 的输出是连续的,不需要预先离散化网格,所以直接用 Embree 做光线求交、在线采点。但这带来一个训练难题:
- 若纯均匀采样 → 绝大多数点离表面很远,网络学会偷懒,一律预测"外";
- 若纯表面附近采样 → 太局部,过拟合。
PIFu 的做法是两者混合:
- 以表面点为中心加正态扰动 $\epsilon\sim\mathcal N(0,\sigma)$,$\sigma = 5.0\,\text{cm}$;
- 再与包围盒内的均匀采样点按 $16{:}1$ 的比例混在一起。
还有一个前提:采点要求网格是 water-tight(水密/封闭)的,否则光线判内外出错(非封闭网格可用现成方法补)。这两点(water-tight 预处理、$16{:}1$ 采样比)是复现成功与否的关键。
四、纹理推断:Tex-PIFu
把公式里的标量 $s$ 换成 RGB 向量,隐函数就能直接预测表面颜色——任意拓扑、自遮挡区域都能补,不用搞 UV 展开。但有个坑:
- occupancy 场在整个 3D 空间都有定义,而 RGB 只在表面上才有定义;
- 如果朴素地训练,$f_c$ 被迫同时学"表面形状"和"颜色",会严重过拟合。
PIFu 用两招解决:
- 条件化——把做形状重建时学到的图像特征 $F_V$ 一起喂进纹理编码器,让它专心学颜色,而不是自己也去猜形状;
- 沿法线偏移——让颜色在表面附近的 3D 空间也有定义,样本点 $X_i' = X_i + \epsilon\cdot N_i$,$\epsilon\sim\mathcal N(0,d)$,$d=1.0\,\text{cm}$。
纹理损失:
$$L_C=\frac{1}{n}\sum_{i=1}^{n}\big|\,f_c(F_C(x_i'),X_i',z)-C(X_i)\,\big|$$
对比 SiCloPe 的"合成背面视图再拼上去":那种做法会在轮廓附近产生投影畸变和伪影;PIFu 直接在网格表面预测颜色,没有这些问题。
五、多视图:自然扩展
把隐函数拆成 $f := f_2\circ f_1$:
- $f_1$:逐视角编码,在 3D 世界坐标下产出潜在嵌入 $\Phi_i$;
- 聚合:对多视角嵌入做平均池化,$\bar\Phi=\operatorname{mean}({\Phi_i})$;
- $f_2$:从聚合特征 $\bar\Phi$ 输出结果。
因为聚合是加法式的,所以任意数量的视角都能接;单视图就是退化成只平均它自己,不需要改框架。论文训练时用 3 个随机视角,但实测能吃掉更多视角(见图 8:1→3→6→9 视角,几何与纹理持续变好)。
六、实验与结果
网络:表面重建用 stacked hourglass(对真实图片泛化更好);纹理编码器用 CycleGAN 的残差块结构;隐函数 MLP 带来自 $F(x)$ 和 $z$ 的 skip connections,帮助深度信息传递。
数据:RenderPeople、BUFF(有扫描真值),真实图片用 DeepFashion。
三个指标:
- P2S:重建表面顶点到真值的平均点-面欧氏距离(cm);
- Chamfer distance:重建与真值表面的双向最近点距离;
- Normal reprojection error(本文提出):把重建与真值的法线图从输入视角渲染出来,算 L2 误差——专门衡量局部细节的细腻度和与输入图的投影一致性。
单视图(Table 1)
| 方法 | RenderPeople Normal / P2S / Chamfer | BUFF Normal / P2S / Chamfer |
|---|---|---|
| BodyNet | 0.262 / 5.72 / 5.64 | 0.308 / 4.94 / 4.52 |
| SiCloPe | 0.216 / 3.81 / 4.02 | 0.222 / 4.06 / 3.99 |
| IM-GAN | 0.258 / 2.87 / 3.14 | 0.337 / 5.11 / 5.32 |
| VRN | 0.116 / 1.42 / 1.56 | 0.130 / 2.33 / 2.48 |
| PIFu (Ours) | 0.084 / 1.52 / 1.50 | 0.0928 / 1.15 / 1.14 |
- Normal 误差大幅领先(0.084,比 VRN 的 0.116 还好)——说明高频细节保住了;
- P2S 上 VRN 在 RenderPeople 略低(1.42 vs 1.52),但在 BUFF 上 PIFu 反超(1.15 vs 2.33);
- 注意 VRN 与 PIFu 用的是同一个图像编码器架构,差别只在表示:隐式表示的表达力 > 体素。
多视图(3 视角,Table 2)
| 方法 | RenderPeople Normal / P2S / Chamfer | BUFF Normal / P2S / Chamfer |
|---|---|---|
| LSM | 0.251 / 4.40 / 3.93 | 0.272 / 3.58 / 3.30 |
| Deep V-Hull | 0.093 / 0.639 / 0.632 | 0.119 / 0.698 / 0.709 |
| PIFu (Ours) | 0.094 / 0.554 / 0.567 | 0.107 / 0.665 / 0.641 |
多视图下 PIFu 在 P2S/Chamfer 上稳定优于 Deep V-Hull 和 LSM。论文还做了动态人体(单目视频序列)的重建演示——当时算首次。
七、局限与未来工作
- 尺度歧义:重建在像素坐标空间做,scale 靠预处理对齐;单图推断绝对尺度仍是开放问题;
- 遮挡 / 局部人体:所有例子都不被其他物体遮挡、身体完整入镜;真实场景常被遮挡或只拍到半身;
- 纹理分辨率:可以上 GAN 或更高输入分辨率;
- 训练需要 water-tight 网格。
八、为什么值得记住
- 它把"全卷积的局部对齐"这个 2D 视觉的胜利配方,第一次成功搬到了 3D——这是 PIFu 最大的观念贡献;
- "pixel-aligned feature + depth"成了后续所有高精度人体重建的默认配置;
- 它暴露的短板(尺度、遮挡、多视图一致性)正是后面 PIFuHD(多层级高分辨率)、Geo-PIFu(体素引导)、ECON / ICON(法线积分 + 多视图一致)要补的坑;
- 对服装/宽松衣物重建(裙摆、高跟鞋这类任意拓扑)尤其友好,但无模板意味着缺少语义部件先验——这块正好可以和部件分割类工作结合起来补。
术语表 / Key Terms
- pixel-aligned implicit function (PIFu) — 像素对齐隐式函数;把逐像素局部特征与 3D 全局上下文对齐的隐式曲面表示
- implicit function — 隐式函数;把曲面定义为函数的等值面,无需显式存储空间
- level set — 水平集 / 等值面,如 $f(X)=0$ 或 0.5
- iso-surface — 等值面,从隐式场中提取出的曲面
- occupancy field — 占据场;空间点在表面"内/外"的连续概率场
- inside/outside probability — 内外概率,网络预测的标量输出
- Marching Cubes — 行进立方体;从稠密 3D 场提取等值面的经典算法
- bilinear sampling — 双线性采样;连续投影坐标处取特征值的方式
- weak-perspective camera — 弱透视相机(本文假设,可扩展为透视)
- depth conditioning — 深度条件化;把 $z(X)$ 显式喂给隐函数(本文关键消融)
- fully convolutional — 全卷积;保持输入与输出空间对齐的网络结构
- image encoder — 图像编码器($g$,本文用 stacked hourglass)
- stacked hourglass — 堆叠沙漏网络,一种多尺度编解码结构
- multi-layer perceptron (MLP) — 多层感知机,本文隐函数 $f$ 的实现
- skip connection — 跳连;把浅层信息直连到深层,帮助梯度/信息传递
- watertight mesh — 水密 / 封闭网格;光线判内外的前提
- ray tracing — 光线追踪(本文用 Embree 在线采点)
- adaptive sampling — 自适应采样;表面附近多采、远处少采
- Chamfer distance — 倒角距离;上采样点集间双向最近点距离,衡量重建质量
- point-to-surface (P2S) — 点到面距离(cm),衡量几何精度
- normal reprojection error — 法线重投影误差;本文提出的细节 / 投影一致性指标
- high-frequency detail — 高频细节(褶皱、发丝等)
- arbitrary topology — 任意拓扑(对裙、长发、高跟鞋很关键)
- template-free — 无模板;不依赖 SMPL 等参数化人体模型
- parametric body model — 参数化人体模型(SMPL/SCAPE 等)
- multi-view stereo (MVS) — 多视图立体
- visual hull — 视觉凸包;用多视图轮廓裁剪出的体积
- voxel / volumetric occupancy — 体素 / 体积占据表示(显存换细节的旧范式)
- per-vertex color — 逐顶点颜色
- texture inpainting — 纹理修复 / 补全;推断被遮挡区域的外观
- UV parameterization — UV 参数化(本文绕开,直接在表面预测颜色)
- self-occlusion — 自遮挡
- projection artifact — 投影伪影(视图合成类方法的典型缺陷)
- latent embedding — 潜在嵌入;多视图聚合用的特征向量
- average pooling — 平均池化;本文多视图特征聚合方式
- scale ambiguity — 尺度歧义;单视图固有难题
- off-the-shelf — 现成的、开箱即用的(指直接用别人训好的模型)
- generalization — 泛化能力,对未见姿态 / 真实照片的适应
浙公网安备 33010602011771号