yyqgood
commited on
Commit
·
678043c
1
Parent(s):
395f082
chore(data): Adapt to COCO format dataset (#1052)
Browse files- tools/eval.py +1 -0
- yolox/evaluators/coco_evaluator.py +28 -1
- yolox/exp/yolox_base.py +2 -1
tools/eval.py
CHANGED
@@ -144,6 +144,7 @@ def main(exp, args, num_gpu):
|
|
144 |
|
145 |
evaluator = exp.get_evaluator(args.batch_size, is_distributed, args.test, args.legacy)
|
146 |
evaluator.per_class_mAP = True
|
|
|
147 |
|
148 |
torch.cuda.set_device(rank)
|
149 |
model.cuda(rank)
|
|
|
144 |
|
145 |
evaluator = exp.get_evaluator(args.batch_size, is_distributed, args.test, args.legacy)
|
146 |
evaluator.per_class_mAP = True
|
147 |
+
evaluator.per_class_AR = True
|
148 |
|
149 |
torch.cuda.set_device(rank)
|
150 |
model.cuda(rank)
|
yolox/evaluators/coco_evaluator.py
CHANGED
@@ -27,9 +27,33 @@ from yolox.utils import (
|
|
27 |
)
|
28 |
|
29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
def per_class_mAP_table(coco_eval, class_names=COCO_CLASSES, headers=["class", "AP"], colums=6):
|
31 |
per_class_mAP = {}
|
32 |
precisions = coco_eval.eval["precision"]
|
|
|
33 |
# precision has dims (iou, recall, cls, area range, max dets)
|
34 |
assert len(class_names) == precisions.shape[2]
|
35 |
|
@@ -66,6 +90,7 @@ class COCOEvaluator:
|
|
66 |
num_classes: int,
|
67 |
testdev: bool = False,
|
68 |
per_class_mAP: bool = False,
|
|
|
69 |
):
|
70 |
"""
|
71 |
Args:
|
@@ -254,7 +279,9 @@ class COCOEvaluator:
|
|
254 |
cocoEval.summarize()
|
255 |
info += redirect_string.getvalue()
|
256 |
if self.per_class_mAP:
|
257 |
-
info += "per class mAP:\n" + per_class_mAP_table(cocoEval)
|
|
|
|
|
258 |
return cocoEval.stats[0], cocoEval.stats[1], info
|
259 |
else:
|
260 |
return 0, 0, info
|
|
|
27 |
)
|
28 |
|
29 |
|
30 |
+
def per_class_AR_table(coco_eval, class_names=COCO_CLASSES, headers=["class", "AR"], colums=6):
|
31 |
+
per_class_AR = {}
|
32 |
+
recalls = coco_eval.eval["recall"]
|
33 |
+
# dimension of recalls: [TxKxAxM]
|
34 |
+
# recall has dims (iou, cls, area range, max dets)
|
35 |
+
assert len(class_names) == recalls.shape[1]
|
36 |
+
|
37 |
+
for idx, name in enumerate(class_names):
|
38 |
+
recall = recalls[:, idx, 0, -1]
|
39 |
+
recall = recall[recall > -1]
|
40 |
+
ar = np.mean(recall) if recall.size else float("nan")
|
41 |
+
per_class_AR[name] = float(ar * 100)
|
42 |
+
|
43 |
+
num_cols = min(colums, len(per_class_AR) * len(headers))
|
44 |
+
result_pair = [x for pair in per_class_AR.items() for x in pair]
|
45 |
+
row_pair = itertools.zip_longest(*[result_pair[i::num_cols] for i in range(num_cols)])
|
46 |
+
table_headers = headers * (num_cols // len(headers))
|
47 |
+
table = tabulate(
|
48 |
+
row_pair, tablefmt="pipe", floatfmt=".3f", headers=table_headers, numalign="left",
|
49 |
+
)
|
50 |
+
return table
|
51 |
+
|
52 |
+
|
53 |
def per_class_mAP_table(coco_eval, class_names=COCO_CLASSES, headers=["class", "AP"], colums=6):
|
54 |
per_class_mAP = {}
|
55 |
precisions = coco_eval.eval["precision"]
|
56 |
+
# dimension of precisions: [TxRxKxAxM]
|
57 |
# precision has dims (iou, recall, cls, area range, max dets)
|
58 |
assert len(class_names) == precisions.shape[2]
|
59 |
|
|
|
90 |
num_classes: int,
|
91 |
testdev: bool = False,
|
92 |
per_class_mAP: bool = False,
|
93 |
+
per_class_AR: bool = False,
|
94 |
):
|
95 |
"""
|
96 |
Args:
|
|
|
279 |
cocoEval.summarize()
|
280 |
info += redirect_string.getvalue()
|
281 |
if self.per_class_mAP:
|
282 |
+
info += "per class mAP:\n" + per_class_mAP_table(cocoEval) + "\n"
|
283 |
+
if self.per_class_AR:
|
284 |
+
info += "per class AR:\n" + per_class_AR_table(cocoEval) + "\n"
|
285 |
return cocoEval.stats[0], cocoEval.stats[1], info
|
286 |
else:
|
287 |
return 0, 0, info
|
yolox/exp/yolox_base.py
CHANGED
@@ -35,6 +35,7 @@ class Exp(BaseExp):
|
|
35 |
self.data_dir = None
|
36 |
self.train_ann = "instances_train2017.json"
|
37 |
self.val_ann = "instances_val2017.json"
|
|
|
38 |
|
39 |
# --------------- transform config ----------------- #
|
40 |
self.mosaic_prob = 1.0
|
@@ -242,7 +243,7 @@ class Exp(BaseExp):
|
|
242 |
|
243 |
valdataset = COCODataset(
|
244 |
data_dir=self.data_dir,
|
245 |
-
json_file=self.val_ann if not testdev else
|
246 |
name="val2017" if not testdev else "test2017",
|
247 |
img_size=self.test_size,
|
248 |
preproc=ValTransform(legacy=legacy),
|
|
|
35 |
self.data_dir = None
|
36 |
self.train_ann = "instances_train2017.json"
|
37 |
self.val_ann = "instances_val2017.json"
|
38 |
+
self.test_ann = "instances_test2017.json"
|
39 |
|
40 |
# --------------- transform config ----------------- #
|
41 |
self.mosaic_prob = 1.0
|
|
|
243 |
|
244 |
valdataset = COCODataset(
|
245 |
data_dir=self.data_dir,
|
246 |
+
json_file=self.val_ann if not testdev else self.test_ann,
|
247 |
name="val2017" if not testdev else "test2017",
|
248 |
img_size=self.test_size,
|
249 |
preproc=ValTransform(legacy=legacy),
|