【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化

news/2025/2/13 5:32:06/文章来源:https://www.cnblogs.com/UnderTurrets/p/18579069

Introduction


在计算机视觉三维重建中,求解3D场景的表示和定位给定的相机帧的相机位姿是两个非常重要的任务,这两个问题互为依赖,一方面,恢复3D场景的表示需要使用已知的相机位姿进行观察;另一方面,定位相机需要来自特征点的可靠对应。

错误的相机位姿会对重建的输出和性能产生一系列负面影响,包括:

  1. 图像合成质量下降

    • 当相机位姿不准确时,生成的视角合成图像可能会出现明显的畸变或模糊,导致最终图像的质量较差。
  2. 三维场景表示不准确

    • 错误的位姿会导致三维场景中的几何结构和深度信息的错误重建,使得模型无法正确理解场景的空间布局。
  3. 影像重叠和视差问题

    • 不准确的位姿可能会造成图像重叠区域的视差不一致,进而导致合成图像中的物体位置、大小等出现明显的不自然或错位现象。
  4. 优化过程的困难

    • 由于相机位姿的误差,优化算法(如Adam)可能会在优化过程中陷入局部最优解,无法收敛到正确的场景表示和相机位置。
  5. 训练效率降低

    • 不准确的相机位姿会使得训练过程变得更加复杂,模型需要更多的迭代才能调整出合理的场景表示,从而延长训练时间。
  6. 潜在的视觉伪影

    • 由于误差,合成图像可能出现视觉伪影(artifacts),如不连贯的阴影、错误的光照等,使得生成的图像看起来不真实。

红框是伪影,蓝框是错位。

在《3D Gaussian Splatting for Real-Time Radiance Field Rendering》发布后,很多重建方法都尝试在3D表征上进行创新,它们普遍使用预输入的相机位姿进行重建,而不同时考虑相机位姿的校准,这些预输入的相机位姿通常是由colmap软件估计得到的。此次介绍的两篇文章《BARF》和《HGSLoc》在进行场景重建的同时进行相机位姿的优化,它们使用一些来自不同视角的图像和这些图像的粗略位姿作为输入,并且在相机位姿优化的方法上做出了改进。

Approach

Planar Image Alignment(2D)

首先,BARF考虑2D的平面图像对齐问题。

$$
\begin{array}{c}
设\mathbf{x} \in \mathbb{R}^2为像素坐标系下的一个坐标,
\mathcal{W}: \mathbb{R}^2 \rightarrow \mathbb{R}^2 是与相机参数\mathbf{p}有关的几何变换,\
\mathcal{I}: \mathbb{R}^2 \rightarrow \mathbb{R}3是我们的图像生成过程(图像的3个通道,所以是\mathbb{R}2 \rightarrow \mathbb{R}^3),
\end{array}
$$

我们的目标是使得生成的图片与原图片尽可能地相似,这个联合优化的目标用最小二乘来表达,就是:

$$
\min {\mathbf{p}} \sum{\mathbf{x}}\left|\mathcal{I}{1}(\mathcal{W}(\mathbf{x} ; \mathbf{p}))-\mathcal{I}(\mathbf{x})\right|_{2}^{2}
$$

相机参数的维度可以记作

$$
\mathbf{p} \in \mathbb{R}^P
$$

这个最小二乘问题的基础迭代步骤可以记作:

$$
\Delta \mathbf{p}=-\mathbf{A}(\mathbf{x} ; \mathbf{p}) \sum_{\mathbf{x}} \mathbf{J}(\mathbf{x} ; \mathbf{p})^{\top}\left( \mathcal{I}{1}(\mathcal{W}(\mathbf{x} ; \mathbf{p})) - \mathcal{I}(\mathbf{x}) \right)
$$

其中,

$$
\begin{array}{c}
\mathbf{J}是从输出到待优化变量求导的雅克比矩阵,\mathcal{I}_2是给定的ground truth,\
\mathcal{I}_1是我们想要优化的。而\mathbf{A}(\mathbf{x} ; \mathbf{p})取决于我们选择的优化策略。
\end{array}
$$

