docstr: Build/load the SAM model based on it's config.
  
  Args:
      config: The SamConfig data structure. If the model_type is available, build from it, otherwise will use
              the parameters set.
  Returns:
      The respective SAM model
  
  Example:
      >>> from kornia.contrib.models.sam import SamConfig
      >>> sam_model = Sam.from_config(SamConfig('vit_b'))
docstr_tok: ["Build\/load","the","SAM","model","based","on","it","'s","config",".","Args",":","config",":","The","SamConfig","data","structure",".","If","the","model_type","is","available",",","build","from","it",",","otherwise","will","use","the","parameters","set",".","Returns",":","The","respective","SAM","model","Example",":",">",">",">","from","kornia.contrib.models.sam","import","SamConfig",">",">",">","sam_model","=","Sam.from_config","(","SamConfig","(","'vit_b","'",")",")"]
code: def from_config(config: SamConfig) -> Sam:
      """Build/load the SAM model based on it's config.
  
      Args:
          config: The SamConfig data structure. If the model_type is available, build from it, otherwise will use
                  the parameters set.
      Returns:
          The respective SAM model
  
      Example:
          >>> from kornia.contrib.models.sam import SamConfig
          >>> sam_model = Sam.from_config(SamConfig('vit_b'))
      """
      model_type = config.model_type
  
      if isinstance(model_type, int):
          model_type = SamModelType(model_type)
      elif isinstance(model_type, str):
          _map_sam_type = {
              "vit_h": SamModelType.vit_h,
              "vit_l": SamModelType.vit_l,
              "vit_b": SamModelType.vit_b,
              "mobile_sam": SamModelType.mobile_sam,
          }
          model_type = _map_sam_type[model_type]
  
      if model_type == SamModelType.vit_b:
          model = _build_sam(
              encoder_embed_dim=768,
              encoder_depth=12,
              encoder_num_heads=12,
              encoder_global_attn_indexes=(2, 5, 8, 11),
          )
  
      elif model_type == SamModelType.vit_l:
          model = _build_sam(
              encoder_embed_dim=1024,
              encoder_depth=24,
              encoder_num_heads=16,
              encoder_global_attn_indexes=(5, 11, 17, 23),
          )
  
      elif model_type == SamModelType.vit_h:
          model = _build_sam(
              encoder_embed_dim=1280,
              encoder_depth=32,
              encoder_num_heads=16,
              encoder_global_attn_indexes=(7, 15, 23, 31),
          )
  
      elif model_type == SamModelType.mobile_sam:
          # TODO: merge this with _build_sam()
          prompt_embed_dim = 256
          image_size = 1024
          vit_patch_size = 16
          image_embedding_size = image_size // vit_patch_size
  
          model = Sam(
              image_encoder=TinyViT.from_config(
                  "5m", img_size=image_size, mobile_sam=True
              ),
              prompt_encoder=PromptEncoder(
                  embed_dim=prompt_embed_dim,
                  image_embedding_size=(
                      image_embedding_size,
                      image_embedding_size,
                  ),
                  input_image_size=(image_size, image_size),
                  mask_in_chans=16,
              ),
              mask_decoder=MaskDecoder(
                  num_multimask_outputs=3,
                  transformer=TwoWayTransformer(
                      depth=2,
                      embedding_dim=prompt_embed_dim,
                      mlp_dim=2048,
                      num_heads=8,
                  ),
                  transformer_dim=prompt_embed_dim,
                  iou_head_depth=3,
                  iou_head_hidden_dim=256,
              ),
              #     pixel_mean=[123.675, 116.28, 103.53],
              #     pixel_std=[58.395, 57.12, 57.375],
          )
  
      elif (
          isinstance(config.encoder_embed_dim, int)
          and isinstance(config.encoder_depth, int)
          and isinstance(config.encoder_num_heads, int)
          and isinstance(config.encoder_global_attn_indexes, int)
      ):
          model = _build_sam(
              encoder_embed_dim=config.encoder_embed_dim,
              encoder_depth=config.encoder_depth,
              encoder_num_heads=config.num_heads,
              encoder_global_attn_indexes=config.encoder_global_attn_indexes,
          )
  
      else:
          raise NotImplementedError(
              "Unexpected config. The model_type should be provide or the encoder configs."
          )
  
      checkpoint = config.checkpoint
      if config.pretrained:
          if checkpoint is None:
              checkpoint = {
                  SamModelType.vit_b: "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth",
                  SamModelType.vit_l: "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth",
                  SamModelType.vit_h: "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth",
                  SamModelType.mobile_sam: "https://github.com/ChaoningZhang/MobileSAM/raw/a509aac54fdd7af59f843135f2f7cee307283c88/weights/mobile_sam.pt",
              }[model_type]
          else:
              warnings.warn(
                  "checkpoint is not None. pretrained=True is ignored"
              )
  
      if checkpoint:
          model.load_checkpoint(checkpoint)
  
      return model
  
imports: from __future__ import annotations
  import warnings
  from dataclasses import dataclass
  from enum import Enum
  from typing import Any, Optional
  import torch
  from kornia.contrib.models import SegmentationResults
  from kornia.contrib.models.base import ModelBase
  from kornia.contrib.models.sam.architecture.common import LayerNorm
  from kornia.contrib.models.sam.architecture.image_encoder import ImageEncoderViT
  from kornia.contrib.models.sam.architecture.mask_decoder import MaskDecoder
  from kornia.contrib.models.sam.architecture.prompt_encoder import PromptEncoder
  from kornia.contrib.models.sam.architecture.transformer import TwoWayTransformer
  from kornia.contrib.models.tiny_vit import TinyViT
  from kornia.core import Tensor
  from kornia.core.check import KORNIA_CHECK, KORNIA_CHECK_SHAPE
label_desc: Use image node_id 2 for calling the Sam obj's underlying member method code with example usage: obj.from_config(config) and returns: model