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

【三维重建-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.0intrinsic(内参:针孔相机的["fx", "fy", "cx", "cy"]2892.33 0 823.206
0 2883.18 619.07
0 0 1425 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.rhkb.cn/news/169729.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python sqlalchemy(ORM)- 02 表关系

文章目录 表关系ORM表示 1v1ORM表示 1vm 表关系 1:1,表A 中的一条记录,仅对应表B中的一条记录;表B的一条记录,仅对应表A的一条记录。1:m,表A中的一条记录,对应表B中的多条记录,表B中的一条记录…

【机器学习】集成学习Boosting

文章目录 集成学习BoostingAdaBoost梯度提升树GBDTXGBoostxgboost库sklearn APIxgboost库xgboost应用 集成学习 集成学习(ensemble learning)的算法主要包括三大类:装袋法(Bagging),提升法(Boo…

在 Python 中使用 Pillow 进行图像处理【2/4】

第二部分 一、说明 该文是《在 Python 中使用 Pillow 进行图像处理》的第二部分,主要介绍pil库进行一般性处理:如:图像卷积、钝化、锐化、阈值分割。 二、在 Python 中使用 Pillow 进行图像处理 您已经学习了如何裁剪和旋转图像、调整图像大…

26. 通过 cilium pwru了解网络包的来龙去脉

pwru是一种基于eBPF的工具,可跟踪Linux内核中的网络数据包,并具有先进的过滤功能。它允许对内核状态进行细粒度检查,以便通过调试网络连接问题来解决传统工具(如iptables TRACE或tcpdump)难以解决甚至无法解决的问题。在本文中,我将介绍pwru如何在不必事先了解所有内容的…

【java】【重构二】分模块开发版本锁定以及耦合(打包)实战

目录 一、创建dependencyManagement标签 二、 将需要版本控制的依赖版本进行标签设置 三、将需要版本控制的依赖从各子模块迁移到此处 四、将父模块的依赖版本控制 五、删除子模块的全部版本 1、bocai-web-management模块 2、bocai-utils模块 六、打包 1、确定代码都…

shein面试:nacos无入侵配置,做过吗,怎么做?

说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,遇到很多很重要的面试题: 无入侵配置,做过吗,怎么做的?Na…

学习package.json

package.json 文件,它是项目的配置文件,常见的配置有配置项目启动、打包命令,声明依赖包等。package.json 文件是一个 JSON 对象,该对象的每一个成员就是当前项目的一项设置。 {"name": "monorepo_frame",&q…

Go 实现选择排序算法及优化

选择排序 选择排序是一种简单的比较排序算法,它的算法思路是首先从数组中寻找最小(大)的元素,然后放到数组中的第一位,接下来继续从未排序的元素中寻找最小(大)元素,然后放到已排序…

Zabbix告警与飞书集成

一、配置媒介 1、下载飞书的Zabbix媒介类型如下: zbx_export_mediatype_feishu.xml 2、Zabbix中导入媒介类型 Zabbix Web中选择管理 > 报警媒介,然后导入该媒介类型。导入规则选择“更新现有的”和“创建新的”。 3、配置飞书媒介类型用户 Zabbi…

【MyBatis进阶】mybatis-config.xml分析以及try-catch新用法

目录 尝试在mybatis项目中书写增删改查 遇见问题:使用mybaties向数据库中插入数据,idea显示插入成功,但是数据库中并没有数据变化? MyBatis核心配置文件剖析 细节剖析: try-catch新用法 截至目前我的项目存在的问题&#xf…

AD20~PCB的板层设计和布线

1、打开51单片机最小系统的工程文件。 2、完成原理图后续工作:打开原理图文件,双击元件“CH340X”窗口右边弹出元件内部属性设置界面,在窗口下方点击“Footprint ->Add…”按钮进入添加元件类型界面,进入元件封装选择界面&…

红日靶场复现1

红日靶场复现1🎈🎈🎈🎈🎉🎉🎉🎉🎉🎉🎈🎈🎉🎈🎈🎉 一、主机发现🎈&#x1…

Http长连接同一个socket多个请求和响应如何保证一一对应?

HTTP/2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,如下图所示,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的…

【MySQL-->数据操作】

文章目录 前言一、insert1.单行插入2.多行插入3.插入更新/替换 二、select1.全列查询2.指定列插入3.列别名4. 表达式计算5.去重6.where条件查询7.排序8.limit分页显示 三、update四、delete五、插入查询结果六、聚合函数六、聚合分组1.格式2.where和having的区别 前言 一、inse…

深入理解Redis集群模式、协议、元数据维护方式

文章目录 🍊 集群模式🍊 集群协议🍊 元数据维护方式🎉 集中式🎉 gossip 协议 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出…

nginx中gzip推荐配置

#开启gzip压缩功能 gzip on; #设置允许压缩的页面最小字节数; 这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小. gzip_min_length 10k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存 gzip_buffers 4 16k;#压缩版本 gzip_http_version 1…

零基础Linux_19(进程信号)产生信号+Core_Dump+保存信号

目录 1. 信号前期知识 1.1 生活中的信号 1.2 Linux中的信号 1.3 信号概念 1.4 信号处理方法的注册 2. 产生信号 2.1 通过终端按键产生信号 2.2 调用系统调用向进程发信号 2.3 软件条件产生信号 2.4 硬件异常产生信号 3. 核心转储Core Dump 4. 保存信号 4.1 信号在…

尚硅谷kafka3.0.0

目录 💃概述 ⛹定义 ​编辑⛹消息队列 🤸‍♂️消息队列应用场景 ​编辑🤸‍♂️两种模式:点对点、发布订阅 ​编辑⛹基本概念 💃Kafka安装 ⛹ zookeeper安装 ⛹集群规划 ​编辑⛹流程 ⛹原神启动 🤸‍♂️…

Windows网络监视工具

对于任何规模的企业来说,网络管理在信息技术中都起着至关重要的作用。管理、监控和密切关注网络基础设施对任何组织都至关重要。在Windows网络中,桌面,服务器,虚拟服务器和虚拟机(如Hyper-V)在Windows操作系…

C算法:写一个用于找出数组的最大值和最小值的函数

需求&#xff1a; 写一个用于找出数组的最大值和最小值的函数。 示例&#xff1a;int array[9] {5, 9, 3, 1, 2, 8, 4, 7, 6}; 该数组最大值的下标为1&#xff0c;最小值的小标为3。 代码实现&#xff1a; #include <stdio.h>int getNum(int *array,int len,int (*…