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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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

现在就是上手代码主要为测试部分,为大家讲一下网络的配置和参数设置问题,此外将我遇见的问题与大家分享。


一、数据集准备

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

1.DTU

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

2.Blended_MVS

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

二、测试步骤

导入工程后需要更改一些参数设置,涉及的文件有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')

运行完之后即可生成点云,
在这里插入图片描述
在我的机子上,占用的显存峰值(单应性变换)为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

在这里插入图片描述

2.blended_mvs

在这里插入图片描述

过几天要是有空,会对代码进行一个大概的分析

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
医学图像的三维重建和可视化是一种将医学图像数据转化为可视化呈现的技术。该技术可以通过计算机算法和软件工具,将医学图像数据中的二维切片合成为一个三维模型,并通过可视化技术将其展示出来。 一个实际的例子是使用软件工具VC(VolumeConstructor)实现医学图像的三维重建和可视化。首先,将医学图像数据(如CT扫描、磁共振图像等)导入到VC中。然后,通过一系列的图像处理算法,将二维切片合成为三维模型。 接着,使用VC提供的可视化工具,将重建三维模型进行进一步操作和呈现。可以通过调整视角、放大缩小、旋转等操作,观察和分析医学图像在三维空间中的结构和特点。同时,还可以将生成的三维模型与其他医学数据进行叠加,如肿瘤分布、血管走向等,能够更好地帮助医生进行诊断和治疗方案的制定。 三维重建和可视化技术在医学领域中具有广泛的应用。例如,在外科手术前的规划过程中,医生可以通过三维重建和可视化技术,更好地理解患者的病情,并制定最佳的手术方案。此外,在放射学诊断中,医生可以通过三维重建和可视化技术,更准确地识别病变、评估病情,并提供更好的治疗建议。 综上所述,医学图像的三维重建和可视化是一种将医学图像数据转化为可视化呈现的技术。通过软件工具VC实现实例,可以更好地帮助医生进行诊断、治疗规划和病情评估等工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值