| |
| |
| |
| |
|
|
| import logging |
| from omegaconf import OmegaConf |
| import os |
| import sys |
| from typing import Any |
|
|
| from dinov3.eval.segmentation.config import SegmentationConfig |
| from dinov3.eval.segmentation.eval import test_segmentation |
| from dinov3.eval.segmentation.train import train_segmentation |
| from dinov3.eval.helpers import args_dict_to_dataclass, cli_parser, write_results |
| from dinov3.eval.setup import load_model_and_context |
| from dinov3.run.init import job_context |
|
|
|
|
| logger = logging.getLogger("dinov3") |
|
|
| RESULTS_FILENAME = "results-semantic-segmentation.csv" |
| MAIN_METRICS = ["mIoU"] |
|
|
|
|
| def run_segmentation_with_dinov3( |
| backbone, |
| config, |
| ): |
| if config.load_from: |
| logger.info("Testing model performance on a pretrained decoder head") |
| return test_segmentation(backbone=backbone, config=config) |
| assert config.decoder_head.type == "linear", "Only linear head is supported for training" |
| return train_segmentation(backbone=backbone, config=config) |
|
|
|
|
| def benchmark_launcher(eval_args: dict[str, object]) -> dict[str, Any]: |
| """Initialization of distributed and logging are preconditions for this method""" |
| if "config" in eval_args: |
| base_config_path = eval_args.pop("config") |
| output_dir = eval_args["output_dir"] |
| base_config = OmegaConf.load(base_config_path) |
| structured_config = OmegaConf.structured(SegmentationConfig) |
| dataclass_config: SegmentationConfig = OmegaConf.to_object( |
| OmegaConf.merge( |
| structured_config, |
| base_config, |
| OmegaConf.create(eval_args), |
| ) |
| ) |
| else: |
| dataclass_config, output_dir = args_dict_to_dataclass(eval_args=eval_args, config_dataclass=SegmentationConfig) |
| backbone = None |
| if dataclass_config.model: |
| backbone, _ = load_model_and_context(dataclass_config.model, output_dir=output_dir) |
| else: |
| assert dataclass_config.load_from == "dinov3_vit7b16_ms" |
| logger.info(f"Segmentation Config:\n{OmegaConf.to_yaml(dataclass_config)}") |
| segmentation_file_path = os.path.join(output_dir, "segmentation_config.yaml") |
| OmegaConf.save(config=dataclass_config, f=segmentation_file_path) |
| results_dict = run_segmentation_with_dinov3(backbone=backbone, config=dataclass_config) |
| write_results(results_dict, output_dir, RESULTS_FILENAME) |
| return results_dict |
|
|
|
|
| def main(argv=None): |
| if argv is None: |
| argv = sys.argv[1:] |
| eval_args = cli_parser(argv) |
| with job_context(output_dir=eval_args["output_dir"]): |
| benchmark_launcher(eval_args=eval_args) |
| return 0 |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|