| 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') |
| |
|
|
| 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() |
|
|
| |
| 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 |
|
|
|
|
| |
| 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[bid] for k, v in out.items()} for bid in range(batch_size)] |
|
|
| |
| 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() |