ECCV 2022|Snap东北大学提出R2L:用数据蒸馏加速NeRF

2023-12-05 13:50

本文主要是介绍ECCV 2022|Snap东北大学提出R2L:用数据蒸馏加速NeRF,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击下方卡片,关注“CVer”公众号

AI/CV重磅干货,第一时间送达

点击进入—> CV 微信技术交流群

转载自:机器之心 | 作者:Huan Wang

神经辐射场 (Neural Radiance Field, or NeRF) [Mildenhall et al., ECCV, 2020] 开启了用神经网络表征三维场景的新范式。NeRF 这两年在学术界和工业界都很火热, 但 NeRF 一个比较大的缺点是, 渲染速度慢。虽然 NeRF 用的神经网络 (11 层的 MLP) 本身很小, 但是渲染一个像素需要采集一条光线上的很多点(上百个), 这导致渲染一张图的计算量非常大, 如下图所示: 用 PyTorch 在单张 NVIDIA V100 显卡测试, 渲染 400x400 的图片就需要 6.7s 的时间, 这显然不利于 NeRF 在业界落地 (例如各种 AR/VR 设备, meta universe 等)。

4e152d9beff375411c191f59772b3001.png

学术界已有不少研究工作来加速 NeRF。比较流行的一种方式是, 给定训练好的 NeRF, 采用更高效的数据结构进行存储, 如 Sparse Voxel Octree [Yu et al., ICCV, 2021]. 尽管加速很可观 (如 [Yu et al., ICCV, 2021] 实现了 3000x 的渲染加速), 但这种数据结构也破坏了 NeRF 作为场景表征存储小的优点。譬如, 原始 NeRF 网络仅仅 2.4MB 大小就可以存储一个场景, 而采用 Sparse Voxel Octree 则需要 1.93GB [Yu et al., ICCV, 2021], 这显然难以在端上应用。

因此, 如何加速 NeRF 渲染并维持其存储小的优点 (简言之: 小且快), 仍然是当前的研究热点, 也是本文的动因。

6517be3f28fbbb5c6bebe95731ae0f24.png

  • Arxiv: https://arxiv.org/abs/2203.17261

  • Code: https://github.com/snap-research/R2L

  • Webpage: https://snap-research.github.io/R2L/

核心方法

我们所提出的核心方法从整体范式上来说非常简单: 通过数据蒸馏将神经辐射场 (NeRF) 转化为神经光场(Neural Light Field, or NeLF) -- 从 NeRF 到 NeLF, 所以我们把方法命名为 R2L。

NeLF 与 NeRF 一样, 都可以作为一个场景的表征. 不同的是:

  • NeRF 的输入是场景中的一个点 (该点的坐标 + 该点所在视线的方向), 输出是该点的 RGB 和不透明度。NeRF 网络的输出是中间结果, 并不是图片上的 RGB 值. 要想得到一个像素的 RGB 值, 需要对该像素对应光线上的很多点进行积分 (即 Alpha Compositing)。

  • 而 NeLF 的输入是一条光线, 输出直接是该光线对应图片上像素值, 不需要 Alpha Compositing 这一步。

对于 Novel View Synthesis 这个任务来说, NeLF 的优势很明显: 速度快! 要得到一个像素的 RGB 只需要跑一次网络, 而 NeRF 则需要跑上百次。

ef9c3722d84a177925bd66c9fdb380e0.png

但它的缺点也很明显, 主要有两个缺点: 

(1) NeLF 网络要拟合的目标函数比 NeRF 更难。这一点可以这么理解: 在一张图片上相邻两个像素的 RGB 可能突变 (因为遮挡), 而相邻两个像素的光线方向其实差别很小, 这就意味着, 这个函数的输入稍微变化一点, 输出可能剧变, 这种函数的不连续性强, 复杂度高. 相比之下, NeRF 表达的函数是空间中的点, 空间中的点由于物理世界的连续性, 相邻位置上 RGB 剧变的可能性小, 所以函数相对简单。

(2) 同样一堆图片, 用来训练 NeLF 的话, 样本量会大幅降低. 一张图片, 长宽为 H, W, 用来训练 NeLF 的话样本量就是 H*W, 而训练 NeRF 样本量是 H*W*K (K 是 NeRF 中的一条光线上的采样点个数, 在 NeRF 原文中 K=256). 所以, 从 NeRF 到 NeLF 训练样本量会变为原来的 1/K, 这是很大的缩减。

神经网络有效, 通常需要有大量的训练数据。从 NeRF 变为 NeLF, 一方面要拟合的目标函数变复杂了, 同时样本量却减小了, 无疑雪上加霜. 如何解决这些问题呢?

为了解决上述问题(1), 我们需要用一个更深的网络来表征更复杂的函数, 所以在我们的文章中提出了一个 88 层的深度残差 MLP (deep residual MLP), 网络结构如下:

b78cd74744a3ec3ad992f68efd1e07ce.png

