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

单张图像3D重建:原理与PyTorch实现

近年来,深度学习(DL)在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外,在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中,我们将探讨最近将深度学习扩展到单图像 3D 重建任务的尝试,这是 3D 计算机图形领域最重要和最深刻的挑战之一。

 在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

1、单图像3D重建任务

单个图像只是 3D 对象到 2D 平面的投影,来自高维空间的一些数据必然在低维表示中丢失。 因此,从单视图 2D 图像来看,永远不会有足够的数据来构造其 3D 组件。

因此,从单个 2D 图像创建 3D 感知的方法需要先了解 3D 形状本身。

在 2D 深度学习中,卷积自动编码器是学习输入图像的压缩表示的非常有效的方法。 将这种架构扩展到学习紧凑的形状知识是将深度学习应用于 3D 数据的最有前途的方法。

2、3D 数据的表示

与只有一种计算机格式(像素)通用表示形式的 2D 图像不同,有多种方法可以用数字格式表示 3D 数据。 它们各有优缺点,因此数据表示的选择直接影响可以使用的方法。

2.1 光栅化形式(体素网格)

光栅法表示的3D模型可以直接应用CNN。

每个蓝色框都是一个体素,大部分体素是空的。

体素(voxel)是体积像素的缩写,是空间网格像素到体积网格体素的直接扩展。 每个体素的局部性共同定义了该体积数据的独特结构,因此 ConvNet 的局部性假设在体积格式中仍然成立。

体素表示的密度低


然而,这种表示是稀疏且浪费的。 有用体素的密度随着分辨率的增加而降低。

  • 优点:可以直接应用CNN从2D到3D表示。
  • 缺点:浪费表示,细节和资源(计算、内存)之间的高度权衡。

2.2 几何形式

几何形式表达的3D模型不能直接应用CNN。

  • 多边形网格:是顶点、边和面的集合,定义了物体的 3 维表面。 它可以以相当紧凑的表示形式捕获粒度细节。
  • 点云:3D 坐标 (x, y, z) 中的点的集合,这些点一起形成类似于 3 维物体形状的云。 点的集合越大,获得的细节就越多。 不同顺序的同一组点仍然表示相同的 3D 对象。例如:
# point_cloud1 and point_cloud2 represent the same 3D structure
# even though they are represented differently in memory
point_cloud1 = [(x1, y1, z1), (x2, y2, z2),..., (xn, yn, zn)]
point_cloud2 = [(x2, y2, z2), (x1, y1, z1),..., (xn, yn, zn)]

几何表示法的优缺点如下:

  • 优点:表现紧凑,注重3D物体的细节表面。
  • 缺点:不能直接应用CNN。

3、我们的实现方法

我们将展示一种结合了点云紧凑表示的优点但使用传统的 2D ConvNet 来学习先验形状知识的实现。

3.1 2D 结构生成器

我们将构建一个标准的 2D CNN 结构生成器,用于学习对象的先验形状知识。

体素方法并不受欢迎,因为它效率低下,而且不可能直接用 CNN 学习点云。 因此,我们将学习从单个图像到点云的多个 2D 投影的映射,视点处的 2D 投影定义为: 2D projection == 3D coordinates (x,y,z) + binary mask (m) 。

  • 输入:单个 RGB 图像
  • 输出:预定视点的 2D 投影

代码如下:

#--------- Pytorch pseudo-code for Structure Generator ---------#
class Structure_Generator(nn.Module):# contains two module in sequence, an encoder and a decoderdef __init__(self):self.encoder = Encoder()self.decoder = Decoder()def forward(self, RGB_image):# Encoder takes in one RGB image and # output an encoded deep shape-embeddingshape_embedding = self.encoder(RGB_image)# Decoder takes the encoded values and output  # multiples 2D projection (XYZ + mask)XYZ, maskLogit = self.decoder(shape_embedding)return XYZ, maskLogit

3.2 点云融合

