多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Lighthouse 光照体积预测:基于多尺度光照体积的空间一致照明算法实战指南

Lighthouse 光照体积预测:基于多尺度光照体积的空间一致照明算法实战指南 Lighthouse 光照体积预测基于多尺度光照体积的空间一致照明算法实战指南【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research导读LighthouseSrinivasan et al., CVPR 2020是一套从窄基线立体 RGB 图像对出发、预测场景内任意 3D 位置入射光照的算法实现位于本仓库的 lighthouse/ 目录。本文以该目录下的 README.md 为骨架结合源码mlv.py、nets.py、train.py、interiornet_test.py深入讲解其核心思想、环境搭建、预训练模型推理与自训练流程帮助你理解多尺度 RGBA 光照体积的预测与体渲染合成原理并能在本地复现论文中的测试与训练管线。一、算法核心思想从立体图像对到光照体积Lighthouse 解决的核心问题是给定场景中某个 3D 位置预测该位置的入射光照incident illumination。与常见的光照估计方法如直接回归环境贴图不同它预测的是场景中任意位置的光照从而实现空间一致Spatially-Coherent的照明效果。从 README.md 的说明可以看到完整处理链路输入一对窄基线narrow-baseline立体 RGB 图像中间表示先由多平面图像Multiplane Image, MPI网络预测 RGBA 分层表示核心输出预测一个多尺度 RGBA 光照体积multiscale RGBA lighting volume渲染通过标准的体渲染volume rendering从光照体积中计算空间变化的照明。整体管线在 mlv.py 的MLV类中实现包含四个关键阶段infer_mpi()从参考图 源图 位姿构造平面扫描体Plane Sweep Volume, PSV再经 3D 编解码网络预测 MPIpredict_lighting_vol()将 MPI 重采样到以目标位置为中心的多尺度立方体cube光照体积cube_net_multires()定义于 nets.py用多分辨率 3D U-Net 细化各级光照立方体render_envmap()把立方体体积重采样到球面坐标系沿半径方向采样多层球壳最终合成环境贴图environment map。立体图像对 │ (窄基线 RGB 对) ▼ MPI 预测 (mpi_net 3D encoder-decoder) │ RGBA 分层表示 ▼ MPI → 多尺度光照立方体 (predict_lighting_vol) │ cube_res64, scale_factors[2,4,8,16] ▼ 多分辨率立方体细化 (cube_net_multires) │ 从粗到细、嵌套式细化 ▼ 球面重采样 体渲染 → 环境贴图 (render_envmap)二、环境安装与代码补全重要前提2.1 依赖版本仓库在 requirements.txt 中声明了运行依赖整体是一个基于 TensorFlow 1.x 的工程依赖版本要求用途tensorflow~1.11.0核心深度学习框架源码使用tensorflow.compat.v1numpy1.15.1数值计算与 .npz 数据读写matplotlib2.2.3输出环境贴图 PNGabsl-py0.6.1命令行 flag 解析app/flagsscipy1.1.0加载 VGG 预训练权重.mat2.2 必须手动补全的外部代码README.md 的 Installation 一节明确说明本工程依赖部分非 Apache 2 许可证的外部代码库需要在下载源码后手动补齐否则无法运行lighthouse/nets.py文件末尾注明需从PhotographicImageSynthesis项目的demo_1024p.py复制第 1048 行以补全判别器discriminator所需的辅助函数lighthouse/geometry/projector.py文件末尾注明需从 LLFF 项目的mpi_math.py复制第 6191 行补全体渲染homography warping、PSV 构造等核心函数。当前文件仅提供了tfmm()等占位 stub 以抑制 lint 错误。注意由于补全代码来自非 Apache 2 许可的代码库请自行评估许可合规性补全遇到困难时可联系作者README 中给出 barrongoogle.com 与 pratulberkeley.edu。三、运行预训练模型interiornet_test.py3.1 需要准备的文件运行测试前需要下载两类外部资源下载链接见 README.md预训练模型权重解压后放入 checkpoint 目录测试样例以.npz格式组织的 InteriorNet 测试集子集每个 npz 文件包含一次测试所需的全部输入。3.2 命令行用法测试脚本为 interiornet_test.py接受三个 flaginteriornet_test.pyFlag默认值说明--checkpoint_dir存放预训练 checkpoint 的目录--data_dirInteriorNet 测试数据集目录含 .npz 文件--output_dir输出环境贴图 PNG 的目录README 给出的示例命令请按实际目录结构修改路径python -m lighthouse.interiornet_test \ --checkpoint_dirlighthouse/model/ \ --data_dirlighthouse/testset/ \ --output_dirlighthouse/output/3.3 测试脚本背后的完整推理链路从源码看interiornet_test.py 构建的推理图完整复现了MPI → 光照体积 → 环境贴图三步定义占位符placeholder参考图ref_image、参考深度ref_depth、内参intrinsics、参考位姿ref_pose、源图像src_images、源位姿src_poses、环境位姿env_pose用pj.inv_depths(min_depth, max_depth, num_planes)在逆深度空间均匀采样 32 个 MPI 平面projector.py。测试时直接使用真实深度的 min/max 作为平面范围README 提示换用你自己的数据集时应改为估计的深度范围model.infer_mpi()预测 RGBA 分层rgba_layersmodel.predict_lighting_vol()生成多尺度光照立方体nets.cube_net_multires()细化立方体model.render_envmap()渲染环境贴图并将结果以{:05d}.png命名逐张写入输出目录。脚本按.npz后缀扫描--data_dir下的所有文件interiornet_test.py并从 checkpoint 目录恢复model.ckptinteriornet_test.py因此目录结构与文件名约定不可随意更改。3.4 推理阶段默认模型参数测试脚本与训练脚本共享同一套模型超参定义于 interiornet_test.py 与 train.py参数值含义batch_size1当前实现仅支持 batch size 1height/width240 / 320输入参考/源图像分辨率pxenv_height/env_width120 / 240环境贴图分辨率pxcube_res64光照立方体每边体素数theta_res/phi_res240 / 120环境贴图水平/垂直采样分辨率r_res128环境贴图渲染时球壳半径方向采样数scale_factors[2, 4, 8, 16]多尺度立方体相对最粗级的降采样倍数num_planes32MPI 平面数量depth_clip20.0最远深度限制最粗立方体范围需按数据集调整四、训练自己的模型4.1 训练入口与数据集训练入口为 train.pyREADME 建议先阅读 data_loader.py 了解 InteriorNet 数据组织方式。模型使用 InteriorNet 数据集训练数据加载器支持以下机制ViewSequence/ViewTrip把一段相机轨迹抽象为视图序列通过generate_trips()在帧间按min_gap~max_gap的偏移量生成四元组triplet 远处相机全景图并用random_subsequence()做随机降采样data_loader.pyprepare_training_set()依次过滤随机光照序列、小平移样本、过暗样本、倒退全景样本、过近场景样本再进入shuffle(1000000)batch(1)prefetch管线data_loader.pyformat_inputs()把原始 480×640 图像缩放到 240×320并相应缩放内参矩阵同时输出参考图/目标图/源图、位姿、深度与环境图监督信号data_loader.py。4.2 训练命令行参数train.py 定义四个 flagFlag默认值说明--vgg_model_fileVGG19 预训练权重文件imagenet-vgg-verydeep-19.mat路径--load_dir用于断点续训的 checkpoint 目录为空则从 experiment_dir 内恢复--data_dirInteriorNet 数据集目录--experiment_dir保存 summaries 与 checkpoints 的实验目录README 给出的训练示例命令python -m lighthouse.train \ --vgg_model_filelighthouse/model/imagenet-vgg-verydeep-19.mat \ --load_dir \ --data_dirlighthouse/data/InteriorNet/ \ --experiment_dirlighthouse/training/其中--vgg_model_file需要从 MatConvNet 预训练模型库下载imagenet-vgg-verydeep-19.mat论文中用于基于 VGG 特征的感知损失。若不需要感知损失可从 mlv.py 的build_train_graph()中看到渲染损失与环境贴图损失的权重均来自 VGG 特征因此训练时该文件为必填项train.py 中直接raise ValueError。4.3 训练超参数与阶段式损失调度train.py 中的训练超参数参数值说明random_seed0随机种子learning_rate1e-3Adam 学习率判别器使用beta10.0summary_freq20TensorBoard summary 写入频率checkpoint_freq500checkpoint 保存频率max_steps720000最大训练步数mlv.py 的build_train_graph()揭示了论文中的三阶段损失调度渲染损失全程对目标视角渲染图像施加基于 VGG 的感知损失render_loss并带参考视锥外像素的 mask环境贴图损失24 万步之后启用envmap_loss通过tf.where(tf.greater(global_step, 240000), envmap_loss, 0.0)控制即前期只训练 MPI 网络对抗损失69 万步之后启用对合成环境贴图施加基于 SPADE 判别器结构的对抗损失adv_loss/disc_loss实现细节见 nets.py 的discriminator()含谱归一化 power iteration同样通过tf.where(tf.greater(global_step, 690000), ...)调度。此外梯度处理采用denan把 NaN 梯度置零后按全局范数裁剪到 100mlv.py。训练过程中会输出丰富的 TensorBoard summary各级环境贴图与球壳合成、MPI 各平面的 RGB/Alpha/PSV、梯度范数、cube 边长与中心位置等mlv.py。五、核心模块源码结构速览文件职责关键内容mlv.py训练/推理主类MLVinfer_mpi、mpi_render_view、predict_lighting_vol、render_envmap、build_train_graph、train、format_network_inputnets.py网络结构mpi_netMPI 预测 3D U-Net、cube_net_multires多分辨率立方体细化、discriminatorSPADE 风格判别器geometry/projector.py几何/投影工具inv_depths逆深度采样、mpi_resample_cubeMPI→立方体重采样含三线性插值、spherical_cubevol_resample立方体→球面重采样、over_compositeover 合成、interleave_shells按半径重排球壳geometry/sampling.py采样工具三线性插值 gathertrilerp_gather等data_loader.pyInteriorNet 数据管线ViewSequence/ViewTrip、prepare_training_set/prepare_eval_set、format_inputs、相机参数与位姿解析interiornet_test.py预训练模型测试入口完整推理图 npz 批处理train.py训练入口超参数配置、VGG 权重加载、训练循环几个值得注意的源码实现细节多尺度嵌套立方体predict_lighting_vol()依据scale_factors计算各级立方体的边长cube_side_lengths [2*max_depth, 2*max_depth/2, ...]与嵌套索引cube_nest_inds粗级立方体中由更细级覆盖的区域在渲染环境贴图前会被scatter_nd生成的 mask 置零mlv.py 与 mlv.py从而避免重复贡献粗到细的级联输入cube_net_multires中每一级网络都接收上一级输出在对应子区域的切片上采样结果作为额外通道tf.concat([tf.stop_gradient(inputs[i]), i_outvol_next], axis-1)并通过 sigmoid 权重把预测体积与输入体积做凸组合nets.py预乘 Alpha 插值无论是 MPI→立方体还是立方体→球面重采样均对预乘 alpha 后的 RGBA 做三线性插值再反预乘还原projector.py这是避免边缘暗边的标准做法。六、硬件与显存约束README.md 的 Extra 一节给出了明确的硬件前提作者在训练与测试中使用的是NVIDIA Tesla V100 GPU且每个 minibatch 只有一个样本训练建议≥16 GB显存测试建议≥12 GB显存若在 16 GB 的 GPU 上训练可以尝试去掉多尺度表示中最细的一级体积。对应到源码即修改 train.py 中的scale_factors [2, 4, 8, 16]注释也提示try omitting 16 if you have GPU memory issues类似地depth_clip 20.0需要按数据集实际深度范围调整train.py。七、致谢与引用Lighthouse 的代码库隶属于 Google Research 的共享仓库README 提示不要为该仓库开 issue 跟踪 bug使用过程中如有问题可直接邮件联系作者。如果使用本代码请按以下 BibTeX 引用来自 README.mdarticle{Srinivasan2020, author {Pratul P. Srinivasan, Ben Mildenhall, Matthew Tancik, Jonathan T. Barron, Richard Tucker, Noah Snavely}, title {Lighthouse: Predicting Lighting Volumes for Spatially-Coherent Illumination}, journal {CVPR}, year {2020}, }结语Lighthouse 以MPI 中间表示 多尺度光照体积 体渲染的技术路线把二维图像输入转化为三维空间中任意位置的光照场为空间一致照明估计提供了可复现的完整工程。本文从环境搭建、外部代码补全、预训练模型推理、自训练参数到核心源码实现进行了系统梳理。需要特别留意两点一是两个外部非 Apache 许可代码块nets.py 与 geometry/projector.py 末尾的说明必须手动补全二是显存门槛较高低显存训练时应优先裁剪最细一级体积调整scale_factors并注意depth_clip需匹配自己的数据集深度范围。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表