这样的深层网络在之前 NeRF 相关的工作没有出现过 (之前的 NeRF 相关工作大多继承了原始 NeRF 文章中的网络结构, 小修小补)。为了能让它训练起来, 我们引入了残差结构的设计。这一点跟 ResNet 的思想一样, 本身并没有更多的创新, 但把这一点引入到 NeRF/NeLF 中, 据我们所知, 本文是第一篇工作。残差结构的引入很有必要, 因为深度网络没有残差结构基本训练不起来, 这一点在文中的消融实验中也得到了证实。

另一个值得注意的创新点是关于如何表征一条光线。理论上说, 一条光线用一个方向向量就可以确定, 但如果真的只用方向向量去表征, 就会出现上面说的 “输入很接近, 输出却可能剧变” 的情况, 这就无疑会给 NeLF 网络的学习带来困难。为了使得 NeLF 网络要学习的函数更容易一些, 我们需要增强输入的差别.

具体来说, 我们采用一条光线上采样的多个点的坐标 (如下图所示), 将其串联(concat) 起来成一个向量, 以此作为该光线的表征, 作为我们 NeLF 网络的输入。

8c8a6ce305af9528eed800ea66ed65da.png

这种表征非常简单直接, 同时也很有效。在文中, 我们也展示了它比之前的 NeLF 工作中用到的其他表征 (例如 Plucker 坐标 [Sitzmann et al, NeurIPS, 2021]) 要更为有效。

为了解决上述问题(2), 我们使用了一个预训练好的 NeRF 模型来产生大量伪数据 (pseudo data)。具体来说, 当 NeRF 对一个场景学习完之后, 给定任意一个角度 (ray direction), NeRF 都能返回这个角度下的图片, 我们就把这些图片收集起来, 形成了很多 (origin, direction, RGB) triplets。这些 triplets 就是训练我们模型的数据, loss 函数是 mean squared error (MSE), 如下所示:

6d516403a46d7deaf5d9403ea028bc03.png

在我们的实验中, 我们收集了 10k 张图片, 是原始数据集 (大概 100 张图片) 的 100 倍, 这些数据确保了有充足的样本去训练 NeLF。文中的消融实验也表明, 大量伪数据对性能至关重要 (6.9dB PSNR 提升)!

值得一提的是, 如果仅仅是用伪数据训练, 我们的模型最优也只能复制 teacher NeRF, 无法超越它。为了能超越, 我们在原始图片上再微调 (Finetune) 一下模型。这个操作被证明有非常显著的效果, 使得我们的模型可以显著超越 teacher NeRF。

实验效果

总的来说, 我们的模型在 NeRF Synthetic 数据集 (图片尺寸 400x400) 上实现了将近 30x 的加速, 并把 PSNR 大幅提升了 1.4dB, 比同类其他方法更加高效。

33bbe9eaf812511496d3ccd7de53423e.png

视觉效果图对比如下, 可以看到, 相比于 NeRF, 我们的模型 (Ours-2, 即在原始数据上微调后的模型)有肉眼可见的提升, 且计算量仅仅是 NeRF 的 1/26。

f20d12b8fbc00a4624f3b098bcbe5f51.png

更多结果请参考我们的文章。代码已经开源: https://github.com/snap-research/R2L, 欢迎尝试!

总结与未来工作

本文提出了一种全新的数据蒸馏方法来加速 NeRF: 我们使用训练好的 NeRF 模型产生伪数据, 来训练提出的深度残差 NeLF 网络。该 NeLF 网络可以达到超过 NeRF 的渲染质量, 且实现将近 30x 加速, 并维持了存储小的优点。

未来工作方向: (1) 从 NeRF 中可以得到深度信息, 目前我们还没提供从 NeLF 网络中得到深度信息的方法, 这是不错的探索方向。(2) 如何用更少, 更高质量的伪数据 (譬如进行数据筛选) 来加速 NeLF 的训练也非常值得探索。

点击进入—> CV 微信技术交流群

 

CVPR 2022论文和代码下载

后台回复:CVPR2022,即可下载CVPR 2022论文和代码开源的论文合集

后台回复:Transformer综述,即可下载最新的3篇Transformer综述PDF

NeRF交流群成立
扫描下方二维码,或者添加微信:CVer6666,即可添加CVer小助手微信,便可申请加入CVer-目标检测或者Transformer 微信交流群。另外其他垂直方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch、TensorFlow和Transformer等。
一定要备注:研究方向+地点+学校/公司+昵称(如NeRF+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群▲扫码或加微信: CVer6666,进交流群
CVer学术交流群(知识星球)来了!想要了解最新最快最好的CV/DL/ML论文速递、优质开源项目、学习教程和实战训练等资料,欢迎扫描下方二维码,加入CVer学术交流群,已汇集数千人!▲扫码进群
▲点击上方卡片,关注CVer公众号
整理不易,请点赞和在看

这篇关于ECCV 2022|Snap东北大学提出R2L:用数据蒸馏加速NeRF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/457832

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro