DiLightNet
SIGGRAPH 2024 论文:用 Radiance Hints 光照提示图,精准控制扩散模型生成
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
SIGGRAPH 2024 论文:用 Radiance Hints 光照提示图,精准控制扩散模型生成
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2024年的电商摄影圈里流传着一个让无数人夜不能寐的传言:某国际品牌用 AI 生成了一张产品主图,投放市场后引发了消费者的广泛投诉——"图片里的金属反光位置和实际产品不一样"。这听起来像是 P 图翻车,但深究下去,暴露的其实是整个 AI 图像生成领域的根本矛盾:扩散模型能生成惊艳的画面,却控制不了光从哪里来。
这个矛盾困扰了研究者很久。文字 prompt 可以描述"一个科幻战士",但很难精确说"主光源在左上方45度,强度中等,表面呈现中等粗糙度的金属反射"。传统解决办法要么需要精确的3D建模(工业级光栅渲染管线,门槛极高),要么依赖真人摄影师的打光经验(无法迁移到虚拟场景)。
DiLightNet 就是在这个背景下诞生的。它来自浙江大学 CAD&CG 国家重点实验室、微软亚洲研究院、威廉与玛丽学院和清华大学的联合团队,发表在 SIGGRAPH 2024 顶级学术会议上,截止目前已被引用超过 106 次。
DiLightNet 的核心创新叫 Radiance Hints(光照提示图)——一种用视觉而非文字来控制光线的全新方法。
具体来说,Radiance Hints 并不是精确的几何信息,而是一种"粗略的视觉引导":把目标物体用一种假想的均匀材质包裹起来,在目标光照下渲染出来。这种渲染图看起来像是一个轮廓清晰但材质单一的雕塑,它告诉扩散模型"光从哪个方向来、物体的立体感应该是什么样子",但不规定具体是什么材质或什么颜色。
这样做有深刻的洞察:扩散模型只需要方向性的引导,不需要精确的物理数据。模型不需要知道"这里有一个立方体、边长2米",只需要知道"这个角落应该是亮的、那个角落应该是暗的"。
DiLightNet 的工作流程分为三个阶段:
第一阶段:生成临时图像(Provisional Image) 使用普通的 Stable Diffusion 模型,根据文本 prompt 生成一张图。这个阶段完全不受控制,AI 自由发挥,只要内容符合文字描述就行。
第二阶段:前景重打光(DiLightNet 核心) 这是整个pipeline的技术心脏。首先,用 DUSt3R(另一种深度估计算法)从临时图像中推断出前景物体的粗糙几何形状;然后,在粗糙几何上按照目标光照渲染 Radiance Hints;最后,将 Radiance Hints 和临时图像一起输入 DiLightNet ControlNet,生成符合目标光照的前景图像。
关键细节在于:DiLightNet 并不是简单地"替换"临时图像的光照,而是通过神经纹理编码(Neural Texture Encoding)技术,将临时图像的纹理细节(颜色、图案)与 Radiance Hints 的几何光影信息相乘融合,从而同时保留原有纹理和控制光照。
第三阶段:背景重合成 前景调整好了,但背景还是原来临时图像的弱光背景,会和新的光照格格不入。因此需要再次调用扩散模型,参照前景的光照信息重绘背景,使整个画面光影一致。
DiLightNet 采用了典型的学术研究代码风格,以 Python 为核心,主要依赖:
| 依赖库 | 作用 |
|---|---|
| Diffusers | 加载 Stable Diffusion ControlNet 流水线 |
| Transformers | 模型架构支持 |
| Accelerate | 分布式训练加速 |
| bpy / Blender | Radiance Hints 的离线渲染(GPU 渲染管线) |
| DUSt3R | 单目深度估计和相机参数推断 |
| rembg | 前景/背景分离(用于自动生成 mask) |
| Gradio | Web 交互界面 |
| trimesh | 3D 网格处理 |
| OpenCV | 图像处理 |
从架构上说,DiLightNet 本质上是一个 SD 2.1 + ControlNet 的变体,核心是一个 16 通道的 NeuralTexture ControlNet,输入通道从标准的 3 通道扩展到:3通道临时图像 + 1通道mask + 12通道Radiance Hints(3个diffuse通道 + 9个不同粗糙度的specular通道)。
项目提供了两种使用方式:
Gradio WebUI(gradio_app.py)适合交互式探索。界面分三步:输入图像 → 背景抠图 → 生成光照效果。界面上可以直接用 Stable Diffusion 生成输入图,也可以上传自己的照片。内置了 SAM(Segment Anything Model)选项用于精细抠图,以及 DUSt3R 的单目深度估计。
命令行工具(infer_img.py)适合批量处理和视频生成。可以通过 --env_map 参数指定 HDRI 环境光照图,批量生成不同光照下的一系列图像帧,最后合成为视频。核心调用的是 StableDiffusionControlNetPipeline,直接传入 Radiance Hints tensor 和 prompt。
两者的区别类似于"用 Photoshop 处理一张图"和"用脚本批量处理一万张图"——Gradio 适合研究验证,CLI 适合工程落地。
DiLightNet 并非完美无缺。实测中有几个值得关注的局限:
1. Blender 渲染依赖门槛高:Radiance Hints 必须通过 Blender(bpy)离线渲染得到,这就要求 bpy 的 Python 版本必须精确匹配(项目使用 Python 3.10 + Blender 3.6 LTS)。如果你的 conda 环境和这个版本冲突,部署过程会比较痛苦。
2. 光照只能从图像推断,不能任意指定:你必须先有一张目标光照下的参考图(或 HDRI),不能直接在 UI 里拖动"太阳位置滑块"。对于完全虚拟的场景(没有任何参考光照图),使用门槛还是比较高。
3. 粗糙几何推断误差:如果 DUSt3R 的深度估计出错(比如透明物体、镜面反射强的物体),Radiance Hints 的几何基础就会偏差,最终光照效果也不理想。
4. 性能开销较大:三阶段流水线意味着每次生成需要多次调用扩散模型。实测 RTX 3090 上单张图大约需要 30-60 秒,不适合实时应用。
DiLightNet 在 SIGGRAPH 2024 的发表,标志着 AI 图像生成从"能用文字描述光"迈向"能用图像精确控制光"的重要一步。它所提出的 Radiance Hints 范式——用"近似视觉引导"而非"精确物理数据"来控制生成模型——对后续研究有重要的启发意义。
从电商摄影的角度看,DiLightNet 的落地价值是明显的:摄影师可以先拍摄一张产品图,然后在不重新打光的情况下,生成任意光照条件下的变体图(工作室日光、阴天散射光、夕阳暖光……),大幅降低商业拍摄的成本。
从影视特效的角度看,它为虚拟制片提供了新的可能性:CG 角色可以在实拍现场光照下渲染,而不需要精确的 Lidar 扫描和离线路径追踪。
目前 GitHub 210 stars,HuggingFace 模型下载量可观,GitHub 全 117 个文件代码结构清晰、文档完善,属于学术开源项目中质量较高的一类。后续如果能进一步支持任意方向光照的直接指定(不依赖 HDRI 图像),将大大拓展其应用场景。
相关资源