PAPER READING · ICCV 2021 · FIXED 2107.11298v1

SurfaceNet

从单张照片估计 SVBRDF,理解对抗先验的能力与边界

Giuseppe Vecchio · Simone Palazzo · Concetto Spampinato
全部四表 / 八幅原图 / 损失与代码审计 / Reviewer & PMG Extensions

01 · 先读结论

SurfaceNet 用一次前向传播,把一张近似平面材质照片转换成 diffuse、normal、roughness、specular 四类 SVBRDF 图。它把逐像素监督与局部对抗学习结合,希望同时恢复细节,并利用没有材质真值的真实照片缩小 synthetic-to-real 差距。

真正的贡献:不是提出新的 BRDF,而是把共享多头 encoder–decoder、输入图像的多尺度 skip,以及 PatchGAN 材质先验组合起来。训练要用生成器和判别器;推理只用生成器,不做 diffusion 采样,不做 MaterialGAN 式测试时 latent 优化。[P §§1–3]

结论按证据强度拆开
结论论文证据必须保留的边界
在 synthetic 测试上更准确Tables 1–2,五项 RMSE 均低于各自列出的 baseline分 flash / natural illumination;natural 比较把 roughness/specular 平均为空间同质参数
PatchGAN 对细节有帮助Table 3 image discriminator → patch discriminator,全部五项下降单次实验,无方差;感受野、参数量和全局分类方式也同时改变
真实图像适配有效Figure 8 的 qualitative 比较真实域没有 ground truth 数值;加入真实图后,synthetic 五项 RMSE 全部变差
支持高分辨率正文 Figure 7 展示 1024 × 1024;作者声称补充材料有 2048 × 2048未取得独立补充材料;公开实现还存在非方形输入问题

复现警报:论文写 ResNet-101,公开代码使用 ResNet-50;论文的真实域训练是核心卖点,当前 trainer 却没有实现其实际训练路径。公开代码还采用不同 GAN loss、权重与默认训练配置。读论文结果和读仓库实现必须分层,不能直接把“官方代码”当成论文原始实验快照。

SurfaceNet 的 synthetic 配对监督与 real 无标签对抗训练框架
原 Figure 1 · SurfaceNet 的 synthetic 配对监督与 real 无标签对抗训练框架 · 固定 v1 官方完整原图(联网) · PDF 第 3 页 · Vecchio et al. 2021

02 · 身份与固定版本

论文作者为 Giuseppe Vecchio、Simone Palazzo、Concetto Spampinato,单位为 University of Catania 的 PeRCeiVe Lab。固定阅读 arXiv 2107.11298v1,2021-07-23 提交,PDF 共 9 页,SHA256 为 1378dbc603ea1682ae9ec88162a2ca4afba062f17d8e1f35dbb2889fa1c21ad6。已有文件与固定公开 PDF 的 hash 已核对,不替换或改页码。

正式发表为 ICCV 2021;作者项目页与 CVF 引用给页码 12840–12848,IEEE 向 Crossref 注册的同一论文 DOI 10.1109/ICCV48922.2021.01260 对应页码为 12820–12828。这是两套出版索引的差异,不能把旧笔记中的 CVF 页码直接判错。arXiv metadata 给的 10.1109/ICCV48922.2021 不够精确,归档时应保留完整文章 DOI。[V][R]

全文未标明通讯作者;原 note 的 Concetto Spampinato 保留为末位候选、unverified。第一作者及机构已由原文确认,不凭顺序补出已核实通讯角色。旧 note 中 GAN / CNN 方法分类正确,主题里的 diffusion models 没有本文方法支持;原文仍完整保存,仅在追加与归档计划中建议复核。

本次确实读了什么

完整固定 PDF、其 arXiv HTML 和 TeX 源码包、作者项目页、官方 poster、官方 Git 仓库当前 commit 与关键历史代码。固定 PDF 没有附录;正文反复提到的 supplementary architecture / 2048 结果,没有出现在官方项目页入口、CVF 索引的附加链接或完整 arXiv source archive 中。源码包含两份重复主文目录,不含 supplement。因此不能声称已读到这份独立补充材料,也不虚构其层表。

本页涵盖固定论文全部 8 幅图和 4 张表;公开代码能补充实现细节,但属于后发、且有差异的实现。未启动模型、未训练、未执行官方 Python。浏览器 QA 按约定留待本地下载后;本轮只做内容、来源、数学源码、资源解码与文件完整性的静态验收。

03 · 为什么用局部对抗学习

SVBRDF capture 的目标不是把照片“变清晰”,而是估计可在新光照下重渲染的表面参数。照片同时混合了材质、法线、照明与相机响应:一块亮斑可能是浅色 diffuse、高 specular、低 roughness 或照明方向。只有一张图时无法唯一解开,必须依赖材质先验。

逐像素 L1 / L2 监督提供配准与数值锚点,但多解情况下常得到平均化、模糊的图。PatchGAN 学习局部多通道材质块是否接近训练真值分布,能补充细节、边缘和跨参数关联。材料通常具有局部纹理结构,所以作者认为局部判别比只给整图一个真假分数更合适。[P §§1–3]

关键区别:“更像真实材质图”不自动等于“这张输入照片的真实材质”。判别器能鼓励锐利结构,也能奖励不存在于实物的高频细节。L1 与 MS-SSIM 在 synthetic 配对数据上负责约束输入与输出对应,真实照片没有对应真值,因而更需要谨慎评估幻觉。

与 baseline 的关系

引用编号在正式会议版可能变化;本页所有 [8]/[9]/[14]/[19] 都固定对应用户的 arXiv v1,不将另一版本的编号混入原表。

04 · 输入、四张参数图与物理边界

输入为单张 RGB 材质照片 \(\mathbf I\in\mathbb R^{H\times W\times3}\),表面大致平面,非平面的细节由 normal map 表示。输出是:

\[\hat{\mathbf M}=G_{\theta}(\mathbf I)=\{\hat{\mathbf d},\hat{\mathbf n},\hat r,\hat{\mathbf s}\}.\]
四类 SVBRDF 输出;公开实现总计 10 个通道
参数图通道解释需要避免的误解
Diffuse d3漫反射颜色 / albedo不应残留输入光照和高光
Normal n3表面局部朝向、凹凸细节不是完整三维几何、厚度或可见外轮廓
Roughness r1控制微表面高光展宽不是 diffuse 纹理对比度,也不是金属度
Specular s3镜面反射颜色参数不能直接当 metallic map;specular workflow 与 metalness workflow 不同

