Spaces:
Sleeping
Sleeping
| import logging | |
| import os | |
| from urllib.parse import urlparse | |
| try: | |
| import comet_ml | |
| except (ModuleNotFoundError, ImportError): | |
| comet_ml = None | |
| import yaml | |
| logger = logging.getLogger(__name__) | |
| COMET_PREFIX = 'comet://' | |
| COMET_MODEL_NAME = os.getenv('COMET_MODEL_NAME', 'yolov5') | |
| COMET_DEFAULT_CHECKPOINT_FILENAME = os.getenv('COMET_DEFAULT_CHECKPOINT_FILENAME', 'last.pt') | |
| def download_model_checkpoint(opt, experiment): | |
| model_dir = f'{opt.project}/{experiment.name}' | |
| os.makedirs(model_dir, exist_ok=True) | |
| model_name = COMET_MODEL_NAME | |
| model_asset_list = experiment.get_model_asset_list(model_name) | |
| if len(model_asset_list) == 0: | |
| logger.error(f'COMET ERROR: No checkpoints found for model name : {model_name}') | |
| return | |
| model_asset_list = sorted( | |
| model_asset_list, | |
| key=lambda x: x['step'], | |
| reverse=True, | |
| ) | |
| logged_checkpoint_map = {asset['fileName']: asset['assetId'] for asset in model_asset_list} | |
| resource_url = urlparse(opt.weights) | |
| checkpoint_filename = resource_url.query | |
| if checkpoint_filename: | |
| asset_id = logged_checkpoint_map.get(checkpoint_filename) | |
| else: | |
| asset_id = logged_checkpoint_map.get(COMET_DEFAULT_CHECKPOINT_FILENAME) | |
| checkpoint_filename = COMET_DEFAULT_CHECKPOINT_FILENAME | |
| if asset_id is None: | |
| logger.error(f'COMET ERROR: Checkpoint {checkpoint_filename} not found in the given Experiment') | |
| return | |
| try: | |
| logger.info(f'COMET INFO: Downloading checkpoint {checkpoint_filename}') | |
| asset_filename = checkpoint_filename | |
| model_binary = experiment.get_asset(asset_id, return_type='binary', stream=False) | |
| model_download_path = f'{model_dir}/{asset_filename}' | |
| with open(model_download_path, 'wb') as f: | |
| f.write(model_binary) | |
| opt.weights = model_download_path | |
| except Exception as e: | |
| logger.warning('COMET WARNING: Unable to download checkpoint from Comet') | |
| logger.exception(e) | |
| def set_opt_parameters(opt, experiment): | |
| """Update the opts Namespace with parameters | |
| from Comet's ExistingExperiment when resuming a run | |
| Args: | |
| opt (argparse.Namespace): Namespace of command line options | |
| experiment (comet_ml.APIExperiment): Comet API Experiment object | |
| """ | |
| asset_list = experiment.get_asset_list() | |
| resume_string = opt.resume | |
| for asset in asset_list: | |
| if asset['fileName'] == 'opt.yaml': | |
| asset_id = asset['assetId'] | |
| asset_binary = experiment.get_asset(asset_id, return_type='binary', stream=False) | |
| opt_dict = yaml.safe_load(asset_binary) | |
| for key, value in opt_dict.items(): | |
| setattr(opt, key, value) | |
| opt.resume = resume_string | |
| # Save hyperparameters to YAML file | |
| # Necessary to pass checks in training script | |
| save_dir = f'{opt.project}/{experiment.name}' | |
| os.makedirs(save_dir, exist_ok=True) | |
| hyp_yaml_path = f'{save_dir}/hyp.yaml' | |
| with open(hyp_yaml_path, 'w') as f: | |
| yaml.dump(opt.hyp, f) | |
| opt.hyp = hyp_yaml_path | |
| def check_comet_weights(opt): | |
| """Downloads model weights from Comet and updates the | |
| weights path to point to saved weights location | |
| Args: | |
| opt (argparse.Namespace): Command Line arguments passed | |
| to YOLOv5 training script | |
| Returns: | |
| None/bool: Return True if weights are successfully downloaded | |
| else return None | |
| """ | |
| if comet_ml is None: | |
| return | |
| if isinstance(opt.weights, str): | |
| if opt.weights.startswith(COMET_PREFIX): | |
| api = comet_ml.API() | |
| resource = urlparse(opt.weights) | |
| experiment_path = f'{resource.netloc}{resource.path}' | |
| experiment = api.get(experiment_path) | |
| download_model_checkpoint(opt, experiment) | |
| return True | |
| return None | |
| def check_comet_resume(opt): | |
| """Restores run parameters to its original state based on the model checkpoint | |
| and logged Experiment parameters. | |
| Args: | |
| opt (argparse.Namespace): Command Line arguments passed | |
| to YOLOv5 training script | |
| Returns: | |
| None/bool: Return True if the run is restored successfully | |
| else return None | |
| """ | |
| if comet_ml is None: | |
| return | |
| if isinstance(opt.resume, str): | |
| if opt.resume.startswith(COMET_PREFIX): | |
| api = comet_ml.API() | |
| resource = urlparse(opt.resume) | |
| experiment_path = f'{resource.netloc}{resource.path}' | |
| experiment = api.get(experiment_path) | |
| set_opt_parameters(opt, experiment) | |
| download_model_checkpoint(opt, experiment) | |
| return True | |
| return None | |