Spaces:
Build error
Build error
| """Methods to compute and save metrics.""" | |
| # Copyright (C) 2020 Intel Corporation | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions | |
| # and limitations under the License. | |
| import random | |
| import string | |
| from glob import glob | |
| from pathlib import Path | |
| from typing import Dict, List, Union | |
| import pandas as pd | |
| from torch.utils.tensorboard.writer import SummaryWriter | |
| import wandb | |
| def write_metrics(model_metrics: Dict[str, Union[str, float]], writers: List[str]): | |
| """Writes metrics to destination provided in the sweep config. | |
| Args: | |
| model_metrics (Dict): Dictionary to be written | |
| writers (List[str]): List of destinations. | |
| """ | |
| # Write to file as each run is computed | |
| if model_metrics == {} or model_metrics is None: | |
| return | |
| # Write to CSV | |
| metrics_df = pd.DataFrame(model_metrics, index=[0]) | |
| result_path = Path(f"runs/{model_metrics['model_name']}_{model_metrics['device']}.csv") | |
| Path.mkdir(result_path.parent, parents=True, exist_ok=True) | |
| if not result_path.is_file(): | |
| metrics_df.to_csv(result_path) | |
| else: | |
| metrics_df.to_csv(result_path, mode="a", header=False) | |
| if "tensorboard" in writers: | |
| write_to_tensorboard(model_metrics) | |
| def write_to_tensorboard( | |
| model_metrics: Dict[str, Union[str, float]], | |
| ): | |
| """Write model_metrics to tensorboard. | |
| Args: | |
| model_metrics (Dict[str, Union[str, float]]): Dictionary containing collected results. | |
| """ | |
| scalar_metrics = {} | |
| scalar_prefixes: List[str] = [] | |
| string_metrics = {} | |
| for key, metric in model_metrics.items(): | |
| if isinstance(metric, (int, float, bool)): | |
| scalar_metrics[key] = metric | |
| else: | |
| string_metrics[key] = metric | |
| scalar_prefixes.append(metric) | |
| writer = SummaryWriter(f"runs/{model_metrics['model_name']}_{model_metrics['device']}") | |
| for key, metric in model_metrics.items(): | |
| if isinstance(metric, (int, float, bool)): | |
| scalar_metrics[key.replace(".", "/")] = metric # need to join by / for tensorboard grouping | |
| writer.add_scalar(key, metric) | |
| else: | |
| if key == "model_name": | |
| continue | |
| scalar_prefixes.append(metric) | |
| scalar_prefix: str = "/".join(scalar_prefixes) | |
| for key, metric in scalar_metrics.items(): | |
| writer.add_scalar(scalar_prefix + "/" + str(key), metric) | |
| writer.close() | |
| def get_unique_key(str_len: int) -> str: | |
| """Returns a random string of length str_len. | |
| Args: | |
| str_len (int): Length of string. | |
| Returns: | |
| str: Random string | |
| """ | |
| return "".join([random.choice(string.ascii_lowercase) for _ in range(str_len)]) | |
| def upload_to_wandb(team: str = "anomalib"): | |
| """Upload the data in csv files to wandb. | |
| Creates a project named benchmarking_[two random characters]. This is so that the project names are unique. | |
| One issue is that it does not check for collision | |
| Args: | |
| team (str, optional): Name of the team on wandb. This can also be the id of your personal account. | |
| Defaults to "anomalib". | |
| """ | |
| project = f"benchmarking_{get_unique_key(2)}" | |
| tag_list = ["dataset.category", "model_name", "dataset.image_size", "model.backbone", "device"] | |
| for csv_file in glob("runs/*.csv"): | |
| table = pd.read_csv(csv_file) | |
| for index, row in table.iterrows(): | |
| row = dict(row[1:]) # remove index column | |
| tags = [str(row[column]) for column in tag_list if column in row.keys()] | |
| wandb.init( | |
| entity=team, project=project, name=f"{row['model_name']}_{row['dataset.category']}_{index}", tags=tags | |
| ) | |
| wandb.log(row) | |
| wandb.finish() | |