Skip to content

Commit 7a6e4e8

Browse files
committed
add cpu rendder, see README.md
1 parent 63b6266 commit 7a6e4e8

File tree

3 files changed

+49
-15
lines changed

3 files changed

+49
-15
lines changed

README.md

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,31 @@ conda env create -f environment.yml
9494
source activate deep3d_pytorch
9595
```
9696

97-
2. Install Nvdiffrast library (Only needed for training and testing with rendering/visualization):
98-
```
99-
git clone -b 0.3.0 https://github.com/NVlabs/nvdiffrast
100-
cd nvdiffrast # ./Deep3DFaceRecon_pytorch/nvdiffrast
101-
pip install .
102-
```
97+
2. Install mesh renderer:
98+
1. Nvdiffrast library (necessary for training, optional for testing):
99+
```
100+
git clone -b 0.3.0 https://github.com/NVlabs/nvdiffrast
101+
cd nvdiffrast # ./Deep3DFaceRecon_pytorch/nvdiffrast
102+
pip install .
103+
cd .. # ./Deep3DFaceRecon_pytorch
104+
```
105+
2. Use a cpu renderer from 3DDFA-V3 instead for testing (which can work on MacOS):
106+
```
107+
git clone --depth=1 https://github.com/wang-zidu/3DDFA-V3
108+
cp 3DDFA-V3/utils/cpu_renderer.py ./utils/
109+
cp -r 3DDFA-V3/utils/cython_renderer ./utils/
110+
111+
pip install Cython
112+
113+
cd util/cython_renderer/
114+
python setup.py build_ext -i
115+
cd ../.. # ./Deep3DFaceRecon_pytorch
116+
```
117+
3. Skip this step for inference/test, but you need run test.py with "--renderer_type none --no_viz" options
118+
103119
104120
3. Install Arcface Pytorch:
105121
```
106-
cd .. # ./Deep3DFaceRecon_pytorch
107122
git clone https://github.com/deepinsight/insightface.git
108123
cp -r ./insightface/recognition/arcface_torch ./models/
109124
```
@@ -183,19 +198,29 @@ On **MacOS**, you can run the test script with CPU or Apple Silicon (M1, M2, M3
183198
run with MPS:
184199
```
185200
# get reconstruction results of your custom images
186-
python test.py --name=<model_name> --epoch=20 --img_folder=<folder_to_test_images> --renderer_type none --device cpu --no_viz
201+
python test.py --name=<model_name> --epoch=20 --img_folder=<folder_to_test_images> --renderer_type none --device mps
202+
203+
# no visualization
204+
python test.py --name=<model_name> --epoch=20 --img_folder=<folder_to_test_images> --renderer_type none --device mps --no_viz
187205

188206
# get reconstruction results of example images
189-
python test.py --name=<model_name> --epoch=20 --img_folder=./datasets/examples --renderer_type none --device cpu --no_viz
207+
python test.py --name=<model_name> --epoch=20 --img_folder=./datasets/examples --renderer_type none --device mps
208+
209+
# no visualization
210+
python test.py --name=<model_name> --epoch=20 --img_folder=./datasets/examples --renderer_type none --device mps --no_viz
190211
```
191212
192213
or run with CPU:
193214
```
194215
# get reconstruction results of your custom images
195-
python test.py --name=<model_name> --epoch=20 --img_folder=<folder_to_test_images> --renderer_type none --device mps --no_viz
216+
python test.py --name=<model_name> --epoch=20 --img_folder=<folder_to_test_images> --renderer_type none --device cpu
217+
218+
python test.py --name=<model_name> --epoch=20 --img_folder=<folder_to_test_images> --renderer_type none --device cpu --no_viz
196219

197220
# get reconstruction results of example images
198-
python test.py --name=<model_name> --epoch=20 --img_folder=./datasets/examples --renderer_type none --device mps --no_viz
221+
python test.py --name=<model_name> --epoch=20 --img_folder=./datasets/examples --renderer_type none --device cpu
222+
223+
python test.py --name=<model_name> --epoch=20 --img_folder=./datasets/examples --renderer_type none --device cpu --no_viz
199224
```
200225
201226
**_Following [#108](https://github.com/sicxu/Deep3DFaceRecon_pytorch/issues/108), if you don't have OpenGL environment, you can simply add "--use_opengl False" to use CUDA context. Make sure you have updated the nvdiffrast to the latest version._**

models/facerecon_model.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def __init__(self, opt):
8888

8989
self.parallel_names = self.model_names
9090

91-
if opt.renderer_type != 'none':
91+
if opt.renderer_type == "nvdiffrast":
9292
self.parallel_names.append('renderer')
9393

9494
self.net_recon = networks.define_net_recon(
@@ -107,11 +107,20 @@ def __init__(self, opt):
107107
self.renderer = MeshRenderer(
108108
rasterize_fov=fov, znear=opt.z_near, zfar=opt.z_far, rasterize_size=int(2 * opt.center), use_opengl=opt.use_opengl
109109
)
110+
elif opt.renderer_type == "face3d" or opt.renderer_type == "cpu":
111+
from util.cpu_renderer import MeshRenderer_cpu as MeshRenderer
112+
113+
fov = 2 * np.arctan(opt.center / opt.focal) * 180 / np.pi
114+
self.renderer = MeshRenderer(
115+
rasterize_fov=fov, znear=opt.z_near, zfar=opt.z_far, rasterize_size=int(2 * opt.center)
116+
)
110117
else:
111118
self.renderer = None
112119

120+
self.output_vis = None
121+
113122
if self.isTrain:
114-
assert self.renderer is not None, f"{self.cls.__name__} should be initialized with opt.renderer_type='nvdiffrast'"
123+
assert self.renderer_type == "nvdiffrast", f"{self.cls.__name__} should be initialized with opt.renderer_type='nvdiffrast'"
115124

116125
self.loss_names = ['all', 'feat', 'color', 'lm', 'reg', 'gamma', 'reflc']
117126

@@ -159,7 +168,7 @@ def forward(self, do_render=True):
159168

160169
if do_render:
161170
self.pred_mask, _, self.pred_face = self.renderer(
162-
self.pred_vertex, self.facemodel.face_buf, feat=self.pred_color)
171+
self.pred_vertex, self.facemodel.face_buf, feat=self.pred_color)[:3]
163172

164173
self.pred_coeffs_dict = self.facemodel.split_coeff(output_coeff)
165174

options/base_options.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def initialize(self, parser):
4343
parser.add_argument('--model', type=str, default='facerecon', help='chooses which model to use.')
4444

4545
# renderer parameters
46-
parser.add_argument('--renderer_type', type=str, default='nvdiffrast', help='chooses which renderer to use. [nvdiffrast | none]')
46+
parser.add_argument('--renderer_type', type=str, default='nvdiffrast', help='chooses which renderer to use. [nvdiffrast | face3d | cpu | none], cpu=face3d')
4747

4848
# additional parameters
4949
parser.add_argument('--epoch', type=str, default='latest', help='which epoch to load? set to latest to use latest cached model')

0 commit comments

Comments
 (0)