【三维重建-PatchMatchNet复现笔记】

news2024/9/30 1:37:14

【三维重建-PatchMatchNet复现笔记】

  • 1 突出贡献
  • 2 数据集描述
  • 3 训练PatchMatchNet
    • 3.1 输入参数
    • 3.2 制定数据集加载方式

1 突出贡献

在这里插入图片描述
在计算机GPU和运行时间受限的情况下,PatchMatchNet测试DTU数据集能以较低GPU内存和较低运行时间,整体误差位列中等,成为2020年多视图三维重建(MVS,Multi-view Stereo)的折中方案.

特点:
高速,低内存,可以处理更高分辨率的图像,它的效率比所有现有的性能最好的模型都要高得多: 比最先进的方法至少快2.5倍,内存使用量减少一倍。
首次在端到端可训练架构中引入了迭代的多尺度Patchmatch,并用一种新颖的、可学习的自适应传播和每次迭代的评估方案改进了传统Patchmatch核心算法。

主要贡献
基于学习的方法比传统的方法有优势,但是受限于内存和运行时间,于是将补丁匹配的想法引入到端到端可训练的深度学习中,用可学习的自适应模块增强了补丁匹配的传统传播和代价评估步骤,减少了内存消耗和运行时间。

2 数据集描述

(1)在学习PatchMatchNet之前,先了解DTU数据集的特点有助于理解算法的实现步骤,DTU数据集是一种在特定条件下拍摄的多视图数据集。其包含128种物体的多视图,分别使用64个固定的相机(表明有64个相机内、外参数)拍摄具有一定重合区域的图片。相机参数如下形式:

extrinsic(外参:旋转矩阵R、T)
0.126794 -0.880314 0.457133 -272.105
0.419456 0.465205 0.779513 -485.147
-0.898877 0.09291 0.428238 629.679
0.0 0.0 0.0 1.0

