提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
之前我介绍了D2HC网络的原理 链接在这
D2HC原理
现在就是上手代码主要为测试部分,为大家讲一下网络的配置和参数设置问题,此外将我遇见的问题与大家分享。
本网络使用的数据集为DTU和Blended_MVS,当然也可以使用在采集数据集,只需整合成DTU结构即可。
使用的是dtu的测试数据集,大小为1g左右,链接dtu测试集,每张图片尺寸为1600×1200,但实际上我们测试时设定为800×600
大小为37g,链接测试集,一般来说几乎所有的论文都是用这个低分的数据图,尺寸为768×576
导入工程后需要更改一些参数设置,涉及的文件有eval.py,fusion.py,test.txt
先在根目录下创建 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')
运行完之后即可生成点云,
在我的机子上,占用的显存峰值(单应性变换)为6g左右,一般为2.8g。
首先他在大体上与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多秒
过几天要是有空,会对代码进行一个大概的分析