论文使用 Cook–Torrance 和 GGX microfacet distribution,认为其它能由参数图描述的反射模型也可适用。但只实际验证了这组参数与数据,不能把“可扩展”写成对各向异性、透射、次表面或多层涂层都已验证。

为了理解这些参数的作用,常用微表面反射形式可写为下式。它是物理解释,不是论文新提出的训练公式;具体 renderer 的 roughness 转换和能量分配约定仍需匹配数据生成器:

\[f_{\mathrm r}(\mathbf p,\boldsymbol\omega_{\mathrm i},\boldsymbol\omega_{\mathrm o})=\frac{\mathbf d(\mathbf p)}{\pi}+\frac{D_{\mathrm{GGX}}(\mathbf n,\mathbf h,r)\,F(\mathbf s,\boldsymbol\omega_{\mathrm i},\mathbf h)\,G_{\mathrm{geom}}(\mathbf n,\boldsymbol\omega_{\mathrm i},\boldsymbol\omega_{\mathrm o},r)}{4(\mathbf n\cdot\boldsymbol\omega_{\mathrm i})(\mathbf n\cdot\boldsymbol\omega_{\mathrm o})}.\]

其中 h 为半角向量,D 控制微表面朝向分布,F 为 Fresnel 项,Ggeom 表示遮蔽。这个式子说明单张图里 roughness、specular、normal 和 lighting 可以互相补偿:输入重渲染相似,不保证每张材质图正确。

\[I_{\mathrm{render}}(\mathbf p)=\int_{\Omega^{+}}f_{\mathrm r}(\mathbf p,\boldsymbol\omega_{\mathrm i},\boldsymbol\omega_{\mathrm o})L_{\mathrm i}(\mathbf p,\boldsymbol\omega_{\mathrm i})\max(0,\mathbf n\cdot\boldsymbol\omega_{\mathrm i})\,\mathrm d\boldsymbol\omega_{\mathrm i}.\]

训练并没有显式预测光源、环境贴图、相机响应、UV 或程序图。renderer 主要用于制作 synthetic 数据与评测重渲染,不在 SurfaceNet 的论文 loss 中作可微训练闭环。公开仓库也没有对应 renderer 代码,因此不能把“无 rendering loss”误写为“论文完全不需要渲染”。

05 · Generator:共享特征与输入图像 skip

论文 ResNet-101 / ASPP、多尺度原图 skip、四个预测 head
原 Figure 2 · 论文 ResNet-101 / ASPP、多尺度原图 skip、四个预测 head · 固定 v1 官方完整原图(联网) · PDF 第 4 页 · Vecchio et al. 2021

论文的 generator 以 DeepLabV3 风格的 ResNet-101 encoder + ASPP 提取多尺度信息,256 × 256 输入变成 2048 × 32 × 32 特征,再由 ASPP 投影为 256 通道。三个可学习上采样块依次恢复 64、128、256 空间尺寸;每一层都拼接相应下采样的原始 RGB。最后共享 256 × 256 × 256 特征,再用四个独立 head 输出材质图。[P §3.1, Fig.2]

\[\mathbf F_{0}=\operatorname{ASPP}(\operatorname{Encoder}(\mathbf I)),\qquad \mathbf F_{\ell+1}=U_{\ell}\!\left([\mathbf F_{\ell},\operatorname{Resize}_{\ell}(\mathbf I)]\right).\]

方括号为通道拼接,每次 256 特征通道加 3 个 RGB 通道成为 259。这里的 skip 是原始图像的多尺度副本,不是通常 U-Net 中 encoder 对应层的特征 skip。原图中的高频纹理可直接回到 decoder,但光照和高光也一起被送入,模型需要学会分离。

ASPP 的作用是并行捕捉不同尺度上下文,让同一材质的局部结构与较大范围色彩关联起来;论文并未在主文列 dilation rates、每个分支层表和完整初始化。不能把某个 torchvision 版本的默认值追认为作者固定设置。

论文设计与公开模型可确认的实现层次
阶段论文当前代码
EncoderResNet-101resnet50,pretrained=True,replace_stride_with_dilation=[False, True, True]
BottleneckASPP + 256 通道DeepLabHead(2048, 256)
Upsample,重复 3 次转置卷积 + residual4×4 ConvTranspose,stride 2,padding 1;BN、ReLU、BasicBlock
最终同尺寸层conv + BN + ReLU,图中共享 256 通道3×3 ConvTranspose,stride 1,padding 1;BN、ReLU、BasicBlock
四个 heads独立参数图预测1×1 Conv,输出 3 / 3 / 1 / 3 通道
输出处理主文没有完整规定center crop 回输入尺寸;clamp 到 [-1,1],没有显式 normal unit normalization

这不是“大模型 / 小模型”两种由论文分别评测的配置:主表只报告一个 SurfaceNet。ResNet-50 是公开仓库实现与论文描述的差别,不能给它分配论文 ResNet-101 的得分。多数运算和 encoder 共享,head 很小,这有利于四类参数之间复用线索,但没有显式物理一致性约束。

高分辨率为何可行,又为何不能无条件保证

全卷积模型不把训练分辨率写死在全连接层,因此可以扩大空间输入。但 receptive field 的像素尺度、ASPP 的全局统计、显存和材质尺度分布都会改变。256² 到 2048² 的输出像素数增加 64 倍,不代表质量和延时保持不变。作者没有报告这组变化的数值曲线或 GPU memory。

06 · Patch discriminator 到底看见什么

正文公式把判别器简写为 D(M),容易让人以为它只看材质图。Figure 1 明确画出 estimated maps + input 和 ground truth maps + input 的拼接,当前代码也把 RGB 与四张 maps 一起输入,共 3 + 10 = 13 通道。因此它是 image-conditioned material discriminator,不能只讨论无条件材质边缘分布。[P Fig.1][C discriminator / trainer]

