yyqgood commited on
Commit
678043c
·
1 Parent(s): 395f082

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

Browse files
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 "image_info_test-dev2017.json",
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),