基于深度学习的三维重建(一):三维重建简介、patchmatchNet环境部署、用colmap如何测试自己的数据集

news2024/11/26 2:33:00

目录

1.什么是三维重建

2.MVS是什么

3.传统MVS的局限性和为什么基于深度学习的MVS性能好于传统三维重建

4.基础概念

5. patchmatchNet环境配置

6.如何测试自己的数据集(位姿计算)

6.1 colmap导出位姿

6.2 将colmap位姿转换成MVS读取的数据格式


1.什么是三维重建

        用相机拍摄真实世界的物体、场景,并通过计算机视觉技术进行处理,从而得到物体的三维模型。英文术语:3D Reconstruction。
        涉及的主要技术有:多视图立体几何、深度图估计、点云处理、网格重建和优化、纹理贴图、马尔科夫随机场、图割等。
        是增强现实(AR)、混合现实(MR)、机器人导航、自动驾驶等领域的核心技术之一。

2.MVS是什么

        用RGB-D信息重建3D几何的模型,输入的话是一系列的RGB-D照片,这些照片会有一些重合部分,我们计算这些照片的位姿信息(每个拍摄的相机角度的位置),我们就知道了每帧间的位置关系,然后对它进行一个3D模型的重建,最后将材质信息给它贴上去(纹理贴图,将RGB-D信息贴到几何模型上)。

        这里的位姿信息获得是通过SLAM或者SFM来做的,我们就可以得到它的深度图进行点云融合等操作。

3.传统MVS的局限性和为什么基于深度学习的MVS性能好于传统三维重建

        MVS重建我们是基于RGB-D信息做的,也就是说我们恢复3D信息是通过立体匹配等方法进行深度恢复,如果RGB信息出现大面积的单色情况(如下图)没有纹理信息的或者是透明的重复纹理的,那么我们很难进行特征点匹配,也就没有办法通过立体匹配进行深度恢复了,最终导致失败。

        在深度学习中,我们通过大量的数据学习一些信息规律和信息。

        但其也有一定的缺点,比如依赖显存和内存,依赖大数据,难以重建高分辨率的模型。

4.基础概念

        ①深度图(depth)/视差图(disparity)

        a.深度图:场景中每个点到相机的距离
        b.视差图:同一个场景在两个相机下成像的像素的位置偏差dis
        c.两者关系: depth = \frac{b_f}{dis},是三维信息的一种表示方式。

        深度图存储的就是相机坐标系下的Z

        ②三维点云:

        a.三维点云是某个坐标系下的点的数据集。
        b.包含了丰富的信息,包括三维坐标XYZ、颜色RGB等信息。

        ③三维网格:

        由物体的邻接点云构成的多边形组成的,通常由三角形、四边形或者其它的简单凸多边形组成。

       ④纹理贴图模型:

        带有颜色信息的三维网格模型。
        所有的颜色信息存储在一张纹理图上,显示时根据每个网格的纹理坐标和对应的纹理图进行渲染得到高分辨率的彩色模型。

        ⑤相机模型:

5. patchmatchNet环境配置

        利用Anaconda配置虚拟环境,python版本为3.7。如果有GPU的话cuda推荐版本为10.1,我是3060显卡,安装的cuda版本为11.3,pytorch版本为1.11.0,可顺利跑通!

         下载patchmatchNet源码:

PatchNet Git地址https://github.com/FangjinhuaWang/PatchmatchNet

        里面有个requirements.txt

        一键安装:pip install -r requirements.txt

        到这里我们就安装成功了,测试一下:

        先下载数据集:

        下载DTU数据集 dtu.zip,在项目文件夹新建data文件夹,解压到data文件夹中。

        在代码路径下打开终端,激活conda环境,运行eval.sh,如果没有gpu,运行eval_cpu.sh。

        运行结果保存在当前目录下./outputs下。

        如果显卡性能不好或者CPU跑性能过慢的话,我们可以改变默认的分辨率大小,在eval.py中,main函数中,img_wh = (800,600),可以改为原来的一半。同时也要改dataset/dtu_yao_eval.py文件,MvsDataset类中更改图像分辨率。

        最终重建的结果如下,效果还是不错滴!

6.如何测试自己的数据集(位姿计算)