intrinsic(内参:针孔相机的["fx", "fy", "cx", "cy"]2892.33 0 823.206
0 2883.18 619.07
0 0 1

425 2.5(深度的最小、最大范围值)原代码的深度顺序是先小后大

(2)使用COLMAP软件(使用方法自查)观察物体scan1的拍摄形式如下图所示 ,其中包含49张帽子图片,故在49个摄像位置进行拍摄,抓取特征点并匹配,重建产生26134个点的稀疏点云:
在这里插入图片描述
(3)训练的数据目录结构如下形式:

训练数据根目录
	+---Cameras_1(相机参数)
	|   +---00000000_cam.txt
	|  	+---00000001_cam.txt
	|  	+---00000002_cam.txt
	|   ......64个相机参数txt文件
	|	+---pair.txt(视图之间重合区域匹配文件(1个))
	|   \---train(内含64个相机参数txt文件)
	|   	+---00000000_cam.txt
	|  		+---00000001_cam.txt
	|  		+---00000002_cam.txt
	|		......
	+---Depths_raw(深度图)
	|   +---scan1
	|       +---depth_map_0000.pfm(pfm格式的深度图:宽160*128|       +---depth_map_0001.pfm
	|       +---depth_map_0002.pfm
	|       +---depth_map_0003.pfm
	|       ......
	|       +---depth_visual_0044.png(png格式的可视化黑白深度图:宽160*128|     	+---depth_visual_0045.png
	|      	+---depth_visual_0046.png
	|      	+---depth_visual_0047.png
	|      	+---depth_visual_0048.png
	|       ......
	|   +---scan2
	|   +---scan3
	|   +---scan4
	|   +---scan5
	|   +---scan6
	|   +---scan7
	|   \---scan8
	\---Rectified
	    +---scan1_train
	    	+---rect_001_0_r5000.png
            +---rect_001_1_r5000.png
            +---rect_001_2_r5000.png
            ....
	    +---scan2_train
	    +---scan3_train
	    +---scan4_train
	    +---scan5_train
	    +---scan6_train
	    +---scan7_train
	    \---scan8_train

这里举例了8个物体的的数据内容,一个G大小供下载测试,下载链接,其中包含两个测试数据,测试数据目录结构如下:

测试数据根目录
+---scan1
|   +---cams(64个相机内外参,深度范围)
|   +---cams_1(64个相机内外参,深度范围)
|   +---images(49张多视角拍摄图片:宽1600*1200|	\---pair.txt(视图之间重合区域匹配文件(1个))
\---scan4
    +---cams
    +---cams_1
    \---images

测试数据与训练数据不同之处有二:
1、图片的尺寸变大了;2、不需要深度图,深度图需要使用训练好的模型计算得到,最终产生点云.ply文件.

作者将所有scan数据划分训练、验证、测试集,并放在lists文件夹中的不同的txt文件中,目录如下:

lists
	├─dtu
	│      all.txt
	│      test.txt
	│      train.txt
	│      val.txt

3 训练PatchMatchNet

3.1 输入参数

举例几个重要参数

"--trainpath",default="D:/AlgorithmFile/3DCoronaryTreeReconstruction/PatchmatchNet/sourceCode/PatchmatchNet-main/data/mini_dtu/train/", help="训练集的路径"(自定义)
"--epochs", type=int, default=16, help="训练轮数"(自定义)
"--batch_size", type=int, default=1, help="训练一批次的大小"(自定义)
"--loadckpt", default=None, help="加载一个特定的断点文件"(默认无)
"--parallel", action="store_true", default=False, help="如果设置,使用并行,这可以防止导出TorchScript模型."
"--patchmatch_iteration", nargs="+", type=int, default=[1, 2, 2], help="patchmatch模块在stages 1,2,3的自迭代次数"
"--patchmatch_num_sample", nargs="+", type=int, default=[8, 8, 16],help="在stages 1,2,3局部扰动的产生的样本数量"
"--patchmatch_interval_scale", nargs="+", type=float, default=[0.005, 0.0125, 0.025], help="在逆深度范围内生成局部扰动样本的归一化区间"
"--patchmatch_range", nargs="+", type=int, default=[6, 4, 2],help="补丁匹配在阶段1,2,3上传播的采样点的固定偏移")
"--propagate_neighbors", nargs="+", type=int, default=[0, 8, 16],help="自适应传播在阶段1,2,3上的邻居数目"
"--evaluate_neighbors", nargs="+", type=int, default=[9, 9, 9],help="第1、2、3阶段自适应评价的自适应匹配代价聚合的邻居个数"

3.2 制定数据集加载方式

# dataset, dataloader
train_dataset = MVSDataset(args.trainpath, args.trainlist, "train", 5, robust_train=True)
test_dataset = MVSDataset(args.valpath, args.vallist, "val", 5,  robust_train=False)

TrainImgLoader = DataLoader(train_dataset, args.batch_size, shuffle=True, num_workers=8, drop_last=True)
TestImgLoader = DataLoader(test_dataset, args.batch_size, shuffle=False, num_workers=4, drop_last=False)

输入:训练集的路径,训练集的train.txt列表,训练模式,待计算的5张邻域图像数(最多10张图),鲁棒性训练(在10张图中随机选择5张无序的)

MVSDataset函数的功能:
1、设定阶段数为4
2、读取训练集的列表
3、设置一个空列表metas存放【不同scan,不同光照下的light_idx索引(同一角度共有7种光照不同的图),不同的参考图ref,对应的10张邻域图src集合
4、获取数据的方法:首先,读取一个metas元素,如果是鲁棒训练,则参考图ref+随机从10张邻域图中选择5张,否则参考图ref+顺序选前5张邻域图
接着,

(1)从Rectified文件夹中读取校正的(宽640x高512)参考图ref和所有src(共6张彩色图,注意参考图的ID是从0-49,对应原图的ID:1-49,故读取原图是ID+1

(2)从Depths_raw文件夹中读取深度可视化png图(宽160x高128)参考图ref和所有src(共6张彩色图),从Depths_raw文件夹中读取深度pfm图(宽160x高128)参考图ref和所有src(共6张彩色图),这两个图的ID跟参考图ID一样从0-48,故不需要加1。

(3) 从Cameras_1文件夹中读取6张不同视角下的相机内外参数和深度范围。

(4)读取的相机内参对应的是较小的图片,而现在需要更大尺寸的图片对应的内参,故需要升高相机内参,这里放大了原来的4倍。

#共六组内外参
intrinsic[:2, :] *= 4.0
intrinsics.append(intrinsic)
extrinsics.append(extrinsic)

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

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

相关文章

Mac运行Docker报错

Mac运行Docker报错 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我点…

利用扰动模型计算旋转矩阵的导数例题

深蓝学院《自动驾驶与机器人中的SLAM技术》第一次课习题 这里直接贴出图片了,懒得打字了。

计算机基础知识38

创建表的完整语法 create table t1(id int,name varchar(43),age int); create table 库名.表名( 字段名1 数据类型 约束条件 约束条件 约束条件 约束条件, 字段名2 数据类型 约束条件 约束条件 约束条件 约束条件...); 1. 字段名和数据类型必须…

Socket 是什么? 总结+详解

文章摘要:Socket 套接字 编程接口 netstat-ano 创建 建立连接 断开 删除 1.Socket 是什么 Socket :套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和…

Netty 入门 — ByteBuf,Netty 数据传输的载体

上篇文章(Netty 入门 — Bootstrap,一切从这里开始),我们了解了 Netty 的第一个核心组件:Bootstrap,它是 Netty 程序的开端。今天我们来熟悉 Netty 的第二个组件:ByteBuf,Netty 数据…

尚硅谷大数据项目《在线教育之实时数仓》笔记003

视频地址:尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第7章 数仓开发之ODS层 P015 第8章 数仓开发之DIM层 P016 P017 P018 P019 01、node001节点Linux命令 02、KafkaUtil.java 03、DimSinkApp.java P020 P021 P022 P023 第7章 数…

GNSS全球卫星导航系统相关技术

一、参考资料 映核物联网|什么是GNSS? 二、GNSS相关介绍 GNSS(Global Navigation Statellite System),即全球导航卫星系统,GNSS的作用是定位和导航。至少4颗卫星,实现准确定位。 1. 全球导航…

vue3使用flv播放视频监控

第一种方法使用安装的 npm install --save flv.js,会出现报错的情况,如flv.js播放视频时出现Failed to execute ‘appendBuffer’ on ‘SourceBuffer’ 解决方法[https://www.cnblogs.com/melancholys/p/14085804.html](https://www.cnblogs.com/melanch…

1024版烟花--2的10次方 快乐

效果: import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;public class App extends Frame {//背景int b1x[] {0, 666, 666, 0};int b1y[] {00, 0, 666, 666};Thread thread;int count 8;//个数App() {setLayout(new …

Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境

文章目录 1 使用环境要求:2 配置webdav3 测试局域网使用potplayer访问webdav4 内网穿透,映射至公网5 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内容让人一言难尽,就算是购买了国外的优秀作品,也总是在关键剧情上删删…

apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】

往期教程 apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 上期演示了下如何修改apk的名称。相信只要用心的友友都会操作了。这次讲解下如何修改软件的版本号与版本名字的操作 名词浅释: 在apk反编译中的VersionCode---是版本号的意思.是一…

【Linux学习】—Linux常用指令(一)

【Linux学习】—Linux常用指令(一) 一、组管理和权限管理 在Linux中的每个用户必须属于一个组,不能独立于组外。 1️⃣所有者 一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。 查看文件的所有者…

马尔科夫链、PCV及贝叶斯动图详解

马尔科夫链、主成分分析以及条件概率等概念,是计算机学生必学的知识点,然而理论的抽象性往往让学生很难深入地去体会和理解。而本文,将这些抽象的理论概念,用可视化的方式来解释,还可调节相应参数来改变结果&#xff0…

1997-2021年世界各国GDP数据

1997-2021年世界各国GDP数据 1、时间:1997-2021年 2、来源:世界银行 3、范围:世界各国 4、指标:国内生产总值(固定LCU)、国内生产总值(当前LCU)、国内生产总值(现值美…

2023年或者每一年值得最被关注的技术趋势是什么?

2023年或者近几年中,值得关注的技术趋势有很多,其中一些主要的包括: 人工智能与机器学习: 人工智能(AI)和机器学习(ML)继续在各个行业中引起变革,从医疗保健到金融服务,再…

快速入门Elasticsearch:安装、基本概念、分词器和文档基本操作详解

本文主要介绍快速入门 Elasticsearch,从 安装 、 基本概念 、 分词器 、*** 文档基本操作 *** 这 4 个方面快速入门。 Elasticsearch 是一款近实时的搜索引擎,底层是基于 Lucene 做搜索,再此基础上加入了分布式的特性,以便支持海…

QListWidget 类使用教程

文章目录 1、简介2、属性3、functions3.1、访问属性相关 function3.2、公共槽3.3、Signal3.4、其他方法 QT 官方文档参考地址:https://doc.qt.io/qt-5/qlistwidget.html 1、简介 moudleclass说明PyQt5.QtWidgets包含了一整套UI元素控件,用于建立符合系统…

Hugging face下载的离线模型不会用?没关系,看这里

可能遇到的问题: 不知道大家有没有碰到这样的问题,想从hugging face 加载模型,使用其提供的接口做一个简单的demo,但是由于网络的原因没办法正常访问: (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443):…

【封装--限定符private--包】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 封装访问限定符 private快捷键实现get和set 封装扩展之包如何导包怎么找包 自定义包方法: 总结 封装 访问限定符 private 什么是封装? 就像电脑&…

DC-8 靶机

DC_8 信息搜集 存活检测 详细扫描 后台网页扫描 网站信息搜集 访问不同的页面的时候 url 随之变化 尝试 sql 注入 在 url 后输入 验证 直接报数据库语法错误 漏洞利用 使用 sqlmap 工具 爆破数据库 sqlmap -u 10.4.7.153/?nid2 --dbs --batch成功爆破出两个数据库 d7db…