mirror of
https://git.datalinker.icu/ali-vilab/TeaCache
synced 2025-12-10 05:14:24 +08:00
155 lines
5.0 KiB
Python
155 lines
5.0 KiB
Python
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:
|
|
# first check if results is normal
|
|
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"
|
|
# read results
|
|
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}")
|