当前位置: 首页 > news >正文

聊聊我做 NeRF-3D重建性能优化经历

d9cce2047c4a6995f6e6d9ad3432bdd8.gif

我们新推出大淘宝技术年度特刊《长期主义,往往从一些小事开始——工程师成长总结专题》,专题收录多位工程师真诚的心路历程与经验思考,覆盖终端、服务端、数据算法、技术质量等7大技术领域,欢迎一起沟通交流。

本文为此系列第四篇内容。

第一篇:负责淘宝业务前端开发9年,聊聊我的心得

第二篇:“技术开发最应该做什么?”,聊聊我在服务端开发5年的理解和收获

第三篇:聊聊我在淘宝做性能分析的经历

本文作者尘漠加入大淘宝到现在也有5年了,一路走来很开心,他认为在这里可以让他静心做技术研究。以下是尘漠的自述——


在淘宝前三年,我主要偏向研究 2d计算机视觉算法,相比于研究GAN、Transformer等热门课题,我更偏向解决一些算法在工业界落地遇到的常见问题,如深度学习模型训练中,常遇到训练数据不足、数据有噪声等问题,所以我更感兴趣噪声标签识别、主动学习等类型算法,也发表了简单实用的O2U-Net[5] (ICCV 2019) 噪声识别算法;另外算法推理性能提升,也是工业应用常见问题,比如在手机端部署CNN模型,需要提升模型推理效率,可能需要模型压缩、剪枝技术,也是我感兴趣的方向之一。

这两年随着元宇宙的爆发,内部团队项目的调整,我也转而开始加入到 元宇宙数字世界构建探索中,开始探索低成本高质量3D建模应用。2022年双十一,淘宝Meta 团队推出的 低成本高质量3D建模工具-Object Drawer首次将学术界神经渲染3D建模算法(NeRF[1])在工业界规模化落地,实现了十几种品类的低成本建模(成本下降了70%)。我的工作职责主要是Object Drawer性能优化,下面聊一聊性能优化经历。

d66dd923107f46a830c493a1964473a7.png

背景

电商商品3D化,可以使得用户在APP中,实时浏览3D商品模型,更直观地了解商品的外观颜色、形状结构、物理材质等信息,为用户带来更好的消费体验,为虚实结合带来更多可能,后续也可以用于AR\VR等内容生产。然而商品3D化存在:人工设计 3D建模成本太高,传统3D重建算法稳定性又很差。

2020年,谷歌提出神经辐射场3D建模方法NeRF[1],可以渲染出较高质量的图片,不需要人工修模,3D建模成本较低,为大规模3D模型生产带来了新思路。

6806a57f0a141ab8deca9ed950dc327b.png

NeRF

起初淘宝Meta 团队主要致力于 提升 NeRF重建效果(布料细节清晰度、商品文字清晰度等提升),使其渲染清晰度达到工业落地标准;然而由于NeRF存在推理速度慢等较大缺陷(服务器V100 GPU显卡,渲染一张高清图 需要1min),所以NeRF在淘宝落地主要在静态出图、AI内容创作做应用尝试,无法扩展到3D交互相关应用。

2020年底,由于项目调整,主管列出团队内一些急需解决的难题供选择。其中一个便是NeRF 算法性能优化,目标是 解决NeRF 3D模型到手机实时渲染的瓶颈问题,使其未来可以扩展到3D AR/VR等更多应用。问题难点:NeRF起初渲染速度非常慢,服务器 V100 GPU显卡上,渲染一张1080p图超过一分钟;如果要做到手机实时渲染,渲染速度预估需提升10000倍以上。

出于对模型推理效率优化方向感兴趣,外加喜欢挑战有难度的任务,我最终选择了解决NeRF推理性能优化。由于NeRF手机实时渲染,在当时并没有论文可以参考,算法推理效率需提升一万倍,所以只能尽力尝试推理加速各种方案。主管没给太大的压力与干涉,实验方案选择上没有任何约束,一句话:只要你认为有效的方案,都可以尝试。这使得我在算法优化工作中,更敢于去尝试有挑战的任务,更敢于去突破业界前沿。

一个人研究一个方向,没有内卷,静心实验研究,大胆尝试自认为有效的方案,这便是我得追求。

