Skip to content

Commit 13a30e2

Browse files
committed
rendering code
1 parent bfe19c8 commit 13a30e2

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

tools/render_models.py

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#!/usr/bin/env python3
2+
3+
import _init_paths
4+
import numpy as np
5+
import os
6+
7+
from lib.config import cfg
8+
from lib.data_io import category_model_id_pair, get_model_file
9+
from multiprocessing import Pool
10+
11+
12+
def render_model(category, model_id, viewpoints_num, overwrite=False):
13+
from lib.blender_renderer import ShapeNetRenderer
14+
"""Render a single model using a given renderer."""
15+
model_paths = get_model_file(category, model_id)
16+
rendering_dir = os.path.join(cfg.DIR.RENDERING_ROOT_PATH, category,
17+
model_id, cfg.DIR.RENDERING_SUBFOLDER)
18+
19+
if not os.path.isdir(rendering_dir):
20+
os.makedirs(rendering_dir)
21+
22+
# Rendering results configuration.
23+
rendered_img_list = os.path.join(rendering_dir,
24+
cfg.RENDERING.RENDERED_IMG_LIST)
25+
rendered_img_metadata = os.path.join(rendering_dir,
26+
cfg.RENDERING.RENDERED_IMG_METADATA)
27+
if os.path.isfile(rendered_img_list) and not overwrite:
28+
return
29+
30+
# Load renderer.
31+
if cfg.RENDERING.RENDER_ENGINE == 'blender':
32+
renderer = ShapeNetRenderer()
33+
else:
34+
raise NotImplementedError('Unsupported rendering engine: ' +
35+
cfg.RENDERING.RENDER_ENGINE)
36+
37+
# Initialize renderer and load model.
38+
viewport_size_x = cfg.CONST.IMG_W + cfg.TRAIN.CROP_X
39+
viewport_size_y = cfg.CONST.IMG_H + cfg.TRAIN.CROP_Y
40+
renderer.initialize([model_paths], viewport_size_x, viewport_size_y)
41+
renderer.loadModel()
42+
43+
# Render images from random viewpoints.
44+
view_configs = []
45+
rendered_filenames = []
46+
for i in range(viewpoints_num):
47+
# Set random viewpoint.
48+
az, el, depth_ratio = list(
49+
*([360, 5, 0.3] * np.random.rand(1, 3) + [0, 25, 0.65]))
50+
renderer.setViewpoint(az, el, 0, depth_ratio, 25)
51+
52+
# Render an image of a given viewpoint.
53+
rendered_filename = '%02d.png' % i
54+
renderer.result_fn = os.path.join(rendering_dir, rendered_filename)
55+
56+
rendering, depth = renderer.render(load_model=False, clear_model=False)
57+
58+
if rendering is None:
59+
raise RuntimeError("Rendering failed for unknown reason.")
60+
61+
# Save the viewpoint.
62+
rendered_filenames.append(rendered_filename)
63+
view_configs.append([str(az), str(el), '0', str(depth_ratio), '25'])
64+
65+
renderer.clearModel()
66+
67+
# Write rendered image list with its metadata.
68+
with open(rendered_img_list, 'w') as f:
69+
for rendered_filename in rendered_filenames:
70+
f.write(rendered_filename + '\n')
71+
72+
with open(rendered_img_metadata, 'w') as f:
73+
for view_config in view_configs:
74+
f.write(' '.join(view_config) + '\n')
75+
76+
77+
def main():
78+
cfg.TRAIN.CROP_X = 10
79+
cfg.TRAIN.CROP_Y = 10
80+
81+
NUM_IMG = cfg.TRAIN.NUM_RENDERING
82+
OUTPUT_DIR = 'rendering' # Subfolder per model to save prerendered images.
83+
84+
# Multi-process pre-rendering
85+
# Blender tends to get slower after it renders few hundred models. Start
86+
# over the whole pool every BATCH_SIZE models to boost the speed.
87+
NUM_PROCESS = 6
88+
BATCH_SIZE = 200
89+
args = [(category, model_id, NUM_IMG) for category, model_id in
90+
category_model_id_pair(dataset_portion=[0, 1])]
91+
92+
args_batches = [args[i * BATCH_SIZE:min((i + 1) * BATCH_SIZE, len(args))]
93+
for i in range(len(args) // BATCH_SIZE + 1)]
94+
95+
for args_batch in args_batches:
96+
with Pool(processes=NUM_PROCESS) as pool:
97+
pool.starmap(render_model, args_batch)
98+
99+
if __name__ == '__main__':
100+
main()

0 commit comments

Comments
 (0)