\[\mathbf Y_{\mathrm{real}}=[\mathbf I_{\mathrm s},\mathbf M_{\mathrm s}],\qquad \mathbf Y_{\mathrm{fake}}=[\mathbf I,G_{\theta}(\mathbf I)].\]

“real”在判别器标签中意为 ground-truth pair,而该 ground truth 主要来自 synthetic 数据;不要把 D 的 real label 和真实照片域混为一谈。无标注真实照片产生的预测是 fake pair,仍试图让 D 接受。

当前代码的六层 PatchGAN:由源码逐层推导,256² 输入
层通道kernel / stride / padding输出尺寸累积理论感受野
Conv 113 → 644 / 2 / 1128 × 1284 × 4
Conv 264 → 1284 / 2 / 164 × 6410 × 10
Conv 3128 → 2564 / 2 / 132 × 3222 × 22
Conv 4256 → 5124 / 2 / 116 × 1646 × 46
Conv 5512 → 5124 / 1 / 115 × 1594 × 94
Conv 6512 → 14 / 1 / 114 × 14142 × 142

中间主要使用 BatchNorm 和 LeakyReLU(0.2),最后直接输出 patch score。上表不是未取得 supplementary 的复刻,而是已核对代码的结构。142² receptive field 是理论支持范围,实际有效权重不同;相邻输出间距 16 像素,patch 高度重叠。论文所说“缩小约 18 倍”是 256 到 14 的尺寸描述,不能当成网络 stride=18。

主文说先平均 patch likelihood 再用 adversarial loss;公开代码直接对整张 14² score map 做 MSE 再平均,而且没有 sigmoid,score 不是校准概率。这两个训练目标并不相同,后面会给出具体差别。

隐式域适配的潜在捷径

研究解读:若 D 能仅凭输入 RGB 的 synthetic / real 风格识别来源,而正例只有 synthetic 配对,真实图分支可能被域信息轻易判 fake。G 只能改 maps,不能改输入 I,便难以纠正这条捷径。论文没有显式 domain-classifier、gradient reversal、feature-distribution loss 或真实 ground-truth 正例来证明捷径被避免。有限容量与域重叠可能使训练仍有帮助,但“强制学到域无关特征”应视为作者解释,而非有独立测量的事实。

07 · 损失函数必须先纠正优化方向

论文 Eq.1 将训练写成总 loss 的最小化,Eq.2 分为 supervised 与 unsupervised 两项:

\[\theta^{\ast}=\arg\min_{\theta}\sum_{i}\mathcal L(\mathbf I_{i},\mathbf M_{i,1},\ldots,\mathbf M_{i,K}),\qquad \mathcal L=\mathcal L_{\mathrm{sup}}+\alpha\mathcal L_{\mathrm{unsup}}.\tag{1–2}\]

但 Eq.3–5 的记号和符号不能照字面全放进同一个 minimizer。正文又混用 Lsup/Lrec、Lunsup/Ladv,并在介绍 adversarial loss 的一句话误写成 Lsup。这里分为“原式”和“与文字目标一致的最小化形式”。[P §3.3]

Eq.3 的 MS-SSIM 符号问题

\[\mathcal L_{\mathrm{rec}}^{\mathrm{printed}}=\sum_{k}\left[\|\mathbf M_{k}-\hat{\mathbf M}_{k}\|_{1}+\beta\,\operatorname{MS\!-\!SSIM}(\mathbf M_{k},\hat{\mathbf M}_{k})\right].\tag{3 原式}\]

论文明确把 MS-SSIM 称为 similarity;若 beta 为正,最小化正 similarity 会鼓励变得不相似。因此实际可用的表达应把相似度转成距离,例如:

\[\mathcal L_{\mathrm{sup}}^{\mathrm{consistent}}=\sum_{k}\left[\|\mathbf M_{k}-\hat{\mathbf M}_{k}\|_{1}+\beta\left(1-\operatorname{MS\!-\!SSIM}(\mathbf M_{k},\hat{\mathbf M}_{k})\right)\right].\]

这是根据优化方向与公开 msssim_loss=1−msssim 给出的解释,不静默篡改原式。L1 约束数值、亮度和颜色偏差,MS-SSIM 约束局部对比与多尺度结构;两者的作用也不宜简单划成“一个只管低频、一个只管高频”。

Eq.4–5 的 log 目标实际上需要最大化

\[\mathcal L_{\mathrm{disc}}^{\mathrm{printed}}=\log D(\mathbf M)+\log\!\left(1-D(G(\mathbf I))\right),\qquad \mathcal L_{\mathrm{gen}}^{\mathrm{printed}}=\log D(G(\mathbf I)).\tag{4–5 原式}\]

若把这两个正 log 当 loss 最小化,会让 D 接受假例、拒绝真例,让 G 主动降低被接受概率,恰好违背文字叙述。它们应作为最大化效用,或取负号变成最小化损失。不能把 D 与 G 的目标直接相加后对所有参数一同下降。

\[\min_{\phi}\mathcal L_{D}=-\mathbb E_{\mathrm{s}}\log D_{\phi}(\mathbf I_{\mathrm s},\mathbf M_{\mathrm s})-\mathbb E_{\mathbf I}\log\!\left(1-D_{\phi}(\mathbf I,G_{\theta}(\mathbf I))\right),\]
\[\min_{\theta}\mathcal L_{G}=\mathbb E_{\mathrm{s}}\mathcal L_{\mathrm{sup}}(\mathbf M_{\mathrm s},G_{\theta}(\mathbf I_{\mathrm s}))-\alpha\,\mathbb E_{\mathbf I}\log D_{\phi}(\mathbf I,G_{\theta}(\mathbf I)).\]

这是一种与文意一致的 non-saturating GAN 规范化写法,并显式补出 Figure 1 的条件 I;固定论文没提供 source-mixing 比例、每轮 D/G 更新次数和 patch 聚合细则,不能从这个解释式推定全部复现设置。

公开实现另用 least-squares GAN

\[\mathcal L_{D}^{\mathrm{code}}=\tfrac12\left(\mathbb E_{q}(D_{\phi}(\mathbf Y_{\mathrm{real}})_{q}-1)^{2}+\mathbb E_{q}D_{\phi}(\mathbf Y_{\mathrm{fake}})_{q}^{2}\right),\]
\[\mathcal L_{G,\mathrm{adv}}^{\mathrm{code}}=0.015\,\mathbb E_{q}(D_{\phi}(\mathbf Y_{\mathrm{fake}})_{q}-1)^{2}.\]

