MipNerf 从0开始搭建到训练自己的数据集

前提

默认对Anaconda安装成功,不需要安装Cuda等和GPU相关的任何包,因为在虚拟环境中有相应的方法进行安装。故,本教程只需要在电脑中安装Anaconda即可。

电脑配置:
本文是在ubuntu18.04+3080环境下实现。

Nerf数据集下载

原文中提供了bash的下载方法,其对大多用户不可用,同时速度较慢,采用网盘下载。网盘链接
在这里插入图片描述
如果只是用Nerf的话可以下载llff_data。如果用mipnerf则下载synthetic,synthetic是有相机参数的文件夹。

下载成功后将数据集放在MipNerf文件夹中的Data文件夹下即可。

MipNerf的运行和使用

MipNerf文章地址:MipNerf
MipNerf的GitHub地址:代码地址
但由于MipNerf的原版安装有很多问题,后来根据其他资料换成了另一个地址:新代码地址,后续也是按照新代码进行环境配置和更改。

环境安装

MipNerf中已经详细介绍了环境安装的教程,但是在一步一步使用之后,发现会出现如下错误:
在这里插入图片描述
这表明系统上安装的 NVIDIA 驱动程序版本较老,与当前的 PyTorch 版本不兼容。而服务器的NVIDA我又没办法自己升级,因此考虑降低PyTorch版本。
使用指令:

nvcc -V

查看CUDA版本是11.4:

nvcc: NVIDIA ® Cuda compiler driver
Copyright © 2005-2021 NVIDIA Corporation
Built on Mon_Oct_11_21:27:02_PDT_2021
Cuda compilation tools, release 11.4, V11.4.152
Build cuda_11.4.r11.4/compiler.30521435_0

官网中查看pytorch_lightning1.5对应的pytorch应该≥1.7, ≤1.10,如下:
在这里插入图片描述
因此,安装相应的Pytorch
在这里插入图片描述
因此需要更改指令为如下方式:

conda create -n mipnerf -y python=3.8
conda activate mipnerf
python -m pip install --upgrade pip
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html
pip install -r requirements.txt

安装成功后运行指令:

python train.py --out_dir out_fox --data_path ./data/ima --dataset_name blender exp_name exp

可以看到,在GPU地方已经变为True,表明环境可以正确调用GPU进行训练。
在这里插入图片描述
到此,环境正确安装。

问题一

安装成功后,运行过程发生如下错误:

AttributeError: module ‘PIL.Image’ has no attribute ‘ANTIALIAS’

这是因为在高版本的Pillow中移除了ANTIALIAS,查看Pillow的版本,如果大于10则手动降低:

pip install Pillow==9.5.0

重新运行训练程序,可以工作。

问题二

RuntimeError: CUDA out of memory. Tried to allocate 384.00 MiB (GPU 0; 11.77 GiB total capacity; 7.96 GiB already allocated; 163.31 MiB free; 8.03 GiB reserved in total by PyTorch)

这是因为GPU内存不足,3080的内存只有12GB,而一次MipNerf的训练可以达到20-30GB,故会出现此问题。修改./configs/lego.yaml代码:

seed: 4
num_gpus: 1
exp_name: 'lego'
train:
  batch_size: 1024
  batch_type: 'all_images'  # single_image: inputs a full image; all_images: inputs batch_size rays sampled from different image
  num_work: 4
  randomized: True
  white_bkgd: True
val:
  batch_size: 1
  batch_type: 'single_image'  # For "single_image", the batch must set to 1
  num_work: 4
  randomized: False
  white_bkgd: True
  check_interval: 10000
  chunk_size: 8192  # The amount of input rays in a forward propagation
  sample_num: 4  # Total number of images verified during once validation

问题三

ValueError: val_check_interval (10000) must be less than or equal to the number of the training batches (2083). If you want to disable validation set limit_val_batches to 0.0 instead.
这是验证集上进行的间隔检查超出了训练批次的数量,修改train.py的代码。

seed: 4
num_gpus: 1
exp_name: 'lego'
train:
  batch_size: 1024
  batch_type: 'all_images'  # single_image: inputs a full image; all_images: inputs batch_size rays sampled from different image
  num_work: 4
  randomized: True
  white_bkgd: True
val:
  batch_size: 1
  batch_type: 'single_image'  # For "single_image", the batch must set to 1
  num_work: 4
  randomized: False
  white_bkgd: True
  check_interval: 2000
  chunk_size: 8192  # The amount of input rays in a forward propagation
  sample_num: 4  # Total number of images verified during once validation

