三维重建——D2HC-RMVSNet网络实战

提示:文章写完后,可以自动生成目录。生成方法请参考右侧帮助文档

前言

之前我介绍了D2HC网络的原理 链接在这
D2HC原理

现在,开始的代码主要用于测试部分。我会告诉你网络配置和参数设置。另外,我会和大家分享我遇到的问题。

1. 数据集准备

本网络使用的数据集为DTU和Blended_MVS,当然也可以使用在采集数据集,只需整合成DTU结构即可。

1.DTU

使用的是dtu的测试数据集,大小为1g左右,链接dtu测试集,每张图片尺寸为1600×1200,但实际上我们测试时设定为800×600

2.Blended_MVS

大小为37g,链接测试集,一般来说几乎所有的论文都是用这个低分的数据图,尺寸为768×576

2. 测试步骤

导入工程后需要更改一些参数设置,涉及的文件有eval.py,fusion.py,test.txt

1.DTU

先在根目录下创建 outputs文件夹
创建checkpoints文件夹,并将下载的模型放置其中,模型链接预训练模型
首先对eval.py进行更改,其中test.txt是需要处理的镜头列表,可自行增删
代码显示如下:

parser = argparse.ArgumentParser(description='Predict depth, filter, and fuse. May be different from the original implementation')
parser.add_argument('--model', default='drmvsnet', help='select model')

parser.add_argument('--inverse_cost_volume', action='store_true', help='need to multiply -1 with cost volume')
parser.add_argument('--fea_net', default='FeatNet', help='feature extractor network')
parser.add_argument('--cost_net', default='UNetConvLSTM', help='cost volume network')
parser.add_argument('--refine_net', default='RefineNet', help='refinement network')

parser.add_argument('--dp_ratio', type=float, default=0.0, help='learning rate')

parser.add_argument('--inverse_depth', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=True)
parser.add_argument('--origin_size', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=False)
parser.add_argument('--refine', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=False)
parser.add_argument('--save_depth', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=True)
parser.add_argument('--fusion', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=False)
parser.add_argument('--syncbn', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=False)
parser.add_argument('--return_depth', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=True)

parser.add_argument('--max_h', type=int, default=600, help='Maximum image height when training')   
parser.add_argument('--max_w', type=int, default=800, help='Maximum image width when training.')    
parser.add_argument('--image_scale', type=float, default=1.0, help='pred depth map scale') # 0.5
parser.add_argument('--reg_loss', help='True or False flag, input should be either "True" or "False".',
    type=ast.literal_eval, default=False)

parser.add_argument('--gn', help='Use gn as normlization".',
    type=ast.literal_eval, default=True)
parser.add_argument('--light_idx', type=int, default=3, help='select while in test')
parser.add_argument('--cost_aggregation', type=int, default=0, help='cost aggregation method, default: 0')
parser.add_argument('--view_num', type=int, default=7, help='training view num setting')
parser.add_argument('--ngpu', type=int, default=1, help='gpu size')

parser.add_argument('--dataset', default='data_eval_transform', help='select dataset')
parser.add_argument('--testpath', default='./data', help='testing data path')
parser.add_argument('--testlist', default='lists/dtu/test.txt',  help='testing scan list')

parser.add_argument('--batch_size', type=int, default=1, help='testing batch size')
parser.add_argument('--numdepth', type=int, default=512, help='the number of depth values')   
parser.add_argument('--interval_scale', type=float, default=0.8, help='the depth interval scale')   

parser.add_argument('--pyramid', type=int, default=0, help='process the pyramid scale of origin image')

parser.add_argument('--loadckpt', default='./checkpoints/model.ckpt', help='load a specific checkpoint')
parser.add_argument('--outdir', default='./outputs', help='output dir')
parser.add_argument('--display', action='store_true', help='display depth images and masks')

执行后输出在outputs文件夹下
请添加图片描述
现在我们已经得到了各个镜头下的深度图,然后就是执行点云融合脚本,需要对fusion.py做更改

parser = argparse.ArgumentParser(description='Predict depth, filter, and fuse. May be different from the original implementation')
parser.add_argument('--model', default='mvsnet', help='select model')

parser.add_argument('--dataset', default='dtu_yao_eval', help='select dataset')
parser.add_argument('--testpath', default='./data',help='testing data path')
parser.add_argument('--testlist', default='./lists/dtu/test.txt',help='testing scan list')

