NeRF训练
准备数据集
制作LLFF数据集
https://github.com/fyusion/llff
1、安装docker和nvidia-docker
注意:
测试docker安装成功:sudo docker run hello-world,不要漏sudo,否则会报错。
docker: Got permission denied while trying to connect to the Docker daemon socket
at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial
unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
测试安装nvidia-docker成功同理,sudo docker run --runtime=nvidia --rm nvidia/cuda:10.1-base nvidia-smi。上面给的参考链接,在这一步没有写出sudo
2、下载模型和官方图片
bash download_data.sh
# 下载完成之后,会生成一个 data/testscene/images文件夹,这里保存了图片
sudo docker pull bmild/tf_colmap
sudo docker tag bmild/tf_colmap tf_colmap
# 生成llff数据集
sudo nvidia-docker run --rm --volume /:/host --workdir /host$PWD tf_colmap bash demo.sh
demo.sh中是需要运行的代码,可根据自己的需求修改
3、为自己的图片生成llff数据集格式
1)data/testscene/images
内更换为自己的图片
2)对demo.sh文件进行修改:对于nerf来说,我们只需要运行imgs2poses.py
,就能生成满足训练格式的图片。此时demo.sh内可以修改为:
# Use COLMAP to compute 6DoF camera poses
python imgs2poses.py data/testscene/
3)执行命令
sudo nvidia-docker run --rm --volume /:/host --workdir /host$PWD tf_colmap bash demo.sh
4、其他
修改imgs2mpis.py
参数 ,实现在不同采样因子下的采样率
blender数据(本文重点关注制作自己数据集)
一、下载官方数据
二、制作自己的数据集
目的:渲染3D模型在不同视角下的图片,并为之生成对应的pose,相机内参。根据以上rgb文件、pose文件、相机内参生成blender输入格式。
一些准备工作
1、下载blender
这里我们只需下载软件即可,不需要配置python依赖库
建议版本:2.79(原因:现有的一些代码不支持新版本,会出现报错,所以下载2.79版就行)
2、下载3d模型,在这里我使用了shapenet。根据自己需求在在其他3D模型可是可以的
打开Blender
1、导入模型:.obj文件
(非常重要)
如果在Blender中导入单独.obj文件,是不会有颜色信息的。因此,在.obj文件的同目录下,需要存在一个.mtl文件,这样导入的模型才会有颜色信息,Blener会自动识别.mtl
.obj文件保存的是模型的几何信息,.mtl保存的是模型的颜色信息,这两个文件shapnet数据集里都有。
如果不想要颜色,可以只单独导入.obj,同目录下不要放.mtl。
导入效果如下图所示
2、开始渲染
打开文本编辑器
在文本编辑框输入以下代码:渲染代码http://t.csdn.cn/AXNNq
格式转换
经过渲染后,可以得到rgb、pose、intrinsics.txt这三个文件。现在,我们根据这三个文件转换成Blender的数据集格式,代码如下:
注意:pose存放的是相机相对世界坐标系下的位姿,而非相机自身坐标系。
- 地址Root就是经过blender渲染获得的相机pose,这个代码的功能是将其转换为.json文件
import math
import numpy as np
import os
import json
#
Root = '/home/liuyuxing/render_data/car/8b177994dc29a707e363d824c14767b2_bule/models_4/data/test/pose/'
file_name_list = os.listdir(Root)
file_name_list.sort()
# print(file_name_list)
# 手动计算的相机水平视场角,计算公式为2*math.atan(400/(2*410.15625)),其中400为传感器尺寸,410.15625为焦距
# 如果原图像的尺寸为W * H,焦距为F,当将图像尺寸改为W/2 * H/2时,其对应的焦距应为2f
# print(2*math.atan(400/(2*820.312500)))
fov = 0.4782877997962207
jsontext = {'camera_angle_x': fov, 'frames': []} # 定义一个字典
for j in range(len(file_name_list)):
filename = Root + file_name_list[j]
lines = open(filename).read().splitlines()
if len(lines) == 1:
pose = np.zeros((4, 4), dtype=np.float32)
for i in range(16):
pose[i // 4, i % 4] = lines[0].split(" ")[i]
r = pose.squeeze()
r = r.tolist()
else:
lines = [[x[0], x[1], x[2], x[3]] for x in (x.split(" ") for x in lines[:4])]
r = np.asarray(lines).astype(np.float32).squeeze()
r = r.tolist()
jsontext['frames'].append({'file_path': './test/r_%0d' % (round(j)),
'transform_matrix': r})
jsondata = json.dumps(jsontext, indent=4, separators=(',', ': ')) # 生成json文件,后面的参数是格式控制
f = open('data/car_blue/transforms_test.json', 'w')
f.write(jsondata)
f.close()
报错记录
一、sudo apt-get update报错
出现问题
输入sudo apt-get update
报错:
Traceback (most recent call last):
File "/usr/lib/cnf-update-db", line 8, in <module>
from CommandNotFound.db.creator import DbCreator
ImportError: No module named CommandNotFound.db.creator
正在读取软件包列表... 完成
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi'
E: Sub-process returned an error code
解决方案
二、dpkg: 警告: 无法找到软件包,E: Sub-process /usr/bin/dpkg returned an error code (1)
三、sudo add-apt-repository 'XXX’报错
出现问题
报错:
Traceback (most recent call last):
File "/usr/bin/add-apt-repository", line 12, in <module>
from softwareproperties.SoftwareProperties import SoftwareProperties, shortcut_handler
ImportError: No module named softwareproperties.SoftwareProperties
解决方案:
vim /usr/bin/add-apt-repository
把#! /usr/bin/python3
改成
#! /usr/bin/python3.6
#! /usr/bin/python3.6 这里的3.6与python默认版本相同