$$
\mathbf{J}(\mathbf{x};\mathbf{p})=\frac{\partial\mathcal{I}_1(\mathcal{W}(\mathbf{x};\mathbf{p}))}{\partial\mathcal{W}(\mathbf{x};\mathbf{p})}\frac{\partial\mathcal{W}(\mathbf{x};\mathbf{p})}{\partial\mathbf{p}}
$$

残差:

$$
\begin{array}{c}
\mathbf{r}(\mathbf{x})=\mathcal{I}{2}(\mathbf{x}) - \mathcal{I}(\mathcal{W}(\mathbf{x} ; \mathbf{p}))\
有的资料中把\mathbf{J}看作是残差对待优化变量的导数,即,\frac{\partial\mathbf{r}}{\partial\mathbf{p}},因此,\Delta \mathbf{p}也可以写成:
\end{array}
$$

$$
\Delta \mathbf{p}=-\mathbf{A}(\mathbf{x} ; \mathbf{p}) \sum_{\mathbf{x}} \mathbf{J}(\mathbf{x} ; \mathbf{p})^{\top} \mathbf{r}(\mathbf{x})
$$

$$
\begin{array}{c}
如果选择一阶优化方法,\mathbf{A}就是一个标量,也就是学习率;\
如果选择二阶优化方法,有时\mathbf{A}(\mathbf{x};\mathbf{p})=(\sum_\mathbf{x}\mathbf{J}(\mathbf{x};\mathbf{p})\top\mathbf{J}(\mathbf{x};\mathbf{p})),这取决于具体的优化策略。
\end{array}
$$

以上是对这个最小二乘问题的概述。这种基于梯度的优化策略的核心在于输入信号是否足够平滑,否则,很容易陷入局部次优解。输入信号的平滑程度等价于:

$$
\frac{\partial\mathcal{I}(\mathbf{x})}{\partial\mathbf{x}},亦即图像梯度
$$

为了避免局部最优,通常在优化的前期对图像进行模糊处理。图像梯度通过数值差分方法得出,而并非解析的。

$$
\begin{array}{c}
BARF并没有采用模糊操作,它用神经网络作为\mathcal{I},优化目标就可以写成:\
\min_{\mathbf{p}i,\boldsymbol{\Theta}}\sumM\sum_\mathbf{x}\left|f(\mathcal{W}(\mathbf{x};\mathbf{p}_i);\boldsymbol{\Theta})-\mathcal{I}_i(\mathbf{x})\right|_22\
其中,f:\mathbb{R}^2 \rightarrow \mathbb{R}^3,\boldsymbol{\Theta}是网络的参数,M是图像个数。\
然后,图像梯度就变为可解析的\frac{\partial{f}(\mathbf{x})}{\partial\mathbf{x}},而不是数值差分的估计。
\end{array}
$$

通过操纵网络f,还可以对对齐的信号平滑度进行更原则性的控制,而不必依赖于图像的启发式模糊,从而使这些形式可推广到3D场景表示。稍后,将会介绍barf如何操作f对信号进行平滑度控制。

Neural Radiance Fields (3D)

接下来,BARF将以上过程拓展为3D,具体如下:

$$
\begin{array}{c}
多层感知机:f:\mathbb{R}^3 \rightarrow \mathbb{R}^4\
MLP参数:\boldsymbol{\Theta}\
3D点坐标:\mathbf{x} \in \mathbb{R}^3\
3D点坐标对应的颜色:\mathbf{c} \in \mathbb{R}^3\
体素密度:\sigma \in \mathbb{R}\
相机位姿变换:\mathcal{W},其有6个自由度{x,y,z,\phi,\theta,\psi},故\mathbf{p}\in \mathbb{R}^6\
且,[\mathbf{c};\sigma]^{\top}=f(\mathbf{x};\boldsymbol{\Theta})\
像素齐次坐标:\bar{\mathbf{u}}=[\mathbf{u};1]^{\top} \in \mathbb{R}^3,深度:z_i,\
\mathbf{x}_i=z_i\bar{\mathbf{u}}
\end{array}
$$

