1. 从“手算”到“脑补”:Photometric Stereo的初心与瓶颈

大家好,我是老张,在三维视觉这个行当里摸爬滚打了十几年,从最早用相机围着物体拍一圈照片,到后来各种激光扫描仪,再到现在的各种AI算法,可以说把三维重建的“坑”和“甜头”都尝了个遍。今天想和大家深入聊聊一个特别有意思的技术——Photometric Stereo(光度立体视觉,简称PS),尤其是它这几年被深度学习“点化”之后,发生的翻天覆地的变化。咱们不扯那些高深莫测的公式,就用大白话,把我这些年实践中的体会和踩过的“坑”都分享出来。

先说说PS到底是干啥的。你可以把它想象成一个“用光影画画”的技术。传统方法是这样的:我把一个物体(比如一个陶瓷花瓶)固定好,用一个相机从同一个位置对着它拍。然后,我拿着一个手电筒,从不同的方向去照这个花瓶,每换一个方向就拍一张照片。因为光线方向变了,花瓶表面每个点的明暗也会跟着变。这些明暗变化里,其实就藏着这个点“朝向”的秘密——也就是它的表面法向量。知道了物体表面每一个像素点的法向量,我就能像拼图一样,把整个物体的三维形状给“算”出来。

这个方法听起来很巧妙,对吧?它确实很经典,也很有用。我早年做工业质检的时候,就用它来检测零件表面的微小划痕或凹陷,精度非常高。但是,传统PS有几个非常要命的“理想化”假设,就像给现实世界套上了一层紧身衣,稍微复杂一点就崩了。

第一个假设是“朗伯体”。啥是朗伯体?你可以想象成一张完全粗糙、不反光的毛毡。光线照上去,它会均匀地朝四面八方散射,所以从任何角度看,它的亮度都是一样的。现实中有这样的东西吗?很少。大部分物体,比如金属、塑料、上了釉的陶瓷,都有光泽,会反光,甚至像车漆那样有复杂的多层效果。用朗伯模型去套它们,就像用尺子去量水的形状,结果肯定不对。

第二个是“点光源”和“方向已知”。传统方法要求光源是来自无限远处的“平行光”(类似太阳光),而且每个光源的精确方向我必须提前知道(这叫光源标定)。在实际操作中,尤其是在工厂或者自然环境下,精确控制并标定多个光源的方向,是个非常繁琐且容易出错的体力活。光线稍微有点散射,或者标定有一点点误差,重建结果就可能差之千里。

第三个是“没有阴影和互反射”。这更理想化了。物体自身会有阴影吧?光线从一个点反射到另一个点(互反射)也会影响亮度吧?这些在传统模型里都很难处理。我印象很深,早年尝试重建一个内部结构复杂的金属件,因为内部光线来回反射,算出来的表面跟麻花似的,完全没法看。

所以,传统PS就像一个手艺精湛但规则死板的老匠人,在条件完美的实验室里能做出精品,但一旦放到光照混乱、材料未知的真实世界,就有点束手无策了。它的核心瓶颈就在于,那套基于物理的反射模型(比如经典的朗伯模型)太“脆”了,无法表达真实世界中千变万化的光影交互。我们急需一种更“聪明”、更“自适应”的方法。

2. 深度学习的“破局之刃”:从DPSN说起

大概在2017年前后,深度学习在计算机视觉领域已经是大杀四方了。我们这群搞三维重建的也在琢磨,能不能让神经网络来学学这个“从明暗到形状”的映射关系?直接把一堆物体在不同光照下的图片和它真实的3D形状(Ground Truth)喂给网络,让它自己去找规律。这个想法催生了深度学习PS的开山之作——DPSN(Deep Photometric Stereo Network)。

我第一次跑通DPSN的代码时,感觉就像打开了一扇新世界的大门。它干了一件特别“暴力”又特别有效的事:完全抛弃了预设的物理反射模型。论文作者的想法很直接——既然我们写不出一个能描述所有材料的完美反射方程,那就让神经网络这个“黑盒子”自己去学吧!网络的结构并不复杂,就是一个多层感知机(MLP),输入是某个像素点在N张不同光照图片中的亮度值(一个N维向量),输出直接就是这个像素点的三维法向量。

这里有个设计非常巧妙,也体现了研究者对实际问题的深刻理解:他们在网络中使用了 Dropout。通常Dropout是用来防止过拟合的,但在这里,作者用它来模拟光线被遮挡的情况。你想啊,现实中某个光源可能因为物体自身的凸起而被挡住,导致这个像素点在那张图里特别暗。传统方法遇到这种缺失数据就头疼。而DPSN在训练时随机“丢掉”一部分输入(置为零),强迫网络学会在信息不完整的情况下做出稳健的预测。这个操作让我拍案叫绝,它把工程上的“坑”直接转化成了训练策略。

当然,DPSN作为先驱,局限性也很明显。它需要大量的“成对数据”来训练,也就是大量“多光照图片 + 精确三维模型”的数据集。制作这样的数据集成本极高,需要精密的运动控制设备和三维扫描仪,这严重限制了它的应用范围。而且,它当时处理的是分辨率很低的图片(比如64x64),对于高精度的工业场景来说还不够用。但无论如何,DPSN证明了用数据驱动的方式绕过复杂物理建模是可行的,这条路走通了。

