§
    ‚Štjmp  ã                   ó*  — 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 dS )z
Processor class for SAM3.
é    ©ÚdeepcopyNé   )Ú
ImageInput)ÚProcessorMixin)ÚBatchEncodingÚPreTokenizedInputÚ	TextInput)Ú
TensorTypeÚauto_docstringÚis_torch_availableÚlogging)Úrequiresc                 óž   — |                       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         úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/sam3/processing_sam3.pyÚbox_cxcywh_to_xyxyr"   #   s\   € Ø—X’X˜b‘\”\�N€Cˆˆa�Ø
��a‘‰-˜3  q¡™=¨C°#¸±'©M¸SÀ3ÈÁ7¹]ÐL€AÝŒ;�q˜bÐ!Ñ!Ô!Ð!ó    c                 ó†   — |                       d¦  «        \  }}}}|d|z  z
  |d|z  z
  ||g}t          j        |d¬¦  «        S r   r   r   s         r!   Úbox_cxcywh_to_xywhr%   )   sL   € Ø—X’X˜b‘\”\�N€Cˆˆa�Ø
��a‘‰-˜3  q¡™=¨A°Ð4€AÝŒ;�q˜bÐ!Ñ!Ô!Ð!r#   c                 óz   — |                       d¦  «        \  } }}}| || |z   ||z   g}t          j        |d¬¦  «        S ©Nr   r   r   ©r   Úyr   r   r    s        r!   Úbox_xywh_to_xyxyr*   /   óD   € Ø—’˜"‘”�J€A€qˆ!ˆQØ
ˆq�A˜‘E˜Q ™UÐ$€AÝŒ;�q˜bÐ!Ñ!Ô!Ð!r#   c                 ó†   — |                       d¦  «        \  } }}}| d|z  z   |d|z  z   ||g}t          j        |d¬¦  «        S r   r   r(   s        r!   Úbox_xywh_to_cxcywhr-   5   sL   € Ø—’˜"‘”�J€A€qˆ!ˆQØ
ˆc�A‰g‰+˜˜S 1™W™¨¨QÐ0€AÝŒ;�q˜bÐ!Ñ!Ô!Ð!r#   c                 óz   — |                       d¦  «        \  } }}}| ||| z
  ||z
  g}t          j        |d¬¦  «        S r'   r   )r   r)   ÚXÚYr    s        r!   Úbox_xyxy_to_xywhr1   ;   r+   r#   c                 ó’   — |                       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_cxcywhr8   A   sT   € Ø—X’X˜b‘\”\�N€BˆˆB�Ø
ˆr‰'�Q‰˜˜b™ A™¨¨R©°2¸±7Ð<€AÝŒ;�q˜bÐ!Ñ!Ô!Ð!r#   c                 óL   — |                       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   )Úboxesr4   r5   r6   r7   s        r!   Úbox_arear;   G   s0   € ð —\’\ "Ñ%Ô%�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j        z  e	z  dededededz  de	fd „Zd.d!„Z	 d/d#„Zd0d%„Z	 	 	 d1d&„Zˆ xZ S )2ÚSam3ProcessorNéöÿÿÿÚtarget_sizeÚpoint_pad_valuec                 ó‚   •—  t          ¦   «         j        ||fi |¤Ž || _        |�|n| j        j        d         | _        dS )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__rA   Úimage_processorÚsizer@   )ÚselfrF   Ú	tokenizerr@   rA   ÚkwargsÚ	__class__s         €r!   rE   zSam3Processor.__init__X   sQ   ø€ ð 	�‰ŒÔ˜¨)Ð>Ð>°vÐ>Ð>Ð>Ø.ˆÔØ*5Ð*A˜;˜;ÀtÔG[ÔG`ÐaiÔGjˆÔÐÐr#   ÚimagesÚtextÚsegmentation_mapsÚinput_boxesÚinput_boxes_labelsÚoriginal_sizesÚreturn_tensorsÚreturnc                 ó†  — d}	|� | j         |f||dœ|¤Ž}	ng|�Tt          |t          j        ¦  «        r&|                     ¦   «                              ¦   «         }t          d|i|¬¦  «        }	n|�t          d¦  «        ‚|                      ||¦  «        }|�3|  	                    ||dd¬¦  «        }
|	�|	 
                    |