q 表示 patch location;模型输出没有 sigmoid。generator 每个 map 的 loss 还含 L1 + 0.88 × MS-SSIM loss + 全 tensor 标准差差值,这个 std 项不在论文中:

\[\mathcal L_{\mathrm{map}}^{\mathrm{code}}=\operatorname{mean}|\hat M-M|+0.88(1-\tilde S(\hat M,M))+|\operatorname{std}(\hat M)-\operatorname{std}(M)|.\]

std 跨 batch、channel、space 计算而非逐像素;它匹配全局对比度,也可能把不同样本统计耦合。公开实现只监督 synthetic path,不能用此式声称完整实现了论文的 real-domain training。

08 · 数据与域适配设置

论文披露的完整数据组成
集合规模 / 来源监督划分与用途
Synthetic SVBRDFDeschaintre 2018 数据,源自 Allegorithmic Substance Share,约 200,000 SVBRDFs / 配对样本输入 rendering + diffuse、normal、specular、roughness沿用 [8] train/test split;本文未列每个 split 精确数量
Flash setting固定距离、中心位置的 phone-like flash 渲染四图 ground truthTable 1、Figures 3/5 对比
Natural illumination setting同一 synthetic test split,用 HDRI Haven 库的随机环境重渲染四图 ground truthTable 2 / Figure 4;训练是否另重渲染、环境划分细节未充分说明
Real material photos3DJungle、DTD 人工挑选样本与手机拍照;14 类,每类 80 张,512²只有 RGB,无 SVBRDF 标签1,120 总计;910 train(每类 65)、210 test(每类 15)

14 类完整名单为 asphalt、bark、bricks、concrete、fabric、floor、foliage、granite、ground、marble、metal、parquet、sand、stone。作者说是 hand-picked,不是直接拿整个 DTD,也没有公布文件名单和 split manifest。约 200,000 也不能理解为 200,000 个独立、未经裁剪扩增的程序材质源文件。[P §4.1]

两种训练实验不要混在一起

主 synthetic 数字:只用有标注 synthetic 数据训练,Table 1 的 SurfaceNet 即 0.017 / 0.030 / 0.029 / 0.014 / 0.058。真实照片实验:再加入无标签 real data,通过对抗项训练,以 qualitative 图判断迁移。Table 4 的 L(real) 则仍在 synthetic test 上测,表现略降。把 Table 1 的最好数字和 Figure 8 的真实适配说成一个单一 checkpoint 无差别拥有全部优势,证据不足。

真实图无 ground truth,所以不能计算对应 map RMSE;作者通过重渲染视觉比较。重渲染相似本身也可能来自材质/光照互相补偿,尤其单图下没有交叉光照采集。对于 domain adaptation,理想补实验应有未参与训练的真实材质及受控多光照 ground truth,而不只看单个砖墙例子。

当前 loader 预处理为 Resize → CenterCrop → ToTensor → Normalize(0.5,0.5),将各 map 与 rendering 映为 [-1,1];roughness 转灰度,其他转 RGB。每次访问材质目录随机选一张 render/ 内图片,验证集也沿用这个随机选择。没有随机 crop、normal 翻转修正、曝光增强或 gamma 线性化的显式代码;不能自行补成论文 augmentation 方案。

09 · 训练与推理配置

论文报告值与当前公开默认值;不相互替代
设置固定 v1 论文当前代码
BackboneResNet-101 / DeepLabV3ImageNet-pretrained ResNet-50
训练尺寸256 × 256resize 默认 256,center crop
OptimizerAdamAdam 默认;betas=(0.9,0.999)
Learning rate4 × 10−50.001,即 25 倍
Batch size664
时长单位250,000 iterations20,000 epochs 默认;不是相同训练时长
GAN weightalpha=0.2alpha_adv=0.015;2021 初始 trainer 曾为 0.15
MS-SSIM weightbeta=0.84alpha_m=0.88,外加 std loss
GAN 开关完整方法开启--train-adversarial 默认为关闭
G 对抗起点未报告预热步数adv_start=300,000;D 从一开始训练,G 达到起点才用 adversarial loss
Real 训练无标签 real 与 synthetic 联合--train-real 构造 loader,但主循环不用它;实际 real 分支未实现
GPU / 运行时主文未报告 GPU、训练小时数、显存、推理时延Accelerate 配置控制设备;本次未执行
其它缺项seed、Adam betas、weight decay、LR schedule、precision、source ratio、D/G 频率、初始化细则代码部分可看,但无固定依赖版本;不能回填为论文值

250,000 × batch 6 = 1,500,000 sample exposures 是简单计算,不能视为 1,500,000 个不同材质或精确 epoch 数。论文指出 alpha 太大会压过 reconstruction loss,beta 小幅变化影响不大,但没有给完整 sweep 曲线或表。

论文应有的训练流程

  1. 取 synthetic 配对 RGB/maps,生成预测;以 L1 与结构 loss 约束输出真值
  2. 用真实配对 maps 和生成 maps 构造 D 正负样本;当前图示包含 RGB 条件
  3. 冻结 G 结果更新 D;更新 G 时让输出通过 D,并保留 synthetic reconstruction
  4. 对无标注真实 RGB,仅提供对抗信号,不伪造 map labels
  5. 按独立 validation 选择 checkpoint;推理删除 D,只跑 G,输出四张 maps

这段是从论文可重建的算法逻辑,不是假装已取得作者缺失 supplementary 的逐步训练脚本。真实域正例如何配对、采样比例和稳定化都还需要更多信息。当前仓库代码只实现了 synthetic 训练路径,且 D/G objective 与主文不同。

推理不需要的步骤

没有文字 prompt、CLIP、temperature、top-k、DDIM、采样次数或迭代 inverse rendering;它不是 diffusion 模型。模型 eval 下对固定输入给确定性前向预测,除非用户自己加 augmentation 或修改网络。后续物理渲染用来检验或使用生成 maps,不能把它混成网络内部的额外预测。