将预测的 2D 投影融合到原生 3D 点云数据中。 这是可能的,因为这些预测的观点是固定的并且是预先已知的。

  • 输入:预定视点的 2D 投影。
  • 输出:点云

3.3 伪渲染器

我们推断,如果从预测的 2D 投影融合的点云有任何好处,那么如果我们从新的视点渲染不同的 2D 投影,它也应该类似于地面实况 3D 模型的投影。

  • 输入:点云
  • 输出:新视点的深度图像

3.4 训练动态

将这 3 个模块组合在一起,我们获得了端到端模型,该模型学习仅使用 2D 卷积结构生成器从一张 2D 图像生成紧凑的点云表示。

由 2D 卷积结构生成器、点云融合和伪渲染模块组成的完整架构

这个模型的巧妙技巧是让融合+伪渲染模块纯粹可微,几何推理:

  • 几何代数意味着没有可学习的参数,使模型尺寸更小并且更容易训练。
  • 可微分意味着我们可以通过它反向传播梯度,从而可以使用 2D 投影的损失来学习生成 3D 点云。

代码如下:

# --------- Pytorch pseudo-code for training loop ----------#
# Create 2D Conv Structure generator
model = Structure_Generator()
# only need to learn the 2D structure optimizer
optimizer = optim.SGD(model.parameters())
# 2D projections from predetermined viewpoints
XYZ, maskLogit = model(RGB_images)
# fused point cloud
#fuseTrans is predetermined viewpoints info
XYZid, ML = fuse3D(XYZ, maskLogit, fuseTrans)
# Render new depth images at novel viewpoints
# renderTrans is novel viewpoints info
newDepth, newMaskLogit, collision = render2D(XYZid, ML, renderTrans)
# Compute loss between novel view and ground truth
loss_depth = L1Loss()(newDepth, GTDepth)
loss_mask = BCEWithLogitLoss()(newMaskLogit, GTMask)
loss_total = loss_depth + loss_mask
# Back-propagation to update Structure Generator
loss_total.backward()
optimizer.step()

3.5 实验结果

来自地面实况 3D 模型的新深度图像与来自学习点云模型的渲染深度图像的比较:

从一张 RBG 图像 → 3D 点云:

有了详细的点云表示,就可以使用 MeshLab 将其转换为其他表示,例如与 3D 打印机兼容的体素或多边形网格。


原文链接:单图像3D重建原理实现 - BimAnt

相关文章:

单张图像3D重建:原理与PyTorch实现

近年来,深度学习(DL)在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外,在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中,我们将探讨最近将深度学习扩展到单图像 3…...

340条样本就能让GPT-4崩溃,输出有害内容高达95%?OpenAI的安全防护措施再次失效

仅需340个示例微调GPT-4,即可绕过安全限制,让模型说出“枪支改装方法”、“生化武器制作过程”等有害内容? OpenAI的安全防护措施再次失效,攻击的成功率高达95%! 近日,美国顶尖大学UIUC与斯坦福联合对GPT…...

2023.11.17使用flask将多个图片文件上传至服务器

