-
Notifications
You must be signed in to change notification settings - Fork 56
/
test_mvp2m.py
117 lines (109 loc) · 5.35 KB
/
test_mvp2m.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# Copyright (C) 2019 Chao Wen, Yinda Zhang, Zhuwen Li, Yanwei Fu
# All rights reserved.
# This code is licensed under BSD 3-Clause License.
import tensorflow as tf
import tflearn
import numpy as np
import pprint
import pickle
import shutil
import os
from modules.models_mvp2m import MeshNetMVP2M
from modules.config import execute
from utils.dataloader import DataFetcher
from utils.tools import construct_feed_dict
from utils.visualize import plot_scatter
def main(cfg):
os.environ['CUDA_VISIBLE_DEVICES'] = str(cfg.gpu_id)
# ---------------------------------------------------------------
# Set random seed
print('=> pre-porcessing')
seed = 123
np.random.seed(seed)
tf.set_random_seed(seed)
# ---------------------------------------------------------------
num_blocks = 3
num_supports = 2
placeholders = {
'features': tf.placeholder(tf.float32, shape=(None, 3), name='features'),
'img_inp': tf.placeholder(tf.float32, shape=(3, 224, 224, 3), name='img_inp'),
'labels': tf.placeholder(tf.float32, shape=(None, 6), name='labels'),
'support1': [tf.sparse_placeholder(tf.float32) for _ in range(num_supports)],
'support2': [tf.sparse_placeholder(tf.float32) for _ in range(num_supports)],
'support3': [tf.sparse_placeholder(tf.float32) for _ in range(num_supports)],
'faces': [tf.placeholder(tf.int32, shape=(None, 4)) for _ in range(num_blocks)],
'edges': [tf.placeholder(tf.int32, shape=(None, 2)) for _ in range(num_blocks)],
'lape_idx': [tf.placeholder(tf.int32, shape=(None, 10)) for _ in range(num_blocks)], # for laplace term
'pool_idx': [tf.placeholder(tf.int32, shape=(None, 2)) for _ in range(num_blocks - 1)], # for unpooling
'dropout': tf.placeholder_with_default(0., shape=()),
'num_features_nonzero': tf.placeholder(tf.int32),
'sample_coord': tf.placeholder(tf.float32, shape=(43, 3), name='sample_coord'),
'cameras': tf.placeholder(tf.float32, shape=(3, 5), name='Cameras'),
'faces_triangle': [tf.placeholder(tf.int32, shape=(None, 3)) for _ in range(num_blocks)],
'sample_adj': [tf.placeholder(tf.float32, shape=(43, 43)) for _ in range(num_supports)],
}
step = cfg.test_epoch
root_dir = os.path.join(cfg.save_path, cfg.name)
model_dir = os.path.join(cfg.save_path, cfg.name, 'models')
predict_dir = os.path.join(cfg.save_path, cfg.name, 'predict', str(step))
if not os.path.exists(predict_dir):
os.makedirs(predict_dir)
print('==> make predict_dir {}'.format(predict_dir))
# -------------------------------------------------------------------
print('=> build model')
# Define model
model = MeshNetMVP2M(placeholders, logging=True, args=cfg)
# ---------------------------------------------------------------
print('=> load data')
data = DataFetcher(file_list=cfg.test_file_path, data_root=cfg.test_data_path, image_root=cfg.test_image_path, is_val=True)
data.setDaemon(True)
data.start()
# ---------------------------------------------------------------
print('=> initialize session')
sesscfg = tf.ConfigProto()
sesscfg.gpu_options.allow_growth = True
sesscfg.allow_soft_placement = True
sess = tf.Session(config=sesscfg)
sess.run(tf.global_variables_initializer())
# ---------------------------------------------------------------
model.load(sess=sess, ckpt_path=model_dir, step=step)
# ---------------------------------------------------------------
# Load init ellipsoid and info about vertices and edges
pkl = pickle.load(open('data/iccv_p2mpp.dat', 'rb'))
# Construct Feed dict
feed_dict = construct_feed_dict(pkl, placeholders)
# ---------------------------------------------------------------
test_number = data.number
tflearn.is_training(False, sess)
print('=> start test stage 1')
for iters in range(test_number):
# Fetch training data
# need [img, label, pose(camera meta data), dataID]
img_all_view, labels, poses, data_id, mesh = data.fetch()
feed_dict.update({placeholders['img_inp']: img_all_view})
feed_dict.update({placeholders['labels']: labels})
feed_dict.update({placeholders['cameras']: poses})
# ---------------------------------------------------------------
out1, out2, out3 = sess.run([model.output1, model.output2, model.output3], feed_dict=feed_dict)
# ---------------------------------------------------------------
# save GT
label_path = os.path.join(predict_dir, data_id.replace('.dat', '_ground.xyz'))
np.savetxt(label_path, labels)
# save 1
# out1_path = os.path.join(predict_dir, data_id.replace('.dat', '_predict_1.xyz'))
# np.savetxt(out1_path, out1)
# # save 2
# out2_path = os.path.join(predict_dir, data_id.replace('.dat', '_predict_2.xyz'))
# np.savetxt(out2_path, out2)
# save 3
out3_path = os.path.join(predict_dir, data_id.replace('.dat', '_predict.xyz'))
np.savetxt(out3_path, out3)
print('Iteration {}/{}, Data id {}'.format(iters + 1, test_number, data_id))
# ---------------------------------------------------------------
data.shutdown()
print('CNN-GCN Optimization Finished!')
if __name__ == '__main__':
print('=> set config')
args = execute()
pprint.pprint(vars(args))
main(args)