10 · 评测协议与全部主表

map 误差为逐元素 RMSE。不同通道的量纲、归一化和有效范围影响数值;normal 的 RGB RMSE 不是角度误差,roughness 误差对视觉效果也不线性。[P §4.2]

\[\operatorname{RMSE}(M,\hat M)=\sqrt{\frac{1}{HWC}\sum_{u,v,c}(M_{u,v,c}-\hat M_{u,v,c})^{2}}.\]

论文评测还取五个 phone-like flash 位置:top-left、top-right、bottom-left、bottom-right、center,对估计 maps 与 ground-truth maps 各渲染五张,比较重渲染 RMSE。Tables 1–2 图注简写成与 original image / rendering 比较,正文的五光位说明更完整;论文没有明确给“先平方平均后开方”还是“每图 RMSE 再平均”的跨视图聚合实现。公开代码只记录 maps 的 RMSE,没有这套 renderer metric。

原 Table 1 · Synthetic / flash;全部 RMSE,越低越好
方法 / 配置Diffuse ↓Normal ↓Roughness ↓Specular ↓Rendering ↓
Deschaintre 2018 [8]0.0190.0350.1290.0500.083
Deschaintre 2019 [9]0.0810.0570.1080.0630.187
Gao 2019 [14]0.0500.0620.1190.2020.108
SurfaceNet0.0170.0300.0290.0140.058

Flash 主表:本文全部五项胜出。相对各指标最优 baseline,diffuse 0.019→0.017,normal 0.035→0.030,roughness 0.108→0.029,specular 0.050→0.014,rendering 0.083→0.058。roughness 改善最大约 73.1%,specular 为 72.0%,rendering 为 30.1%;这些是 RMSE 相对下降,不是“感知质量提高百分比”。

原 Table 2 · Synthetic / natural illumination;r/s 为全图平均后的同质参数
方法 / 配置Diffuse ↓Normal ↓Roughness ↓Specular ↓Rendering ↓
Li 2017 [19]0.0930.0810.3310.1810.106
SurfaceNet0.0330.0550.0940.0410.078

Natural 主表:本文先把 roughness 与 specular 逐图取像素平均,以匹配 Li 2017 的 homogeneous 参数。对这两项,表中评测不再测试空间细节恢复;因此不能把 roughness 0.331→0.094 说成空间变化 roughness 的逐像素收益。diffuse / normal 仍为图,Figures 4/6 也只展示两种共同 map。

\[\bar r=\frac1{HW}\sum_{u,v}r_{u,v},\qquad \bar{\mathbf s}=\frac1{HW}\sum_{u,v}\mathbf s_{u,v}.\]

原文称 reduce to scalar values,但 specular 实际是 RGB 参数;它没有清晰说明是否还跨颜色求平均,所以这里用向量均值明确保留颜色维,作为合理解释而非已核实 eval 实现。两个任务设置和 baseline 集合不同,不能把 Table 1 与 2 的 Rendering 数字直接当成同分布排名。

主表相对下降,本次由原数值计算
条件DiffuseNormalRoughnessSpecularRendering
Flash,逐指标最佳所列 baseline10.5%14.3%73.1%72.0%30.1%
Natural,相对 Li 201764.5%32.1%71.6%77.3%26.4%

论文没有随机 seed 复现实验、confidence interval、标准差或 paired significance test;所谓 SOTA 是该时期该比较范围下的作者结论,不是今天所有条件下的排名。真实照片评测完全是 qualitative,不存在正文宣称的真实域四图定量误差表。

11 · Synthetic 结果逐图读

Synthetic flash 下的四图估计和 rendering,与三种 baseline 及 GT 对比
原 Figure 3 · Synthetic flash 下的四图估计和 rendering,与三种 baseline 及 GT 对比 · 固定 v1 官方完整原图(联网) · PDF 第 6 页 · Vecchio et al. 2021

Figure 3:flash 图案包含带高光的石材/拼块。列为 rendering、diffuse、normal、roughness、specular;行包括 GT、[8]、[9]、[14]、Ours。作者观察 [8] diffuse 偏亮且 normal 缺细节;[9] normal 对比过强、roughness 扁平;[14] normal 过度放大噪声,高光与材质的分离不稳定。本文更保留粗糙度边界和局部纹理。

重要的是同时看四图与 rendering:只看输入重建可被多种错误参数组合骗过;只看某图更锐利,也可能把光照当成 geometry。此图与主表共同支持 synthetic 优势,但一个样例不能覆盖所有金属、光滑、高频材质。

Synthetic natural illumination 与 Li2017 的共同参数比较
原 Figure 4 · Synthetic natural illumination 与 Li2017 的共同参数比较 · 固定 v1 官方完整原图(联网) · PDF 第 6 页 · Vecchio et al. 2021

Figure 4:natural illumination 下对比 GT、Li 2017 与本文,显示 rendering、diffuse、normal。Li 的法线整体偏平、diffuse 混入照明,本文在局部拼接处更接近 GT。roughness/specular 因双方按同质设定比较而不展示,不是模型从任务中删除了两张图。

正文说重渲染 test split 以形成自然照明设置,却未给完整环境列表、曝光和 train/test 环境隔离。渲染输入里几何材质分布与训练相近也可能提高表现;后续应按原始材质身份和环境共同切分,避免同源 crop 或照明泄漏。

12 · 真实图像和高分辨率

Real flash 的四图、重渲染和源照片比较
原 Figure 5 · Real flash 的四图、重渲染和源照片比较 · 固定 v1 官方完整原图(联网) · PDF 第 7 页 · Vecchio et al. 2021

Figure 5:真实 flash 照片没有 GT maps,展示各方法 diffuse、normal、roughness、specular、重新渲染,再放原照片。本文的粗糙度较平滑但保留辐射状边界;其它方法分别有缺细节、过度平滑或过度对比。视觉上与输入更一致是有意义的,但不能因此核实每个像素的真实 BRDF。

Real natural illumination 的 diffuse、normal 和重渲染比较
原 Figure 6 · Real natural illumination 的 diffuse、normal 和重渲染比较 · 固定 v1 官方完整原图(联网) · PDF 第 7 页 · Vecchio et al. 2021

