Addax-Data-Science's picture
Upload 162 files
d9bb75c verified
Raw
History Blame Contribute Delete
2.93 kB
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This software may be used and distributed in accordance with
# the terms of the DINOv3 License Agreement.
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: # using a config yaml file, useful for training
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: # either using default values, or only adding some args to the command line
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())