基于Nerf的三维重建算法Neus初探

目录

介绍

安装

训练开源数据

训练自己的数据


介绍

作者提出了一种新的神经表面重建方法,称为NeuS,用于从2D图像输入中以高保真度重建对象和场景。在NeuS中,我们建议将曲面表示为有符号距离函数(SDF)的零级集,并开发一种新的体绘制方法来训练神经SDF表示。我们观察到,传统的体绘制方法会导致表面重建的固有几何误差(即偏差),因此提出了一种在一阶近似中没有偏差的新公式,从而即使在没有掩模监督的情况下也能实现更准确的表面重建。在DTU数据集和BlendedMVS数据集上的实验表明,NeuS在高质量表面重建方面优于现有技术,尤其是对于具有复杂结构和自遮挡的对象和场景。

算法已开源,先把代码扔这了。

github:GitHub - Totoro97/NeuS: Code release for NeuS

安装

git clone https://github.com/Totoro97/NeuS.git
cd NeuS
pip install -r requirements.txt

这是readme中给出的,如果顺利的话说明你安装的很顺利,如果不顺利的话,可以参考我的方法。(顺利的安装千篇一律,不顺的安装各有各的不顺,我的不顺是cuda和pytorch的版本不匹配)

首先还是推荐用conda搭建虚拟环境。

conda create -n neus python=3.8

激活虚拟环境

conda activate neus

然后安装pytorch,requirements.txt给出的版本是1.8.0,这里为了体现出个性,我选择装1.9.0。(其实是1.8.0版本不匹配报错了,不得已换了1.9.0,我用的cuda版本是11.1)

pip --default-timeout=1000 install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html

然后用pip install 把requirements.txt中的包都装一下,还有个tensorboard没写,也一并装一下。

环境搭建完成。

训练开源数据

在NeuS文件夹下创建public_data用于存放数据,把下载的开源数据解压放到这个文件夹下。

用不带mask的模式训练

python exp_runner.py --mode train --conf ./confs/womask.conf --case bmvs_clock

带mask的模式训练

python exp_runner.py --mode train --conf ./confs/wmask.conf --case bmvs_clock

这里显存不足的话可能会报错,把./confs/wmask.conf中的batch_size调小一点即可。

训练生成的结果会保存在根目录下exp文件夹下,可以看到meshes文件夹中保存了训练过程中的mesh模型,但面片较少。需要比较精细的mesh模型需要运行

python exp_runner.py --mode validate_mesh --conf ./confs/womask.conf --case bmvs_clock--is_continue 

还可以生成多视角的渲染效果,可运行:

python exp_runner.py --mode interpolate_000_001 --conf ./confs/womask.conf --case bmvs_clock --is_continue 

000,001是图片编号,根据自己需要调整。

用meshlab打开ply文件,没有纹理,只有白模。

基于Nerf的三维重建算法Neus初探_第1张图片

训练自己的数据

首先用手机对着重建模型咔咔一顿拍,尽量多拍一些不同角度的,然后我们获得了一堆图像文件。

先来看一下之前训练的开源数据,包含了两个文件夹和一个文件。

基于Nerf的三维重建算法Neus初探_第2张图片

image文件夹就是rgb图片数据,算法默认支持png格式。

基于Nerf的三维重建算法Neus初探_第3张图片

mask文件夹包含的是模型的前景图像,前景和后景以黑色和白色区分,如果配置文件选择withou mask,其实这个文件夹的数据是没有意义的。但必须有文件,且名称、图像像素要和image的图像一一对应。

最后是cameras_sphere.npz文件,它包括了相机的属性和图像的位姿信息等,这个是需要我们自己计算的。官方给出了两种计算方案,这里只介绍第二种,用colmap计算npz文件。colmap的使用可参考:colmap简介及入门级使用 - 知乎。这里就不详述了。

新建一个文件夹test1和一个子文件夹test1/image,并将图片数据都放在image文件夹下。使用colmap计算得到data.db文件,File->Export model将计算结果导出到/sparse/0文件夹下。

基于Nerf的三维重建算法Neus初探_第4张图片

运行

cd colmap_preprocess
python imgs2poses.py ../../public_data/test1

会在/public_data/test1路径下生成sparse_points.ply文件。这是重建的稀疏点云模型。根据需要分割要建模的区域保存为sparse_points_interest.ply。

运行

python gen_cameras.py ../../public_data/test1

在test1/preprocessed会生成cameras_sphere.npz文件。

此时按照开源数据的方法训练是会报错的,还差mask数据,即使运行without mask模式也不行,必须要在mask文件夹下找到对应image文件夹的数据,图像的文件名和大小也要一致,空白图片也可以。这里把我的生成mask数据的代码放到这里,供大家参考。

# coding:utf-8

import cv2
import os
import numpy as np

dir = '/home/user/nerf/NeuS/public_data/test1'
dir_mask = os.path.join(dir,'mask')
if not os.path.exists(dir_mask):
    os.mkdir(dir_mask)
img_dir = os.path.join(dir,'image')
img_list = os.listdir(img_dir)
for img_file in img_list:
    (filename, extension) = os.path.splitext(img_file)
    if extension == '.JPG' :
        img_file_png = filename + '.png'
        img_file_png = os.path.join(img_dir, img_file_png)
        img_file_mask = dir + '/mask/' + filename + '.png'
        img = cv2.imread(os.path.join(img_dir,img_file))
        img_mask = np.zeros(img.shape, np.uint8)
        for i in range(img.shape[0]):
            for j in range(img.shape[1]):
                 img_mask[i,j,:] = [255,255,255]
        cv2.imwrite(img_file_png, img)  
        cv2.imwrite(img_file_mask, img_mask)  
        os.remove(os.path.join(img_dir,img_file))  # 删除原文件

然后和开源数据用相同的方法训练即可。

你可能感兴趣的:(python,深度学习,开发语言)