当前位置: 首页 > 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驱动程序或文档,您可能需要自己编写驱动程序…...

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

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

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

网络编程(UDP编程)

思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...