953d6e2c2bfd70d7266c5be6d3e8f3ed.png

由浅入深尝试

由于我以前经历主要涉及 2D 计算机视觉相关算法,对于3D几何相关算法不太熟悉。所以对于算法推理速度优化,起初会偏向选择自己比较熟悉的方案进行尝试,比如神经网络推理加速通用的方案,网络剪枝、8bit量化、蒸馏等方法。经过了半年了实验,最终把神经网络常见的算法加速推理方法都尝试了一遍,最终效率仅提升200 倍左右的效率,离提升10000倍的目标仍遥不可及。后来又折腾了两个月,目标没什么大进展,慢慢意识到如果不对NeRF算法做较大改动,提出具有创新性的方法,效率基本不大可能有四个数量级的提升,因此我开始静下心来,学习3D模型表示、图形渲染等基础3D技术。

随着对3D模型表示、渲染有了进一步深入了解,业界前沿也有了一些推理加速的方法可以参考(Fast-NeRF、PlenOctree[3])。在综合考虑效率、内存占用、存储空间等问题上,我结合了PlenOctree[3] +SNeRG[4] 优点,提出了 采用 Octree+Tiny-MLP数据结构,并对MLP模型做了效率优化,在普通Android上1080p渲染效率做到了6FPS左右。推理效率提升了三个数量级,问题得到大幅度缓解,但还需要继续提升5倍以上的推理速度,才可以实现NeRF手机实时交互。

76f44451ea60e212c1fcd9bd4b4fbcdc.png

nerf 模型体素离散化

基于体素表示的推理加速方法,也会引入新的挑战:空间换时间策略,会引入新的问题,模型存储空间、内存占用变大,比如1024*1024*1024分辨率体素,结合前沿方法,经过模型量化、剪枝后,存储空间依旧达到300M;内存占用更是直接打爆手机,基本在2G以上。另外相比于学术研究NeRF  360视角渲染开源数据集来说,720 电商商品展示 在模型大小、内存占用都会更大。

PlenOctree[3] +SNeRG[4]

目标

6FPS

30FPS

>1500M

50M

>300M

5M

158ed147da832f29f5e2bfc97c6fc074.png

走不寻常的路,多个问题一起思考解决

如前所述,经过了第一阶段的模型优化,虽然推理效率问题大幅缓解,然而也带来了新的挑战问题。存储空间、内存都很大,效率也需要进一步提升,三个问题都很艰巨。正常的思维是三个问题逐一解决,分开思考、逐个击破,然而在考虑到分开解决存在研发周期过长、同时各性能难以平衡问题,研发周期过长,每个问题解决可能需要花好几个月的时间探索。我最终选择探索三个问题一起解决方案,相比于逐个解决,虽然难度加大,但可以把三个问题综合考虑、更好的平衡效果,缩短研发周期。

基于体素表示的神经辐射场,要提升效率、内存、存储三者性能,真正的难点在于其基本只有一条路可以走:减少体素点数,其可供参考的资料较少,需要靠自己摸索实验。

从2D图片压缩启发,我发现人类视觉上看,一张渲染图片是否清晰,取决于一张图片的边缘区域是否清晰。于是第一阶段优化,我们提出了 HrSRG[2](ECCV 2022)的方法:3D体模型分层表示+感知损失+GAN,在提升纹理清晰度的同时,使得模型推理效率模型达到state-of-the-art。在高端手机上可实时渲染,720商品展示模型大小40M左右(相比于学术开源数据360展示更加复杂)

670f9c76cae49030fbcbe487a23a7941.png

然而如果要真正达到业务落地要求,我需要进一步做到低端手机实时渲染,同时模型需要进一步压缩到5M的模型大小,进而我提出了:3D 体素模型高频检测算法,对低频区域用更少得体素点来表示,高频区域用更多的体素来表示。在结合HrSRG[2]+体模型高频检测算法后,可以把一个6000w个点 NeRF 3d体素模型,减少到200w个点,存储空间和模型大小会减少到原来的1/30,效率也会有大幅度提升。相比于前沿方法PlenOctree[3]、SNeRG[4]等方法,该方法可以实现大幅度压缩,且清晰度更为清晰,同时能够把效率、推理速度、内存三者性能都能得到大幅度提升,达到了手机上5M模型,同时低端手机能够实时渲染的要求:

967ddb47e1617bc8483ac07ac52ba7b2.jpeg

在效果上,可以更好的保持纹理清晰度,对于商品特征细节信息上,相比于NeRF达到更高精度还原:

68a6de44f5e9bbe1d199ebe0447abd4e.jpeg

Object Drawer细小文字还原

e1b7c1ee37c821499e66a7c1be53a58a.png

展望未来

即使目前目标任务基本完成,达到业务上线要求,我依旧喜欢更进一步精细打磨算法性能,比如NeRF[1] 体素表示现在模型大小压缩到5M左右,精益求精,未来还是希望进一步能够压缩到1M以内,NeRF[1]在低端机实时渲染效率依旧需要进一步提升到50FPS以上,每向前走一步都是成长。

2f84c35ad40c0f3005b40aacdc949307.png

参考文档

1、NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

2、《 Digging into Radiance Grid for Real-Time View Synthesis with Detail Preservation》

3、《PlenOctrees for Real-time Rendering of Neural Radiance Fields》

4、《Baking Neural Radiance Fields for Real-Time View Synthesis》

5、《O2U-Net: A Simple Noisy Label Detection Approach for Deep Neural Networks  》

9dafb1a74711986438adfc3699cb39ce.png

团队介绍

大淘宝技术Meta团队,目前负责面向消费场景的3D/XR基础技术建设和创新应用探索,创造以手机及XR 新设备为载体的消费购物新体验。团队在端智能、端云协同、商品三维重建、3D引擎、XR引擎等方面有着深厚的技术积累,先后发布深度学习引擎MNN、端侧实时视觉算法库PixelAI、商品三维重建工具Object Drawer、端云协同系统Walle等。团队在OSDI、MLSys、CVPR、ICCV、NeurIPS、TPAMI等顶级学术会议和期刊上发表多篇论文。欢迎视觉算法、3D/XR引擎、深度学习引擎研发、终端研发等领域的优秀人才加入,共同走进3D数字新时代。简历请投递至: chengfei.lcf@alibaba-inc.com

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法

相关文章:

聊聊我做 NeRF-3D重建性能优化经历

我们新推出大淘宝技术年度特刊《长期主义,往往从一些小事开始——工程师成长总结专题》,专题收录多位工程师真诚的心路历程与经验思考,覆盖终端、服务端、数据算法、技术质量等7大技术领域,欢迎一起沟通交流。 本文为此系列第四篇…...

未磁科技全球首台64通道无液氦心磁图仪及首个培训基地落户北京安贞医院

【全球首台64通道无液氦心磁图仪在北京安贞医院举行开机仪式】 近日,在北京安贞医院举行了未磁科技全球首台64通道无液氦心磁图仪开机仪式,中国医学装备协会赵自林理事长、北京安贞医院纪智礼书记、张宏家院长、宋现涛教授,以及未磁科技蔡宾…...

SpringBoot 如何使用 ApplicationEventPublisher 发布事件

SpringBoot 如何使用 ApplicationEventPublisher 发布事件 在 SpringBoot 应用程序中,我们可以使用 ApplicationEventPublisher 接口来发布事件。事件可以是任何对象,当该对象被发布时,所有监听该事件的监听器都会收到通知。 下面是一个简单…...

【深度学习】2-3 神经网络-输出层设计

前馈神经网络(Feedforward Neural Network),之前介绍的单层感知机、多层感知机等都属于前馈神经网络,它之所以称为前馈(Feedforward),或许与其信息往前流有关:数据从输入开始,流过中间计算过程,最后达到输出…...

Python网络爬虫开发:使用PyQt5和WebKit构建可定制的爬虫

部分数据来源:ChatGPT 引言 在网络爬虫开发中,使用Web浏览器模拟用户行为是非常重要的。而在这个过程中,基于 WebKit 的框架可以提供比其他技术更紧密的浏览器集成,以及更高效、更多样化的页面交互方式。 在本文中,我们将通过一个使用基于 WebKit 的爬虫示例,并与类似…...

Laya3.0游戏框架搭建流程(随时更新)

近两年AI绘图技术有了长足发展,准备把以前玩过的游戏类型重制下,也算是圆了一个情怀梦。 鉴于unity商用水印和启动时间的原因,我决定使用Laya来开发。目前laya已经更新到了3.0以上版本,就用目前比较新的版本。 之后关于开发中遇到…...