体渲染表达式:

$$
\begin{array}{c}
\hat{\mathcal{I}}(\mathbf{u})=\int_{z_{\mathrm{near}}}^{z_{\mathrm{far}}}T(\mathbf{u},z)\sigma(z\bar{\mathbf{u}})\mathbf{c}(z\bar{\mathbf{u}})\mathrm{d}z ,\
其中,z_{\mathrm{near}}和z_{\mathrm{far}}是感兴趣的深度上下限,\mathcal{I}仍然是\mathbb{R}^2 \rightarrow \mathbb{R}^3,\
表示这个像素坐标对应的RGB数值。\
T(\mathbf{u},z)=\exp\bigl(-\int_{z_{\mathrm{max}}}{z}\sigma(z\bar{\mathbf{u}})\mathrm{d}z^{\prime}\bigr)
\end{array}
$$

T对应3dgs中的透射率。这两个式子和3dgs的体渲染公式也是极为接近的:

$$
C_i=\sum_{n\leq N}c_n\cdot\alpha_n\cdot T_n,\text{ where }T_n=\prod_{m<n}(1-\alpha_m),\
\alpha_n=o_n\cdot\exp(-\sigma_n),\quad\sigma_n=\frac12\Delta_n\top\Sigma{\prime{-1}}\Delta_n.
$$

区别在于,3dgs中的T是通过累乘得出,体素密度则取决于椭球投影到平面的形状再乘以不透明度。而nerf中的颜色值和体素密度是通过MLP直接得出。

$$
\begin{array}{c}
令\mathbf{y}=[\mathbf{c};\sigma]^{\top}=f(\mathbf{x};\boldsymbol{\Theta})\
继续改写:\hat{\mathcal{I}}(\mathbf{u})=g\left(\mathbf{y}_1,\ldots,\mathbf{y}_N\right),g:\mathbb{R}^{4N} \rightarrow \mathbb{R}^3\
\hat{\mathcal{I}}(\mathbf{u};\mathbf{p})=g\Big(f(\mathcal{W}(z_1\bar{\mathbf{u}};\mathbf{p});\boldsymbol{\Theta}),\ldots,f(\mathcal{W}(z_N\bar{\mathbf{u}};\mathbf{p});\boldsymbol{\Theta})\Big),\mathcal{W}:\mathbb{R}^{3} \rightarrow \mathbb{R}^3
\end{array}
$$

最后,这个联合优化问题变为:
$$
\min_{\mathbf{p}_1,...,\mathbf{p}M,\boldsymbol{\Theta}}\sumM\sum_\mathbf{u}\left|\hat{\mathcal{I}}(\mathbf{u};\mathbf{p}_i,\boldsymbol{\Theta})-\mathcal{I}_i(\mathbf{u})\right|_22
$$

Bundle-Adjusting Neural Radiance Fields

barf与Nerf差异最大的一点在于,barf需要在优化网络参数的同时考虑到相机参数。而barf认为直接使用nerf的位置编码方案使得相机参数优化变得困难,对此,barf做出了改进,提出了捆绑优化的动态调整策略,这也是这篇文献最大的贡献之一。

Nerf最初的位置编码方案为:

$$
\gamma(\mathbf{x})=\begin{bmatrix}\mathbf{x},\gamma_0(\mathbf{x}),\gamma_1(\mathbf{x}),\ldots,\gamma_{L-1}(\mathbf{x})\end{bmatrix}\in\mathbb{R}^{3+6L}
$$

这里的L是超参数。

$$
\gamma_k(\mathbf{x})=\begin{bmatrix}\cos(2k\pi\mathbf{x}),\sin(2k\pi\mathbf{x})\end{bmatrix}\in\mathbb{R}^6
$$

