computer-vision
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()