Ë
    ÜÓ^jmp  ã                   ó  — d Z ddlmZ ddlZddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZmZmZmZ dd	lmZ  ej(                  e«      Z e«       rddlZd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z ed¬«      e G d„ de«      «       «       ZdgZ y)z
Processor class for SAM3.
é    )ÚdeepcopyNé   )Ú
ImageInput)ÚProcessorMixin)ÚBatchEncodingÚPreTokenizedInputÚ	TextInput)Ú
TensorTypeÚauto_docstringÚis_torch_availableÚlogging)Úrequiresc                 ó˜   — | j                  d«      \  }}}}|d|z  z
  |d|z  z
  |d|z  z   |d|z  z   g}t        j                  |d¬«      S ©Néÿÿÿÿç      à?©Údim©ÚunbindÚtorchÚstack©ÚxÚx_cÚy_cÚwÚhÚbs         ús/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/sam3/processing_sam3.pyÚbox_cxcywh_to_xyxyr!   #   sV   € Ø—X‘X˜b“\�N€Cˆˆa�Ø
��a‘‰-˜3  q¡™=¨C°#¸±'©M¸SÀ3ÈÁ7¹]ÐL€AÜ�;‰;�q˜bÔ!Ð!ó    c                 ó€   — | j                  d«      \  }}}}|d|z  z
  |d|z  z
  ||g}t        j                  |d¬«      S r   r   r   s         r    Úbox_cxcywh_to_xywhr$   )   sF   € Ø—X‘X˜b“\�N€Cˆˆa�Ø
��a‘‰-˜3  q¡™=¨A°Ð4€AÜ�;‰;�q˜bÔ!Ð!r"   c                 ót   — | j                  d«      \  } }}}| || |z   ||z   g}t        j                  |d¬«      S ©Nr   r   r   ©r   Úyr   r   r   s        r    Úbox_xywh_to_xyxyr)   /   ó>   € Ø—‘˜"“�J€A€qˆ!ˆQØ
ˆq�A˜‘E˜Q ™UÐ$€AÜ�;‰;�q˜bÔ!Ð!r"   c                 ó€   — | j                  d«      \  } }}}| d|z  z   |d|z  z   ||g}t        j                  |d¬«      S r   r   r'   s        r    Úbox_xywh_to_cxcywhr,   5   sF   € Ø—‘˜"“�J€A€qˆ!ˆQØ
ˆc�A‰g‰+˜˜S 1™W™¨¨QÐ0€AÜ�;‰;�q˜bÔ!Ð!r"   c                 ót   — | j                  d«      \  } }}}| ||| z
  ||z
  g}t        j                  |d¬«      S r&   r   )r   r(   ÚXÚYr   s        r    Úbox_xyxy_to_xywhr0   ;   r*   r"   c                 óŒ   — | j                  d«      \  }}}}||z   dz  ||z   dz  ||z
  ||z
  g}t        j                  |d¬«      S )Nr   é   r   r   )r   Úx0Úy0Úx1Úy1r   s         r    Úbox_xyxy_to_cxcywhr7   A   sN   € Ø—X‘X˜b“\�N€BˆˆB�Ø
ˆr‰'�Q‰˜˜b™ A™¨¨R©°2¸±7Ð<€AÜ�;‰;�q˜bÔ!Ð!r"   c                 óD   — | j                  d«      \  }}}}||z
  ||z
  z  S )z·
    Batched version of box area. Boxes should be in [x0, y0, x1, y1] format.

    Inputs:
    - boxes: Tensor of shape (..., 4)

    Returns:
    - areas: Tensor of shape (...,)
    r   )r   )Úboxesr3   r4   r5   r6   s        r    Úbox_arear:   G   s-   € ð —\‘\ "Ó%�N€BˆˆB�Ø�‰G˜˜R™Ñ Ð r"   )r   )Úbackendsc                   ó   ‡ — e Zd Z	 d dedz  defˆ fd„Ze	 	 	 	 	 	 	 d!dedz  deez  e	e   z  e	e   z  dz  dedz  de	e	e	e
         ej                  z  dz  d	e	e	e	e         ej                  z  dz  d