那么,k阶位置编码的雅克比矩阵为:
$$
\frac{\partial\gamma_k(\mathbf{x})}{\partial\mathbf{x}}=2k\pi\cdot\left[-\sin(2k\pi\mathbf{x}),\cos(2^k\pi\mathbf{x})\right]
$$

它将来自MLP的梯度信号放大,并且其方向以相同频率变化。这使得预测有效更新Δp变得困难,因为来自采样的3D点的梯度信号在方向和幅度方面是不相干的,并且很容易相互抵消。因此,对于barf的联合优化来说,不能直接应用位置编码。


barf的做法是从低频段到高频段逐步激活位置编码:
$$
\begin{array}{c}
\gamma_k(\mathbf{x};\alpha)=w_k(\alpha)\cdot\left[\cos(2k\pi\mathbf{x}),\sin(2k\pi\mathbf{x})\right], \
w_k(\alpha)=\begin{cases}0
&
\text{if }\alpha<k \
\frac{1-\cos((\alpha-k)\pi)}{2}&
\text{if }0\leq\alpha-k<1 \
1&\text{if }\alpha-k\geq1&\end{cases}\
\frac{\partial\gamma_k(\mathbf{x};\alpha)}{\partial\mathbf{x}}=w_k(\alpha)\cdot2k\pi\cdot\left[-\sin(2k\pi\mathbf{x}),\cos(2^k\pi\mathbf{x})\right].
\end{array}\
\alpha \in [o,L] 是与优化进度成正比的可控的一个超参数。
$$

从原始3D输入x(α=0)开始,barf逐渐激活较高频段的编码,直到启用完整位置编码(α=L),相当于原始 NeRF 模型。这使得 BARF 能够通过最初平滑的信号发现正确的Δp,然后将重点转移到学习高保真场景表示。

Experiment

平面图像对齐的定性实验

给定图像块,barf的目标是恢复整个图像的对齐和神经网络重建,其中初始化为(b)中所示的中心裁剪,而相应的真实变换(ground-truth warps)如(c)所示。

实验结果:(a)为直接使用位置编码,(b)为不使用位置编码,(c)是barf的结果。

合成场景上的定量实验

SceneCamera pose registrationView synthesis quality
Rotation (°) ↓Translation ↓PSNR ↑SSIM ↑LPIPS ↓
full pos.enc.w/o pos.enc.BARFfull pos.enc.w/o pos.enc.BARFfull pos.enc.w/o pos.enc.BARFref. NeRFfull pos.enc.w/o pos.enc.BARFref. NeRFfull pos.enc.w/o pos.enc.BARFref. NeRF
Chair7.1860.1100.09616.6380.5550.42819.0230.2231.1631.910.8040.9420.9540.9610.2230.0650.0440.036
Drums3.2080.0570.0437.3220.2550.22520.8323.5623.9123.960.8400.8930.9000.9020.1660.1160.0990.095
Ficus9.3680.0950.08510.1350.4300.47419.7525.5826.2626.580.8360.9260.9340.9410.1820.0700.0580.051
Hotdog3.2900.2250.2486.3441.1221.30828.1534.0034.5434.910.9230.9670.9700.9730.0830.0400.0320.029
Lego3.2520.1080.0824.8410.3910.29124.2326.3528.3329.280.8760.8800.9270.9420.1020.1120.0500.037
Materials6.9710.8450.84415.1882.6782.69216.5126.8627.4828.060.7470.9260.9360.9420.2940.0680.0580.049
Mic10.5540.0810.07522.7240.3560.30115.1030.9331.1831.830.7880.9660.9690.9710.3340.0560.0490.046
Ship5.5060.0950.0747.2320.3540.32622.1226.7827.5028.000.7550.8330.8490.8580.2550.1750.1320.118
Mean6.167<0.202<0.19311.3030.7680.75622.1226.7827.5029.400.8210.9170.9300.9360.2050.0870.0650.057

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844315.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Proteus 8.17软件下载与安装教程】

