|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import argparse
|
|
|
from typing import Any, List, Optional, Tuple
|
|
|
|
|
|
import torch
|
|
|
import torch.backends.cudnn as cudnn
|
|
|
|
|
|
from dinov2.models import build_model_from_cfg
|
|
|
from dinov2.utils.config import setup
|
|
|
import dinov2.utils.utils as dinov2_utils
|
|
|
|
|
|
|
|
|
def get_args_parser(
|
|
|
description: Optional[str] = None,
|
|
|
parents: Optional[List[argparse.ArgumentParser]] = None,
|
|
|
add_help: bool = True,
|
|
|
):
|
|
|
parser = argparse.ArgumentParser(
|
|
|
description=description,
|
|
|
parents=parents or [],
|
|
|
add_help=add_help,
|
|
|
)
|
|
|
parser.add_argument(
|
|
|
"--config-file",
|
|
|
type=str,
|
|
|
help="Model configuration file",
|
|
|
)
|
|
|
parser.add_argument(
|
|
|
"--pretrained-weights",
|
|
|
type=str,
|
|
|
help="Pretrained model weights",
|
|
|
)
|
|
|
parser.add_argument(
|
|
|
"--output-dir",
|
|
|
default="",
|
|
|
type=str,
|
|
|
help="Output directory to write results and logs",
|
|
|
)
|
|
|
parser.add_argument(
|
|
|
"--opts",
|
|
|
help="Extra configuration options",
|
|
|
default=[],
|
|
|
nargs="+",
|
|
|
)
|
|
|
return parser
|
|
|
|
|
|
|
|
|
def get_autocast_dtype(config):
|
|
|
teacher_dtype_str = config.compute_precision.teacher.backbone.mixed_precision.param_dtype
|
|
|
if teacher_dtype_str == "fp16":
|
|
|
return torch.half
|
|
|
elif teacher_dtype_str == "bf16":
|
|
|
return torch.bfloat16
|
|
|
else:
|
|
|
return torch.float
|
|
|
|
|
|
|
|
|
def build_model_for_eval(config, pretrained_weights):
|
|
|
model, _ = build_model_from_cfg(config, only_teacher=True)
|
|
|
dinov2_utils.load_pretrained_weights(model, pretrained_weights, "teacher")
|
|
|
model.eval()
|
|
|
model.cuda()
|
|
|
return model
|
|
|
|
|
|
|
|
|
def setup_and_build_model(args) -> Tuple[Any, torch.dtype]:
|
|
|
cudnn.benchmark = True
|
|
|
config = setup(args)
|
|
|
model = build_model_for_eval(config, args.pretrained_weights)
|
|
|
autocast_dtype = get_autocast_dtype(config)
|
|
|
return model, autocast_dtype
|
|
|
|