¦  «         n|
}	|��u|	d         }|                      |d	d
dd¬¦  «        }|                      |ddd¬¦  «        }|�|€|                      |¦  «        }|�|                      |¦  «        dd…         }|�|                      |¦  «        dd…         }|�|�||k    rt          d¦  «        ‚|�y|                      ||dgz   ¦  «        }t          j        |t          j        ¬¦  «        }|                      ||dd¬¦  «         t%          |¦  «        }|	 
                    d|i¦  «         |�M|                      ||¦  «        }t          j        |t          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)rN   rR   rQ   )Útensor_typezKEither images or original_sizes must be provided if input_boxes is not NoneÚ
max_lengthé    )rR   ÚpaddingrV   r   r:   z)[image level, box level, box coordinates]é   )Úexpected_depthÚ
input_nameÚexpected_formatÚexpected_coord_sizer3   Úlabelsz[image level, box level])rZ   r[   r\   zaInput boxes and labels have inconsistent dimensions. Please ensure they have the same dimensions.)ÚdtypeT)Úis_bounding_boxÚpreserve_paddingrO   rP   )rF   Ú
isinstancer   ÚTensorÚcpuÚtolistr   Ú
ValueErrorÚ_resolve_text_promptsrI   ÚupdateÚ_validate_single_inputÚ_generate_default_box_labelsÚ_get_nested_dimensionsÚ_pad_nested_listÚtensorÚfloat32Ú_normalize_tensor_coordinatesr8   Úint64)rH   rL   rM   rN   rO   rP   rQ   rR   rJ   Ú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   sá  € ðD ˆØÐØ+�tÔ+Øðà"3Ø-ðð ð ð	ð ˆHˆHð Ð'Ý˜.­%¬,Ñ7Ô7ð ?Ø!/×!3Ò!3Ñ!5Ô!5×!<Ò!<Ñ!>Ô!>�Ý$Ð&6¸Ð%GÐUcÐdÑdÔdˆHˆHØÐ$ÝÐjÑkÔkÐkà×)Ò)¨$°Ñ<Ô<ˆØÐØŸ.š.¨¸nÐVbÐoq˜.ÑrÔrˆKØÐ#Ø—’ Ñ,Ô,Ð,Ð,à&�ð Ñ"Ø%Ð&6Ô7ˆNà"×9Ò9ØØ Ø"Ø KØ$%ð :ñ ô ˆOð &*×%@Ò%@Ø"Ø Ø#Ø :ð	 &Añ &ô &Ð"ð Ð*Ð/EÐ/MØ)-×)JÒ)JÈ?Ñ)[Ô)[Ð&ð Ð*Ø!%×!<Ò!<¸_Ñ!MÔ!MÈbÈqÈbÔ!Q�Ø%Ð1Ø(,×(CÒ(CÐDZÑ([Ô([Ð\^Ð]^Ð\^Ô(_Ð%ð Ð*Ð/EÐ/QØ!Ð%:Ò:Ð:Ý$Ø{ñô ð ð
 Ð*Ø#×4Ò4°_ÀnÐXYÐWZÑFZÑ[Ô[�Ý#œl¨<½u¼}ÐMÑMÔM�Ø×2Ò2Ø ÀÐX\ð 3ñ ô ð õ 1°Ñ=Ô=�Ø—’ °Ð <Ñ=Ô=Ð=à%Ð1Ø&*×&;Ò&;Ð<RÐTiÑ&jÔ&jÐ#Ý%*¤\Ð2EÍUÌ[Ð%YÑ%YÔ%YÐ"Ø—’Ð!5Ð7IÐ JÑKÔKÐKàˆr#   FÚcoordsútorch.Tensorc                 óì   — |\  }}t          |¦  «                             ¦   «         }|r|                     ddd¦  «        }|d         |z  |d<   |d         |z  |d<   |r|                     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   r3   ).r   ).é   rY   )r   ÚfloatÚreshape)rH   r|   Úoriginal_sizer`   Úold_hÚold_ws         r!   Ú_normalize_coordinatesz$Sam3Processor._normalize_coordinatesÒ   s‡   € ð %‰ˆˆuÝ˜&Ñ!Ô!×'Ò'Ñ)Ô)ˆàð 	.Ø—^’^ B¨¨1Ñ-Ô-ˆFØ œ¨%Ñ/ˆˆv‰Ø œ¨%Ñ/ˆˆv‰àð 	+Ø—^’^ B¨Ñ*Ô*ˆFàˆr#   c                 ó   — d„ |D ¦   «         S )z[Generate default box labels: `point_pad_value` for None (padded) entries, 1 for real boxes.c                 ó<   — g | ]}|€d ndgt          |¦  «        z  ‘ŒS ©Nr   )Úlen)Ú.0Úimage_boxess     r!   ú
<listcomp>z>Sam3Processor._generate_default_box_labels.<locals>.<listcomp>ï   s0   € ÐkÐkÐkÈK˜Ð+��°!°µs¸;Ñ7GÔ7GÑ1GÐkÐkÐkr#   © )rH   rs   s     r!   rj   z*Sam3Processor._generate_default_box_labelsí   s   € àkÐkÐ[jÐkÑkÔkÐkr#   r   c                 ó„  ‡ ‡‡— |€dS t          |t          j        ¦  «        rW‰‰dz
  k    st          |j        ¦  «        dk    r&|                     ¦   «                              ¦   «         S ˆˆˆ fd„|D ¦   «         S t          |t          j        ¦  «        rE‰‰dz
  k    st          |j        ¦  «        dk    r|                     ¦   «         S ˆˆˆ fd„|D ¦   «         S t          |t          ¦  «        r‰‰k    r|S ˆˆˆ fd„|D ¦   «         S t          |t          t          f¦  «        r|S t          dt          |¦  «        › �¦  «        ‚)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)
        Nr3   c                 óD   •— g | ]}‰                      |‰‰d z   ¦  «        ‘ŒS ©r   ©Ú_convert_to_nested_list©rŠ   ÚitemÚcurrent_depthrZ   rH   s     €€€r!   rŒ   z9Sam3Processor._convert_to_nested_list.<locals>.<listcomp>  ó2   ø€ ÐoÐoÐoÐbf˜×4Ò4°T¸>È=Ð[\ÑK\Ñ]Ô]ÐoÐoÐor#   c                 óD   •— g | ]}‰                      |‰‰d z   ¦  «        ‘ŒS r�   r‘   r“   s     €€€r!   rŒ   z9Sam3Processor._convert_to_nested_list.<locals>.<listcomp>  r–   r#   c                 óL   •— g | ] }|�‰                      |‰‰dz   ¦  «        nd ‘Œ!S rˆ   r‘   r“   s     €€€r!   rŒ   z9Sam3Processor._convert_to_nested_list.<locals>.<listcomp>  sN   ø€ ð ð ð àð ^bÐ]m�D×0Ò0°°~À}ÐWXÑGXÑYÔYÐYÐswðð ð r#   zUnsupported data type: )rb   r   rc   r‰   ÚshapeÚnumpyre   ÚnpÚndarrayÚlistÚintr€   rf   Útype)rH   ÚdatarZ   r•   s   ` ``r!   r’   z%Sam3Processor._convert_to_nested_listñ   s~  øøø€ ð ˆ<Ø�4õ �d�EœLÑ)Ô)ð 	EØ °Ñ 2Ò2Ð2µc¸$¼*±o´oÈÒ6JÐ6JØ—z’z‘|”|×*Ò*Ñ,Ô,Ð,àoÐoÐoÐoÐoÐoÐjnÐoÑoÔoÐoÝ˜�bœjÑ)Ô)ð 	EØ °Ñ 2Ò2Ð2µc¸$¼*±o´oÈÒ6JÐ6JØ—{’{‘}”}Ð$àoÐoÐoÐoÐoÐoÐjnÐoÑoÔoÐoÝ˜�dÑ#Ô#ð 	EØ Ò.Ð.à�ðð ð ð ð ð à $ðñ ô ð õ ˜�s¥E˜lÑ+Ô+ð 	EØˆKåÐCµt¸D±z´zÐCÐCÑDÔDÐDr#   c                 ó`  — |€|rdndS t          |t          t          f¦  «        s|S t          |¦  «        }|rPt          |¦  «        t          |¦  «        k    r0t	          dt          |¦  «        › dt          |¦  «        › d�¦  «        ‚t          |¦  «        D ]\  }}|€|r||         �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.)rb   r�   Útupler‰   rf   Ú	enumerate)rH   rM   rO   ÚiÚ
text_values        r!   rg   z#Sam3Processor._resolve_text_prompts  sè   € ð
 ˆ<Ø*Ð4�8�8°Ð4å˜$¥¥u Ñ.Ô.ð 	ØˆKõ �D‰zŒzˆàð 	�3˜t™9œ9­¨KÑ(8Ô(8Ò8Ð8ÝðTÝ˜4‘y”yðTð TÝ47¸Ñ4DÔ4DðTð Tð Tñô ð õ ' t™_œ_ð 	#ð 	#‰MˆAˆzØÐ! kÐ!°kÀ!´nÐ6PØ"��Q‘øàˆr#   c                 ó>  — |€g }t          |t          ¦  «        s|S t          |¦  «        dk    r#|                     t          |¦  «        ¦  «         n&t	          |d         t          |¦  «        ¦  «        |d<   t          |¦  «        dk    r’|D ]�}|€Œt          |t          ¦  «        ru|                      |¦  «        }t          |¦  «        D ]P\  }}|dz   t          |¦  «        k    r|                     |¦  «         Œ1t	          ||dz            |¦  «        ||dz   <   ŒQŒ�|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.
        Nr   r   )rb   r�   r‰   ÚappendÚmaxrk   r¤   )rH   Únested_listÚmax_dimsr”   Úsub_dimsr¥   r   s          r!   rk   z$Sam3Processor._get_nested_dimensions6  s3  € ð ÐØˆHå˜+¥tÑ,Ô,ð 	ØˆOåˆx‰=Œ=˜AÒÐØ�OŠO�C Ñ,Ô,Ñ-Ô-Ð-Ð-å˜h qœk­3¨{Ñ+;Ô+;Ñ<Ô<ˆH�Q‰Kåˆ{ÑÔ˜aÒÐØ#ð Hð H�à�<ØÝ˜d¥DÑ)Ô)ð HØ#×:Ò:¸4Ñ@Ô@�Hå"+¨HÑ"5Ô"5ð Hð H™˜˜3Ø˜q™5¥C¨¡M¤MÒ1Ð1Ø$ŸOšO¨CÑ0Ô0Ð0Ð0å.1°(¸1¸q¹5´/À3Ñ.GÔ.G˜H Q¨¡U™O˜Oøàˆr#   c                 óò  ‡	— |€| j         }|t          |¦  «        k    r|S t          |t          ¦  «        s|g}t          |¦  «        }||         }|t          |¦  «        dz
  k    r|                     |g||z
  z  ¦  «         nÒ|dk    r{|t          |¦  «        dz
  k     r$||dz   d…         }|                      ||¦  «        Š	n|g||dz            z  Š	|                     ˆ	fd„t          ||z
  ¦  «        D ¦   «         ¦  «         nQ||dz   d…         }|                      ||¦  «        Š	|                     ˆ	fd„t          |¦  «        D ¦   «         ¦  «         |t          |¦  «        dz
  k     r�t          t          |¦  «        ¦  «        D ]p}||         €'||dz   d…         }|                      ||¦  «        ||<   Œ1t          ||         t          ¦  «        r$|                      ||         ||dz   |¦  «        ||<   Œq|S )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   r3   c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS r�   r   ©rŠ   Ú_Útemplates     €r!   rŒ   z2Sam3Processor._pad_nested_list.<locals>.<listcomp>�  s!   ø€ Ð#bÐ#bÐ#b¸1¥H¨XÑ$6Ô$6Ð#bÐ#bÐ#br#   c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS r�   r   r¯   s     €r!   rŒ   z2Sam3Processor._pad_nested_list.<locals>.<listcomp>’  s!   ø€ Ð#SÐ#SÐ#S¸1¥H¨XÑ$6Ô$6Ð#SÐ#SÐ#Sr#   )rA   r‰   rb   r�   ÚextendÚ_create_empty_nested_structureÚrangerl   )
rH   rª   Útarget_dimsÚcurrent_levelÚ	pad_valueÚcurrent_sizer@   Útemplate_dimsr¥   r±   s
            @r!   rl   zSam3Processor._pad_nested_list^  s[  ø€ ð" ÐØÔ,ˆIà�C Ñ,Ô,Ò,Ð,ØÐõ ˜+¥tÑ,Ô,ð 	(Ø&˜-ˆKõ ˜;Ñ'Ô'ˆØ! -Ô0ˆð �C Ñ,Ô,¨qÑ0Ò0Ð0à×Ò 	˜{¨k¸LÑ.HÑIÑJÔJÐJÐJð ˜aÒÐà ¥3 {Ñ#3Ô#3°aÑ#7Ò7Ð7à$/°ÀÑ0AÐ0CÐ0CÔ$D�MØ#×BÒBÀ=ÐR[Ñ\Ô\�H�Hð !*˜{¨[¸ÈÑ9JÔ-KÑK�Hà×"Ò"Ð#bÐ#bÐ#bÐ#bÅÀkÐT`ÑF`Ñ@aÔ@aÐ#bÑ#bÔ#bÑcÔcÐcÐcð !,¨M¸AÑ,=Ð,?Ð,?Ô @�Ø×>Ò>¸}ÈiÑXÔX�Ø×"Ò"Ð#SÐ#SÐ#SÐ#SÅÀkÑ@RÔ@RÐ#SÑ#SÔ#SÑTÔTÐTð �3˜{Ñ+Ô+¨aÑ/Ò/Ð/Ý�3˜{Ñ+Ô+Ñ,Ô,ð vð v�Ø˜q”>Ð)à$/°ÀÑ0AÐ0CÐ0CÔ$D�MØ%)×%HÒ%HÈÐXaÑ%bÔ%b�K ‘N�NÝ ¨A¤µÑ5Ô5ð vØ%)×%:Ò%:¸;Àq¼>È;ÐXeÐhiÑXiÐktÑ%uÔ%u�K ‘NøàÐr#   c                 óŒ   ‡ ‡‡— t          ‰¦  «        dk    r‰g‰d         z  S ˆˆˆ fd„t          ‰d         ¦  «        D ¦   «         S )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   c                 óL   •— g | ] }‰                      ‰d d…         ‰¦  «        ‘Œ!S )r   N)r´   )rŠ   r°   Údimsr¸   rH   s     €€€r!   rŒ   z@Sam3Processor._create_empty_nested_structure.<locals>.<listcomp>­  s2   ø€ ÐeÐeÐeÐQR�D×7Ò7¸¸Q¸R¸R¼À)ÑLÔLÐeÐeÐer#   )r‰   rµ   )rH   r½   r¸   s   ```r!   r´   z,Sam3Processor._create_empty_nested_structure   sW   øøø€ õ ˆt‰9Œ9˜Š>ˆ>Ø�;  a¤Ñ(Ð(àeÐeÐeÐeÐeÐeÕV[Ð\`ÐabÔ\cÑVdÔVdÐeÑeÔeÐer#   c                 ó  — t          |t          ¦  «        r8t          |¦  «        dk    rdS |D ]}|�d|                      |¦  «        z   c S ŒdS t          |t          j        t          j        f¦  «        rt          |j        ¦  «        S dS )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   )	rb   r�   r‰   Ú_get_nesting_levelr›   rœ   r   rc   r™   )rH   Ú
input_listr”   s      r!   r¿   z Sam3Processor._get_nesting_level¯  s�   € õ �j¥$Ñ'Ô'ð 	)Ý�:‰Œ !Ò#Ð#Ø�qà"ð =ð =�ØÐ#Ø˜t×6Ò6°tÑ<Ô<Ñ<Ð<Ð<Ð<ð $ð �1Ý˜
¥R¤Zµ´Ð$>Ñ?Ô?ð 	)å�zÔ'Ñ(Ô(Ð(Øˆqr#   r    rZ   r[   r\   r]   c                 ó  — |€dS t          |t          j        t          j        f¦  «        ry|j        |k    r!t          d|› d|› d|› d|j        › d�	¦  «        ‚|�5|j        d         |k    r$t          d|› d|› d|j        d         › d	�¦  «        ‚|                      ||¦  «        S t          |t          ¦  «        rM|  
                    |¦  «        }||k    rt          d|› d
|› d|› d|› d�	¦  «        ‚|                      ||¦  «        S dS )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.)rb   r   rc   r›   rœ   Úndimrf   r™   r’   r�   r¿   )rH   r    rZ   r[   r\   r]   r•   s          r!   ri   z$Sam3Processor._validate_single_inputÅ  sè  € ð0 ˆ<Ø�4õ �d�Uœ\­2¬:Ð6Ñ7Ô7ð 	FàŒy˜NÒ*Ð*Ý ð q˜Zð  qð  qÀnð  qð  qð  CRð  qð  qð  Z^ô  Zcð  qð  qð  qñô ð ð %Ð0Ø”:˜b”>Ð%8Ò8Ð8Ý$ð M ð  Mð  MÐJ]ð  Mð  MÐ{ô  |Fð  GIô  |Jð  Mð  Mð  Mñô ð ð ×/Ò/°°nÑEÔEÐEõ �d�DÑ!Ô!ð 	FØ ×3Ò3°DÑ9Ô9ˆMØ Ò.Ð.Ý ð l˜Zð  lð  lÀ^ð  lð  lð  ~Mð  lð  lð  Ubð  lð  lð  lñô ð ð ×/Ò/°°nÑEÔEÐEð	Fð 	Fr#   c                 óÀ  — |r"|| j         k    }|                     dd¬¦  «        }t          t          |¦  «        ¦  «        D ]œ}||j        d         k     r‰|t          |¦  «        k     r||         n|d         }|                      ||         ||¬¦  «        }	|rA||         }
t          j        |
                     ||         ¦  «        |	||         ¦  «        ||<   Œ—|	||<   Œ�dS )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)	rA   Úallrµ   r‰   r™   r…   r   ÚwhereÚ	expand_as)rH   rm   rQ   r`   ra   ÚmaskÚ
coord_maskÚimg_idxr‚   Únormalized_coordsÚimg_masks              r!   ro   z+Sam3Processor._normalize_tensor_coordinates÷  s  € ð ð 	8à˜TÔ1Ò1ˆDØŸš b°$˜Ñ7Ô7ˆJå�S Ñ0Ô0Ñ1Ô1ð 	8ð 	8ˆGØ˜œ aœÒ(Ð(Ø;BÅSÈÑEXÔEXÒ;XÐ;X ¨wÔ 7Ð 7Ð^lÐmnÔ^o�Ø$(×$?Ò$?Ø˜7”O ]ÀOð %@ñ %ô %Ð!ð $ð 8à)¨'Ô2�HÝ&+¤kØ ×*Ò*¨6°'¬?Ñ;Ô;Ð=NÐPVÐW^ÔP_ñ'ô '�F˜7‘O�Oð '8�F˜7‘Oøð	8ð 	8r#   r   c                 ó>   — | 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)rF   Ú"post_process_semantic_segmentation)rH   ÚoutputsrÏ   rÐ   rÑ   s        r!   rÒ   z0Sam3Processor.post_process_semantic_segmentation  s1   € ð, Ô#×FÒFØØ%ØØ'Að	 Gñ 
ô 
ð 	
r#   ç333333Ó?c                 ó:   — | 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"]
        ```
        )rF   Úpost_process_object_detection)rH   rÓ   rÐ   rÏ   s       r!   rÖ   z+Sam3Processor.post_process_object_detection7  s!   € ðV Ô#×AÒAÀ'È9ÐVbÑcÔcÐcr#   c                 ó<   — | 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"]
        ```
        )rF   Ú"post_process_instance_segmentation)rH   rÓ   rÐ   Úmask_thresholdrÏ   s        r!   rØ   z0Sam3Processor.post_process_instance_segmentationd  s)   € ðr Ô#×FÒFØ�Y °ñ
ô 
ð 	
r#   )Nr?   )NNNNNNN)F)r|   r}   rS   r}   )r   )N)r   N)FF)Nr   F)rÔ   N)rÔ   r   N)!Ú__name__Ú
__module__Ú__qualname__rž   rE   r   r   r
   r	   r�   r€   r   rc   Ústrr   r   r{   r…   rj   r’   rg   rk   rl   r´   r¿   r›   rœ   ri   ro   rÒ   rÖ   rØ   Ú__classcell__)rK   s   @r!   r>   r>   U   sú  ø€ € € € € ð beðkð kØ7:¸T±zðkØ[^ðkð kð kð kð kð kð ð %)ØaeØ/3ØEIØJNØBFØ26ðjð jà˜TÑ!ðjð Ð+Ñ+¨d°9¬oÑ=ÀÐEVÔ@WÑWÐZ^Ñ^ðjð &¨Ñ,ð	jð
 ˜$˜t Eœ{Ô+Ô,¨u¬|Ñ;¸dÑBðjð !  d¨3¤i¤Ô1°E´LÑ@À4ÑGðjð ˜T %œ[Ô)¨E¬LÑ8¸4Ñ?ðjð ˜jÑ(¨4Ñ/ðjð 
ðjð jð jñ „^ðjðXð ð ð ð ð6lð lð lð(Eð (Eð (Eð (EðTð ð ð6&ð &ð &ð &ðP@ð @ð @ð @ðDfð fð fðð ð ð8 +/ð0Fð 0FàŒl˜RœZÑ'¨$Ñ.ð0Fð ð0Fð ð	0Fð
 ð0Fð ! 4™Zð0Fð 
ð0Fð 0Fð 0Fð 0Fðd!8ð !8ð !8ð !8ðH UZð
ð 
ð 
ð 
ð:+dð +dð +dð +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-   r1   r8   r;   r>   Ú__all__r�   r#   r!   ú<module>ré      s£  ððð ð Ð Ð Ð Ð Ð à Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %Ø .Ð .Ð .Ð .Ð .Ð .Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ *Ð *Ð *Ð *Ð *Ð *ð 
ˆÔ	˜HÑ	%Ô	%€àÐÑÔð Ø€L€L€Lð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð!ð !ð !ð 
€�:ÐÑÔØðH	
ð H	
ð H	
ð H	
ð H	
�Nñ H	
ô H	
ñ „ñ ÔðH	
ðV Ð
€€€r#   