Figure 6:真实自然光材料,比较 diffuse、normal 与重渲染;本文的 rendering 更接近 source picture。这是单例 qualitative evidence,不是对真实域全 210 张测试集的数值统计。照明估计和输入曝光不完全公开,也会影响 rendering 的视觉接近程度。

正文 1024×1024 真实砖墙高分辨率估计
原 Figure 7 · 正文 1024×1024 真实砖墙高分辨率估计 · 固定 v1 官方完整原图(联网) · PDF 第 8 页 · Vecchio et al. 2021

Figure 7:手机自然光下的 1024 × 1024 砖墙,输出有可见砖缝和细粒度 normal。引言声称可达 2048 × 2048、并指向补充材料;本次未取得该独立补充材料,所以只把正文的 1024 例图当成可直接检查的高分辨率证据。没有 tile seam、跨尺度一致性、峰值显存或处理速度的定量验证。

真实砖墙 synthetic-only 与 synthetic+real 的定性比较
原 Figure 8 · 真实砖墙 synthetic-only 与 synthetic+real 的定性比较 · 固定 v1 官方完整原图(联网) · PDF 第 8 页 · Vecchio et al. 2021

Figure 8:同一真实砖墙,上行 synthetic-only,下行 synthetic+real。加入真实图后 roughness/specular 中的砖纹更清楚,输出渲染也更接近原图。作者把这种现象解释为域无关特征和正则化;但没有真实 maps ground truth、域可分性测试或多 seed 统计,不能把解释当成已经证实的机制。

13 · 全量消融与不能跳过的负结果

原 Table 3 · 架构与判别器消融;完整五行五指标
方法 / 配置Diffuse ↓Normal ↓Roughness ↓Specular ↓Rendering ↓
Base0.2070.1560.3220.1380.185
+ Dec.0.0860.0930.1300.0420.087
+ Skip0.0730.1220.2530.0840.073
+ Image0.0210.0370.0650.0220.067
+ Patch0.0170.0300.0290.0140.058

Base:DeepLabV3 encoder,使用插值恢复输出,无图像 skip、无 adversarial loss。+Dec:加入可学习上采样。+Skip:再拼接下采样输入。最后对比 image-level 与 patch-level discriminator。原表图注提到 “Full”,但表内实际行名是 +Image / +Patch;本页保持实际表行,不凭图注补造第六行。

作者称所有架构变化都改善 accuracy,表格不支持这个逐指标强结论:+Dec→+Skip 时 diffuse 0.086→0.073、rendering 0.087→0.073 改善,但 normal 0.093→0.122、roughness 0.130→0.253、specular 0.042→0.084 都变差。粗糙度恶化约 94.6%,specular 翻倍。skip 可能带入输入外观污染,是否如此仍需额外实验,不能只由相关变化确定原因。

+Image→+Patch 则五项全降,尤其 roughness 0.065→0.029,下降 55.4%;rendering 0.067→0.058,下降 13.4%。这是 patch discriminator 的直接证据,但公开 ImageDiscriminator 使用额外层和 adaptive max pooling,不是仅替换相同网络的末端平均,比较还混有 receptive field 和容量差异。

原 Table 4 · Loss 与真实数据适配消融;测试仍为 synthetic
方法 / 配置Diffuse ↓Normal ↓Roughness ↓Specular ↓Rendering ↓
L10.1620.1470.3350.1840.134
Lsup0.0730.1220.2530.0840.088
Lunsup0.1330.1120.2740.1190.128
L (synth)0.0170.0300.0290.0140.058
L (real)0.0220.0330.0430.0220.064

L1→Lsup:加入 structural loss 后五项更好。Lunsup alone:对比 Lsup,只有 normal 稍低(0.112 vs 0.122),其它都更差,说明 GAN 材质先验不能替代配对数值监督。Full synthetic:五项均最好。

Full real 不是“真实域误差”:该行仍在 synthetic test 评估,指训练加入真实图片。相对 full synthetic,diffuse 0.017→0.022(+29.4%)、normal +10.0%、roughness +48.3%、specular +57.1%、rendering +10.3%。绝对误差增加较小,但相对变化并非全部可忽略。“牺牲一点 synthetic 换真实域泛化”是作者的解释;真实域增益只有 Figure 8 的定性支持。

跨表不一致:Table 3 的 +Skip 和 Table 4 的 Lsup 前四项完全相同(0.073 / 0.122 / 0.253 / 0.084),Rendering 却分别为 0.073 与 0.088。正文没有解释是否运行、renderer 或设置不同。这里保留两个原值并标明待核实,不擅自选一个“修正”。

仍缺的消融

14 · 官方代码审计:能直接复现到哪一步

当前主分支固定在 4b4c009ecaaa41ababce28c83c600187b2db928d,最后提交 2023-11-03,主分支 28 commits。2021-07-23 的论文同期仓库只有 README、LICENSE 与图片;2021-11 才加入模型和部分 trainer。旧 trainer 尚不完整,不能作为完整原始训练代码。当前代码仍明显不同于 v1 方法。[C]

逐项可验证的复现边界
项源码事实对使用者的影响
Backbone直接 import resnet50 as resnet;2021 历史模型同样如此不是论文写的 ResNet-101
无标签 real pathreal DataLoader 可构造;run_epoch 只迭代 synth;forward_batch(real=True) 直接 raise NotImplementedError--train-real 并未实现论文 domain adaptation,缺陷不应隐藏
README 训练命令没有带 --train-adversarial;该选项默认 false照 README 的最短命令不会启用 GAN
GAN 预热G adversarial 从 step 300000 起;paper 总训练 250000只把总步数改成论文值仍可能全程没有 G adversarial 信号
训练 objectiveLSGAN、0.015、0.88、额外全 tensor std;不是论文 logGAN +0.2/+0.84不能把当前脚本给出的数字当论文 loss 复现
推理入口README 引用 eval.py,但固定树中不存在推理命令不完整;没有已验证可下载的官方 pretrained checkpoint 链接
依赖入口README 指 requirements.txt,固定树中不存在没有依赖锁定;库 API 和默认值需要重新核实
任意长宽F.interpolate(x, feat.shape[-2]) 传入单个整数,把两维都设成 feature height非方形输入的 RGB skip 与特征宽度可不匹配;论文的 arbitrary size 不等于该实现支持任意长宽比
输出物理有效性各 head clamp [-1,1],无 normal normalization、能量守恒或 diffuse/specular 约束渲染前应做约定一致的解码与验证
验证随机性SurfaceDataset 每次访问随机取 render,test loader 也用该类即使 shuffle=False,验证输入仍可变;没有显式 seed 控制
指标训练/验证只算 map L1、RMSE 和 denormalized RMSE没有五光位 rendering RMSE 或论文自然光评测
数据固定目录名和 map PNG 约定;PicturesDataset 只取 *.png1120 真实样本名单、split、预渲染脚本未随代码提供
相对路径SurfaceDataset 把 iterdir 已返回的带目录路径再与 dset_dir 拼接相对 dataset 路径可能重复前缀;绝对路径通常避免此问题,需 smoke test

