-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathevaluate.py
153 lines (136 loc) · 5.03 KB
/
evaluate.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import torch
import os
from vbench import VBench
from vbench.distributed import dist_init, print0
from datetime import datetime
import argparse
import json
def parse_args():
CUR_DIR = os.path.dirname(os.path.abspath(__file__))
parser = argparse.ArgumentParser(description='VBench', formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument(
"--output_path",
type=str,
default='./evaluation_results/',
help="output path to save the evaluation results",
)
parser.add_argument(
"--full_json_dir",
type=str,
default=f'{CUR_DIR}/vbench/VBench_full_info.json',
help="path to save the json file that contains the prompt and dimension information",
)
parser.add_argument(
"--videos_path",
type=str,
required=True,
help="folder that contains the sampled videos",
)
parser.add_argument(
"--dimension",
nargs='+',
required=True,
help="list of evaluation dimensions, usage: --dimension <dim_1> <dim_2>",
)
parser.add_argument(
"--load_ckpt_from_local",
type=bool,
required=False,
help="whether load checkpoints from local default paths (assuming you have downloaded the checkpoints locally",
)
parser.add_argument(
"--read_frame",
type=bool,
required=False,
help="whether directly read frames, or directly read videos",
)
parser.add_argument(
"--mode",
choices=['custom_input', 'vbench_standard', 'vbench_category'],
default='vbench_standard',
help="""This flags determine the mode of evaluations, choose one of the following:
1. "custom_input": receive input prompt from either --prompt/--prompt_file flags or the filename
2. "vbench_standard": evaluate on standard prompt suite of VBench
3. "vbench_category": evaluate on specific category
""",
)
parser.add_argument(
"--prompt",
type=str,
default="None",
help="""Specify the input prompt
If not specified, filenames will be used as input prompts
* Mutually exclusive to --prompt_file.
** This option must be used with --mode=custom_input flag
"""
)
parser.add_argument(
"--prompt_file",
type=str,
required=False,
help="""Specify the path of the file that contains prompt lists
If not specified, filenames will be used as input prompts
* Mutually exclusive to --prompt.
** This option must be used with --mode=custom_input flag
"""
)
parser.add_argument(
"--category",
type=str,
required=False,
help="""This is for mode=='vbench_category'
The category to evaluate on, usage: --category=animal.
""",
)
## for dimension specific params ###
parser.add_argument(
"--imaging_quality_preprocessing_mode",
type=str,
required=False,
default='longer',
help="""This is for setting preprocessing in imaging_quality
1. 'shorter': if the shorter side is more than 512, the image is resized so that the shorter side is 512.
2. 'longer': if the longer side is more than 512, the image is resized so that the longer side is 512.
3. 'shorter_centercrop': if the shorter side is more than 512, the image is resized so that the shorter side is 512.
Then the center 512 x 512 after resized is used for evaluation.
4. 'None': no preprocessing
""",
)
args = parser.parse_args()
return args
def main():
args = parse_args()
dist_init()
print0(f'args: {args}')
device = torch.device("cuda")
my_VBench = VBench(device, args.full_json_dir, args.output_path)
print0(f'start evaluation')
current_time = datetime.now().strftime('%Y-%m-%d-%H:%M:%S')
kwargs = {}
prompt = []
if (args.prompt_file is not None) and (args.prompt != "None"):
raise Exception("--prompt_file and --prompt cannot be used together")
if (args.prompt_file is not None or args.prompt != "None") and (args.mode!='custom_input'):
raise Exception("must set --mode=custom_input for using external prompt")
if args.prompt_file:
with open(args.prompt_file, 'r') as f:
prompt = json.load(f)
assert type(prompt) == dict, "Invalid prompt file format. The correct format is {\"video_path\": prompt, ... }"
elif args.prompt != "None":
prompt = [args.prompt]
if args.category != "":
kwargs['category'] = args.category
kwargs['imaging_quality_preprocessing_mode'] = args.imaging_quality_preprocessing_mode
my_VBench.evaluate(
videos_path = args.videos_path,
name = f'results_{current_time}',
prompt_list=prompt, # pass in [] to read prompt from filename
dimension_list = args.dimension,
local=args.load_ckpt_from_local,
read_frame=args.read_frame,
mode=args.mode,
**kwargs
)
print0('done')
if __name__ == "__main__":
main()