File size: 3,490 Bytes
d8dc31c | 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 | import argparse
from config import cfg
from tqdm import tqdm
import torch
import torch.backends.cudnn as cudnn
import os.path as osp
from pdb import set_trace
import time
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('--num_gpus', type=int, dest='num_gpus')
parser.add_argument('--exp_name', type=str, default='output/test')
parser.add_argument('--result_path', type=str, default='output/test')
parser.add_argument('--ckpt_idx', type=int, default=0)
parser.add_argument('--testset', type=str, default='EHF')
parser.add_argument('--agora_benchmark', type=str, default='na')
parser.add_argument('--shapy_eval_split', type=str, default='val')
parser.add_argument('--use_cache', action='store_true')
parser.add_argument('--eval_on_train', action='store_true')
parser.add_argument('--vis', action='store_true')
parser.add_argument('--vis_feature', action='store_true')
parser.add_argument('--vis_hand_bbox', action='store_true')
args = parser.parse_args()
return args
def main():
print('### Argument parse and create log ###')
args = parse_args()
config_path = osp.join('../output',args.result_path, 'code', 'config_base.py')
ckpt_path = osp.join('../output', args.result_path, 'model_dump', f'snapshot_{int(args.ckpt_idx)}.pth.tar')
# set_trace()
cfg.get_config_fromfile(config_path)
cfg.update_test_config(args.testset, args.agora_benchmark, args.shapy_eval_split,
ckpt_path, args.use_cache, args.eval_on_train, args.vis)
cfg.update_config(args.num_gpus, args.exp_name)
cfg.vis_feature = args.vis_feature
cfg.vis_hand_bbox = args.vis_hand_bbox
cudnn.benchmark = True
from base import Tester
tester = Tester()
tester._make_batch_generator()
tester._make_model()
start_time = time.time()
frame_count = 0
eval_result = {}
cur_sample_idx = 0
for itr, (inputs, targets, meta_info) in enumerate(tqdm(tester.batch_generator)):
iter_start = time.time()
# forward
with torch.no_grad():
model_out = tester.model(inputs, targets, meta_info, 'test')
iter_end = time.time()
iter_time = iter_end - iter_start
fps = 1.0 / iter_time if iter_time > 0 else 0
print(f"[Iter {itr}] time: {iter_time:.4f}s FPS: {fps:.2f}")
frame_count += 1
# save output
batch_size = model_out['img'].shape[0]
out = {}
for k, v in model_out.items():
if isinstance(v, torch.Tensor):
out[k] = v.cpu().numpy()
elif isinstance(v, list):
out[k] = v
else:
raise ValueError('Undefined type in out. Key: {}; Type: {}.'.format(k, type(v)))
# out = {k: v.cpu().numpy() for k, v in out.items()}
# for k, v in out.items(): batch_size = out[k].shape[0]
out = [{k: v[bid] for k, v in out.items()} for bid in range(batch_size)]
# evaluate
cur_eval_result = tester._evaluate(out, cur_sample_idx)
for k, v in cur_eval_result.items():
if k in eval_result:
eval_result[k] += v
else:
eval_result[k] = v
cur_sample_idx += len(out)
total_time = time.time() - start_time
avg_fps = frame_count / total_time
print(f"Average FPS: {avg_fps:.2f}")
tester._print_eval_result(eval_result)
if __name__ == "__main__":
main() |