【三维重建】【深度学习】Windows10下NeRS官方代码Pytorch实现
提示:最近开始在【三维重建】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。
文章目录
- 【三维重建】【深度学习】Windows10下NeRS官方代码Pytorch实现
- 前言
- NeRS模型运行
- 下载源码并安装环境
- 安装 Pytorch3d
- 训练NeRS
- 训练个人数据集
- 渲染的视频: ![在这里插入图片描述](https://img-blog.csdnimg.cn/1f8b540c1a894d8aa90cb2101a2884a1.gif) 用meshlab查看模型: ![](https://img-blog.csdnimg.cn/d2d5b1c558794ceab0c3509dfe2e345d.png)
- 总结
前言
NeRS是由卡内基梅隆大学机器人研究所的Zhang, Jason等人在《NeRS: Neural Reflectance Surfaces for Sparse-view 3D Reconstruction in the Wild【NeurIPS 2021】》【论文地址】一文中提出了学习与球体不同的闭合表面的神经形状表示,从而确保重建结果完全密闭。表面参数化允许NeRS 学习(神经)双向表面反射函数(BRDF),将依赖于视图的外观分解为环境照明、漫反射颜色(反照率)和镜面“光泽度”。NeRS可以根据稀疏的图片推测出物体的3D形状,可利用日常手机相机采集数据对物体进行3D重建。
在详细解析NeRF网络之前,首要任务是搭建NeRS【Pytorch-demo地址】所需的运行环境,并完成模型训练和测试工作,展开后续工作才有意义。
NeRS模型运行
下载源码并安装环境
在win10环境下装anaconda环境,方便搭建专用于NeRF模型的虚拟环境。
【pytorch代码推荐参考教程】
安装GPU版本的pytorch教程,pytorch-gpu版本需要根据个人计算机去安装相应版本。
# 创建虚拟环境
conda create -n ners python=3.8
# 查看新环境是否安装成功
conda env list
# 激活环境
activate ners
# 下载githup源代码到合适文件夹,并cd到代码文件夹内(科学上网)
git clone https://github.com/jasonyzhang/ners.git
cd ners
# 安装pytorch包(这里的版本安装需要对照cub版本,在安装pytorch3D小节部分)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu115
# 通过清华源,安装其他包(需要删除关于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())
安装 Pytorch3d
1.安装必要依赖库
# 这里可能需要anaconda的默认源安装
conda install -c conda-forge -c fvcore -c iopath -c bottler fvcore iopath
2.cub安装配置: 查询对照表。
根据自己的cuda 版本选择对应的cub realase版本下载。
这里的cuda是物理机器上实际安装的cuda版本(环境变量里配置的cuda),不是虚拟环境中的cuda版本。
否则即使pytorch3d安装成功,也不能使用gpu。
下载解压后,在环境变量中添加cub的文件的路径(CUB_HOME)。
3.安装pytorch3D: 下载解压pytorch3D源码,注意版本要与pytorch对应,每个版本下有注明其适用的pytorch版本。
# 创建文件夹,将下载好的pytorch3D放到该目录下(重命名)
mkdir -p external
在Windows系统下,不建议使用git clone方式下载源码。
下载0.7.1版本的pytorch3D版本,并解压到NeRS工程的external/目录下。
安装过程中可能出现如下错误:
解决方法:安装 Visual Studio 2019
修改extra_compile_args = {“cxx”: [“-std=c++14”]}为extra_compile_args = {“cxx”: [“”]}:
管理员身份打开 x64 Native Tools Command Prompt for VS 2019,依次输入:
activate ners
# 进入到pytorch3D目录下
cd external/pytorch3d
set DISTUTILS_USE_SDK=1
set PYTORCH3D_NO_NINJA=1
# 开始安装
python setup.py install
查看pytorch3d版本:
import pytorch3d
print(pytorch3d.__version__)
训练NeRS
1.下载数据集
下载MVMC数据集(576 个实例),并解压到工程目录下。
下其MISC数据集(8个实例),,并解压到工程目录下。
2.训练网络
执行命令过程中,可能出现如下错误:
解决方法,卸载当前版本,推荐安装9.0.1版本:
pip uninstall pillow
pip install pillow==9.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
在MVMC上运行
# --mvmc标志来使用MVMC数据 --instance-dir指定具体汽车数据集
python main.py --instance-dir data/mvmc/7246694387 --mvmc --export-mesh --symmetrize
# 整个MVMC所有汽车的数据集
python scripts/mvmc_driver.py
训练完成后的结果保存在output目录中的对应数据文件夹下。
博主将视频转为了GIF方便展示:
用meshlab查看模型:
在MISC上运行
# --predict-illumination 照明预测
python main.py --instance-dir data/misc_objects/espresso --symmetrize --export-mesh --predict-illumination
渲染的视频:
用meshlab查看模型:
训练个人数据集
制作数据集所需要的图片是用手机拍摄视频后抽帧获取的,完成的数据集放置在data\our\目录下。数据格式是参照MISC数据集格式。
这里mask的获取推荐查看博主的之前的博文【Windows10下MiVOS官方代码Pytorch实现与源码解析】,它能批量为一组数据集生成对应的mask。
目前这一步为止,mask文件中图像的尺寸和文件名与image中图像不一致,因此需要进一步处理使其保持一致,并且需要将mask从三通道彩色图变为单通道的黑白图。
import cv2
import os
from PIL import Image
import numpy as np
# 个人数据所在目录
dir_data = r'D:\deeplean_demo\ners\data\statue'
# mask的目录
dir_mask = os.path.join(dir_data, 'masks')
# image的目录
dir_img = os.path.join(dir_data, 'images')
# 所有mask文件名
mask_list = os.listdir(dir_mask)
# 所有image文件名
img_list = os.listdir(dir_img)
for mask_file, img_file in zip(mask_list, img_list):
# 获得图片的文件名
(img_filename, img_extension) = os.path.splitext(img_file)
# 读取图片
img = cv2.imread(os.path.join(dir_img, img_file))
# 获取图片的尺寸,使mask的尺寸与原图保持一致
h, w = img.shape[0], img.shape[1]
# 读取mask,并将其转为黑白的mask,只有0和255
# mask = cv2.imread(os.path.join(dir_mask, mask_file), 0) == 0
mask = cv2.imread(os.path.join(dir_mask, mask_file), 0) > 0
mask = mask*255
# resize mask的尺寸
image_mask = cv2.resize(mask.astype("uint8"), (w, h), interpolation=cv2.INTER_AREA)
# 使mask的文件名与原图保持一致
img_file_mask = img_filename + '.png'
img_file_mask = os.path.join(dir_mask, img_file_mask)
#删除旧的mask
os.remove(os.path.join(dir_mask, mask_file))
# 保持新的mask
cv2.imwrite(img_file_mask, image_mask )
# cv2.imwrite(img_file_mask, mask )
官方数据集的mask位深度是32(即channel通道数是4),但是博主在读了源码发现只需要保留位深度是8的mask也是可以的。
metadata.json中的数据分别表示方位角(左右偏转角度)、俯仰角(上下偏转角度)和长方体体积,复制MISC数据集中的一个JSON文件,注意数据集中每张图片都分别对应一个方位角和俯仰角。
博主这里是自己估算的,没什么特殊方法,有知道的朋友可以在评论区告知一身!!!
开始训练
python main.py --instance-dir data/our/mouse --symmetrize --export-mesh --predict-illumination
渲染的视频:
用meshlab查看模型:
总结
尽可能简单、详细的介绍NeRS的安装流程以及解决了安装过程中可能存在的问题。后续会根据自己学到的知识结合个人理解讲解NeRF的原理和代码。