【三维重建】【深度学习】windows10下NeRF代码Pytorch实现

【三维重建】【深度学习】windows10下NeRF代码Pytorch实现

提示:最近开始在【三维重建】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。



前言

NeRF是由加利福尼亚大学伯克利分校的Mildenhall, Beni等人在《NeRF: Representing Scenes as
Neural Radiance Fields for View Synthesis【ECCV 2020】》【论文地址】一文中提出了一种5D的神经辐射场来作为复杂场景的隐式表示,其输⼊稀疏的多⻆度带pose的图像训练得到⼀个神经辐射场模型。简单来说就是通过输入同一场景不同视角下的二维图片和相机位姿,对场景进行三维隐式建模,并通过体素渲染方程实现了合成任意新视角下的场景图片。
在详细解析NeRF网络之前,首要任务是搭建NeRF【Pytorch-demo地址】所需的运行环境,并完成模型训练和测试工作,展开后续工作才有意义。
NeRF预备基础知识
NeRF图像质量评估指标
参考:基于COLMAP制作LLFF格式数据集
NeRF代码Pytorch实现–数据加载(上)
NeRF代码Pytorch实现–数据加载(中)


NeRF模型运行

下载源码并安装环境

win10环境下装anaconda环境,方便搭建专用于NeRF模型的虚拟环境。
【pytorch代码推荐参考教程】

安装GPU版本的pytorch教程,pytorch-gpu版本需要根据个人计算机去安装相应版本。

# 创建虚拟环境
conda create -n nerf_mvs python=3.7
# 查看新环境是否安装成功
conda env list
# 激活环境
activate nerf_mvs 
# 下载githup源代码到合适文件夹,并cd到代码文件夹内(科学上网)
git clone https://github.com/yenchenlin/nerf-pytorch.git
cd nerf-pytorch
# 安装pytorch包
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
# 通过清华源,安装其他包(需要删除关于pytorch的部分)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 查看所有安装的包
pip list
conda list

最终的安装的所有包。

检查torch版,已经安装torch-gpu版本

# 查看pytorch版本
import torch
print(torch.__version__)
# 查看cuda版本
print(torch.version.cuda)
# 查看cuda是否可用
print(torch.cuda.is_available())
# 查看可用cuda数量
print(torch.cuda.device_count())

训练NeRF

1.下载数据集:win10系统下还是有点麻烦,需要保证主机安装了以下环境!!!因为需要在win10下执行bash命令
win10配置wget
win10配置gitbash

# 进入nerf-pytorch目录下,需要用linux的目录格式
cd /E/deep-learning-for-image-processing-master/nerf-pytorch
bash download_example_data.sh

# download_example_data.sh内容
wget http://cseweb.ucsd.edu/~viscomp/projects/LF/papers/ECCV20/nerf/tiny_nerf_data.npz
mkdir -p data
cd data
wget http://cseweb.ucsd.edu/~viscomp/projects/LF/papers/ECCV20/nerf/nerf_example_data.zip
unzip nerf_example_data.zip
cd ..

根据configs目录下的配置文件(XXX.txt)中指定的数据存放路径,把下载的开源数据解压放到NeRF工程内的data文件夹下。


2.训练网络: 在执行指令时,选择指定的配置文件(configs/XXX.txt)训练对应的数据集。

# 开始训练网络(lego数据集)
python run_nerf.py --config configs/lego.txt


训练生成的结果保存在NeRF工程目录下的logs文件夹下:

logs\XXXX目录下保存了训练过程中生成的网络权重:

查看效果(mp4转了GIF):

训练个人数据集

个人数据集的制作流程,可以参考博主的另一篇博文【基于COLMAP制作自己的NeRF(LLFF格式)数据集】,制作数据集所需要的图片是用手机拍摄视频后抽帧获取的。
在/nerf-pytorch/data/nerf_llff_data/目录下查看自己的图片数据集和位姿文件;
在/nerf-pytorch/configs/目录下查看对应的配置文件。

执行nerf代码,开始训练。

# test_frame.txt:对应的数据集的配置文件
python run_nerf.py --config configs/test_frame.txt


查看效果(mp4转了GIF):

生成的视频(GIF)要想包括目标物体,需要在demo中手动调整位姿,因为数据集各有不同,所以位姿也是因人而异。