2023.11.17使用flask将多个图片文件上传至服务器 实现功能: 1、同时上传多个图片文件 2、验证文件扩展名 3、显示上传文件的文件名 4、显示文件上传结果 程序结构 main.py from flask import Flask, request, jsonify, render_template import osapp Flask(__n…...

母婴服务预约小程序的效果如何

二胎家庭增速明显,占比较大,成为市场各母婴品牌的目标,而随着行业发展及市场变化,线上互联网深入人们生活,各家母婴品牌开始向“数字化”靠拢。 目前母婴门店商家主要面临服务/产品线上曝光不足、宣传度不够或扩圈无门…...

Flask实现cookie 开发

要在Flask中实现cookie的开发,可以通过使用Flask提供的set_cookie()和get_cookie()函数来设置和获取cookie值。以下是一个示例,演示如何在Flask应用中使用cookie: from flask import Flask, request, make_responseapp Flask(__name__)app.…...

2311rust,到60版本更新

1.54.0稳定版 属性可调用类似函数的宏 Rust1.54支持在属性中调用类似函数的宏.类似函数的宏是像基于macro_rules!宏一样调用的或像macro!(...)一样的过程宏. 注意,常见用例是,在Rust文档注解中包含其他文件中的文档.如,如果项目的README代表了一个很好的文档注释,则可用incl…...

【开源】基于Vue和SpringBoot的微信小程序的音乐平台

项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…...

adb手机调试常用命令

查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 查看分辨率 adb shell wm size 查看屏幕密度 adb shell wm density 查看显示屏参数 adb shell dumpsys window displays 查看android_id adb shell settings get secure android…...

IDEA常用插件合集

功能类: 1、Background Image Plus 换壁纸 2、Chinese(Simplified)... 中文语言包 3、Translation 代码翻译 4、Key Promoter X 快捷键提示插件 5、Rainbow bracket 彩虹括号插件 6、Code Glance 代码小地图 效率类 : 1、Tabnine AI Code C…...

【算法】滑动窗口题单——2.不定长滑动窗口(求最长/最大)

文章目录 3. 无重复字符的最长子串1493. 删掉一个元素以后全为 1 的最长子数组904. 水果成篮1695. 删除子数组的最大得分2841. 几乎唯一子数组的最大和2024. 考试的最大困扰度1004. 最大连续1的个数 III1438. 绝对差不超过限制的最长连续子数组2401. 最长优雅子数组解法1——维…...

电子学会C/C++编程等级考试2022年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

Libvirt-Qemu-Kvm 操作手记

(持续更新~) 本文主要用于记录在操作libvirt qemu kvm过程中遇到的问题及原因分析。 Hugepage 让qemu使用大页可以减少tdp的size,一定程度上可以提高性能;使用大页可以用memfd或者file backend。 memfd 操作步骤如下: 在系统中reserv…...

代码随想录算法训练营第二十八天| 78 子集 90 子集|| 93 复原IP地址

78 子集 由题意可知数组中的元素互不相同&#xff0c;所以在dfs中我们可以将当前的path直接加入到res中。 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>path new LinkedList<>();public List<List<Integer…...

9 HDFS架构剖析

问题 100台服务器&#xff0c;存储空间单个200GB 20T 5T文件如何存储&#xff1f; 128MB一块 128MB81GB 1288*10241TB 5T数据分成的128MB的块数 8192 * 5 客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统。 HDFS集群有两类节点&#xff1a; 一个na…...

Python中的迭代器、生成器和装饰器

当谈到Python中的迭代器、生成器和装饰器时&#xff0c;这三个概念都是与函数和数据处理密切相关的。让我们逐个深入了解它们。 1. 迭代器&#xff08;Iterators&#xff09;&#xff1a; 迭代器是一个可以逐个访问元素的对象。在Python中&#xff0c;迭代器实现了两个方法&a…...

【NGINX--1】基础知识

1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

小米路由器AX1800降级后的SSH登录和关墙等命令

​​​​​​​​​​​​​​​​​​​​​http://192.168.31.1/cgi-bin/luci/;stok429aaa9c7f05ee7d0816a00257b8414a/api/misystem/set_config_iotdev?bssidXiaomi&user_idlongdike&ssid-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20s%…...

5-什么是猴子补丁,有什么用途?什么是反射,python中如何使用反射?http和https的区别?

1 什么是猴子补丁&#xff0c;有什么用途 **解释**1 Python猴子补丁&#xff08;Monkey Patch&#xff09;是一种在运行时动态修改代码的技术。通在不修改源代码的情况下&#xff0c;改变代码的执行方式或增加功能2 Monkey Patching是在 运行时(run time) 动态替换属性(attrib…...

深信服AC应用控制技术

拓扑图 目录 拓扑图 一.上班时间不允许使用qq(假设上班时间是上午9到12&#xff0c;下午14到18) 1.新增上班时间不允许使用qq访问权限策略 2.将策略应用到组&#xff0c;例如修仙部 3.验证 上班时间发现登录不了 下班时间可以登录 二.上班时间不允许访问视频网站(假设上班时…...

全新云开发工具箱:融合多项功能的微信小程序源码解决方案

全新云开发工具箱&#xff1a;融合多项功能的微信小程序源码解决方案 这款微信小程序源码提供了超过40个功能&#xff0c;集合了各种实用工具&#xff0c;成为一款全能工具箱。这些功能包括证件照制作、垃圾分类查询、个性签名制作、二维码生成、文字九宫格、手持弹幕、照片压…...

让AI当你的面试官:基于快马平台打造智能前端面试辅导助手

最近在准备前端面试时&#xff0c;我发现很多题目看似简单&#xff0c;但真要回答得全面深入并不容易。比如经典的"深拷贝"问题&#xff0c;不仅要写出代码&#xff0c;还得考虑循环引用、性能优化等细节。这时候如果能有个AI助手帮忙分析题目、提供思路&#xff0c;…...

DS4Windows:突破手柄限制,打造跨平台游戏控制体验

DS4Windows&#xff1a;突破手柄限制&#xff0c;打造跨平台游戏控制体验 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 在PC游戏世界中&#xff0c;手柄兼容性一直是玩家面临的主要障碍…...

零基础友好:借助快马生成的指导项目轻松完成anaconda安装与初体验

最近在学Python数据分析&#xff0c;被各种环境配置搞得头大。朋友推荐用Anaconda管理环境&#xff0c;但光是安装就卡了半天。后来在InsCode(快马)平台发现了个神器项目&#xff0c;像有个老师手把手教操作&#xff0c;分享下我的学习过程&#xff1a; 为什么选择Anaconda 刚开…...

如何快速实现STL转STEP:面向3D设计新手的完整指南

如何快速实现STL转STEP&#xff1a;面向3D设计新手的完整指南 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 你是否遇到过这样的困境&#xff1a;精心设计的3D打印模型完成后&#xff0c;想要…...

栈(C语言)

目录 1. 栈的定义 2. 代码实现 1. 栈的定义 栈属于线性表&#xff0c;具有后进先出的特点&#xff0c;存储结构类似羽毛球桶&#xff0c;可以依次取出最后放入栈中的数据。实现&#xff1a;栈一般采用数组 / 链表实现&#xff0c;但是推荐程度&#xff1a;数组 > 单链表 …...

QMCDecode:让QQ音乐加密文件重获自由的macOS工具

QMCDecode&#xff1a;让QQ音乐加密文件重获自由的macOS工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结…...

5种高效系统清理策略:DriverStore Explorer深度解析与实战指南

5种高效系统清理策略&#xff1a;DriverStore Explorer深度解析与实战指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows系统长期使用后&#xff0c;驱动存储仓库会积累大量冗…...

为什么你的ranges::filter_view在C++27中突然崩溃?——深度逆向Clang 18.1.8 ABI变更引发的迭代器失效链

第一章&#xff1a;C27范围库扩展演进与ABI稳定性危机C27正以前所未有的力度重构范围&#xff08;Ranges&#xff09;库&#xff0c;引入std::ranges::zip_view的标准化、std::ranges::cartesian_product视图、以及支持异构比较的std::ranges::sort重载。这些增强显著提升了表达…...

NaViL-9B开源模型GPU适配详解:eager注意力回退机制原理与影响

NaViL-9B开源模型GPU适配详解&#xff1a;eager注意力回退机制原理与影响 1. 模型概述与技术背景 NaViL-9B是由国内顶尖研究机构发布的开源多模态大语言模型&#xff0c;具备同时处理文本和图像输入的能力。作为原生多模态架构的代表&#xff0c;该模型在9B参数规模下实现了高…...

NCM格式转换技术解析:从加密限制到音频自由的技术实现

NCM格式转换技术解析&#xff1a;从加密限制到音频自由的技术实现 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 一、问题场景&#xff1a;数字音乐的格式枷锁与用户困境 1.1 音乐人的设备兼容困境 独立音乐人小林最近遇到了一个…...