Proteus 8.17是一款集电路仿真、PCB设计和虚拟模型仿真于一体的电子设计自动化(EDA)软件工具‌。它广泛应用于电子设计、嵌入式系统开发等领域,是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台‌12。 主要功能 Proteus 8.17的主要功能包括:‌电…

ABC382

上午 NOIP 太憋屈了,我要切水恢复一下信心( 希望 cy 别看见A - Daily Cookie 在题目限制中,已经确定 \(S\) 中 @ 字符的个数多于 \(D\)。所以我们直接数 . 的个数加上 \(D\) 就可以。 时间复杂度 \(O(n)\)。点击查看代码 #include <iostream> #include <cstdio>…

kali 安装 shodan

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!网络安全工具:通过百度网盘…

攻防世界misc部分

信女愿要一台永远不会报错的电脑[攻防世界]1-misc 解题根据提示“生日”,猜测8位数暴力破解,大概试一下20000000开始,不然一个小时太久了得到口令20001228又是压缩包,注意CRC,与上图2.zip中相同,猜测明文破解 [攻防世界]BotW- 题目 MASTER USING IT AND YOU CAN HAVE THI…

Shell编程 - 函数篇

自建函数库 - 颜色字符串颜色 字符串输出颜色,有时候关键地方需要醒目,颜色是最好的方式:字体颜色 字体背景颜色 显示方式30:黑 40:黑 0:终端默认设置31:红 41:深红 1:高亮显示32:绿 42:绿 4:下划线33:黄 43:黄色 5:闪烁34:蓝色 44:蓝色 7:反白显示35:紫色 …

[NCTF2019]Fake XML cookbook

题目链接:[NCTF2019]Fake XML cookbook。 打开题目后,环境如下。随便发送一个登陆包后,查看请求包与响应包。尝试 XXE。 POST /doLogin.php HTTP/1.1 Host: f2f80df1-2df7-4b45-a1da-b06e22a5b17a.node5.buuoj.cn:81 Content-Length: 155 Accept: application/xml, text/xml…

9.2

import pandas as pd import scipy.stats as stats data = pd.read_excel(9.2.xlsx) data_values = data.values.flatten().tolist() statistic, p_value = stats.shapiro(data_values) print("Shapiro-Wilk 统计量:", statistic) print("p 值:", p_valu…

Java日志手机号脱敏工具类

背景 在开发过程中,很容易将用户敏感信息,例如手机号码、身份证等,打印在日志平台。为了保护用户数据,又不影响日志的打印,需要将日志中的敏感信息进行脱敏。效果没看明白,强烈建议 pull项目,执行一下项目中SensitiveUtils#main方法。特性支持多层级Json/对象字段脱敏 支…

SSM项目出现的依赖问题

在ssm项目中,整合后,依赖出现问题导致出现了一堆bug 例如:Controller扫描不到、TomCat启动时报错Listener一个或多个启动失败、spring配置文件找不到、TomCat启动时提示启动XXX功能失败 诸如此类一堆问题。。。。 找了很久发现是依赖的问题,项目使用的依赖过多,把之前项目…

高级语言程序设计第九次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:092300125 姓名:张天荣 14.17 3. struct Month {char name[12];char nmee2[4];int day;int id; };#include <stdi…

linux安装intel编译器2018

加压软件/public/download/parallel_studio_2018.tgz进入目录后用./install.sh开始安装 按回车 这个选择1,然后需要输入lic激活文件路径。 安装完成后添加PATH到环境变量中 1、如果是普通用户,在用户的.bashrc里面添加 2、如果是root用户,在/etc/profile文件的最后一行添加 …

AGC 069

D. Tree and Intervals 感觉这个题可做啊,真该先开这个题的/fn \(x_i\) 可以看作一端 \(\le i\),另一端 \(>i\) 的边数,进一步可以转化为:把 \(\le i\) 的点染成黑色,\(>i\) 的点染成白色,得到的总连通块数。 考虑判定怎样的“总连通块数”序列是可以被生成的。 一…