-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathtest_video.py
123 lines (104 loc) · 4.05 KB
/
test_video.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
118
119
120
121
122
123
import os
import argparse
import torch
import mmcv
from mmcv.runner import load_checkpoint, parallel_test, obj_from_dict
from mmcv.parallel import scatter, collate, MMDataParallel
from mmdet.core import results2json_videoseg, ovis_eval, ovis_eval_vis
from mmdet import datasets
from mmdet.datasets import build_dataloader
from mmdet.models import build_detector, detectors
def single_test(model, data_loader, show=False, save_path=''):
model.eval()
results = []
dataset = data_loader.dataset
prog_bar = mmcv.ProgressBar(len(dataset))
for i, data in enumerate(data_loader):
with torch.no_grad():
result = model(return_loss=False, rescale=not show, **data)
results.append(result)
if show:
model.module.show_result(data, result, dataset.img_norm_cfg,
dataset=dataset.CLASSES,
save_vis = True,
save_path = save_path,
is_video = True)
batch_size = data['img'][0].size(0)
for _ in range(batch_size):
prog_bar.update()
return results
def _data_func(data, device_id):
data = scatter(collate([data], samples_per_gpu=1), [device_id])[0]
return dict(return_loss=False, rescale=True, **data)
def parse_args():
parser = argparse.ArgumentParser(description='MMDet test detector')
parser.add_argument('config', help='test config file path')
parser.add_argument('checkpoint', help='checkpoint file')
parser.add_argument(
'--save_path',
type=str,
help='path to save visual result')
parser.add_argument(
'--gpus', default=1, type=int, help='GPU number used for testing')
parser.add_argument(
'--proc_per_gpu',
default=1,
type=int,
help='Number of processes per GPU')
parser.add_argument('--out',
help='output result file')
parser.add_argument('--load_result',
action='store_true',
help='whether to load existing result')
parser.add_argument('--load_result_json',
action='store_true',
help='whether to load existing result json')
parser.add_argument(
'--eval',
default=['segm'],
type=str,
nargs='+',
choices=['bbox', 'segm'],
help='eval types')
parser.add_argument('--show', default=False, action='store_true', help='show results')
args = parser.parse_args()
return args
def main():
args = parse_args()
os.makedirs('./tmp', exist_ok=True)
if args.out is not None and not args.out.endswith(('.pkl', '.pickle')):
raise ValueError('The output file must be a pkl file.')
cfg = mmcv.Config.fromfile(args.config)
# set cudnn_benchmark
if cfg.get('cudnn_benchmark', False):
torch.backends.cudnn.benchmark = True
cfg.model.pretrained = None
cfg.data.test.test_mode = True
assert os.path.exists(args.config)
dataset = obj_from_dict(cfg.data.test, datasets, dict(test_mode=True))
assert args.gpus == 1
model = build_detector(
cfg.model, train_cfg=None, test_cfg=cfg.test_cfg)
load_checkpoint(model, args.checkpoint)
model = MMDataParallel(model, device_ids=[0])
data_loader = build_dataloader(
dataset,
imgs_per_gpu=1,
workers_per_gpu=10, #cfg.data.workers_per_gpu,
num_gpus=1,
dist=False,
shuffle=False)
outputs = single_test(model, data_loader, args.show, save_path=args.save_path)
if args.out:
if not args.load_result:
print('writing results to {}'.format(args.out))
mmcv.dump(outputs, args.out)
eval_types = args.eval
if eval_types:
print('Starting evaluate {}'.format(' and '.join(eval_types)))
result_file = args.out + ('.json' if not args.out.endswith('.json') else '')
if not args.load_result:
results2json_videoseg(dataset, outputs, result_file)
ovis_eval_vis(result_file, eval_types, dataset)
if __name__ == '__main__':
main()