Urban NeRF

news2024/11/18 10:30:41

本文首发于馆主君晓的博客,文章链接

简要介绍

  这是谷歌和多伦多大学合作的一篇发表在CVPR2022上的工作,延续NeRF重建的相关思路。考虑到之前的一些工作要么是在合成数据集上进行的NeRF重建,要么就是用到真实的场景,但是场景很小,这篇文章主要关注街景的重建和新视图的生成。Urban NeRF主要针对原始NeRF做了三个扩展,扩展如下:

  • 增加了输入数据的模态,引入异步捕获的点云数据。
  • 解决捕获的图像之间曝光度变化的问题。
  • 利用得到的分割mask来监督指向天空的射线上点的体积密度。

image-20221230170411499

  方法概览如上图,输入就是多视角的图像以及激光雷达扫描得到的点云,然后渲染出各种新视角的图像以及重建得到的准确的3D结构。至于作者是如何利用点云数据的,如何得到重建的mesh的,我们在后文会讲到。

核心方法

  首先是核心方法的整体介绍,损失函数分为两个部分。第一个部分是光度一致性损失,第二部分是点云相关的损失。光度一致性损失就是就是原始NeRF的损失,也就是对应位姿渲染出来的图像与真实图像的MSE损失。这里与原始NeRF有一些区别的地方就在于渲染的时候加入了曝光变量 β \beta β因为不同的图像在不同的位置拍摄,从而受到的光照是不一样的,所以这个对图像的渲染是存在影响的,所以这里加入了曝光参数,是一种常见的做法。

image-20230101143714124

  接下来详细介绍一下作者是如何做的。首先是曝光补偿,作者提到我们使用现代化耳朵设备去拍摄照片,通常都是相机设置的自动曝光和自动白平衡。由于相机的自动曝光和自动白平衡,这对NeRF的渲染过程造成很大的困难,因为我们不知道每一张图像的曝光参数这些,而且不同图像的曝光参数不一样。对于这个问题之前有人提到,他们通常引入一个隐码(latent code)来对每一张图像的外观进行编码(appearance code)。使用隐码来对每一张图像的外观进行编码是没有问题的,但是作者认为拍摄出来的照片主要是白平衡和曝光补偿的区别,所以作者认为直接用隐码输入到网络中是一种过度参数化,会解决那些非曝光补偿的错误。作者的观点就是,既然我们认为渲染出来的照片主要与白平衡和曝光补偿相关,那么我们就去解决这个问题。这里作者仍然采用隐码的方式,但不同的是,作者这里是学一个仿射变换(3x3的仿射矩阵),这样就只建模白平衡和曝光补偿。那么其它因素的影响就不会考虑进去了。而且这个仿射变换是直接加在渲染的过程中的。

image-20230101150950490

  接着便是天空建模。首先这篇文章关注的是街景相关的建模的渲染,那不可避免的,图像中会拍摄到天空。对于天空区域的光线,没有穿透过任何不透明的表面,那么在训练的过程中,对这部分的监督是微弱的。那么作者就考虑天空部分单独进行处理,首先使用分割网络对图像进行分割,分割成有天空区域和没有天空的区域形成mask。对于天空区域的光线,因为没有障碍物遮挡,那么体积密度肯定就是0,那么就会出现下面的损失函数。其中 S i ( r ) S_{i}(r) Si(r)表示某条光线是否是朝向天空的光线,是就是1,否则为0。

image-20230101152821041

image-20230101152830431

  到此为止,光度一致性损失算是讲完了。接下来是lidar相关的损失。首先是深度监督,既然引入了激光雷达扫描得到的点云,那么自然便是深度监督。即渲染得到的深度去匹配雷达点云中的深度。具体损失函数如下:

image-20230101170532926

  除此之外,还有一个重要的深度损失就是视线先验,对于激光雷达观测到的点,一个合理的假设是,一个测量点p对应于一个非透明表面上的位置,大气介质对激光雷达测量的颜色没有贡献。说人话就是对于某个物体表面上的一点,其颜色与该点附近的体积密度有关,与更远的空气介质无关。那么我们期望辐射集中在沿着射线的一个点上,也就是说一个点负责观察到的颜色,如下面公式所示:

image-20230101171009914

  即是当且仅当权重函数等于冲激函数(狄拉克函数),一条射线上所有颜色的集合只等于某一点的颜色。这里解释一下为什么要当权重函数等于狄拉克函数,首先狄拉克函数在定义域内 ( − ∞ , + ∞ ) (-\infty,+\infty) (,+)积分为1,也就是面积为1。其次是任意不包含0的区间内积分为0。既然是冲击函数,也就是就在某一点有明显强烈的值,但是在其它点就没有。而我们知道NeRF的权重函数表示从某一点到某一点光线的透射率,如果权重函数为狄拉克函数,那么就表示只在某一点不透,其它点全透。那么就能够表达出作者想要表达的视觉先验了,即从光线原点出发,到达的第一个在物体表面上的点,决定颜色,在那之前和之后的点都不决定这个颜色。于是loss可以变成下面的样子,也就是从 [ t n , t f ] [t_{n},t_{f}] [tn,tf]对权重函数与狄拉克函数的差进行积分,值越小越符合我们的这个先验。