两个容易让复现数字失真的实现细节

MS-SSIM 聚合:当前代码构造五尺度对比项和 similarity,最后写 prod(pow1[:-1] * pow2[-1])。若每尺度已归约成标量,最后一尺度 similarity 被广播乘入前四项,最终其幂出现四次,而通常的多尺度乘积只乘一次:

\[S_{\mathrm{usual}}=s_{5}^{w_{5}}\prod_{j=1}^{4}c_{j}^{w_{j}},\qquad \tilde S_{\mathrm{code}}=s_{5}^{4w_{5}}\prod_{j=1}^{4}c_{j}^{w_{j}}.\]

代码还在 loss 路径把 similarity / contrast 分别做 (x+1)/2,注释自己说明这不符合原始定义,用于防止 fractional power 的 NaN。这里只确认计算语义,不断言论文实际训练采用相同代码或已量化影响。独立算术例子中,末尺度 s=0.8、w=0.1333,其额外比值是约 0.9146,说明不能把它当标准库 MS-SSIM 无差别替换。

平均 patch 后取 loss 与平均各 patch loss:论文叙述可能让人先平均预测,再平方或取 log;实现用逐 patch MSE。对平方形式:

\[\mathbb E_{q}(D_{q}-1)^{2}=(\mathbb E_{q}D_{q}-1)^{2}+\operatorname{Var}_{q}(D_{q}).\]

逐 patch MSE 额外惩罚 patch 间方差,不能由“都叫 PatchGAN”忽略这个区别。没有 sigmoid 的 score 也不能称为概率。

训练循环的其它注意点

当前 synthetic loader 由 Accelerate prepare,real loader 没纳入实际循环;代码 resume 从 checkpoint 目录名抽 epoch。每轮都跑验证并记录 tensorboard;没有固定 LR scheduler 或显式混合精度设置。D 更新用 fake.detach(),G 更新时通过 D 回传,但没有显式冻结 D 参数,产生的 D 梯度会在下次 D 更新前清零;这是额外计算,不自动等于 D 被 G optimizer 更新。

MIT LICENSE 覆盖仓库代码;图像、Substance 材质、DTD 与预训练 backbone 仍应各自核对来源约定。本次下载与静态阅读官方代码,没有运行其训练、安装或推理入口。

15 · 复现计划与本次独立检查

先决定复现对象:论文 ResNet-101/log-GAN/真实适配,还是公开 ResNet-50/LSGAN/synthetic-only 实现。两者不是同一个 baseline;建议命名为“paper-described configuration”和“public-code configuration”,并单列差异。修复后的实现属于研究者改版,不能伪装成原作者结果。

  1. 固定 paper hash、代码 commit、数据 split 与 renderer;保存完整命令、依赖版本、seed 和 checkpoint hash
  2. 补齐 README 缺失的依赖及推理入口,只对确认的代码路径做 smoke test,不执行任何未知 checkpoint 反序列化
  3. 验证 square / nonsquare、不同尺寸、padding、normal vector norm、roughness 范围、specular 颜色和 gamma 约定
  4. 把 L1、标准 MS-SSIM、当前 MS-SSIM、std term、logGAN、LSGAN 分别实现成可切换组件,测试梯度方向
  5. 先跑 synthetic 配对训练,再加入明确的 real sampling 路径;检查 D 是否通过输入域捷径区分真假
  6. 复现原表时按 flash / natural 设置分开,natural r/s 平均规则和五光位 RMSE 聚合必须固定
  7. 真实测试除 qualitative 展示外,采集多光位照片、参考 BRDF 或可核实 geometry,以评估“好看但错误”的 maps

本次仅用独立、重新写的普通算术做以下检查,没有导入作者 Python:六层卷积输出 14² 与 receptive field 142;四输出共 10 通道、conditional D 13 通道;MS-SSIM 广播重复因子;patch MSE 分解;[-1,1] 与 [0,1] 的 RMSE 线性缩放;所有主表相对变化。它们验证解读自洽,不等于模型复现。

\[\operatorname{RMSE}(\hat M_{[-1,1]},M_{[-1,1]})=2\,\operatorname{RMSE}(\hat M_{[0,1]},M_{[0,1]}).\]

代码同时记录 normalized 与 unnormalized RMSE,若选错列,误差会恰好差两倍。论文主文未把这一实现选择说清,不能仅靠接近的小数推定复现成功。

16 · Reviewer 视角

有说服力的地方

四类材质图共享 encoder/decoder,独立 head 结构简洁;输入图 skip 提供细节通路;PatchGAN 对局部结构与多图参数的统计关系有针对性。主 synthetic 数值和 patch-vs-image 消融都给出一致改善,尤其 roughness/specular 大幅降低。方法不依赖测试时优化,作为快速 material-map estimator 的系统方向有价值。

核心证据缺口

总体应把它看作有清晰思路和 synthetic 证据的 conditional GAN 材质估计系统,而不是已经闭合真实世界物理恢复与开源复现两条链的通用方法。仓库的不足不能反推论文实验必然无效,但足以要求任何复现报告明确其版本和修订。

优先补的三类实验

第一,保持 backbone、训练数据、GPU budget 一致,比较 logGAN / LSGAN、image / patch、带 / 不带 RGB 条件的判别器。第二,完整量化 real adaptation 的收益与 synthetic trade-off,包含 withheld material identities、按类别结果和 confidence interval。第三,用多光照和不同 camera view 的重渲染验证材质图,而不是单输入图复原。