windows下可能出现的问题:

  1. subprocess.CalledProcessError: Command ‘cp ./data/nerf_llff_data/scene\images/* ./data/nerf_llff_data/XXXX\images_8’ returned non-zero exit status 1.
  2. TypeError: cannot unpack non-iterable NoneType object

产生原因: config/文件下的配置文件XXX.Xtxt设置了factor=8,默认即是8倍下采样,下采样后的图片会被保存在image_8文件夹下,完成这一过程后nerf会从image_8读取图片并用于训练。问题就出现在下采样的过程,由于系统兼容性问题,windows系统无法执行_minify函数中的部分系统指令,导致了第一个错误,并在此过程中产生了一个的空文件夹image_8,假如代码不经过修改再次执行,判断存在文件夹image_8后跳过下采样过程直接进行后续的训练,因此在空的image_8文件夹中进行数据读取,就产生了第二个错误。
在nerf-pytorch/load_llff.py文件中:
在这里插入图片描述
更改意见: 添加一个下采样的demo,将处理过的图片保存到image_8中。

假如读者不想增加额外的代码,可以参考下一个章节的内容。

import cv2
import os
from PIL import Image

images_path = './data/nerf_llff_data/test_frame/images/' # 原图路径
output_dir = './data/nerf_llff_data/test_frame/images_8/' # resize后路径
factor = 8 # 降采样倍数
images_list = os.listdir(images_path)
img = Image.open(images_path + images_list[0])
(W,H) = (img.width,img.height) #[W,H]
print("image_size : ",(W ,H))
# 保存resize后的图片到新文件夹下
for image_name in images_list:
    img = cv2.imread(images_path+image_name)
    img_resize = cv2.resize(img, (int(W/factor), int(H/factor)))
    cv2.imwrite(output_dir + image_name, img_resize)
    print(image_name , " done")
print("all images done")

训练个人数据集补充

上个小章节也能成功完成个人数据集的训练,解决方法有点另辟蹊径且简单高效,但假如读者想真正的解决问题,可以继续阅读本章节内容。

# test_frame.txt:对应的数据集的配置文件
python run_nerf.py --config configs/test_frame.txt

出现问题的主要原因是在Windows下部分linux指令不能执行:

  1. "subprocess.CalledProcessError: Command ‘cp ./data/nerf_llff_data/fern\images/* ./data/nerf_llff_data/fern\images_8’ returned non-zero exit status 1"的原因:
    check_output('cp {}/* {}'.format(imgdir_orig, imgdir), shell=True)
    
    windows系统下没有cp指令。
    解决方案:win10配置Cygwin 能够使用cp指令,修改load_llff.py部分代码。
    # 因为win10的路径符号\会影响指令的执行,改为linux的符号/
    imgdir_orig = imgdir
    # 修改为
    imgdir_orig = imgdir.replace("\\", "/")
    imgdir = os.path.join(basedir, name)
    # 修改为
    imgdir = os.path.join(basedir, name).replace("\\", "/")
    
  2. "subprocess.CalledProcessError: Command ‘mogrify -resize 12.5% -format png *.JPG’ returned non-zero exit status 1."的原因:
    args = ' '.join(['mogrify', '-resize', resizearg, '-format', 'png', '*.{}'.format(ext)])
    
    windows系统下没有mogrify指令。
    解决方案:win10配置ImageMagick能够使用mogrify指令,修改load_llff.py部分代码。
    args = ' '.join(['mogrify', '-resize', resizearg, '-format', 'png', '*.{}'.format(ext)])
    # 修改为
    args = ' '.join(['magick ', 'mogrify', '-resize', resizearg, '-format', 'png', '*.{}'.format(ext)])
    

代码成功执行:

注意:部分数据集格式如JPG虽然CP命令能成功复制图片,但是复制的图片是损坏的,导致代码运行不了,这种时候请使用上个章节的解决办法。还有就是每次执行有奇怪的报错,先把生成的下采样图片文件夹(images_4或images_8)删除再重新执行。


总结

尽可能简单、详细的介绍NeRF的安装流程以及解决了安装过程中可能存在的问题。后续会根据自己学到的知识结合个人理解讲解NeRF的原理和代码。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值