docstr: Encodes prompts for input to SAM's mask decoder.
  
  Args:
      embed_dim: The prompts' embedding dimension
      image_embedding_size: The spatial size of the image embedding, as (H, W).
      input_image_size: The padded size of the image as input to the image encoder, as (H, W).
      mask_in_chans: The number of hidden channels used for encoding input masks.
      activation: The activation to use when encoding input masks.
docstr_tok: ["Encodes","prompts","for","input","to","SAM","'s","mask","decoder",".","Args",":","embed_dim",":","The","prompts","'","embedding","dimension","image_embedding_size",":","The","spatial","size","of","the","image","embedding",",","as","(","H",",","W",")",".","input_image_size",":","The","padded","size","of","the","image","as","input","to","the","image","encoder",",","as","(","H",",","W",")",".","mask_in_chans",":","The","number","of","hidden","channels","used","for","encoding","input","masks",".","activation",":","The","activation","to","use","when","encoding","input","masks","."]
code: def __init__(
      self,
      embed_dim: int,
      image_embedding_size: tuple[int, int],
      input_image_size: tuple[int, int],
      mask_in_chans: int,
      activation: type[Module] = nn.GELU,
  ) -> None:
      """Encodes prompts for input to SAM's mask decoder.
  
      Args:
          embed_dim: The prompts' embedding dimension
          image_embedding_size: The spatial size of the image embedding, as (H, W).
          input_image_size: The padded size of the image as input to the image encoder, as (H, W).
          mask_in_chans: The number of hidden channels used for encoding input masks.
          activation: The activation to use when encoding input masks.
      """
      super().__init__()
      self.embed_dim = embed_dim
      self.input_image_size = input_image_size
      self.image_embedding_size = image_embedding_size
      self.pe_layer = PositionEmbeddingRandom(embed_dim // 2)
  
      self.num_point_embeddings: int = (
          4  # pos/neg point + 2 box corners
      )
      point_embeddings = [
          nn.Embedding(1, embed_dim)
          for i in range(self.num_point_embeddings)
      ]
      self.point_embeddings = nn.ModuleList(point_embeddings)
      self.not_a_point_embed = nn.Embedding(1, embed_dim)
  
      self.mask_input_size = (
          4 * image_embedding_size[0],
          4 * image_embedding_size[1],
      )
      self.mask_downscaling = nn.Sequential(
          nn.Conv2d(1, mask_in_chans // 4, kernel_size=2, stride=2),
          LayerNorm2d(mask_in_chans // 4),
          activation(),
          nn.Conv2d(
              mask_in_chans // 4, mask_in_chans, kernel_size=2, stride=2
          ),
          LayerNorm2d(mask_in_chans),
          activation(),
          nn.Conv2d(mask_in_chans, embed_dim, kernel_size=1),
      )
      self.no_mask_embed = nn.Embedding(1, embed_dim)
  
imports: from __future__ import annotations
  from math import pi
  from typing import Optional
  import torch
  from torch import nn
  from kornia.contrib.models.common import LayerNorm2d
  from kornia.core import Device, Module, Tensor, concatenate, cos, sin, stack, zeros
label_desc: Use image node_id 1 to create a new PromptEncoder object from inherited base classes: Module with example: obj = PromptEncoder(embed_dim, image_embedding_size, input_image_size, mask_in_chans, activation)