image-20230101171932971

  为了让数值更容易处理,作者这里将狄拉克函数换成了一个分布,均值为0,方差为 ( ϵ 3 ) 2 (\frac{\epsilon}{3})^{2} (3ϵ)2,这样的一个分布。除此之外,为了便于计算,作者将这样的一个损失函数分为三个部分,一个是处于射线原点到物体表面点附近的empty loss,另外一个就是物体表面点附近的near loss。最后一个是从物体表面点到最远端点的distant loss。

image-20230101172624897

image-20230101172648025

image-20230101172637136

image-20230101172703182

  在empty和dist阶段,都是想让他们的权重函数尽量越小越好,因为和他们没有太大关系。在near阶段,则是让权重函数与冲击函数越接近越好。这就是将实现先验用到了损失函数当中,当然作者也提到过,在这里需要控制到 ϵ \epsilon ϵ的大小,太小的 ϵ \epsilon ϵ会影响模型的performance,作者在补充材料中提到使用一种指数衰减策略来找到一个合适 ϵ \epsilon ϵ

实验相关

  首先是数据,作者选取的是街景数据集(Street View Dataset),并且做了两种设置,一种设置是将每个场景分为训练集和测试集,对于测试集是随机选取20%的图像用作测试集。选取所有的与相机位置接近的lidar rays作为我们的测试集。另外一种设置是为了评价作者的模型在没有lidar的情况下会表现出什么样子。所以选取建筑物,将光线终止在建筑物表面的光线全部抹去(不使用),用剩下的lidar rays作为我们的训练集。

  然后就是选取的basline,主要选择了四个模型:NeRF,Mip-NeRF、DS-NeRF、NeRF-W。对于生成新视角图像的这个任务,实验结果对比如下,我们可以看到在PSNR、SSIM、LPIPS这三个指标上,本文提出的方法都达到一个SOTA的结果。不过我认为与选择的场景有关,因为本文是为了街景而设计的NeRF,其它的NeRF除了NeRF-W能够用于室外,其它都是在室内场景下表现不错。

image-20230101174540148

  然后是重建相关的指标对比,如下图,就不做过多介绍了。接着是消融实验。

image-20230101175228613

image-20230101175317416

image-20230101175342722

总结

  总体来说这篇文章的思路是清楚的,首先确定任务为街景重建,之后找到目前室外的基于NeRF重建存在的几个问题,首先是光照的变化,将latent code解码成仿射变换,直接关注曝光补偿和白平衡。然后是对于天空的那些射线,体积密度的监督。接着便是引入lidar scan做的一些工作,深度监督自然是少不了的。关键的是那个视线先验,确定物体表面上的一点的颜色与该点相关,而与其它点关系不大,从而得到insight loss。不过有点可惜的是这篇文章没有开源代码,也没有非官方的开源代码,不知道是何原因,以后若有时间,复现一下。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDK1.8和JDK1.7的HashMap源码分析以及线程不安全问题

参考: 教你如何阅读HashMap源码~吊打面试官 - 腾讯云开发者社区-腾讯云 (tencent.com) 有一些面试题 Map - HashSet & HashMap 源码解析 | Java 全栈知识体系 (pdai.tech) HashMap源码&底层数据结构分析 | JavaGuide(Java面试学习指南) hashmap头插法和尾插…

LAB1 VRRP实验

■实验拓扑 ■实验需求 多厂商的网关冗余(VRPP) 考虑上行/上上行/下行链路的之间的track 生成树配置 VPC能访问R4的loopback口地址(8.8.8.8) ■实验步骤 ▶思科路由器CISCO-R4 Router(config)#hostname CISCO-R4 CISCO-…

【博客581】为什么MASQUERADE都在POSTROUTING做

为什么MASQUERADE都在POSTROUTING做 MASQUERADE都在POSTROUTING做,为什么不能在output做 1、iptables flow graph: 2、output之后的routing和rerouting: 对于本机 app 发出(outcoming)的流量,netfilter 有2次 routing 过程&…

算法刷题打卡第59天:相交链表

相交链表 难度:简单 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 …

空洞卷积atrous/dilated convolution

1、定义 空洞卷积(atrous/dilated convolution)又称膨胀卷积是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。空洞卷积向卷积层引入了一个称为“扩张率/膨胀率(dilation rate)”的新参数,该参数定义了卷积核…

Excel 个人财务:如何在 Excel 模板中创建预算

