Spaces:
Sleeping
Sleeping
# Copyright (c) Facebook, Inc. and its affiliates. | |
import logging | |
import numpy as np | |
import pprint | |
import sys | |
from collections.abc import Mapping | |
def print_csv_format(results): | |
""" | |
Print main metrics in a format similar to Detectron, | |
so that they are easy to copypaste into a spreadsheet. | |
Args: | |
results (OrderedDict[dict]): task_name -> {metric -> score} | |
unordered dict can also be printed, but in arbitrary order | |
""" | |
assert isinstance(results, Mapping) or not len(results), results | |
logger = logging.getLogger(__name__) | |
for task, res in results.items(): | |
if isinstance(res, Mapping): | |
# Don't print "AP-category" metrics since they are usually not tracked. | |
important_res = [(k, v) for k, v in res.items() if "-" not in k] | |
logger.info("copypaste: Task: {}".format(task)) | |
logger.info("copypaste: " + ",".join([k[0] for k in important_res])) | |
logger.info("copypaste: " + ",".join(["{0:.4f}".format(k[1]) for k in important_res])) | |
else: | |
logger.info(f"copypaste: {task}={res}") | |
def verify_results(cfg, results): | |
""" | |
Args: | |
results (OrderedDict[dict]): task_name -> {metric -> score} | |
Returns: | |
bool: whether the verification succeeds or not | |
""" | |
expected_results = cfg.TEST.EXPECTED_RESULTS | |
if not len(expected_results): | |
return True | |
ok = True | |
for task, metric, expected, tolerance in expected_results: | |
actual = results[task].get(metric, None) | |
if actual is None: | |
ok = False | |
continue | |
if not np.isfinite(actual): | |
ok = False | |
continue | |
diff = abs(actual - expected) | |
if diff > tolerance: | |
ok = False | |
logger = logging.getLogger(__name__) | |
if not ok: | |
logger.error("Result verification failed!") | |
logger.error("Expected Results: " + str(expected_results)) | |
logger.error("Actual Results: " + pprint.pformat(results)) | |
sys.exit(1) | |
else: | |
logger.info("Results verification passed.") | |
return ok | |
def flatten_results_dict(results): | |
""" | |
Expand a hierarchical dict of scalars into a flat dict of scalars. | |
If results[k1][k2][k3] = v, the returned dict will have the entry | |
{"k1/k2/k3": v}. | |
Args: | |
results (dict): | |
""" | |
r = {} | |
for k, v in results.items(): | |
if isinstance(v, Mapping): | |
v = flatten_results_dict(v) | |
for kk, vv in v.items(): | |
r[k + "/" + kk] = vv | |
else: | |
r[k] = v | |
return r | |