如何用PIFU将照片从2D转换为彩色的3D模型

411 阅读4分钟

这是一个简短的教程,介绍如何转换和训练Pifu将2D照片转换为彩色的3D模型。Pifu是PIFuHD的前身。

理论上,PIFU可以被训练来为任何类型的物体创建3D模型,而不仅仅是人类,当然,你需要用你自己的数据来训练它。
如果你觉得很冒险,你可以创建你自己的数据集,并使用我为你创建的Docker文件训练PIFU。

演示

要尝试这个演示,最简单的是使用Google Colab。

不幸的是,你会在PIFu的源代码中看到的Google Colab Notebook没有检查安装了哪个版本的Pytorch,所以它目前还不能工作。现有的预训练模型是用Pytorch 1.4版本训练的,因此为了推断,我们还需要运行Pytorch 1.4版本。

我创建了一个笔记本的副本,将Pytorch的版本降级到1.4。你可以忽略创建视频文件的代码。这其实是不需要的。你可以直接运行笔记本,用MeshLab打开网格。

第1步:创建一张你想进行3D扫描的人的照片。确保你创建了一个遮罩,并且两个图片都是512×512像素。在我的例子中,我使用了Photoshop。

第2步: 创建一张与你想做3D扫描的人的照片。

第3步:打开谷歌

第4步: 在/content/PIFu/sample_images下上传你的图像,加上遮罩,作为<图像文件名>.png和<图像文件名>_mask.png。图像和遮罩都应该是512×512像素。

图像

遮罩

第5步:执行笔记本并从/content/PIFu/results下载生成的3D模型。它将是一个obj文件。

你需要在一个支持每个顶点颜色的网格浏览器中打开obj文件。我建议下载Meshlab来快速查看。下面是我的结果

几何和颜色的训练

我能够在一台Windows 10 PC上执行数据生成步骤,并执行PIFU的训练,WSL Ubuntu 20带有NVIDA Container Toolkit,允许Docker访问我的RTX 3070 GPU。

如果你试图按照PIFu网站上的手动步骤来做,请注意。Pyembree在Windows上的安装很麻烦,而且很可能你会永远运行数据生成,因为如果不安装pyembree而安装trimesh,它将会永远对成千上万的三角形进行光线追踪计算。Trimesh 甚至不会警告你它没有使用 Pyembree。唯一的办法是通过实践来发现。

import pyembree
import trimesh
m = trimesh.creation.icosphere
m = trimesh.creation.icosphere()
# check for `ray_pyembree` instead of `ray_triangle`
m.ray
Out[6]: <trimesh.ray.ray_pyembree.RayMeshIntersector at 0x7f8a8fc6e668>

如果你在类包名称中没有看到ray_pyembree,那么你将使用光线追踪的回退计算。这将花费大量时间。

前提条件(Windows 10)

  1. Nvidia GPU
  2. 安装了Nvidia驱动程序
  3. WSL Ubuntu 20
  4. 码头程序
  5. Nvidia容器工具包

培训步骤

正如PIFu Github网站所解释的,培训分为3个阶段。

  1. 下载用于样本数据集的网格
  2. 数据生成
  3. 训练(几何+颜色)

我创建的Docker文件已经执行了下载样本Mesh和生成数据的步骤,所以只要你设法建立docker容器,你就应该能够进行训练。

假设所有的先决条件都已经设置好了。

第1步:下载Docker文件

FROM mikedh/trimesh:latest
USER root
RUN apt-get update && apt-get install -y zip
RUN apt-get install -y gcc libopenexr-dev zlib1g-dev
USER user
RUN cd /home/user && git clone https://github.com/shunsukesaito/PIFu.git
WORKDIR /home/user/PIFu
RUN curl -O https://renderpeople.com/sample/free/rp_dennis_posed_004_OBJ.zip
RUN mkdir rp_dennis_posed_004_OBJ && unzip rp_dennis_posed_004_OBJ.zip -d rp_dennis_posed_004_OBJ
RUN pip install tqdm
RUN pip3 install opencv-python pyexr pyopengl
RUN python -m apps.prt_util -i ./rp_dennis_posed_004_OBJ
RUN export MESA_GL_VERSION_OVERRIDE=3.3 && python -m apps.render_data -i rp_dennis_posed_004_OBJ -o training -e

FROM nvidia/cuda:11.3.1-base
RUN rm /etc/apt/sources.list.d/nvidia-ml.list && rm /etc/apt/sources.list.d/cuda.list
RUN apt-get update

RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get -y install tzdata
RUN apt-get -y install python3-pip

RUN pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113

RUN apt-get install -y python3-opencv 
RUN pip install tqdm scikit-image pyembree trimesh

COPY --from=0 /home/user/PIFu /home/user/PIFu
git clone https://gist.github.com/5fcfe5f67d290b817a9c77392b170fa6.git

第2步:建立用于训练的docker容器

cd 5fcfe5f67d290b817a9c77392b170fa6/
sudo docker build -t pifu/training .

3步:启动docker容器

sudo docker run --gpus all -it pifu/training bash

4步:运行几何学的训练

$ cd /home/user/PIFu$ python3 -m apps.train_shape --dataroot training/ --random_flip --random_scale --random_trans

第5步:运行颜色训练

python3 -m apps.train_color --dataroot 

好好享受吧!