wpcmf “金钱是一种工具。使用得当,它会变得美丽——使用不当,它会变得一团糟!” – 布拉德利文森 正确使用金钱需要纪律。在本教程中,我们将了解如何使用 Excel 进行个人财务以正确管理我们的预算和财务。我们将涵盖以下主题。 …

Java使用spire进行word文档的替换

前言 今天遇到一个需求,需要对word模板进行替换制定的变量 在网上找了很多方案,做了很多的demo,下面就把我觉得比较简单的一种分享给大家 本次的主角是:spire.doc spire.doc是专门实现对word的操作(包括文字&#…

「数据密集型系统搭建」原理篇|OLAP、OLTP,竟是两个世界

本篇来聊聊OLAP与OLTP的区别以及它们各自的适用场景,以此话题为导引和大家聊聊技术视野与知识储备对于研发同学的重要性,最后站在事务处理与在线分析的角度分别论述下两个数据世界的底层构建逻辑。 OLAP、OLTP的概念与区别 概念 了解OLAP、OLTP的概念&…

【CANN训练营第三季】学习ascend-CANN遇到的经典疑难问题总结

1、/home/HwHiAiUser/samples_1/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/src/…/inc/utils.h:13:10: fatal error: acl/acl.h: No such file or directory #include “acl/acl.h” 原因:放错了DDK——PATH export D…

【Unity3D】快速上手 EasyAR

目录 一,AR技术 1.AR简介 2.AR特点 3.AR工作原理 二,EasyAR 插件 1.获取Key 2.EasyAR 插件下载和导入 三,快速上手 EasyAR 废话不多说上运行效果 一,AR技术 1.AR简介 AR(Augmented Reality,增强现…

RedLock算法(红锁算法)介绍

文章目录一. 部署图二. RedLock算法简单介绍加锁解锁一. 部署图 各redis独立部署,各自独立 二. RedLock算法简单介绍 加锁 应用程序获取系统当前时间应用程序使用相同的kv值依次从多个redis实例中获取锁。 如果某一个节点超过一定时间依然没有获取到锁则直接放…

Porjet1 小白学习CANoe16安装、新建工程、新建数据库、简单运行

准备工作 1,下载CANoe16(因为笔者只找到了官方提供的CANoe16的DEMO license) 2,安装CANoe16,点击默认安装即可,不需要安装驱动。 3,如果桌面没有找到CANoe16的打开方式可以参考 解决安装CANoe1…

OpenGL之Shader编程入门

1.shader 编程基础 1.1 Vertex shader与Fragment shader Vertex shader即顶点着色器,用来改变顶点的属性。Fragment shader即片元着色器,用来改变片元的颜色,在Direct3D中称为Pixel shader,像素着色器。 1.2 编程语言 面向OpenG…

C语言快速互转HEX(16进制)和原始字符串/数组

C语言快速互转HEX(16进制)和原始字符串/数组缘由这个起因是昨晚群里有人在讨论怎么把字符串转成HEX方法最佳,讨论到最后变成哪种方法效率最优了。毕竟这代码是要在MCU上面跑的,要同时考虑到时间和空间的最优解。当然讨论的是有结果…

Java8流式计算相关

目录 lambda 优点 语法介绍 语法格式一 : 语法格式二 : 语法格式三 : 语法格式四 : 语法格式五 : 语法格式六 : 方法引用 stream Stream流的常用方法: 创建动态list 创建固定长度list map filter groupingBy sum list转map: map转li…

谷粒商城学习笔记

docker 安装docker docker官方centos镜像下载地址:https://docs.docker.com/engine/install/centos/ 步骤: 先卸载,如果不是root用户在前边加上sudo sudo yum remove docker \docker-client \docker-client-latest \docker-common \docke…

C 程序设计教程(05)—— C 语言的数据类型(三):指针类型

C 程序设计教程(05)—— C 语言的数据类型(三):指针类型 该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用…

MySql中json类型数据的查询以及在MyBatis-Plus中的使用

表结构和初始数据 新建表结构 CREATE TABLE json_test (id int NOT NULL AUTO_INCREMENT,roles json DEFAULT NULL COMMENT 角色,project json DEFAULT NULL COMMENT 项目,PRIMARY KEY (id) ) ENGINEInnoDB;初始数据 INSERT INTO ctts_dev.json_test(id, roles, project) VALU…

SpringBoot 整合 xxl-job

文章目录部署 xxl-jobSpringBoot 配置maven 配置application.yaml配置 XxlJobConfigXxlJobSpringExecutor新建执行任务配置 xxl-job-admin执行器管理任务管理部署 xxl-job K8S 部署 xxl-job 参考文档:https://blog.csdn.net/weixin_42555971/article/details/12489…

【Web开发】Python实现Web服务器(Docker下部署Flask)

🍺基于Python的Web服务器系列相关文章编写如下🍺: 🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈🎈【Web开发】Python实现Web服务器(Flask案例测试)&a…