3. 摆脱“监督”:无监督与弱监督学习的崛起

DPSN的成功带来了新问题:数据从哪里来?难道每个新场景、新材料都要去制作昂贵的数据集吗?显然不现实。于是,研究者们开始想,能不能让网络自己教自己?这就引向了无监督或弱监督学习的路径。这里我重点说一下我觉得非常精彩的IRPS(Neural Inverse Rendering for General Reflectance Photometric Stereo)。

IRPS的思路充满了“循环自洽”的美感。它不再需要物体表面的真实法向量作为监督信号了。那它学什么呢?它学的是“重建图片”的能力。整个网络分成两大块:

  1. PSNet:负责从输入的多光照图片中,预测出物体表面的法向量和反射率参数。
  2. IRNet(逆渲染网络):它就像一个虚拟的渲染引擎。你给它PSNet预测出的法向量、反射率参数,以及已知的光源方向,它能用渲染方程“合成”出一张应该被观测到的图片。

核心的损失函数就是“合成图”和“真实输入图”的差异。如果PSNet预测的法向量和材质是准确的,那么IRNet合成出来的图片就应该和相机实际拍到的图片一模一样。网络通过不断减小这个“重建损失”来优化自己。这就像一个画家,通过对比自己临摹的作品和原画的差别,来修正自己对物体形状和质感的理解。

此外,IRPS还加入了一个聪明的约束:它用传统的最小二乘法PS(在假设朗伯体下)快速算出一个粗糙的法向量图,虽然不准,但大致方向是对的。这个粗糙结果作为“弱监督信号”,用来引导网络初期不要跑得太偏。我试过这个方法,对于那种带有复杂高光的塑料或金属物体,它的重建效果比纯传统方法好太多了,因为它内部的IRNet实际上学习到了一个比朗伯模型复杂得多的反射模型。

这种“逆渲染”的思想影响深远。它解决了数据标注的难题,让网络能利用海量无标签的多光照图像进行学习。更重要的是,它让网络具备了分解形状和材质的潜力,这对于后续的编辑、重光照等应用至关重要。从依赖“标准答案”到追求“自圆其说”,这是深度学习PS走向实用化的关键一步。

4. 架构进化:从像素到全局,从回归到分类

随着研究的深入,大家发现简单的多层感知机(MLP)处理整张图片效率低下,且难以捕捉像素间的空间关系。于是,更适合图像处理的卷积神经网络(CNN) 自然被引入了进来。PS-FCN 和 CNN-PS 就是两个非常具有代表性的架构创新,它们解决了不同层面的问题。

PS-FCN 的作者思考了一个很实际的问题:输入的光照图片数量必须是固定的吗?传统方法通常需要4张、6张等固定数量的图。但现实中,我可能有时有5张,有时有10张。PS-FCN通过一个巧妙的特征融合层解决了这个问题。它先用一个共享权重的CNN分别提取每张输入图像的特征,然后使用一个 Max-pooling(最大池化) 操作,把这些特征融合成一个。Max-pooling的好处是,它不管输入多少张图、顺序如何,总能提取出所有特征图里最显著的那个响应。这完美契合了PS的特性——对于物体表面的某个点,总会有某个特定方向的光源能把它照得最亮,这个最亮的信息对推断法向量最关键。

我特别喜欢论文里对融合后特征图的可视化。那些特征通道看起来并不是在识别边缘或纹理,而是在“响应”特定方向的法线。这直观地展示了网络是如何学会理解“形状”的。PS-FCN将PS框架完全带入了一个灵活、端到端的深度学习范式,处理速度和精度都上了一个台阶。

而 CNN-PS 则从另一个角度创新。作者认为,直接学习“像素亮度->法向量”的映射仍然比较难。他们设计了一个叫 “观测映射” 的预处理步骤。简单说,他们把每个像素点在所有光照下的亮度值,按照光源方向排列成一个球面上的分布图。这个分布图的模式,与物体表面的反射特性(BRDF)直接相关。然后,CNN的任务就变成了学习“观测映射的模式”到“法向量”的映射。这相当于把问题转化到了一个更规整、更易于学习的表达空间里。

更妙的是,CNN-PS还采用了多视角预测取平均的策略。他们把观测映射旋转多个角度,让CNN从不同“视角”去预测法向量,最后把结果平均起来。这大大提升了预测的鲁棒性,对于处理非凸表面(比如有凹陷的物体)特别有效。我在处理一些铸造件内部的凹陷缺陷时,就发现这种方法比单一预测要稳定得多。

5. 终极简化:让网络自己“找光”——自标定PS

上面提到的方法,大多还有一个前提:光源方向必须已知。这在实际部署中依然是个巨大的负担。能不能连光源标定这个步骤也省掉?让网络从一堆未知光照的图片中,同时猜出形状和光源方向?这听起来像是一个“鸡生蛋还是蛋生鸡”的循环问题,但深度学习还真给出了答案。这就是 SDPS-Net(Self-calibrating Deep Photometric Stereo Networks) 做的事情。

