Survey: compositional nerf
目录
<GIRAFFE>
Giraffe: Representing scenes as compositional generative neural feature fields目录
- 注:目前笔记在纸质打印版,待后续迁移电子版
编者按
- 用neural rendering “避开"了多物体lighting的显式建模
Motivation
overview
<OSF>
Object-centric neural scene rendering目录
编者按
- 相比于组成式,其实更关注多物体之间的 Lighting
- 物体 pose 都是真值
- 相比于 GIRAFFE,把多物体的光照、反射等处理地很好了;GIRAFFE 是用 neural rendering 逃避了显式地建模光照和多物体透射反射,这篇文章直面难题,类似 Neural Reflectance Field
- 看上去物体位置、id 都是真值,重点主要是建模好多物体的光照
Motivation
- OSF(object-centric neural scattering functions) models per-object light transport
- modeling dynamic scene:物体在移动/有无,光源在移动
Overview
- 数据集
- furniture-single
- furniture-random 25 个动态的场景,每个包含多个物体的随机 layout
- furniture-realisitc
📌 Ray Sampling
<Neural Scene Graphs>
Neural scene graphs for dynamic scenes目录
编者按
- 不是传统的 scene graph 中的 graph 的定义,事实上较为
hand-crafted
;- 额外把类别级表征模型也放到图里了,并且额外定义了一具体物体表征到类别级表征模型的边,事实上就是为了表达下某个物体属于某个类别(还有不同 scale),没有什么意义,这样的定义造成了全文的记号混乱,很多地方把类别级表征模型和具体物体表征混为一谈
- 用到的数据:
- tracking 信息;自动驾驶 tracking 数据集
- 视角信息,内外参
- 物体 3D bbox
- video
- 事实上做了什么
- 利用 KITTI 数据集的 3d bbox 和物体位置标注数据,以及图像,学习了几种类别(卡车、轿车、大巴)的 nerf-based 的 asset bank(即类别级 nerf 表征)
- 在有 3d bbox 和物体位置标注的情况下,完成了 动态前景+背景解耦、背景 inpainting 等
- 额外利用逆向神经渲染过程简单尝试了下最优化迭代 BEV 视角下的 bbox 实现检测
-
用到了 motion clue 来自监督地检测物体、追踪物体姿态?- 没有。有 3D bbox 真值、tracking 信息/物体位置信息真值
-
是否做到了重新光照?还是只是简单的同处移位?- 只是简单的同处移位。还是 nerf 设定的一贯问题:view-dependent 效应 现在 纯粹由物体本身决定(
baked-in
物体),没有环境光的解耦建模,和环境没关系
- 只是简单的同处移位。还是 nerf 设定的一贯问题:view-dependent 效应 现在 纯粹由物体本身决定(
Motivation
- 主要是为了 model dynamic scenes;graph 是显式的 graph
- task:做了什么
- 动态场景分解与操作
- 动态场景分解与操作
- 额外应用:
- ==通过逆向渲染进行物体检测==
Overview
Scene graph 定义:注意不是传统的 scene graph 中的 graph 的定义,事实上较为 hand-crafted
- $\mathcal{S}=\left< \mathcal{W}, C, F, L, E \right>$
- 根节点 $\mathcal{W}$,世界节点
- 相机节点 $C$
- 叶子节点 $F$, 包括静态 $F_{bckg}$ 和动态物体$\lbrace F_{\theta_c} \rbrace_{c=1}^{N_{class}}$等;其实就是指==类别级表征模型==,即同类别不同物体通过不同的子 latent 表达不同的 individual,类似 GRAF/PIGAN/AD-NERF/template-nerf
这个图可以看出,从物体的 latent code 节点 $L$ 到 类别级表征模型 $F$ 还有一个所谓的边连接,其实就是表达一下这个物体属于某个类别的含义,并没有其他的特别的边含义;- 共享的,因此同类别物体表达时拥有共同的 scale;为了含有不同 scale,计算一个非等比的 scaling $S_o$,这个信息也加到了上述所谓的从 $L$ 到 $F$ 的边上
- 叶子节点 $L$,是每个物体的具体表征 latent
- 边 $E$,不连接 或者 存在从顶点 u 到顶点 v 的 transformation
类别级表征模型:文中描述定义为"augmented nerf"/“增广 nerf”,其实就是类似 GRAF/CGAN 的条件 nerf/conditional nerf
- 其实就是背景模型用 single-nerf 表达,动态物体用类别级 nerf 表达,在坐标$x$上额外拼接一个 latent $l$,和 GRAF 一模一样
- 背景
- 动态物体
- 这里注意:
- 因为该文是直接在 KITTI 上训练的,事实上相当于就是在 KITTI 上训了一遍 car 的 GRAF 模型
- 每个物体有缩放、变换,所以坐标变换关系如下:
- $x=S_o T_o^w x, ; \text{with} ; x_o \in [-1, 1]$
- 其中 $S_o$ 就是 bbox 大小的倒数 –> 这样模型可以学到不依赖 size 的 canonical 表征
- 这里注意:
渲染框架
- 静态背景,为了提高效率,用了 multi-plane 采样,2.5D 表达
- Stereo magnification: Learning view synthesis using multiplane images. In SIGGRAPH, 2018.
- 初始($t=0$)相机坐标系下,near clip 和 far clip 之间定义与图像平面平行的 $N_s$ 个等距平面,用这样的方式定义的背景场景表征(而不像nerf那样的三维函数的模式)
- 对于任意一条光线,背景节点采样点是光线与逐个平面的交点
- 🤔 笔者思考:
- 这种等距平面的模式也许也适用于任意长度、任意延伸的路面表征;随着路面朝向的改变与长度延伸,不断地新增等距平面
- 需要考虑选取路面"隧道"样空间的哪些截面作为平面,与车道线垂直?平面原点定义为车道线点?如何考虑多车道?如何考虑多个车道之间空间的交界?
- 动态物体,计算 ray-box intersection,计算射线和 bbox 相交的区域
- AABB-ray intersection;
- A ray-box intersection algorithm and efficient dynamic voxel rendering. 2018
- 首先把光线变到物体的local坐标系,然后做efficient AABB test
- 计算每条射线方向和所有动态物体的 bbox 交点起终点,然后在起交点和终交点之间采样 $N_d$ 个点即为采样点
- 作者说很少量的几个等距点足够精确表达动态物体,并且渲染时间也很短
- AABB-ray intersection;
- 🤔 笔者思考:
- 考虑到任意组合场景的设定下,不同物体的采样方式、
渲染方式、缩放都会不太一样;- 如果渲染方式都不同,就很难render compositional scene了,因为体渲染组合场景是需要根据前后的三维遮挡关系来修正$T(t)$积分函数的
- 不同物体的model比较合适的统一的输入是rays_o、rays_d、near、far,而不是采样点;统一返回一组点的 $\sigma(t)$ 与 $\mathbf{c}(t)$ ;然后统一利用其进行体渲染
- 比如对于背景节点的采样点是和等距平面的交点
- 对于动态节点的采样点是光线和bbox交叉部分的采样点
- 考虑到任意组合场景的设定下,不同物体的采样方式、
Result
- 在额外有 3D bbox 真值、tracking 信息/物体位置信息真值时,单独分开表达物体还算是较为简单的
额外应用:利用逆向神经渲染进行物体检测:🚀 是我想要的思路!
- 在 BEV 下随机采一个初始 anchor box,然后只使用 $l_1$ 图像重建误差同时迭代最优化
anchor box position
、latent code
不足与 future work
- 数据集本身 scale 小(毕竟是自动驾驶数据集),物体都见不全,后面想做 large view extrapolation
Implementation
利用 tracking 的标注直接计算得变换矩阵
“a scene” 一个scene? 训练350k迭代/一整天
- 🤔 每次只训练一个scene?相当于就是一整段 KITTI sequence?
- 最多12个动态物体 -> 符合 KITTI 数据集里面的每一段的情况
等距平面 $N_s=6$,bbox交叉线采点数 $N_d=7$
扩充了物体的bbox,使得能够包含物体的阴影
线性学习率下降
可以使用KITTI原来人工的标注,也可以使用现有的tracking的方法:(tracking 即使 noisy 也可以)
PointRCNN
检测 +AB3DMOT
tracking- 或者 CenterTrack:只依赖于纯粹的未标注的视频序列