import contextlib import io from typing import Dict import numpy as np from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval from rich.table import Table def calculate_ap(coco_gt: COCO, pd_path): with contextlib.redirect_stdout(io.StringIO()): coco_dt = coco_gt.loadRes(pd_path) coco_eval = COCOeval(coco_gt, coco_dt, "bbox") coco_eval.evaluate() coco_eval.accumulate() coco_eval.summarize() return coco_eval.stats def make_ap_table(score: Dict[str, float], past_result=[], max_result=None, epoch=-1): ap_table = Table() ap_table.add_column("Epoch", justify="center", style="white", width=5) ap_table.add_column("Avg. Precision", justify="left", style="cyan") ap_table.add_column("%", justify="right", style="green", width=5) ap_table.add_column("Avg. Recall", justify="left", style="cyan") ap_table.add_column("%", justify="right", style="green", width=5) for eps, (ap_name1, ap_color1, ap_value1, ap_name2, ap_color2, ap_value2) in past_result: ap_table.add_row(f"{eps: 3d}", ap_name1, f"{ap_color1}{ap_value1:.2f}", ap_name2, f"{ap_color2}{ap_value2:.2f}") if past_result: ap_table.add_row() color = np.where(max_result <= score, "[green]", "[red]") this_ap = ("AP @ .5:.95", color[0], score[0], "AP @ .5", color[1], score[1]) metrics = [ ("AP @ .5:.95", color[0], score[0], "AR maxDets 1", color[6], score[6]), ("AP @ .5", color[1], score[1], "AR maxDets 10", color[7], score[7]), ("AP @ .75", color[2], score[2], "AR maxDets 100", color[8], score[8]), ("AP (small)", color[3], score[3], "AR (small)", color[9], score[9]), ("AP (medium)", color[4], score[4], "AR (medium)", color[10], score[10]), ("AP (large)", color[5], score[5], "AR (large)", color[11], score[11]), ] for ap_name, ap_color, ap_value, ar_name, ar_color, ar_value in metrics: ap_table.add_row(f"{epoch: 3d}", ap_name, f"{ap_color}{ap_value:.2f}", ar_name, f"{ar_color}{ar_value:.2f}") return ap_table, this_ap