CGPC2024 第三日
机器学习 + 图形绘制
霍宇驰,ZJU
传统图形学:Modeling -> Rendering
知识驱动 vs. 数据驱动
AI -> PPL
Neural Rendering
- CV
- Machine Learning + Physics knowledge
- 照片分析
- 自由视角视频(体积视频)
- Graphics
- 采用机器学习取代部分图形流水线步骤
Scene
- Mesh -> Voxel + Neural(可微性更好)
- 基于向量的场景表达
- Mesh-based: Neural Material
- 基于点云的表达
- 基于网络的表达(NeRF)
Render
- AO
- DeepAO: 软阴影是个低频信号,运用神经网络预测AO信息
- 直接光照
- IBL
- Texture -> 神经网络方法预测直接光
- 间接光
- Caustic难以预测(集中)
- 多次弹射后的间接光较好预测
- 体积、次表面散射
- Human-related Rendering
Global Neural Render Pipeline
- 缺少场景中多物体交互
- Object-Oriented Pipeline
- NeLT: Neural Light Transfer
- 物体可交互性
- Caustics, transmission…
- 动态几何
- LightFormer: Light Encoding -> Light Gathering
Post-processing
- 对PT结果降噪
- 图像域降噪
- 路径域降噪
- 改进PT采样策略
- 神经采样函数(Neural Importance Sampling, TOG 2019)
- 强化学习引导
- 多估计器混合
- 时空样本重用
- 蓄水池(?
- 帧预测 - DLSS3.5
- 神经超分
- NVIDIA DLSS
- AMD FidelityFX
神经渲染:NeRF与3DGS 从隐式到显式
于涛,THU
讲的很好,深入浅出,理解率挺高的
NeRF - Neural Radiance Field
- 最初用于宏观-场景光场重建
- 远观:黑洞光场重建
- 微观:显微光场重建
前置概念
- 全光函数
- 定义:对某一点看到的物体集合
- ref: The Plenoptic Function and the Elements of Early Vision
- 光场
- 定义:空间中光线集合的完备表示
- 成像
- 反向追踪每个像素光线与场景交互(PT)
- 定义:从某一个角度对光场采样得到图像的过程
- 对全光函数的路径积分
- 光场重建
- 采样是离散的,但光场是连续的
- 从有限、离散的多个视角重建出整体光场
- 新视点合成
- 输入:多视角图像
- 过程:光场重建
- 结果:新视角渲染结果
定义
- 利用神经网络表示的空间辐射场
- 辐射场
- 设存在函数
描述空间光场 - 即
为密度值(alpha通道?)
- 设存在函数
- 神经网络
- 多层感知器(MLP)
- 任意分布数据的拟合
- 每个节点是一个非线性映射函数(神经元)
- 通过每个神经元参数的学习,可以实现任意非线性函数的拟合
- 即MLP拟合全光函数
- 优化:反向传播、
- 隐式表征
- 离散表征:像素插值
- 神经表征:MLP是连续函数,支持任意分辨率表征和重建
- 三维表征:Mesh -> 连续化、occupancy networks、DeepSDF、可微Volumetric Rendering
- 节省存储空间:存储Neural Network函数
- 渲染质量高、不依赖几何形状、可建模材质效果
实现
问题:得到NeRF,如何进行新视点合成?
- 渲染:不能对路径采样点直接积分(没有考虑遮挡关系)
- 方案:体渲染(Volume Rendering)
体渲染
透过率在单根光线
相乘得到,一旦遮挡 ( ),则总透过率结果为0 【NeRF二次采样没理解】
重建 = 优化
- 体渲染后得到 Rendering Loss
- 优化参数:神经网络权重
- 优化目标:与实拍像素一致
- 迭代训练神经网络,直到在所有输入视角可以与实拍一样
不同观测角对Shading影响
- 表面材质和环境光决定不同视角观测颜色不一致
- 引入观测方向影响
其他工作
- NeRF in the Wild: 网络照片多场景合成
- Block NeRF: 街景合成
- InstantNGP: 渲染速度提升
- Neuralangelo【没懂】
三维高斯溅射 3D-GS
- 更好的训练效率、更好的重建质量、更快速的渲染
3D-GS vs. NeRF
- 显式辐射场
- 使用体素、网络或点云离散集合表示空间辐射场
- 渲染速度快,但优化困难(Mesh)、渲染稀疏(点云)、分辨率低(体素)
- 隐式辐射场
- 使用神经网络拟合空间辐射场连续函数
- 支持任意分辨率渲染,但渲染速度慢,计算负载高,容易产生floaters
- 3D-GS 辐射场
- 综合结合光栅化和体渲染的优势
Pipeline
- 使用一组各向异性的3D高斯点实现非结构化辐射场表达
- GPU并行可微渲染,实现splatting和显式梯度计算
- 通过自适应密度控制添加或滤除3D高斯点,实现完整重建
定义 & 实现
3D-GS 点:四个属性
多元正态(高斯)分布函数
- 描述3D椭球的位置、缩放程度
- 协方差矩阵
- 多元正态分布的协方差矩阵是半正定矩阵
- 不透明度α
- 球谐函数(Spherical Harmonics, SH)
- 描述GS的各向异性颜色
- 定义在球坐标系中的一组基函数,描述球面上任意方向的光强
- SH阶数越高,系数越多,表达能力越强
- 问题:常常选用4阶SH,但4阶拟合并不是很好
- 空间中不同角度的观察变化一般不强烈,即使不太拟合可以大概描述
- 问题:阶数越高优化难度越高
- 源码先优化了0阶,然后再进行后续优化
- 初始化
- SfM稀疏点云初始化 3D-Gaussian
- 输入:一组静态图像
- SfM估计相机位姿,重建系数点云
- SDGS Init:位置(u),协方差,不透明度(α)、颜色(SH)
- 渲染:3D Gaussian Splatting
- 将三维高斯(椭球)投影到二维图像平面(椭圆)进行渲染
- 分块光栅化(Tiled-based Rasterizer)
- 分块
- Overlapping 检测
- 存储每个 GS 对应的所有 Tile
- 3D高斯点的 Key 由 Tile ID 和高斯点深度值构成,Value 为高斯球
- Radix-Sort 按深度排序,得到了 Tile 对于哪几个高斯点及其深度上的排序
- 每个像素顺序遍历相关高斯球,进行颜色混合(考虑不透明度)
- 效率高:做到了像素级并行计算
- CUDA: SIMT模型
- 每个 Tile 对应一个 Thread Block,访问 Shared Memory
- 每个 Thread Block 首先根据 Tile 信息把高斯数据存储到 Shared Memory
- 只读取一轮 Global Memory,之后计算颜色时只用访问 Shared Memory
- 参数优化
- 每次生成像素后可以直接构建Loss
- 图像差异化计算
- 密度控制
- 根据高斯点的梯度判断是否过于稀疏/密集
前沿方向
- NeRF 的成果挪到 3D-GS 上
- 4D-GS
- LLM + Diffusion Model + 3D-GS
- 3D-GS for MR
实际业务
- 移动端实时交互
- 透明物体、复杂结构
- 占用空间
- PSNR > 40dB
- 代码长度(App编译大小)
总结
大学时光确实是美好的。暑假又能抛开校内那些繁杂的行政杂物、落后现实的培养方案,也有时间去学些自己想学的东西,做些想做的事了。也正是沉重的现实引力让兴趣更显光芒。
我自己的微信签名是法国作家Alain Fournier的一段话的节选:
“即便到了今天,我们仍无法自动建模一只在水里游泳的、细节栩栩如生的老虎(…)
The bad news is that we have still a long way to go. The good news is that we have still a long way to go.”
这段话被引用于图形学的基础教材虎书中,用以解释封面的来历;如今,随着NeRF等技术的一系列发展,我们正逐渐接近这个不依赖艺术家和程序员而自动建模的目标。
往小里说,I have a dream,正如毛星云前辈所期盼的那样,期待中国游戏产业能够先进化,由《黑神话》开辟一条3A游戏工业化的道路,作为玩家,自然期待会享受到更多的国产作品。
往大里说,渲染和重建领域的很多学术问题尚未解决,学术界除了热门的AI+CG方向,传统图形学仍在不断前进,正需要科研人不断前行;除了学术之外,工业界仍在探索效率问题,尽管软硬件方面都陷入了一些品鉴,但从30FPS到90FPS,优化的道路漫漫无期。
前路漫漫,亦悲亦喜。