pytorch 代码
NERF 自己数据集复现 完成步骤+遇到问题
本文主要用于记录自己复现NERF所遇到的一些问题,欢迎各位大佬对文中有误内容批评指正
完成步骤:
1 数据集跑colmap,生成相机位姿
进入colmap界面
点击File,选择New Project,继续点击new,在llfftest文件夹下手动输入文件名database.db后,点击保存:
接着点击Select,选择保存图片的那个images文件夹,点击Save:
接下来点击File右边的Processing,选择Feature extraction,出现如下界面,只需要配置第一个选项,然后点击下面Extract(一般用单目相机)
结束后点击Processing旁边的Reconstruction,选择Start Reconstruction,等待结束
结束后,点击File,选择Export model,这里一定注意不要直接保存,需要新建两个文件夹(sparse,0),请保持一致 nerf原代码中固定了sparse/0文件夹的名称
结束后检查文件夹中的东西:
2 将生成的bin文件通过llff数据集转化成.npz格式
(生成的txt文件也可以转化,但需要修改下LLFF里面的代码)
把llff数据中的pose_utils.py函数中的这种后缀是.bin的和_binary的都换成.txt和_text(read_points3D_text函数也有定义直接用)
接下来,将获取的位姿等数据转化为llff格式,需要下载llff脚本,(地址:GitHub - Fyusion/LLFF: Code release for Local Light Field Fusion at SIGGRAPH 2019)
下载完成后进入文件夹执行
python imgs2poses.py <自己跑的colmap数据路径>
结束后得到一个.npy文件
3制作自己数据集的configs.txt文件
创建自己的配置文件放在configs里面,其中的factor为下采样因子,原文是8(进行8倍的下采样)
完成后执行
python run_nerf.py --config configs/llfftest.txt
注意如果你是360度环拍的数据集 执行 ?这个地方存疑
python run_nerf.py --config configs/test.txt --spherify --no_ndc
否则无法得到正确的渲染的结果 (渲染的图像中会有黑色的线)
修改训练次数
找到run_nerf.py 中的train()函数 修改N_iters即可
如果训练渲染的效果很差,大部分情况是拍的数据的问题,网上有很多如何拍摄的教程,可以去搜一下,本人除了llff和合成数据集外,跑过DTU数据集,效果还可以,ETH3D的效果一般,可能是因为图片变化太大了。
问题:
1 out of the memory
修改txt文件中的N_rand N_samples N_importance
代表处理光束的数量,普通采样点数量(进入coarse网络的采样点个数),重要性采样点的数量(进入fine网络的采样点个数是sample+importance)
2subprocess.CalledProcessError: Command ‘mogrify -resize 12.5% -format png *.JPG‘ ret
如果直接把原图像拷进去,images_8文件夹直接存放原图,可以成功训练,但会导致训练效果极其模糊甚至神经元爆炸!
(自己创个images_8文件夹,用下面代码手动执行下采样)如果不执行下采样,训练出来的结果很差
下采样代码如下: (要修改代码中的数据地址)
import cv2
import os.path
def countFile(dir):
tmp = 0
for item in os.listdir(dir):
if os.path.isfile(os.path.join(dir, item)):
tmp += 1
else:
tmp += countFile(os.path.join(dir, item))
return tmp
filenum = countFile('/root/data/eth3d/office/office/images') # 返回的是图片的张数
print(filenum)
n = 8 #这个是采样因子,下采样几倍把这个因子修改成几
index = 0 # 保存图片编号
num = 0 # 处理图片计数
for i in range(0, filenum):
########################################################
filename = '/root/data/eth3d/office/office/images/' + str(i) + '.jpg'
print(filename)
original_image = cv2.imread(filename)
if n == 2:
img_1 = cv2.pyrDown(original_image)
if n ==8:
img_1=cv2.pyrDown(original_image)
img_1=cv2.pyrDown(img_1)
img_1=cv2.pyrDown(img_1) #如果需要其他的采样倍数自己修改代码
cv2.imwrite('/root/data/eth3d/office/office/images_8/' + str(index) + '.jpg', img_1)
num = num + 1
print("正在为第" + str(num) + "图片采样......")
index = index + 1
参考:nerf训练自己的数据,过程记录十分详细-CSDN博客
Windows下:nerf部署-CSDN博客 nerf训练自己的数据,过程记录十分详细_深度学习_qq_43575504-杭州城市开发者社区 (csdn.net)