e	e	e
      ej                  z  dz  deez  dz  defd„«       Zd"d#d„Zd„ Zd$d„Zd„ Zd%d„Zd&d„Zd„ Zd„ Z	 d%dej                  ej4                  z  e	z  dededededz  de	fd„Zd'd„Z	 d(d„Zd)d„Z	 	 	 d*d„Zˆ xZ S )+ÚSam3ProcessorNÚtarget_sizeÚpoint_pad_valuec                 ó†   •— t        ‰| �  ||fi |¤Ž || _        |�|| _        y| j                  j                  d   | _        y)zÿ
        target_size (`int`, *optional*):
            The target size (target_size, target_size) to which the image will be resized.
        point_pad_value (`int`, *optional*, defaults to -10):
            The value used for padding input boxes.
        NÚheight)ÚsuperÚ__init__r?   Úimage_processorÚsizer>   )ÚselfrD   Ú	tokenizerr>   r?   ÚkwargsÚ	__class__s         €r    rC   zSam3Processor.__init__X   sG   ø€ ô 	‰Ñ˜¨)Ñ>°vÒ>Ø.ˆÔØ*5Ð*A˜;ˆÕÀt×G[ÑG[×G`ÑG`ÐaiÑGjˆÕr"   ÚimagesÚtextÚsegmentation_mapsÚinput_boxesÚinput_boxes_labelsÚoriginal_sizesÚreturn_tensorsÚreturnc                 óð  — d}	|� | j                   |f||dœ|¤Ž}	nW|�Ht        |t        j                  «      r|j	                  «       j                  «       }t        d|i|¬«      }	n|�t        d«      ‚| j                  ||«      }|�+| j                  ||dd¬«      }
|	�|	j                  |
«       n|
}	|��A|	d   }| j                  |d	d
dd¬«      }| j                  |ddd¬«      }|�|€| j                  |«      }|�| j                  |«      dd }|�| j                  |«      dd }|�|�k7  rt        d«      ‚|�n| j                  |dgz   «      }t        j                  |t        j                   ¬«      }| j#                  ||dd¬«       t%        |«      }|	j                  d|i«       |�J| j                  |«      }t        j                  |t        j&                  ¬«      }|	j                  d|i«       |	S )a}  
        images (`ImageInput`, *optional*):
            The image(s) to process.
        text (`str`, `list[str]`, `list[list[str]]`, *optional*):
            The text to process.
        segmentation_maps (`ImageInput`, *optional*):
            The segmentation maps to process.
        input_boxes (`list[list[list[float]]]`, `torch.Tensor`, *optional*):
            The bounding boxes to process.
        input_boxes_labels (`list[list[int]]`, `torch.Tensor`, *optional*):
            The labels for the bounding boxes.
        original_sizes (`list[list[float]]`, `torch.Tensor`, *optional*):
            The original sizes of the images.

        Returns:
            A [`BatchEncoding`] with the following fields:
            - `pixel_values` (`torch.Tensor`): The processed image(s).
            - `original_sizes` (`list[list[float]]`): The original sizes of the images.
            - `labels` (`torch.Tensor`): The processed segmentation maps (if provided).
            - `input_boxes_labels` (`torch.Tensor`): The processed labels for the bounding boxes.
            - `input_boxes` (`torch.Tensor`): The processed bounding boxes.
        N)rL   rP   rO   )Útensor_typezKEither images or original_sizes must be provided if input_boxes is not NoneÚ