SDPS-Net的作者(也是PS-FCN的作者)设计了一个两阶段的网络,思路清晰又实用:

  1. 光源标定网络:这个网络的任务是,输入一堆图片,估计出每张图片对应的光源方向。但直接回归一个三维向量(方向)很难训练。作者把它转化成了一个分类问题。他们把天穹(光源可能来的所有方向)划分成很多个小格子,比如水平方向分36份,垂直方向分36份,总共1296个类别。网络的任务是判断光源来自哪个“格子”。为了避免类别太多,他们又把水平和垂直方向分开预测。这个设计非常工程化,大大降低了学习难度。
  2. 法向量回归网络:在估计出光源方向后,问题就退化成了已知光源的PS问题,这时就可以用类似PS-FCN的网络来预测法向量了。

整个网络是端到端一起训练的。损失函数包括光源分类的损失和法向量回归的损失。我尝试用一些网络上的商品展示图(通常有多个固定灯光但方向未知)跑过这个模型,效果令人惊喜。虽然绝对精度可能不如严格标定的系统,但对于很多对绝对尺度要求不高、只需要相对形状的应用(比如电商产品的3D展示、文物数字化),这几乎是一个“零配置”的解决方案。它把PS技术的使用门槛降到了最低:你只需要用手机或普通相机,从固定机位拍一组打灯的照片就行了,剩下的交给网络。

6. 实战指南:如何选择与上手现代深度学习PS

聊了这么多方法,可能你已经有点眼花缭乱了。在实际项目里,我们到底该怎么选呢?结合我这几年做项目的经验,给大家梳理一个简单的决策路径和上手建议。

首先,看你的数据和条件:

  • 如果你有精确的光源方向:那么选择面最广。从经典的 PS-FCN 开始是个好选择,它的代码比较成熟,社区支持较好,适合快速验证和获得一个不错的基线效果。
  • 如果你的物体材质特别复杂(强反光、各向异性):那么 IRPS 这类基于逆渲染的方法可能更合适,因为它内建了学习复杂反射模型的能力。不过它的训练和调参相对复杂一些。
  • 如果你只有图片,光源方向完全未知:SDPS-Net 几乎是唯一成熟的深度学习选择。可以先用它估计出光源和粗模,如果对精度要求极高,可以考虑用它的输出作为初始化,再用传统优化方法进行精修。
  • 如果你的数据量极少,无法训练新模型:可以关注一些预训练模型。现在不少工作都在向这个方向努力,旨在训练一个泛化能力强的“万能”PS网络。虽然离真正通用还有距离,但对于常见材质(塑料、陶瓷、布料)的物体,已经可以做到不错的零样本(zero-shot)重建。

其次,谈谈实操中的“坑”与技巧:

  1. 数据准备是关键:即使是无监督方法,也需要大量多光照图像。在采集时,尽量保证相机绝对静止,只改变光源。背景最好保持黑色或纯色,方便分割。图像数量越多、光源分布越均匀(覆盖半球各个方向),效果通常越好。
  2. 从开源代码和数据集开始:别急着自己从头写。上面提到的论文基本都开源了代码。像 DiLiGenT 和 PS-Blobby 是学术界常用的基准数据集,可以用来测试和熟悉流程。先用他们的数据跑通代码,理解输入输出格式。
  3. 注意输入归一化:图像的亮度值需要做归一化处理。通常不是简单的除以255,而是要考虑相机的响应曲线。一个实用的做法是,在场景中放一个纯白色的朗伯参考板(如硫酸钡板),拍摄它在同一组光照下的照片,用这些照片来校正输入图像,消除相机非线性响应的影响。这一步对提升重建质量至关重要,却容易被新手忽略。
  4. 后处理不可少:网络预测出的是法向量图,还不是我们最终需要的深度图或三维网格。你需要通过“积分”把法向量场转换成深度。这是一个不适定问题,特别是当法向量场存在噪声或不一致时。可以使用像 Frankot-Chellappa 算法这样的经典方法,或者一些基于深度学习的法向-深度转换网络。得到深度图后,再用 Marching Cubes 等算法生成网格。
  5. 硬件要求:训练这些网络,尤其是高分辨率图像,需要不错的GPU(显存建议8G以上)。但推理阶段的要求相对友好,很多模型在消费级显卡上就能实时或准实时运行。

深度学习给Photometric Stereo这门传统技术注入了新的生命力,让它从实验室的精密仪器,变成了有可能装在手机里、用在生产线上的实用工具。这个过程不是一蹴而就的,是一步步解决了数据依赖、未知反射、未知光源等一个又一个实际难题。现在回头看,这个演进之路特别像是一个“自动化”和“智能化”的过程:让机器自己学习物理规律,而不是让我们去艰难地编写和调试它。当然,现在的方法还远未完美,比如对极度光滑的镜面、透明物体、动态场景的处理依然挑战巨大。但这条路的方向已经清晰,剩下的就是不断优化和迭代了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