未验证 提交 6c874ce4 编写于 作者: Y yyqgood 提交者: GitHub

chore(data): Adapt to COCO format dataset (#1052)

chore(data): Adapt to COCO format dataset
上级 d669fd38
......@@ -144,6 +144,7 @@ def main(exp, args, num_gpu):
evaluator = exp.get_evaluator(args.batch_size, is_distributed, args.test, args.legacy)
evaluator.per_class_mAP = True
evaluator.per_class_AR = True
torch.cuda.set_device(rank)
model.cuda(rank)
......
......@@ -27,9 +27,33 @@ from yolox.utils import (
)
def per_class_AR_table(coco_eval, class_names=COCO_CLASSES, headers=["class", "AR"], colums=6):
per_class_AR = {}
recalls = coco_eval.eval["recall"]
# dimension of recalls: [TxKxAxM]
# recall has dims (iou, cls, area range, max dets)
assert len(class_names) == recalls.shape[1]
for idx, name in enumerate(class_names):
recall = recalls[:, idx, 0, -1]
recall = recall[recall > -1]
ar = np.mean(recall) if recall.size else float("nan")
per_class_AR[name] = float(ar * 100)
num_cols = min(colums, len(per_class_AR) * len(headers))
result_pair = [x for pair in per_class_AR.items() for x in pair]
row_pair = itertools.zip_longest(*[result_pair[i::num_cols] for i in range(num_cols)])
table_headers = headers * (num_cols // len(headers))
table = tabulate(
row_pair, tablefmt="pipe", floatfmt=".3f", headers=table_headers, numalign="left",
)
return table
def per_class_mAP_table(coco_eval, class_names=COCO_CLASSES, headers=["class", "AP"], colums=6):
per_class_mAP = {}
precisions = coco_eval.eval["precision"]
# dimension of precisions: [TxRxKxAxM]
# precision has dims (iou, recall, cls, area range, max dets)
assert len(class_names) == precisions.shape[2]
......@@ -66,6 +90,7 @@ class COCOEvaluator:
num_classes: int,
testdev: bool = False,
per_class_mAP: bool = False,
per_class_AR: bool = False,
):
"""
Args:
......@@ -254,7 +279,9 @@ class COCOEvaluator:
cocoEval.summarize()
info += redirect_string.getvalue()
if self.per_class_mAP:
info += "per class mAP:\n" + per_class_mAP_table(cocoEval)
info += "per class mAP:\n" + per_class_mAP_table(cocoEval) + "\n"
if self.per_class_AR:
info += "per class AR:\n" + per_class_AR_table(cocoEval) + "\n"
return cocoEval.stats[0], cocoEval.stats[1], info
else:
return 0, 0, info
......@@ -35,6 +35,7 @@ class Exp(BaseExp):
self.data_dir = None
self.train_ann = "instances_train2017.json"
self.val_ann = "instances_val2017.json"
self.test_ann = "instances_test2017.json"
# --------------- transform config ----------------- #
self.mosaic_prob = 1.0
......@@ -242,7 +243,7 @@ class Exp(BaseExp):
valdataset = COCODataset(
data_dir=self.data_dir,
json_file=self.val_ann if not testdev else "image_info_test-dev2017.json",
json_file=self.val_ann if not testdev else self.test_ann,
name="val2017" if not testdev else "test2017",
img_size=self.test_size,
preproc=ValTransform(legacy=legacy),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册