6.1 colmap导出位姿

        比如我们用手机拍摄了一组照片,要对其进行三维重建,应该怎么做呢?

        我们上面说到,输入到patchmatchNet网络中的参数是一组照片以及它们的深度信息(位姿+深度范围或者稀疏点云),因此我们主要做的就是数据格式的转换。

        第一步就是位姿的计算,无论是sfm或者SLAM除了输出位姿(R,t)以外都会有稀疏点的输出,并且告诉哪些稀疏点会被哪些相机和关键帧看到,我们就是用这些信息完成重建。

        一、数据:

        数据要求:图的质量要好不能模糊遮挡、帧之间要有大量的重合区域。(弱纹理,高反光效果不好)

        二、位姿计算:使用colmap计算位姿,也可以使用别的比如OpenMVG,Slam这些需要自己写转换脚本参考colmap_input.py。colmap git链接https://github.com/colmap/colmap/releases        在windows下的使用,下载这两个其中一个,

        双击:

        新建一个工程:

        Database是新建的数据库名称,Images是包含图片的文件夹。

        可以看到桌面已经有这个工程了。

        下一步就是特征提取,

        点击提取

        特征匹配完成!

        重建,点击开始重建。

        红色的就是每帧相机的位置,黑色的就是稀疏的地图点。

        现在我们就得到了哪些相机可以观测到哪些点、相机的位姿信息、相机的内参等。

        我们就可以用地图点计算深度范围计算初始的深度图都是可以的,接下来我们导出信息。FIle/Import model as text:

        camera.txt里面是相机的参数:

        images.txt里面存储着图像的参数以及像素坐标系下的坐标:

         POINTS2D[] as (X, Y, POINT3D_ID)对应的就是在这个相机下能看到的所有三维点的ID及在这个相机下的投影坐标(u,v)。

        points3D.txt里面存储着 3维点的XYZ以及它们的RGB信息以及误差,它们可以被哪些相机看到以及对应的2D点的索引:

6.2 将colmap位姿转换成MVS读取的数据格式

        转换成MVS格式直接由DataLoader调用即可:

        我们看怎么实现:colmap_input.py 我在源码中进行了标注

        未完待续....

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

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

相关文章

Linux安装Docker配置docker-compose 编排工具【超详细】

一、介绍Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有…

面试官:什么是性能测试计划?(内含干货)

引言在进入今天的内容前, 先想几个问题:什么是测试计划?什么是性能测试计划?在你的性能知识领域中, 你认为性能测试计划应该包含哪些内容?因为作为企业的金牌面试官, 经过我面试的求职者&#x…

一文搞懂:JS严格模式“use strict”

什么是JS的严格模式 JS严格模式概念是在ES5中引入的,在此模式下,JS对语法的要求会变的严格,某些不太严谨的代码在严格模式下将不能运行。 如何启用严格模式 只需要JS代码的起始添加 "use strict"即可。如: "use…

Spring Boot邮件发送(powernode CD2207)(内含教训视频+源代码)

Spring Boot邮件发送(powernode CD2207)(内含教训视频源代码) 教学视频源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87452056 目录Spring Boot邮件发送(powernode CD2207&…

图解LeetCode——1233. 删除子文件夹(难道:中等)

一、题目 你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。 如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下,那么 folder[i] 就是 folder[j] …

Redis学习【4】之简单动态字符串

文章目录一 简单动态字符串 SDS1.1 SDS简介1.2 SDS结构1.3 SDS优势1.3.1 防止”字符串长度获取”性能瓶颈1.3.2 保障二进制安全1.3.3 减少内存再分配次数1.3.4 兼容C函数1.4 常用的 SDS 操作函数一 简单动态字符串 SDS 1.1 SDS简介 无论是 Redis 的 Key 还是 Value&#xff0…

《系统架构设计》-01-架构和架构师概述

文章目录1. 架构的基本定义1.1 架构组成理论1.1.1 系统元素1)概念2)静态结构和动态结构1.1.2 基本系统属性1.1.3 设计和发展原则1.2 架构的决策理论1.2.1 统一软件过程(Rational Unified Process,统一软件过程)1.2.2 决…

《手把手教你》系列基础篇(七十三)-java+ selenium自动化测试-框架设计基础-TestNG实现启动不同浏览器(详解教程)