max_lengthé    )rP   ÚpaddingrT   r   r9   z)[image level, box level, box coordinates]é   )Úexpected_depthÚ
input_nameÚexpected_formatÚexpected_coord_sizer2   Úlabelsz[image level, box level])rX   rY   rZ   zaInput boxes and labels have inconsistent dimensions. Please ensure they have the same dimensions.)ÚdtypeT)Úis_bounding_boxÚpreserve_paddingrM   rN   )rD   Ú
isinstancer   ÚTensorÚcpuÚtolistr   Ú
ValueErrorÚ_resolve_text_promptsrG   ÚupdateÚ_validate_single_inputÚ_generate_default_box_labelsÚ_get_nested_dimensionsÚ_pad_nested_listÚtensorÚfloat32Ú_normalize_tensor_coordinatesr7   Úint64)rF   rJ   rK   rL   rM   rN   rO   rP   rH   ÚencodingÚtext_inputsÚprocessed_boxesÚprocessed_boxes_labelsÚboxes_max_dimsÚboxes_labels_max_dimsÚpadded_boxesÚfinal_boxesÚpadded_boxes_labelsÚfinal_boxes_labelss                      r    Ú__call__zSam3Processor.__call__e   so  € ðD ˆØÐØ+�t×+Ñ+Øðà"3Ø-ñð ñ	‰Hð Ð'Ü˜.¬%¯,©,Ô7Ø!/×!3Ñ!3Ó!5×!<Ñ!<Ó!>�Ü$Ð&6¸Ð%GÐUcÔd‰HØÐ$ÜÐjÓkÐkà×)Ñ)¨$°Ó<ˆØÐØŸ.™.¨¸nÐVbÐoq˜.ÓrˆKØÐ#Ø—‘ Õ,à&�ð Ñ"Ø%Ð&6Ñ7ˆNà"×9Ñ9ØØ Ø"Ø KØ$%ð :ó ˆOð &*×%@Ñ%@Ø"Ø Ø#Ø :ð	 &Aó &Ð"ð Ð*Ð/EÐ/MØ)-×)JÑ)JÈ?Ó)[Ð&ð Ð*Ø!%×!<Ñ!<¸_Ó!MÈbÈqÐ!Q�Ø%Ð1Ø(,×(CÑ(CÐDZÓ([Ð\^Ð]^Ð(_Ð%ð Ð*Ð/EÐ/QØ!Ð%:Ò:Ü$Ø{óð ð
 Ð*Ø#×4Ñ4°_ÀnÐXYÐWZÑFZÓ[�Ü#Ÿl™l¨<¼u¿}¹}ÔM�Ø×2Ñ2Ø ÀÐX\ð 3ô ô 1°Ó=�Ø—‘ °Ð <Ô=à%Ð1Ø&*×&;Ñ&;Ð<RÐTiÓ&jÐ#Ü%*§\¡\Ð2EÌUÏ[É[Ô%YÐ"Ø—‘Ð!5Ð7IÐ JÔKàˆr"   c                 óÀ   — |\  }}t        |«      j                  «       }|r|j                  ddd«      }|d   |z  |d<   |d   |z  |d<   |r|j                  dd«      }|S )a  
        Expects a numpy array of length 2 in the final dimension. Requires the original image size in (H, W) format.

        Args:
            target_size (`int`):
                The target size of the image.
            coords (`torch.Tensor`):
                The coordinates to be normalized.
            original_size (`tuple`):
                The original size of the image.
            is_bounding_box (`bool`, *optional*, defaults to `False`):
                Whether the coordinates are bounding boxes.
        r   r2   ).r   ).é   rW   )r   ÚfloatÚreshape)rF   ÚcoordsÚoriginal_sizer^   Úold_hÚold_ws         r    Ú_normalize_coordinatesz$Sam3Processor._normalize_coordinatesÒ   sq   € ð %‰ˆˆuÜ˜&Ó!×'Ñ'Ó)ˆáØ—^‘^ B¨¨1Ó-ˆFØ ™¨%Ñ/ˆˆv‰Ø ™¨%Ñ/ˆˆv‰áØ—^‘^ B¨Ó*ˆFàˆr"   c                 óN   — |D �cg c]  }|€dndgt        |«      z  ‘Œ c}S c c}w )z[Generate default box labels: `point_pad_value` for None (padded) entries, 1 for real boxes.Nr{   )Úlen)rF   rq   Úimage_boxess      r    rh   z*Sam3Processor._generate_default_box_labelsí   s,   € à[jÖkÈK˜Ð+‘°!°´s¸;Ó7GÑ1GÑGÒkÐkùÒks   …"c           	      óÖ  — |€yt        |t        j                  «      rb||dz
  k(  st        |j                  «      dk  r|j                  «       j                  «       S |D �cg c]  }| j                  |||dz   «      ‘Œ c}S t        |t        j                  «      rT||dz
  k(  st        |j                  «      dk  r|j                  «       S |D �cg c]  }| j                  |||dz   «      ‘Œ c}S t        |t        «      r/||k(  r|S |D �cg c]  }|�| j                  |||dz   «      nd‘Œ c}S t        |t        t        f«      r|S t        dt        |«      › �«      ‚c c}w c c}w c c}w )a®  
        Recursively convert various input formats (tensors, numpy arrays, lists) to nested lists.
        Preserves None values within lists.

        Args:
            data: Input data in any format (may be None or contain None values)
            expected_depth: Expected nesting depth
            current_depth: Current depth in recursion

        Returns:
            Nested list representation of the data (or None)
        Nr2   r{   zUnsupported data type: )r`   r   ra   r„   ÚshapeÚnumpyrc   Ú_convert_to_nested_listÚnpÚndarrayÚlistÚintr|   rd   Útype)rF   ÚdatarX   Úcurrent_depthÚitems        r    r‰   z%Sam3Processor._convert_to_nested_listñ   sd  € ð ˆ<Øô �dœEŸL™LÔ)Ø °Ñ 2Ò2´c¸$¿*¹*³oÈÒ6JØ—z‘z“|×*Ñ*Ó,Ð,àjnÖoÐbf˜×4Ñ4°T¸>È=Ð[\ÑK\Õ]ÒoÐoÜ˜œbŸj™jÔ)Ø °Ñ 2Ò2´c¸$¿*¹*³oÈÒ6JØ—{‘{“}Ð$àjnÖoÐbf˜×4Ñ4°T¸>È=Ð[\ÑK\Õ]ÒoÐoÜ˜œdÔ#Ø Ò.à�ð
 !%öàð ^bÐ]m�D×0Ñ0°°~À}ÐWXÑGXÔYÐswÑwòð ô ˜œs¤E˜lÔ+ØˆKäÐ6´t¸D³z°lÐCÓDÐDùò' pùò
 pùòs   Á EÃE!Ä	!E&c                 ó  — |€|rdS dS t        |t        t        f«      s|S t        |«      }|r;t        |«      t        |«      k7  r$t	        dt        |«      › dt        |«      › d�«      ‚t        |«      D ]  \  }}|�Œ	|sŒ||   €Œd||<   Œ |S )zQ
        Resolve text prompts by setting defaults based on prompt types.
        NÚvisualzEThe number of text prompts must match the number of input boxes. Got z text prompts and z input boxes.)r`   rŒ   Útupler„   rd   Ú	enumerate)rF   rK   rM   ÚiÚ
