主页:https://ibrnet.github.io/
论文:https://arxiv.org/abs/2102.13090
解读:
解读:
BV1t3411J7d3 (IBRNet)
这个UP还讲了 MVSNeRF ,一个后来的更好的稀疏视角NeRF
BV1G3411M7Ko (MVSNeRF)
在MVSNeRF里面有做对比试验,IBRNet在新场景上微调的能力太弱(又慢又不收敛)
记得后面去仔细看看MVSNeRF
看这篇主要是想看看他是怎么融合多视角信息的,所谓的均值-方差池化到底是什么东西。
他计算体密度的思路很有意思,处于表面上的点 更有可能在 多视角 下显现出 局部外观的一致性。所以,可以用 检查多视角特征的一致性的方式 来推理出 体密度。
体密度的获取比较麻烦,简单来说就是把该点所有视角的图片特征 { f i } i = 1 N ∈ R d \left \{ \mathbf{f}_{i}\right\}_{i=1}^{N} \in \mathbb{R}^{d} {fi}i=1N∈Rd (拼接上均值 μ ∈ R d \boldsymbol{\mu} \in \mathbb{R}^{d} μ∈Rd 和 方差 v ∈ R d \mathbf{v} \in \mathbb{R}^{d} v∈Rd )过一遍 MLP,得到多视角感知特征 { f i ′ } i = 1 N ∈ R d \left \{ \mathbf{f}_{i}^{\prime}\right\}_{i=1}^{N}\in \mathbb{R}^{d} {fi′}i=1N∈Rd 和权重 { w i } i = 1 N ∈ [ 0 , 1 ] \left\{w_{i}\right\}_{i=1}^{N}\in [0,1] {wi}i=1N∈[0,1] 。做加权和(池化),再经过一个 MLP 得到该点的 体密度特征 f σ ∈ R d σ \mathbf{f}_{\sigma} \in \mathbb{R}^{d_{\sigma}} fσ∈Rdσ 。然后把同一条射线上的所有点的 体密度特征 { f σ } \{\mathbf{f}_{\sigma} \} {fσ} 输入一个 transformer ,得到它们的 体密度。
颜色是靠现有颜色的加权和。预测一个权重,用 输入图像 上的投影位置的颜色 做 加权和。
这个图只是说明他在渲染时,用了个 transformer ,用于计算体密度,具体还得看下面那张更详细的图
我们观察到,处于表面上的点 更有可能在 多视角 下显现出 局部外观的一致性。
所以,可以用 检查多视角特征的一致性的方式 来推理出 体密度。
一种可能的方案是,类似PointNet [52] ,输入多视角的特征,然后把 特征的均值方差 输入 MLP 计算 权重,然后根据权重进行 全局池化(就是加权平均)。
(以下用 { f i } i = 1 N ∈ R d \left \{ \mathbf{f}_{i}\right\}_{i=1}^{N} \in \mathbb{R}^{d} {fi}i=1N∈Rd 表示某个点的多视角特征)
具体来说,我们先从多视角特征中 { f i } i = 1 N \left \{ \mathbf{f}_{i}\right\}_{i=1}^{N} {fi}i=1N 中计算 per-element 的 均值 μ ∈ R d \boldsymbol{\mu} \in \mathbb{R}^{d} μ∈Rd 和 方差 v ∈ R d \mathbf{v} \in \mathbb{R}^{d} v∈Rd ,以捕获全局信息。然后,把每个 f i \mathbf{f}_i fi 与 μ \boldsymbol{\mu} μ 和 v \mathbf{v} v 连接起来,作为特征(这样就把全局信息和局部信息拼接到一起了)。
把拼接后的特征,输入一个共享的小 MLP 中,该 MLP 每次读入一个连接后特征 ( f i , μ , v ) (\mathbf{f}_i,\boldsymbol{\mu},\mathbf{v}) (fi,μ,v) ,输出一个多视图感知特征 f i ′ ∈ R d \mathbf{f}_{i}^{\prime}\in \mathbb{R}^{d} fi′∈Rd 和一个 权重 w i ∈ [ 0 , 1 ] w_i\in [0,1] wi∈[0,1]
然后我们将 { f i ′ } i = 1 N \left \{ \mathbf{f}_{i}^{\prime}\right\}_{i=1}^{N} {fi′}i=1N 池化成一个向量,经过一个 MLP ,得到 该点的体密度特征 f σ ∈ R d σ \mathbf{f}_{\sigma} \in \mathbb{R}^{d_{\sigma}} fσ∈Rdσ ,这个 f σ \mathbf{f}_\sigma fσ 后续会和该射线上的其他点一起送入一个 transformer ,计算出每个点的体密度。
池化的方式是,用 { w i } i = 1 N \left\{w_{i}\right\}_{i=1}^{N} {wi}i=1N 对 { f i ′ } i = 1 N \left \{ \mathbf{f}_{i}^{\prime}\right\}_{i=1}^{N} {fi′}i=1N 求加权平均。
(池化应该就是这么简单,不过原文还提到了方差也会参与池化,但是没讲清楚,我严重怀疑是他写嗨了手滑了打错了,方差应该就是只在计算权重和特征的时候用到了。如果实在不放心,后面去看看 PointNet 里面的池化是怎么用方差的,再确认一下,说不定方差真的要参与池化)
原文如下
We pool these new features { f i ′ } i = 1 N \left \{ \mathbf{f}_{i}^{\prime}\right\}_{i=1}^{N} {fi′}i=1N by computing their weighted average and variance using weights { w i } i = 1 N \left\{w_{i}\right\}_{i=1}^{N} {wi}i=1N