|
import argparse |
|
import json |
|
import os |
|
|
|
SEMANTIC_WEIGHT = 1 |
|
QUALITY_WEIGHT = 4 |
|
|
|
QUALITY_LIST = [ |
|
"subject consistency", |
|
"background consistency", |
|
"temporal flickering", |
|
"motion smoothness", |
|
"aesthetic quality", |
|
"imaging quality", |
|
"dynamic degree", |
|
] |
|
|
|
SEMANTIC_LIST = [ |
|
"object class", |
|
"multiple objects", |
|
"human action", |
|
"color", |
|
"spatial relationship", |
|
"scene", |
|
"appearance style", |
|
"temporal style", |
|
"overall consistency", |
|
] |
|
|
|
NORMALIZE_DIC = { |
|
"subject consistency": {"Min": 0.1462, "Max": 1.0}, |
|
"background consistency": {"Min": 0.2615, "Max": 1.0}, |
|
"temporal flickering": {"Min": 0.6293, "Max": 1.0}, |
|
"motion smoothness": {"Min": 0.706, "Max": 0.9975}, |
|
"dynamic degree": {"Min": 0.0, "Max": 1.0}, |
|
"aesthetic quality": {"Min": 0.0, "Max": 1.0}, |
|
"imaging quality": {"Min": 0.0, "Max": 1.0}, |
|
"object class": {"Min": 0.0, "Max": 1.0}, |
|
"multiple objects": {"Min": 0.0, "Max": 1.0}, |
|
"human action": {"Min": 0.0, "Max": 1.0}, |
|
"color": {"Min": 0.0, "Max": 1.0}, |
|
"spatial relationship": {"Min": 0.0, "Max": 1.0}, |
|
"scene": {"Min": 0.0, "Max": 0.8222}, |
|
"appearance style": {"Min": 0.0009, "Max": 0.2855}, |
|
"temporal style": {"Min": 0.0, "Max": 0.364}, |
|
"overall consistency": {"Min": 0.0, "Max": 0.364}, |
|
} |
|
|
|
DIM_WEIGHT = { |
|
"subject consistency": 1, |
|
"background consistency": 1, |
|
"temporal flickering": 1, |
|
"motion smoothness": 1, |
|
"aesthetic quality": 1, |
|
"imaging quality": 1, |
|
"dynamic degree": 0.5, |
|
"object class": 1, |
|
"multiple objects": 1, |
|
"human action": 1, |
|
"color": 1, |
|
"spatial relationship": 1, |
|
"scene": 1, |
|
"appearance style": 1, |
|
"temporal style": 1, |
|
"overall consistency": 1, |
|
} |
|
|
|
ordered_scaled_res = [ |
|
"total score", |
|
"quality score", |
|
"semantic score", |
|
"subject consistency", |
|
"background consistency", |
|
"temporal flickering", |
|
"motion smoothness", |
|
"dynamic degree", |
|
"aesthetic quality", |
|
"imaging quality", |
|
"object class", |
|
"multiple objects", |
|
"human action", |
|
"color", |
|
"spatial relationship", |
|
"scene", |
|
"appearance style", |
|
"temporal style", |
|
"overall consistency", |
|
] |
|
|
|
|
|
def parse_args(): |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument("--score_dir", required=True, type=str) |
|
args = parser.parse_args() |
|
return args |
|
|
|
|
|
if __name__ == "__main__": |
|
args = parse_args() |
|
res_postfix = "_eval_results.json" |
|
info_postfix = "_full_info.json" |
|
files = os.listdir(args.score_dir) |
|
res_files = [x for x in files if res_postfix in x] |
|
info_files = [x for x in files if info_postfix in x] |
|
assert len(res_files) == len(info_files), f"got {len(res_files)} res files, but {len(info_files)} info files" |
|
|
|
full_results = {} |
|
for res_file in res_files: |
|
|
|
info_file = res_file.split(res_postfix)[0] + info_postfix |
|
with open(os.path.join(args.score_dir, info_file), "r", encoding="utf-8") as f: |
|
info = json.load(f) |
|
assert len(info[0]["video_list"]) > 0, f"Error: {info_file} has 0 video list" |
|
|
|
with open(os.path.join(args.score_dir, res_file), "r", encoding="utf-8") as f: |
|
data = json.load(f) |
|
for key, val in data.items(): |
|
full_results[key] = format(val[0], ".4f") |
|
|
|
scaled_results = {} |
|
dims = set() |
|
for key, val in full_results.items(): |
|
dim = key.replace("_", " ") if "_" in key else key |
|
scaled_score = (float(val) - NORMALIZE_DIC[dim]["Min"]) / ( |
|
NORMALIZE_DIC[dim]["Max"] - NORMALIZE_DIC[dim]["Min"] |
|
) |
|
scaled_score *= DIM_WEIGHT[dim] |
|
scaled_results[dim] = scaled_score |
|
dims.add(dim) |
|
|
|
assert len(dims) == len(NORMALIZE_DIC), f"{set(NORMALIZE_DIC.keys())-dims} not calculated yet" |
|
|
|
quality_score = sum([scaled_results[i] for i in QUALITY_LIST]) / sum([DIM_WEIGHT[i] for i in QUALITY_LIST]) |
|
semantic_score = sum([scaled_results[i] for i in SEMANTIC_LIST]) / sum([DIM_WEIGHT[i] for i in SEMANTIC_LIST]) |
|
scaled_results["quality score"] = quality_score |
|
scaled_results["semantic score"] = semantic_score |
|
scaled_results["total score"] = (quality_score * QUALITY_WEIGHT + semantic_score * SEMANTIC_WEIGHT) / ( |
|
QUALITY_WEIGHT + SEMANTIC_WEIGHT |
|
) |
|
|
|
formated_scaled_results = {"items": []} |
|
for key in ordered_scaled_res: |
|
formated_score = format(scaled_results[key] * 100, ".2f") + "%" |
|
formated_scaled_results["items"].append({key: formated_score}) |
|
|
|
output_file_path = os.path.join(args.score_dir, "all_results.json") |
|
with open(output_file_path, "w") as outfile: |
|
json.dump(full_results, outfile, indent=4, sort_keys=True) |
|
print(f"results saved to: {output_file_path}") |
|
|
|
scaled_file_path = os.path.join(args.score_dir, "scaled_results.json") |
|
with open(scaled_file_path, "w") as outfile: |
|
json.dump(formated_scaled_results, outfile, indent=4, sort_keys=True) |
|
print(f"results saved to: {scaled_file_path}") |
|
|