Ayush Chaurasia commited on
Commit
ffb6e11
·
unverified ·
1 Parent(s): 09246a5

W&B: Update Tables API and comply with new dataset_check (#3772)

Browse files

* Update tables API and windows path fix

* update dataset check

Files changed (1) hide show
  1. utils/wandb_logging/wandb_utils.py +11 -6
utils/wandb_logging/wandb_utils.py CHANGED
@@ -136,7 +136,6 @@ class WandbLogger():
136
 
137
  def check_and_upload_dataset(self, opt):
138
  assert wandb, 'Install wandb to upload dataset'
139
- check_dataset(self.data_dict)
140
  config_path = self.log_dataset_artifact(check_file(opt.data),
141
  opt.single_cls,
142
  'YOLOv5' if opt.project == 'runs/train' else Path(opt.project).stem)
@@ -171,9 +170,11 @@ class WandbLogger():
171
  data_dict['val'] = str(val_path)
172
  self.val_table = self.val_artifact.get("val")
173
  self.map_val_table_path()
 
 
174
  if self.val_artifact is not None:
175
  self.result_artifact = wandb.Artifact("run_" + wandb.run.id + "_progress", "evaluation")
176
- self.result_table = wandb.Table(["epoch", "id", "prediction", "avg_confidence"])
177
  if opt.bbox_interval == -1:
178
  self.bbox_interval = opt.bbox_interval = (opt.epochs // 10) if opt.epochs > 10 else 1
179
  return data_dict
@@ -181,7 +182,7 @@ class WandbLogger():
181
  def download_dataset_artifact(self, path, alias):
182
  if isinstance(path, str) and path.startswith(WANDB_ARTIFACT_PREFIX):
183
  artifact_path = Path(remove_prefix(path, WANDB_ARTIFACT_PREFIX) + ":" + alias)
184
- dataset_artifact = wandb.use_artifact(artifact_path.as_posix())
185
  assert dataset_artifact is not None, "'Error: W&B dataset artifact doesn\'t exist'"
186
  datadir = dataset_artifact.download()
187
  return datadir, dataset_artifact
@@ -216,6 +217,7 @@ class WandbLogger():
216
  def log_dataset_artifact(self, data_file, single_cls, project, overwrite_config=False):
217
  with open(data_file) as f:
218
  data = yaml.safe_load(f) # data dict
 
219
  nc, names = (1, ['item']) if single_cls else (int(data['nc']), data['names'])
220
  names = {k: v for k, v in enumerate(names)} # to index dictionary
221
  self.train_artifact = self.create_dataset_table(LoadImagesAndLabels(
@@ -228,6 +230,7 @@ class WandbLogger():
228
  data['val'] = WANDB_ARTIFACT_PREFIX + str(Path(project) / 'val')
229
  path = data_file if overwrite_config else '_wandb.'.join(data_file.rsplit('.', 1)) # updated data.yaml path
230
  data.pop('download', None)
 
231
  with open(path, 'w') as f:
232
  yaml.safe_dump(data, f)
233
 
@@ -297,6 +300,7 @@ class WandbLogger():
297
  id = self.val_table_map[Path(path).name]
298
  self.result_table.add_data(self.current_epoch,
299
  id,
 
300
  wandb.Image(self.val_table.data[id][1], boxes=boxes, classes=class_set),
301
  total_conf / max(1, len(box_data))
302
  )
@@ -312,11 +316,12 @@ class WandbLogger():
312
  wandb.log(self.log_dict)
313
  self.log_dict = {}
314
  if self.result_artifact:
315
- train_results = wandb.JoinedTable(self.val_table, self.result_table, "id")
316
- self.result_artifact.add(train_results, 'result')
317
  wandb.log_artifact(self.result_artifact, aliases=['latest', 'last', 'epoch ' + str(self.current_epoch),
318
  ('best' if best_result else '')])
319
- self.result_table = wandb.Table(["epoch", "id", "prediction", "avg_confidence"])
 
 
320
  self.result_artifact = wandb.Artifact("run_" + wandb.run.id + "_progress", "evaluation")
321
 
322
  def finish_run(self):
 
136
 
137
  def check_and_upload_dataset(self, opt):
138
  assert wandb, 'Install wandb to upload dataset'
 
139
  config_path = self.log_dataset_artifact(check_file(opt.data),
140
  opt.single_cls,
141
  'YOLOv5' if opt.project == 'runs/train' else Path(opt.project).stem)
 
170
  data_dict['val'] = str(val_path)
171
  self.val_table = self.val_artifact.get("val")
172
  self.map_val_table_path()
173
+ wandb.log({"validation dataset": self.val_table})
174
+
175
  if self.val_artifact is not None:
176
  self.result_artifact = wandb.Artifact("run_" + wandb.run.id + "_progress", "evaluation")
177
+ self.result_table = wandb.Table(["epoch", "id", "ground truth", "prediction", "avg_confidence"])
178
  if opt.bbox_interval == -1:
179
  self.bbox_interval = opt.bbox_interval = (opt.epochs // 10) if opt.epochs > 10 else 1
180
  return data_dict
 
182
  def download_dataset_artifact(self, path, alias):
183
  if isinstance(path, str) and path.startswith(WANDB_ARTIFACT_PREFIX):
184
  artifact_path = Path(remove_prefix(path, WANDB_ARTIFACT_PREFIX) + ":" + alias)
185
+ dataset_artifact = wandb.use_artifact(artifact_path.as_posix().replace("\\","/"))
186
  assert dataset_artifact is not None, "'Error: W&B dataset artifact doesn\'t exist'"
187
  datadir = dataset_artifact.download()
188
  return datadir, dataset_artifact
 
217
  def log_dataset_artifact(self, data_file, single_cls, project, overwrite_config=False):
218
  with open(data_file) as f:
219
  data = yaml.safe_load(f) # data dict
220
+ check_dataset(data)
221
  nc, names = (1, ['item']) if single_cls else (int(data['nc']), data['names'])
222
  names = {k: v for k, v in enumerate(names)} # to index dictionary
223
  self.train_artifact = self.create_dataset_table(LoadImagesAndLabels(
 
230
  data['val'] = WANDB_ARTIFACT_PREFIX + str(Path(project) / 'val')
231
  path = data_file if overwrite_config else '_wandb.'.join(data_file.rsplit('.', 1)) # updated data.yaml path
232
  data.pop('download', None)
233
+ data.pop('path', None)
234
  with open(path, 'w') as f:
235
  yaml.safe_dump(data, f)
236
 
 
300
  id = self.val_table_map[Path(path).name]
301
  self.result_table.add_data(self.current_epoch,
302
  id,
303
+ self.val_table.data[id][1],
304
  wandb.Image(self.val_table.data[id][1], boxes=boxes, classes=class_set),
305
  total_conf / max(1, len(box_data))
306
  )
 
316
  wandb.log(self.log_dict)
317
  self.log_dict = {}
318
  if self.result_artifact:
319
+ self.result_artifact.add(self.result_table, 'result')
 
320
  wandb.log_artifact(self.result_artifact, aliases=['latest', 'last', 'epoch ' + str(self.current_epoch),
321
  ('best' if best_result else '')])
322
+
323
+ wandb.log({"evaluation": self.result_table})
324
+ self.result_table = wandb.Table(["epoch", "id", "ground truth", "prediction", "avg_confidence"])
325
  self.result_artifact = wandb.Artifact("run_" + wandb.run.id + "_progress", "evaluation")
326
 
327
  def finish_run(self):