text_values        r    re   z#Sam3Processor._resolve_text_prompts  s±   € ð
 ˆ<Ù*�8Ð4°Ð4ä˜$¤¤u Ô.ØˆKô �D‹zˆáœ3˜t›9¬¨KÓ(8Ò8ÜðÜ˜4“y�kÐ!3´C¸Ó4DÐ3EÀ]ðTóð ô ' t›_ò 	#‰MˆAˆzØÑ!¢k°kÀ!±nÑ6PØ"��Q’ð	#ð ˆr"   c                 óÊ  — |€g }t        |t        «      s|S t        |«      dk(  r|j                  t        |«      «       nt	        |d   t        |«      «      |d<   t        |«      dkD  rz|D ]u  }|€Œt        |t        «      sŒ| j                  |«      }t        |«      D ]@  \  }}|dz   t        |«      k\  r|j                  |«       Œ)t	        ||dz      |«      ||dz   <   ŒB Œw |S )a�  
        Get the maximum dimensions at each level of nesting, skipping None values.

        Args:
            nested_list (`list`):
                Nested list structure (may contain None values).
            max_dims (`list`, *optional*):
                Current maximum dimensions (for recursion).

        Returns:
            `list`: A list of maximum dimensions for each nesting level.
        r   r{   )r`   rŒ   r„   ÚappendÚmaxri   r•   )rF   Únested_listÚmax_dimsr‘   Úsub_dimsr–   r   s          r    ri   z$Sam3Processor._get_nested_dimensions6  sí   € ð ÐØˆHä˜+¤tÔ,ØˆOäˆx‹=˜AÒØ�O‰OœC Ó,Õ-ä˜h q™k¬3¨{Ó+;Ó<ˆH�Q‰Käˆ{Ó˜aÒØ#ò H�à�<ØÜ˜d¤DÕ)Ø#×:Ñ:¸4Ó@�Hä"+¨HÓ"5ò H™˜˜3Ø˜q™5¤C¨£MÒ1Ø$ŸO™O¨CÕ0ä.1°(¸1¸q¹5±/À3Ó.G˜H Q¨¡UšOñ	HðHð ˆr"   c                 óf  — |€| j                   }|t        |«      k\  r|S t        |t        «      s|g}t        |«      }||   }|t        |«      dz
  k(  r|j	                  |g||z
  z  «       n½|dkD  rm|t        |«      dz
  k  r||dz   d }| j                  ||«      }n|g||dz      z  }|j	                  t        ||z
  «      D �	cg c]  }	t        |«      ‘Œ c}	«       nK||dz   d }| j                  ||«      }|j	                  t        |«      D �	cg c]  }	t        |«      ‘Œ c}	«       |t        |«      dz
  k  rmt        t        |«      «      D ]V  }
||
   €||dz   d }| j                  ||«      ||
<   Œ&t        ||
   t        «      sŒ:| j                  ||
   ||dz   |«      ||
<   ŒX |S c c}	w c c}	w )a3  
        Recursively pad a nested list to match target dimensions. Replaces None values with padded structures.

        Args:
            nested_list (`list`):
                Nested list to pad (may contain None values).
            target_dims (`list`):
                Target dimensions for each level.
            current_level (`int`, *optional*, defaults to 0):
                Current nesting level.
            pad_value (`int`, *optional*):
                Value to use for padding.

        Returns:
            `list`: The padded nested list.
        Nr{   r   r2   )	r?   r„   r`   rŒ   ÚextendÚ_create_empty_nested_structureÚranger   rj   )rF   r›   Útarget_dimsÚcurrent_levelÚ	pad_valueÚcurrent_sizer>   Útemplate_dimsÚtemplateÚ_r–   s              r    rj   zSam3Processor._pad_nested_list^  sô  € ð" ÐØ×,Ñ,ˆIàœC Ó,Ò,ØÐô ˜+¤tÔ,Ø&˜-ˆKô ˜;Ó'ˆØ! -Ñ0ˆð œC Ó,¨qÑ0Ò0à×Ñ 	˜{¨k¸LÑ.HÑIÕJð ˜aÒà ¤3 {Ó#3°aÑ#7Ò7à$/°ÀÑ0AÐ0CÐ$D�MØ#×BÑBÀ=ÐR[Ó\‘Hð !*˜{¨[¸ÈÑ9JÑ-KÑK�Hà×"Ñ"ÄÀkÐT`ÑF`Ó@aÖ#b¸1¤H¨XÕ$6Ò#bÕcð !,¨M¸AÑ,=Ð,?Ð @�Ø×>Ñ>¸}ÈiÓX�Ø×"Ñ"ÄÀkÓ@RÖ#S¸1¤H¨XÕ$6Ò#SÔTð œ3˜{Ó+¨aÑ/Ò/Üœ3˜{Ó+Ó,ò v�Ø˜q‘>Ð)à$/°ÀÑ0AÐ0CÐ$D�MØ%)×%HÑ%HÈÐXaÓ%b�K ’NÜ ¨A¡´Õ5Ø%)×%:Ñ%:¸;Àq¹>È;ÐXeÐhiÑXiÐktÓ%u�K ’Nðvð Ðùò# $cùò
 $Ts   ÃF)ÄF.c                 ó˜   — t        |«      dk(  r	|g|d   z  S t        |d   «      D �cg c]  }| j                  |dd |«      ‘Œ c}S c c}w )a  
        Create an empty nested structure with given dimensions filled with pad_value.

        Args:
            dims (`list`):
                The dimensions of the nested structure.
            pad_value (`int`):
                The value to fill the structure with.
        r{   r   N)r„   r¡   r    )rF   Údimsr¤   r¨   s       r    r    z,Sam3Processor._create_empty_nested_structure   sT   € ô ˆt‹9˜Š>Ø�;  a¡Ñ(Ð(äV[Ð\`ÐabÑ\cÓVdÖeÐQR�D×7Ñ7¸¸Q¸R¸À)ÕLÒeÐeùÒes   ¨Ac                 ó   — t        |t        «      r/t        |«      dk(  ry|D ]  }|€Œd| j                  |«      z   c S  yt        |t        j
                  t        j                  f«      rt        |j                  «      S y)z¸
        Get the nesting level of a list structure, skipping None values.

        Args:
            input_list (`list`):
                The list to get the nesting level of.
        r   r{   )	r`   rŒ   r„   Ú_get_nesting_levelrŠ   r‹   r   ra   r‡   )rF   Ú
input_listr‘   s      r    r¬   z Sam3Processor._get_nesting_level¯  sx   € ô �j¤$Ô'Ü�:‹ !Ò#Øà"ò =�ØÑ#Ø˜t×6Ñ6°tÓ<Ñ<Ò<ð=ð Ü˜
¤R§Z¡Z´·±Ð$>Ô?ä�z×'Ñ'Ó(Ð(Ør"   r�   rX   rY   rZ   r[   c                 óð  — |€yt        |t        j                  t        j                  f«      ry|j
                  |k7  r"t        d|› d|› d|› d|j
                  › d�	«      ‚|�4|j                  d   |k7  r"t        d|› d|› d|j                  d   › d	�«      ‚| j                  ||«      S t        |t        «      r@| j                  |«      }||k7  rt        d|› d
|› d|› d|› d�	«      ‚| j                  ||«      S y)aÇ  
                Validate a single input by ensuring proper nesting and raising an error if the input is not valid.

                Args:
                    data (`torch.Tensor`, `np.ndarray`, or `list`):
                        Input data to process.
                    expected_depth (`int`):
                        Expected nesting depth.
                    input_name (`str`):
                        Name of the input for error messages.
                    expected_format (`str`):
                        The expected format of the input.
                    expected_coord_size (`int`, *optional*):
                        Expected coordinate size (4 for boxes, None for labels).
        .
        NzInput z must be a tensor/array with z, dimensions. The expected nesting format is z. Got z dimensions.r   z as the last dimension, got ú.z must be a nested list with z( levels. The expected nesting format is z levels.)r`   r   ra   rŠ   r‹   Úndimrd   r‡   r‰   rŒ   r¬   )rF   r�   rX   rY   rZ   r[   r�   s          r    rg   z$Sam3Processor._validate_single_inputÅ  s   € ð0 ˆ<Øô �dœUŸ\™\¬2¯:©:Ð6Ô7à�y‰y˜NÒ*Ü Ø˜Z˜LÐ(EÀnÐEUð  VBð  CRð  BSð  SYð  Z^÷  Zcñ  Zcð  Ydð  dpð  qóð ð %Ð0Ø—:‘:˜b‘>Ð%8Ò8Ü$Ø   Ð,IÐJ]ÐI^Ð^zÐ{÷  |Fñ  |Fð  GIñ  |Jð  {Kð  KLð  Móð ð ×/Ñ/°°nÓEÐEô �dœDÔ!Ø ×3Ñ3°DÓ9ˆMØ Ò.Ü Ø˜Z˜LÐ(DÀ^ÐDTÐT|ð  ~Mð  }Nð  NTð  Ubð  Tcð  ckð  lóð ð ×/Ñ/°°nÓEÐEð "r"   c                 óz  — |r"|| j                   k7  }|j                  dd¬«      }t        t        |«      «      D ]€  }||j                  d   k  sŒ|t        |«      k  r||   n|d   }| j                  ||   ||¬«      }	|r5|   }
t        j                  |
j                  ||   «      |	||   «      ||<   Œ||	||<   Œ‚ y)a  
        Helper method to normalize coordinates in a tensor across multiple images.

        Args:
            tensor (`torch.Tensor`):
                Input tensor with coordinates.
            original_sizes (`list`):
                Original image sizes.
            is_bounding_box (`bool`, *optional*, defaults to `False`):
                Whether coordinates are bounding boxes.
            preserve_padding (`bool`, *optional*, defaults to `False`):
                Whether to preserve padding values (for boxes).
        r   T)r   Úkeepdimr   )r^   N)	r?   Úallr¡   r„   r‡   r‚   r   ÚwhereÚ	expand_as)rF   rk   rO   r^   r_   ÚmaskÚ
coord_maskÚimg_idxr   Únormalized_coordsÚimg_masks              r    rm   z+Sam3Processor._normalize_tensor_coordinates÷  sÝ   € ñ à˜T×1Ñ1Ñ1ˆDØŸ™ b°$˜Ó7ˆJäœS Ó0Ó1ò 	8ˆGØ˜Ÿ™ a™Ó(Ø;BÄSÈÓEXÒ;X ¨wÒ 7Ð^lÐmnÑ^o�Ø$(×$?Ñ$?Ø˜7‘O ]ÀOð %@ó %Ð!ñ $à)¨'Ñ2�HÜ&+§k¡kØ ×*Ñ*¨6°'©?Ó;Ð=NÐPVÐW^ÑP_ó'�F˜7’Oð '8�F˜7’Oñ	8r"   c                 ó@   — | j                   j                  ||||¬«      S )a6  
        Converts the output of [`Sam3Model`] into semantic segmentation maps.

        Args:
            outputs ([`Sam3ImageSegmentationOutput`]):
                Raw outputs of the model containing semantic_seg.
            target_sizes (`list[tuple]` of length `batch_size`, *optional*):
                List of tuples corresponding to the requested final size (height, width) of each prediction. If unset,
                predictions will not be resized.
            threshold (`float`, *optional*, defaults to 0.5):
                Threshold for binarizing the semantic segmentation masks.
            return_segmentation_scores (`bool`, *optional*, defaults to `False`):
                Whether to return segmentation scores alongside the segmentation map.

        Returns:
            semantic_segmentation: `list[torch.Tensor]` of length `batch_size`, where each item is a semantic
            segmentation map of shape (height, width) corresponding to the target_sizes entry (if `target_sizes` is
            specified). Each entry is a binary mask (0 or 1).
        )Útarget_sizesÚ	thresholdÚreturn_segmentation_scores)rD   Ú"post_process_semantic_segmentation)rF   Úoutputsr¼   r½   r¾   s        r    r¿   z0Sam3Processor.post_process_semantic_segmentation  s/   € ð, ×#Ñ#×FÑFØØ%ØØ'Að	 Gó 
ð 	
r"   c                 ó<   — | j                   j                  |||«      S )a  
        Converts the raw output of [`Sam3Model`] into final bounding boxes in (top_left_x, top_left_y,
        bottom_right_x, bottom_right_y) format. This is a convenience wrapper around the image processor method.

        Args:
            outputs ([`Sam3ImageSegmentationOutput`]):
                Raw outputs of the model containing pred_boxes, pred_logits, and optionally presence_logits.
            threshold (`float`, *optional*, defaults to 0.3):
                Score threshold to keep object detection predictions.
            target_sizes (`list[tuple[int, int]]`, *optional*):
                List of tuples (`tuple[int, int]`) containing the target size `(height, width)` of each image in the
                batch. If unset, predictions will not be resized.

        Returns:
            `list[dict]`: A list of dictionaries, each dictionary containing the following keys:
                - **scores** (`torch.Tensor`): The confidence scores for each predicted box on the image.
                - **boxes** (`torch.Tensor`): Image bounding boxes in (top_left_x, top_left_y, bottom_right_x,
                  bottom_right_y) format.

        Example:

        ```python
        >>> from transformers import AutoModel, AutoProcessor
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO

        >>> model = AutoModel.from_pretrained("facebook/sam3-base")
        >>> processor = AutoProcessor.from_pretrained("facebook/sam3-base")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read()))
        >>> inputs = processor(images=image, text="cat", return_tensors="pt")
        >>> outputs = model(**inputs)

        >>> # Post-process to get bounding boxes
        >>> results = processor.post_process_object_detection(outputs, threshold=0.3, target_sizes=[image.size[::-1]])
        >>> boxes = results[0]["boxes"]
        >>> scores = results[0]["scores"]
        ```
        )rD   Úpost_process_object_detection)rF   rÀ   r½   r¼   s       r    rÂ   z+Sam3Processor.post_process_object_detection7  s!   € ðV ×#Ñ#×AÑAÀ'È9ÐVbÓcÐcr"   c                 ó>   — | j                   j                  ||||«      S )ay	  
        Converts the raw output of [`Sam3Model`] into instance segmentation predictions with bounding boxes and masks.
        This is a convenience wrapper around the image processor method.

        Args:
            outputs ([`Sam3ImageSegmentationOutput`]):
                Raw outputs of the model containing pred_boxes, pred_logits, pred_masks, and optionally
                presence_logits.
            threshold (`float`, *optional*, defaults to 0.3):
                Score threshold to keep instance predictions.
            mask_threshold (`float`, *optional*, defaults to 0.5):
                Threshold for binarizing the predicted masks.
            target_sizes (`list[tuple[int, int]]`, *optional*):
                List of tuples (`tuple[int, int]`) containing the target size `(height, width)` of each image in the
                batch. If unset, predictions will not be resized.

        Returns:
            `list[dict]`: A list of dictionaries, each dictionary containing the following keys:
                - **scores** (`torch.Tensor`): The confidence scores for each predicted instance on the image.
                - **boxes** (`torch.Tensor`): Image bounding boxes in (top_left_x, top_left_y, bottom_right_x,
                  bottom_right_y) format.
                - **masks** (`torch.Tensor`): Binary segmentation masks for each instance, shape (num_instances,
                  height, width).

        Example:

        ```python
        >>> from transformers import AutoModel, AutoProcessor
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO

        >>> model = AutoModel.from_pretrained("facebook/sam3-base")
        >>> processor = AutoProcessor.from_pretrained("facebook/sam3-base")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read()))
        >>> inputs = processor(images=image, text="cat", return_tensors="pt")
        >>> outputs = model(**inputs)

        >>> # Post-process to get instance segmentation
        >>> results = processor.post_process_instance_segmentation(
        ...     outputs, threshold=0.3, target_sizes=[image.size[::-1]]
        ... )
        >>> masks = results[0]["masks"]
        >>> boxes = results[0]["boxes"]
        >>> scores = results[0]["scores"]
        ```
        )rD   Ú"post_process_instance_segmentation)rF   rÀ   r½   Úmask_thresholdr¼   s        r    rÄ   z0Sam3Processor.post_process_instance_segmentationd  s'   € ðr ×#Ñ#×FÑFØ�Y °ó
ð 	
r"   )Niöÿÿÿ)NNNNNNN)F)r~   útorch.TensorrQ   rÆ   )r   )N)r   N)FF)Nr   F)ç333333Ó?N)rÇ   r   N)!Ú__name__Ú
__module__Ú__qualname__r�   rC   r   r   r	   r   rŒ   r|   r   ra   Ústrr
   r   ry   r‚   rh   r‰   re   ri   rj   r    r¬   rŠ   r‹   rg   rm   r¿   rÂ   rÄ   Ú__classcell__)rI   s   @r    r=   r=   U   sæ  ø„ ð beñkØ7:¸T±zðkØ[^õkð ð %)ØaeØ/3ØEIØJNØBFØ26ñjà˜TÑ!ðjð Ð+Ñ+¨d°9©oÑ=ÀÐEVÑ@WÑWÐZ^Ñ^ðjð &¨Ñ,ð	jð
 ˜$˜t E™{Ñ+Ñ,¨u¯|©|Ñ;¸dÑBðjð !  d¨3¡i¡Ñ1°E·L±LÑ@À4ÑGðjð ˜T %™[Ñ)¨E¯L©LÑ8¸4Ñ?ðjð ˜jÑ(¨4Ñ/ðjð 
òjó ðjôXò6ló(EòTó6&óP@òDfòð8 +/ñ0Fà�l‰l˜RŸZ™ZÑ'¨$Ñ.ð0Fð ð0Fð ð	0Fð
 ð0Fð ! 4™Zð0Fð 
ó0Fód!8ðH UZó
ó:+dð` ØØ÷;
r"   r=   )!Ú__doc__Úcopyr   rˆ   rŠ   Úimage_utilsr   Úprocessing_utilsr   Útokenization_utils_baser   r   r	   Úutilsr
   r   r   r   Úutils.import_utilsr   Ú
get_loggerrÈ   Úloggerr   r!   r$   r)   r,   r0   r7   r:   r=   Ú__all__© r"   r    ú<module>rØ      s�   ðñõ ã å %Ý .ß RÑ Rß LÓ LÝ *ð 
ˆ×	Ñ	˜HÓ	%€áÔÛò"ò"ò"ò"ò"ò"ò!ñ 
�:ÔØôH	
�Nó H	
ó ó ðH	
ðV Ð
�r"   