17 · 对 Procedural Material Generation 的研究延伸

本节均为进一步研究设想。SurfaceNet 输出的是像素材质 maps,没有生成 SBS/SBSAR、节点图、shader program 或程序参数;没有 graph validity、compiler、DiffMat、renderer-in-the-loop 搜索或修复。它可作为 PMG 的观测解析器和局部材质 prior,不能直接被当作程序生成器。

方向一:估计 maps 作为候选约束,而非唯一真值

输入照片先得到四图估计,再用程序图 G、参数 theta 生成材质 maps,由 renderer R 在多光照/多视角下匹配。由于单图歧义,给各 map、区域分配置信度,不让某张错误但锐利的 normal 主导整个图搜索:

\[\min_{G,\theta,L,C}\lambda_{I}d(R(G,\theta,L,C),I^{\ast})+\sum_{k}w_{k}d_{k}(B_{k}(G,\theta),\hat M_{k})+\lambda_{\mathrm{valid}}\mathcal V(G)+\lambda_{\mathrm{complex}}\Omega(G).\]

Bk 是程序执行得到的第 k 张参数图,V 检查节点类型/端口/可执行性,Omega 约束图复杂度和 bitmap 依赖。只有 renderer 能解释图像,不意味着图拓扑真实;应同时报告重渲染、可编辑性、图大小、重复结构和未见光照表现。

方向二:把 PatchGAN 放到程序输出空间

判别器可看程序执行后的联合 diffuse/normal/roughness/specular patch,作为局部材质合法性评分。但不能把对抗 score 当真实物理质量的标尺;程序可能通过 checkerboard、过强对比或频率偏置钻 reward 漏洞。需要保留参数监督、正常范围、normal integrability 或多光照渲染损失。

最小可检验实验:同一 graph grammar 下比较 pixel-only、pixel+joint-map patch prior、pixel+renderer、pixel+两者。测试在未见 lighting 下的误差、图执行率、结构编辑一致性和节点复杂度;控制搜索预算,避免把更多计算当成方法收益。

方向三:显式处理 RGB 条件的域捷径

当前 conditional D 的正例仅在 synthetic 域,可能把域识别与材质真假混在一起。可以比较三种判别器:只看联合 maps、看 photometric-normalized RGB+maps、对 synthetic/real 做域均衡或域不变特征。还可以通过 renderer 生成与真实输入匹配的候选正例,但必须处理错误光照和相机估计,不能自称 ground truth。

一个诊断实验是固定 maps,只替换 input image 的风格/曝光,观察判别 score 是否大变;如果是,D 可能利用 RGB 域捷径而不是材质质量。再固定 input,扰动 roughness、法线方向或 specular,测试它是否真的对物理相关错误敏感。

方向四:多尺度一致性与无缝程序纹理

SurfaceNet 的全卷积泛化关注局部细节,但程序材质还要求周期边界、方向性、尺度和跨 tile 一致。可以让同一个程序在不同分辨率与裁剪下执行,要求估计/生成 maps 在对应区域一致;另加 tile edge continuity 约束。需要把真实结构尺度和像素纹理尺度分开,避免模型把一块大砖当成许多小砖。

\[\mathcal L_{\mathrm{scale}}=\sum_{s}d\!\left(\operatorname{Down}_{s}(B(G,\theta)),B_{s}(G,\theta)\right),\qquad \mathcal L_{\mathrm{tile}}=d(B_{\mathrm{left}},B_{\mathrm{right}})+d(B_{\mathrm{top}},B_{\mathrm{bottom}}).\]

上式是研究目标草案,不是论文 loss。对于非周期材质应关闭 tile 约束,否则会抹除合理的全局布局。实验分别报告 tileable 与非 tileable 子集,别把强制周期化算成所有材质的改善。

方向五:从单点估计转向不确定性驱动采集

单图 r/s 歧义可用模型 ensemble、输入曝光扰动一致性或校准误差估计标出高不确定区域;然后选择一张最有信息的新 flash 位置,而不是盲目生成更多“好看”候选。对 PMG,只有当新增照片能缩小程序参数候选集合时,采集才真正有效。

推荐先建立一个小而严格的真实材质多光照验证集,测试 SurfaceNet maps 是否有助于程序搜索减少迭代、降低 bitmap 依赖和增强可编辑性。若结果只改善输入图相似度却恶化新光照,应回到物理验证与不确定性建模,而非继续提高 PatchGAN 权重。

18 · 来源、归档建议与未解决事项

  1. [P] 固定论文:arXiv v1 PDF;对应 HTML;官方 source archive。固定 PDF 全部 9 页已读,4 表与8图完整覆盖。
  2. [O] 作者项目页:SurfaceNet;官方 poster。poster 的结果标题误写成真实/自然光,但数值对应主文 synthetic flash;其中 0.50 / 0062 的写法亦有排版问题,所以全部数字优先以固定论文为准。
  3. [V] 正式会议索引:CVF ICCV 2021 页面。索引记录可检索,直接页面本次返回403;使用作者与 arXiv 一手来源完成正文阅读,没有访问私有馆藏。
  4. [R] DOI 注册元数据:Crossref 文章记录,publisher=IEEE、2021-10、注册页码12820–12828;与 CVF 页码并列保存。
  5. [C] 官方代码固定版本:完整仓库快照;generator;discriminators;trainer;losses。

原 note 保留:全部 YAML、作者链接、BibTeX、旧图链接和用户 ResNet-101 / ASPP 笔记均保持原字节前缀。追加说明应补 ICCV 2021、文章 DOI、project page;主题 diffusion models 建议后续复核,不静默删除。图像/3D 等既有分类可保留并说明主要输出是二维 SVBRDF buffers。

不能声称完成的内容:未取得正文引用的独立 supplementary;没有公开代码中缺失的训练真实域流程、推理入口、依赖文件与可核实 checkpoint;没有模型训练/推理实测;没有实际浏览器布局/MathJax 渲染验收。全部 8 幅图使用下载解码且与官方 source archive 字节一致的联网原图,离线阅读需要网络可用或后续获准做资源本地化。