在这里插入图片描述
然后可以正常运行,到这里解决了内存不足等问题。(但是有四块3080,似乎应该是可以跑满源代码的,不知道为什么一直提示第一块内存不足,这里还有问题需改进。

发现了问题所在,在config/lego.yaml文件中,有一段num_gpus:
1
,这个决定了最大使用的GPU,因此,我只需要把这里的1改为服务器中最大GPU数目,即可完成多GPU的调用。(注意,这里的修改只对train.py有用)。

问题四

pip安装后conda list 没有包。
先查看pip的路径:

which pip

/home/XXX/.local/bin/pip

显然,这个是全局pip,我们要做的是将包安装到虚拟环境中,这个pip安装到了base下面,有一个简单的方法是使用如下指令:

python -m pip install name_bao

就可以安装在虚拟环境中,具体修改pip的默认路径方法后续更新。

使用自己的数据集

本章大量使用博主《三维小菜鸡》的文章:nerf训练自己的数据,过程记录十分详细

具体过程可以参考该文章,本文只对其中报错部分进行相关的完善。

获得JSON文件

从网上下载COLMAP安装包即可,下载链接
在这里插入图片描述
下载后安装即可,第二步需要下载instant_ngp的源码文件,这里的作用是产生MipNerf需要的json文件,博主发现ngp有一个函数提供了从COLMAP得到json文件的方法,自此说明。

instant-ngp源码,下载成功后,在终端中输入以下指令:

conda create -n ngp -y python=3.9
conda activate ngp
python =m pip install --upgrade pip
pip install -r requirements.txt

配置好ngp的环境后需要使用函数colmap2nerf.py,这个函数可以直接传入视频,也可以传入图片进行生成json文件。

python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images [图片路径]

最后在文件夹中会发现一个transforms.json文件,该文件就是数据集的相机文件。

MipNerf修改部分

再MipNerf的代码中,需要修改两个地方,一个是train.py需要使用的,一个是render_video.py需要的。

train.py

train的命令为:

python train.py --out_dir OUT_DIR --data_path UZIP_DATA_DIR --dataset_name blender exp_name EXP_NAME

在train.py函数中,会调用./configs/XXX.yaml文件,这个文件对train的GPU使用数目,训练轮次,batchsize进行了规定,为了更快地训练结束,我调整了格式如下:
在这里插入图片描述
修改此文件即可,其余部分不用修改。

render_video.py

render文件原来设定使用一个GPU,我修改让其使用多GPU训练,run_render函数代码如下:

def run_render(args):
    device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
    model = MipNeRFSystem.load_from_checkpoint(args.ckpt).to(device).eval()

    # 使用DataParallel包装模型以在四个GPU上运行
    if torch.cuda.device_count() > 1:
        print("Using", torch.cuda.device_count(), "GPUs!")
        model = torch.nn.DataParallel(model, device_ids=[3, 4])
    # Access hparams through the underlying model
    if isinstance(model, torch.nn.DataParallel):
        underlying_model = model.module
        hparams = underlying_model.hparams
    else:
        hparams = model.hparams
    exp_name = hparams['exp_name']

除此之外,需要修改相机参数camera_angle_x,这个值来自于json文件中的camera_angle_x。

    parser.add_argument('--camera_angle_x', help='camera_angle_x in source dataset',
                        type=float, default=0.9156173236398449)

json文件格式如下:
在这里插入图片描述
最终,运行函数就可以生成视频文件,mov文件需要转换为mp4才可以在windows下播放。

 python render_video.py --ckpt OUT/ckpt/exp/epoch=0-step=9999.ckpt --out_dir OUT_vidio --scale 4
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
Mipnerf是一种用于复现NeRF(Neural Radiance Fields)的方法,它通过使用多尺度表示来提高渲染质量和效率。以下是复现Mipnerf代码的一般步骤: 1. 数据准备:首先,你需要准备用于训练数据集。这些数据集通常包含多个视角下的图像和相应的相机参数。 2. 构建NeRF模型:你需要实现NeRF模型的网络结构。这个模型通常由一个编码器和一个解码器组成。编码器将输入的相机参数和图像坐标映射到一个隐空间中的表示,解码器则将隐空间中的表示映射回图像颜色和密度。 3. 训练NeRF模型:使用准备好的数据集,你需要训练NeRF模型。训练过程中,你可以使用渲染损失函数来优化模型参数,使得模型能够生成与真实图像尽可能接近的渲染结果。 4. 实现Mipnerf:在NeRF模型的基础上,你需要实现Mipnerf的多尺度表示。这可以通过在编码器和解码器中添加多个分辨率级别的网络层来实现。 5. 训练Mipnerf模型:使用准备好的数据集,你需要训练Mipnerf模型。训练过程中,你可以使用多尺度渲染损失函数来优化模型参数,使得模型能够生成更高质量的渲染结果。 6. 测试和评估:在完成训练后,你可以使用训练好的Mipnerf模型来生成新视角下的图像,并进行评估和比较。 以上是一般的复现步骤,具体实现细节可能因代码库的不同而有所差异。你可以参考相关的论文和代码库来获取更详细的指导和实现细节。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岂止是狼子野心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值