parser.add_argument('--batch_size', type=int, default=1, help='testing batch size')
parser.add_argument('--numdepth', type=int, default=192, help='the number of depth values')
parser.add_argument('--interval_scale', type=float, default=1.06, help='the depth interval scale')

parser.add_argument('--loadckpt', default=None, help='load a specific checkpoint')
parser.add_argument('--outdir', default='./outputs/checkpoints_model.ckpt', help='output dir')
parser.add_argument('--display', action='store_true', help='display depth images and masks')

parser.add_argument('--test_dataset', default='dtu', help='which dataset to evaluate')

运行后可以生成点云,
三维重建——D2HC-RMVSNet网络实战
在我的机子上,占用的显存峰值(单应性变换)为6g左右,一般为2.8g。

2.Blended_MVS

首先他在大体上与DTU类似,但官方未直接给运行sh文件,想要成功运行需要更改fusion.py脚本的一句代码。

代码显示如下:

def filter_depth(scan_folder, out_folder, plyfilename, photo_threshold):
    # the pair file
    pair_file = scan_folder+'/'+'cams'+'/'+'pair.txt'    #适用blended数据集  修改 

在运行eval.py时需要设置的参数如下

parser = argparse.ArgumentParser(
    description='Predict depth, filter, and fuse. May be different from the original implementation')
parser.add_argument('--model', default='drmvsnet', help='select model')

parser.add_argument('--inverse_cost_volume', action='store_true', help='need to multiply -1 with cost volume')
parser.add_argument('--fea_net', default='FeatNet', help='feature extractor network')
parser.add_argument('--cost_net', default='UNetConvLSTM', help='cost volume network')
parser.add_argument('--refine_net', default='RefineNet', help='refinement network')

parser.add_argument('--dp_ratio', type=float, default=0.001, help='learning rate')

parser.add_argument('--inverse_depth', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=True)
parser.add_argument('--origin_size', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=False)
parser.add_argument('--refine', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=False)
parser.add_argument('--save_depth', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=True)
parser.add_argument('--fusion', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=False)
parser.add_argument('--syncbn', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=False)
parser.add_argument('--return_depth', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=True)

parser.add_argument('--max_h', type=int, default=576, help='Maximum image height when training')  
parser.add_argument('--max_w', type=int, default=768, help='Maximum image width when training.')   
parser.add_argument('--image_scale', type=float, default=1.0, help='pred depth map scale')  # 0.5
parser.add_argument('--reg_loss', help='True or False flag, input should be either "True" or "False".',
                    type=ast.literal_eval, default=False)

parser.add_argument('--gn', help='Use gn as normlization".',
                    type=ast.literal_eval, default=True)
parser.add_argument('--light_idx', type=int, default=3, help='select while in test')
parser.add_argument('--cost_aggregation', type=int, default=0, help='cost aggregation method, default: 0')
parser.add_argument('--view_num', type=int, default=7, help='training view num setting')  #20  blended
parser.add_argument('--ngpu', type=int, default=1, help='gpu size')

parser.add_argument('--dataset', default='data_eval_transform_blend', help='select dataset')
parser.add_argument('--testpath', default='./data', help='testing data path')    #./data
parser.add_argument('--testlist', default='./lists/blendedmvs/validation_list.txt', help='testing scan list')  #./lists/blendedmvs/validation_list.txt

parser.add_argument('--batch_size', type=int, default=1, help='testing batch size')
parser.add_argument('--numdepth', type=int, default=512, help='the number of depth values')   
parser.add_argument('--interval_scale', type=float, default=0.5, help='the depth interval scale')   

parser.add_argument('--pyramid', type=int, default=0, help='process the pyramid scale of origin image')

parser.add_argument('--loadckpt', default='./checkpoints/model_blended.ckpt', help='load a specific checkpoint')
parser.add_argument('--outdir', default='./outputs', help='output dir')
parser.add_argument('--display', action='store_true', help='display depth images and masks')

之后的流程与dtu类似。
在我的机子上一张图的处理时间为20多秒

结果

1.dtu

三维重建——D2HC-RMVSNet网络实战

2.blended_mvs

三维重建——D2HC-RMVSNet网络实战

过几天有时间的话,我再对代码做个大致的分析

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年3月18日 下午6:08
下一篇 2022年3月18日 下午6:23

相关推荐