1.简介 上一篇文章中,从TestNg的特点我们知道支持变量,那么我们这一篇就通过变量参数来启动不同的浏览器进行自动化测试。那么如何实现同时启动不同的浏览器对脚本进行测试,且听我娓娓道来。 2.项目实战 2.1创建一个TestNg class 1.首先按…

深入工厂|高精密多层板是如何被智造出来的?

或许有很多人从网络上见过各种教程,告诉你单层板是什么,多层板是什么,他们该如何做出来,但是在具体制造时却全凭想象,今天,就让我们来实地看看,精密的多层板是如何被制造出来的!今天…

大数据---zookeeper集群搭建

zookeeper集群搭建 跳过安装jdk的方法就是找到安装jdk环境的虚拟机克隆 克隆之后的虚拟机根据台数直接修改ip地址,重新配置免密登录,确保每台机器能够互相连接,然后安装zookeeper 文章目录zookeeper集群搭建前期工作服务器划分修改hostname设…

【java】Spring Boot -- Spring AOP原理及简单实现

文章目录一、AOP基本概念1.1、Filter、Interceptor、AOP1.2、AOP中的一些概念1).通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理;通知类型,主要有以下几种:2).连接点(Jo…

Acwing---1246. 等差数列

等差数列1.题目2.基本思想3.代码实现1.题目 数学老师给小明出了一道等差数列求和的题目。 但是粗心的小明忘记了一部分的数列,只记得其中 N个整数。 现在给出这 N个整数,小明想知道包含这 N 个整数的最短的等差数列有几项? 输入格式 输入…

ChatGPT 接入微信,最强聊天机器人来了

最近的 ChatGPT 又再次火热起来了,各种周边工具也是层出不穷,今天我们就一起来做一个基于 ChatGPT 的微信聊天机器人,来感受 AI 世界的快乐吧~ 我们先来看几个我比较关心的问题吧 Python 语言算法 什么是 ChatGPT 人工智能会统治世界吗&a…

【Kubernetes】【二】环境搭建 环境初始化

本章节主要介绍如何搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类:一主多从和多主多从。 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境多主…

带你玩转Jetson之Deepstream简明教程(四)DeepstreamApp如何使用以及用于工程验证。

1.DeepstreamApp是什么? 如果你安装完毕deepstream整体框架,会在你的系统执行目录内有可执行文件,文件名字是deepstream-app。这是一个可执行脚本文件,通过deepstream框架中的代码在安装的时候编译后install到系统根目录内。 此脚…

家政服务小程序实战教程11-首页跳转到分类页面

小程序的分类页面,通常会以侧边栏导航显示内容,我们使用了侧边选项卡和数据列表组件实现了分类展示的功能 还有个需求是从首页点击某个分类的时候,跳转到分类页时候需要选中对应的类别 01 增加页面参数 页面如果跳转时候需要这种接收参数并实…

JAVA和Spring的SPI机制讲解

文章目录1 SPI机制讲解1.1 引言1.2 Java SPI实现1.2.1 示例说明1.2.2 相关测试1.2.3 源码分析1.3 Spring SPI1.3.1 Spring 示例1.3.2 相关测试类1.3.3 源码分析1 SPI机制讲解 1.1 引言 SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制,可以用来启…

力扣337题 打家劫舍Ⅲ Java语言版

/**每个节点都用一个长度为2的数组来表示其状态,其中dp[0]表示偷该节点所得到的最多钱币,dp[1]表示不偷该节点所得到的最多钱币*/ class Solution {public int rob(TreeNode root) {int[] robRoot robTree(root);return Math.max(robRoot[0],robRoot[1]);}public int[] robTre…

rtp协议

RTP协议 在实时音视频通话中,我们通常使用 UDP 作为传输层协议,使用 RTP 协议包荷载音视频数据,RTP(Real-time Transport Protocol)是一种在 Internet 上传输多媒体数据的应用层协议,它通常建立在 UDP 之上…

RabbitMQ学习(五):RabbitMQ持久化

一、持久化概念在上一章内容中我们已经看到了如何处理任务不丢失的情况,但是如何保障当 RabbitMQ 服务停掉后消 息生产者发送过来的消息不丢失呢?默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它将忽视队列 和消息,除非告知它不…