使用单张2D图进行3D重建
An Effective Loss Function for Generating 3D Models from Single 2D Image without Rendering
论文地址:https://arxiv.org/abs/2103.03390 论文提出了一种新颖的有效损失函数,用于评估重建的 3D 点云的投影覆盖地面实况对象轮廓的程度。然后使用 Poisson Surface Reconstruction 将重建的点云转换为 3D 网格。最后,在特定的 3D 网格上执行基于 GAN 的纹理映射,并从单个 2D 图像生成带纹理的 3D 网格。
注意事项:
使用框架**:** PyTorch1.4.0
使用硬件**:** 8 vCPU + 64 GiB + 1 x Tesla V100-PCIE-32GB
运行代码方法**:** 点击本页面顶部菜单栏的三角形运行按钮或按Ctrl+Enter键 运行每个方块中的代码
JupyterLab的详细用法**:** 请参考《ModelAtrs JupyterLab使用指导》
碰到问题的解决办法**:** 请参考《ModelAtrs JupyterLab常见问题解决办法》
1.下载代码和数据集
运行下面代码,进行数据和代码的下载和解压缩
使用CUB-200-2011数据集,数据位于2dto3d/datasets/cub/CUB_200_2011中
import os
# 数据代码下载
!wget https://obs-aigallery-zc.obs.cn-north-4.myhuaweicloud.com/algorithm/2dto3d.zip
# 解压缩
os.system('unzip 2dto3d.zip -d ./')
os.chdir('./2dimageto3dmodel/2dto3d')
2.训练
2.1安装依赖库
kaolin编译安装,https://github.com/NVIDIAGameWorks/kaolin/tree/e7e513173bd4159ae45be6b3e156a3ad156a3eb9
耐心等待,需要一些时间
import os
os.system('pip install -r requirements.txt')
os.system('pip install scipy==1.4.1')
os.system('cd kaolin&&python setup.py install')
os.system('pip install --no-dependencies nuscenes-devkit opencv-python-headless scikit-learn joblib pyquaternion cachetools')
os.system('pip install packaging')
0
2.2训练
用预训练的模型,在2dto3d/gan_weights/pretrained_weights_cub/checkpoint_latest.pth
训练完成后,模型也会更新
这里只训练2个epoch
!python main.py --dataset cub --batch_size 16 --weights pretrained_weights_cub
Time per epoch: 162.517 s
100%|█████████████████████████████████████████| 373/373 [01:25<00:00, 4.79it/s]
FID (training set): 264.43
Texture-only FID (training set): 205.55
Mesh-only FID (training set): 54.65
FID (validation set): 264.48
Texture-only FID (validation set): 205.73
Mesh-only FID (validation set): 55.49
3.模型测试
测试的结果都在2dto3d/results/pretrained_weights_cub/文件夹下
!python main.py --dataset cub --batch_size 16 --weights pretrained_weights_cub --save_results
CUB 200-2011 dataset with 5964 images is successfully loaded.
Evaluating epoch 2
Export of batch with size '16' successfully done.
3.1展示结果
3d网格可以下载之后使用3D查看器来展示,这里只展示2d图像 如果要精确,就需要多训练或者进行调参
import matplotlib.pyplot as plt
img = plt.imread('../2dto3d/results/pretrained_weights_cub/mesh_1.png')
plt.imshow(img)
<matplotlib.image.AxesImage at 0x7f71da1a2750>
- 点赞
- 收藏
- 关注作者
评论(0)