.net 软件开发模式——三层架构

三层架构是一种常用的软件开发架构模式,它将应用程序分为三个层次:表示层、业务逻辑层和数据访问层。每一层都有明确的职责和功能,分别负责用户交互、业务处理和数据存储等任务。这种架构模式的优点包括易于维护和扩展、更好的组织结构和代码…...

SpringBoot如何优雅的实现重试功能

文章目录 使用背景spring-retry介绍快速使用加入依赖开启Retry使用参数 使用背景 在有些特定场景,如和第三方对接。 我们调用接口时需要支持重试功能,第一次调用没成功,我们需要等待x秒后再次调用。 通常会设置重试次数,避免业务…...

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

OpenText Exceed TurboX(ETX)—— 适用于 UNIX、Linux 和 Windows 的远程桌面解决方案

由于新技术的采用,以及商业全球化和全球协作的现实,几乎所有企业(无论其规模和所处行业)的员工的工作方式、时间和地点都发生了重大变化。业务领导者正在推动其 IT 部门提出解决方案,以帮助其远程员工提高工作效率&…...

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降

【人工智能】— 逻辑回归分类、对数几率、决策边界、似然估计、梯度下降 逻辑回归分类Logistic Regression ClassificationLogistic Regression: Log OddsLogistic Regression: Decision BoundaryLikelihood under the Logistic ModelTraining the Logistic ModelGradient Desc…...

k8s pod “cpu和内存“ 资源限制

转载用于收藏学习:原文 文章目录 Pod资源限制requests:limits:docker run命令和 CPU 限制相关的所有选项如下: Pod资源限制 为了保证充分利用集群资源,且确保重要容器在运行周期内能够分配到足够的资源稳定运行&#x…...

datagrip 连接 phoenix

jar替换完后尽量重启datagrip. 然后重新连接即可. 不重启貌似报错... 效果:...

黑客入侵的常法

1.无论什么站,无论什么语言,我要渗透,第一件事就是扫目录,最好一下扫出个上传点,直接上传 shell ,诸位不要笑,有时候你花很久搞一个站,最后发现有个现成的上传点,而且很容…...

VB报警管理系统设计(源代码+系统)

可定时显示报警系统是一个能够定时并及时报警,提醒人们安全有效地按计划完成任务的系统。本论文从软件工程的角度,对可定时显示报警系统做了全面的需求分析,简要说明了该系统的构思、特点及开发环境;阐述了系统的主要功能,论述了它的设计与实现,并且叙述了系统的测试与评…...

Redis入门 - Redis Stream

原文首更地址,阅读效果更佳! Redis入门 - Redis Stream | CoderMast编程桅杆Redis入门 - Redis Stream Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列(MQ,Message Queue)&#xf…...

微服务中常见问题

Spring Cloud 组件 Spring Cloud五大组件有哪些? Eureka:注册中心 Ribbon:负载均衡 Feign:远程调用 Hystrix:服务熔断 Zuul/Gateway:服务网关 随着SpringCloud Alibaba在国内兴起,我们项目中…...

更新删除清理购物车

目录 1 更新购物车 2 取会员门店购物车项 3 取会员门店购物车项(无缓存) 4 删除门店购物车某项 5 删除门店购物车多项 6 清理门店购物车 7 清理门店购物车 8 添加商品至购物车 9 添加商品至购物车...

基于Intel NUC平台的字符设备陀螺仪GX5-25驱动程序

陀螺仪GX5-25连接到Intel NUC上可能需要进行一些设备树的修改和编写驱动程序的工作。这是因为陀螺仪GX5-25可能需要特定的设备树配置和驱动程序来与Intel NUC的硬件和操作系统进行通信。 如果陀螺仪GX5-25没有官方的Linux驱动程序或文档,您可能需要自己编写驱动程序…...

建立小型医学数据库(总结)

建立小型医学数据库 小型医学数据库可以用于存储和管理医学数据,如患者病历、药品信息、试验结果等。这对于医疗机构和科研机构来说非常必要,可以提高数据管理和共享的效率,进而促进医学研究和诊疗水平的提升。 建立小型医学数据库有以下基本…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...