§
    ‚Štj‹W  ã                   óø   — 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
 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 ed
¬¦  «        e G d„ de¦  «        ¦   «         ¦   «         ZdgZdS )z
Processor class for SAM2.
é    ©ÚdeepcopyNé   )Ú
ImageInput)ÚProcessorMixin)ÚBatchEncoding)Ú
TensorTypeÚauto_docstringÚis_torch_availableÚlogging)Úrequires)Útorch)Úbackendsc                   ó.  ‡ — e Zd Zd$dedz  defˆ fd„Ze	 	 	 	 	 	 	 d%dedz  dedz  deeeee                                    e	j
        z  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eddddfd„Zd'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ed#„ ¦   «         Zˆ xZS ),ÚSam2ProcessorNéöÿÿÿÚtarget_sizeÚpoint_pad_valuec                 ó€   •—  t          ¦   «         j        |fi |¤Ž || _        |�|n| j        j        d         | _        dS )aÆ  
        target_size (`int`, *optional*):
            The target size (in pixels) for normalizing input points and bounding boxes. If not provided, defaults
            to the image processor's size configuration. All input coordinates (points and boxes) are normalized
            to this size before being passed to the model. This ensures consistent coordinate representation
            regardless of the original image dimensions.
        point_pad_value (`int`, *optional*, defaults to -10):
            The value used for padding input points when batching sequences of different lengths. This value is
            used to mark padded positions and is preserved during coordinate normalization.
        NÚheight)ÚsuperÚ__init__r   Úimage_processorÚsizer   )Úselfr   r   r   ÚkwargsÚ	__class__s        €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/sam2/processing_sam2.pyr   zSam2Processor.__init__&   sO   ø€ ð 	�‰ŒÔ˜Ð3Ð3¨FÐ3Ð3Ð3Ø.ˆÔØ*5Ð*A˜;˜;ÀtÔG[ÔG`ÐaiÔGjˆÔÐÐó    ÚimagesÚsegmentation_mapsÚinput_pointsÚinput_labelsÚinput_boxesÚoriginal_sizesÚreturn_tensorsÚreturnc                 óº  ‡— |� | j         |f||dœ|¤Ž}	ne|�Tt          |t          j        ¦  «        r&|                     ¦   «                              ¦   «         }t          d|i|¬¦  «        }	nt          d¦  «        ‚|	d         }|�Bt          |¦  «        dk    r/t          |¦  «        t          |¦  «        k    rt          d¦  «        ‚|€|€|��|  	                    |dd	d
d¬¦  «        }
|  	                    |ddd¬¦  «        }|  	                    |dddd¬¦  «        }|
�|  
                    |
¦  «        dd…         }|�|  
                    |¦  «        dd…         }|�|  
                    |¦  «        dd…         Š|
�|�||k    rt          d¦  «        ‚|�=t          |¦  «        dk    r*t          ˆfd„|D ¦   «         ¦  «        rt          d¦  «        ‚|
�i|                      |
|dgz   ¦  «        }t          j        |t          j        ¬¦  «        }|                      ||d¬¦  «         |	                     d|i¦  «         |�M|                      ||¦  «        }t          j        |t          j        ¬¦  «        }|	                     d|i¦  «         |�Ot          j        |t          j        ¬¦  «        }|                      ||d¬¦  «         |	                     d|i¦  «         |	S )as  
        segmentation_maps (`ImageInput`, *optional*):
            The segmentation maps to process.
        input_points (`list[list[list[list[float]]]]`, `torch.Tensor`, *optional*):
            The points to add to the frame.
        input_labels (`list[list[list[int]]]`, `torch.Tensor`, *optional*):
            The labels for the points.
        input_boxes (`list[list[list[float]]]`, `torch.Tensor`, *optional*):
            The bounding boxes to add to the frame.
        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_points` (`torch.Tensor`): The processed points.
            - `input_labels` (`torch.Tensor`): The processed labels.
            - `input_boxes` (`torch.Tensor`): The processed bounding boxes.
        N)r!   r&   r%   )Útensor_typez0Either images or original_sizes must be providedé   z{original_sizes must be of length 1 or len(images). If you are passing a single image, you must pass a single original_size.é   Úpointsz;[image level, object level, point level, point coordinates]é   )Úexpected_depthÚ
input_nameÚexpected_formatÚexpected_coord_sizer   Úlabelsz([image level, object level, point level])r.   r/   r0   Úboxesz)[image level, box level, box coordinates]zbInput points and labels have inconsistent dimensions. Please ensure they have the same dimensions.c              3   óJ   •K  — | ]}t          |¦  «        ‰d          k     V — ŒdS ©r*   N)Úlen)Ú.0Ú	img_boxesÚboxes_max_dimss     €r   ú	<genexpr>z)Sam2Processor.__call__.<locals>.<genexpr>•   s3   øè è € Ð[Ð[¸i•s˜9‘~”~¨°qÔ(9Ò9Ð[Ð[Ð[Ð[Ð[Ð[r   z±Input boxes have inconsistent dimensions that would require padding, but boxes cannot be padded due to model limitations. Please ensure all images have the same number of boxes.)ÚdtypeT)Úpreserve_paddingr"   r#   ©Úis_bounding_boxr$   )r   Ú
isinstancer   ÚTensorÚcpuÚtolistr   Ú
ValueErrorr6   Ú_validate_single_inputÚ_get_nested_dimensionsÚanyÚ_pad_nested_listÚtensorÚfloat32Ú_normalize_tensor_coordinatesÚupdateÚint64)r   r    r!   r"   r#   r$   r%   r&   r   Úencoding_image_processorÚprocessed_pointsÚprocessed_labelsÚprocessed_boxesÚpoints_max_dimsÚlabels_max_dimsÚpadded_pointsÚfinal_pointsÚpadded_labelsÚfinal_labelsÚfinal_boxesr9   s                       @r   Ú__call__zSam2Processor.__call__5   s˜  ø€ ðB ÐØ'; tÔ';Øð(à"3Ø-ð(ð (ð ð	(ð (Ð$Ð$ð Ð'Ý˜.­%¬,Ñ7Ô7ð ?Ø!/×!3Ò!3Ñ!5Ô!5×!<Ò!<Ñ!>Ô!>�Ý'4Ð6FÈÐ5WÐesÐ'tÑ'tÔ'tÐ$Ð$åÐOÑPÔPÐPð 2Ð2BÔCˆàÐ¥# nÑ"5Ô"5¸Ò":Ð":½sÀ>Ñ?RÔ?RÕVYÐZ`ÑVaÔVaÒ?aÐ?aÝð Nñô ð ð
 Ð# |Ð'?À;ÑCZà#×:Ò:ØØ Ø#Ø ]Ø$%ð  ;ñ  ô  Ðð  $×:Ò:ØØ Ø#Ø Jð	  ;ñ  ô  Ðð #×9Ò9ØØ Ø"Ø KØ$%ð :ñ ô ˆOð  Ð+Ø"&×"=Ò"=Ð>NÑ"OÔ"OÐPRÐQRÐPRÔ"S�ØÐ+Ø"&×"=Ò"=Ð>NÑ"OÔ"OÐPRÐQRÐPRÔ"S�ØÐ*Ø!%×!<Ò!<¸_Ñ!MÔ!MÈbÈqÈbÔ!Q�ð  Ð+Ð0@Ð0LØ" oÒ5Ð5Ý$Ø|ñô ð ð
 Ð*­s°?Ñ/CÔ/CÀqÒ/HÐ/HÝÐ[Ð[Ð[Ð[È?Ð[Ñ[Ô[Ñ[Ô[ð Ý$ðRñô ð ð  Ð+Ø $× 5Ò 5Ð6FÈÐ[\ÐZ]ÑH]Ñ ^Ô ^�Ý$œ|¨MÅÄÐOÑOÔO�Ø×2Ò2°<ÀÐbfÐ2ÑgÔgÐgØ(×/Ò/°ÀÐ0NÑOÔOÐOàÐ+Ø $× 5Ò 5Ð6FÈÑ XÔ X�Ý$œ|¨MÅÄÐMÑMÔM�Ø(×/Ò/°ÀÐ0NÑOÔOÐOàÐ*Ý#œl¨?Å%Ä-ÐPÑPÔP�Ø×2Ò2°;ÀÐ`dÐ2ÑeÔeÐeØ(×/Ò/°ÀÐ0LÑMÔMÐMà'Ð'r   FÚcoordsztorch.Tensorc                 ó   — |\  }}||}}t          |¦  «                             ¦   «         }|r|                     ddd¦  «        }|d         ||z  z  |d<   |d         ||z  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-   ).r   ).r*   r+   )r   ÚfloatÚreshape)	r   r   rY   Úoriginal_sizer>   Úold_hÚold_wÚnew_hÚnew_ws	            r   Ú_normalize_coordinatesz$Sam2Processor._normalize_coordinates¯   s˜   € ð  %‰ˆˆuØ" KˆuˆÝ˜&Ñ!Ô!×'Ò'Ñ)Ô)ˆàð 	.Ø—^’^ B¨¨1Ñ-Ô-ˆFØ œ¨5°5©=Ñ9ˆˆv‰Ø œ¨5°5©=Ñ9ˆˆv‰àð 	+Ø—^’^ B¨Ñ*Ô*ˆFàˆr   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          |¦  «        › �¦  «        ‚)aS  
        Recursively convert various input formats (tensors, numpy arrays, lists) to nested lists.

        Args:
            data: Input data in any format
            expected_depth: Expected nesting depth
            current_depth: Current depth in recursion

        Returns:
            Nested list representation of the data
        Nr-   c                 óD   •— g | ]}‰                      |‰‰d z   ¦  «        ‘ŒS ©r*   ©Ú_convert_to_nested_list©r7   ÚitemÚcurrent_depthr.   r   s     €€€r   ú
<listcomp>z9Sam2Processor._convert_to_nested_list.<locals>.<listcomp>á   ó2   ø€ ÐoÐoÐoÐbf˜×4Ò4°T¸>È=Ð[\ÑK\Ñ]Ô]ÐoÐoÐor   c                 óD   •— g | ]}‰                      |‰‰d z   ¦  «        ‘ŒS rf   rg   ri   s     €€€r   rl   z9Sam2Processor._convert_to_nested_list.<locals>.<listcomp>æ   rm   r   c                 óD   •— g | ]}‰                      |‰‰d z   ¦  «        ‘ŒS rf   rg   ri   s     €€€r   rl   z9Sam2Processor._convert_to_nested_list.<locals>.<listcomp>í   rm   r   zUnsupported data type: )r?   r   r@   r6   ÚshapeÚnumpyrB   ÚnpÚndarrayÚlistÚintr\   Ú	TypeErrorÚtype)r   Údatar.   rk   s   ` ``r   rh   z%Sam2Processor._convert_to_nested_listÍ   sk  øøø€ ð ˆ<Ø�4õ �d�EœLÑ)Ô)ð 	DØ °Ñ 2Ò2Ð2µc¸$¼*±o´oÈÒ6JÐ6JØ—z’z‘|”|×*Ò*Ñ,Ô,Ð,àoÐoÐoÐoÐoÐoÐjnÐoÑoÔoÐoÝ˜�bœjÑ)Ô)ð 	DØ °Ñ 2Ò2Ð2µc¸$¼*±o´oÈÒ6JÐ6JØ—{’{‘}”}Ð$àoÐoÐoÐoÐoÐoÐjnÐoÑoÔoÐoÝ˜�dÑ#Ô#ð 
	DØ Ò.Ð.à�ð pÐoÐoÐoÐoÐoÐjnÐoÑoÔoÐoÝ˜�s¥E˜lÑ+Ô+ð 	DØˆKåÐBµd¸4±j´jÐBÐBÑCÔCÐCr   c                 ó8  — |€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.

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

        Returns:
            `list`: A list of maximum dimensions for each nesting level.
        Nr   r*   )r?   rt   r6   ÚappendÚmaxrE   Ú	enumerate)r   Únested_listÚmax_dimsrj   Úsub_dimsÚiÚdims          r   rE   z$Sam2Processor._get_nested_dimensionsó   s+  € ð ÐØˆ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 ]A}t          ||         t          ¦  «        r$|                      ||         ||dz   |¦  «        ||<   ŒB|S )aì  
        Recursively pad a nested list to match target dimensions.

        Args:
            nested_list (`list`):
                Nested list to pad.
            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   r-   c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS © r   ©r7   Ú_Útemplates     €r   rl   z2Sam2Processor._pad_nested_list.<locals>.<listcomp>G  s!   ø€ Ð#bÐ#bÐ#b¸1¥H¨XÑ$6Ô$6Ð#bÐ#bÐ#br   c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS r„   r   r…   s     €r   rl   z2Sam2Processor._pad_nested_list.<locals>.<listcomp>L  s!   ø€ Ð#SÐ#SÐ#S¸1¥H¨XÑ$6Ô$6Ð#SÐ#SÐ#Sr   )r   r6   r?   rt   ÚextendÚ_create_empty_nested_structureÚrangerG   )
r   r}   Útarget_dimsÚcurrent_levelÚ	pad_valueÚcurrent_sizer   Útemplate_dimsr€   r‡   s
            @r   rG   zSam2Processor._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�Ý˜k¨!œn­dÑ3Ô3ð 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 r5   )rŠ   )r7   r†   ÚdimsrŽ   r   s     €€€r   rl   z@Sam2Processor._create_empty_nested_structure.<locals>.<listcomp>c  s2   ø€ ÐeÐeÐeÐQR�D×7Ò7¸¸Q¸R¸R¼À)ÑLÔLÐeÐeÐer   )r6   r‹   )r   r“   rŽ   s   ```r   rŠ   z,Sam2Processor._create_empty_nested_structureV  sW   øøø€ õ ˆt‰9Œ9˜Š>ˆ>Ø�;  a¤Ñ(Ð(àeÐeÐeÐeÐeÐeÕV[Ð\`ÐabÔ\cÑVdÔVdÐeÑeÔeÐer   c                 ó
  — t          |t          ¦  «        r3t          |¦  «        dk    rdS d|                      |d         ¦  «        z   S t          |t          j        t          j        f¦  «        rt          |j        ¦  «        S dS )z¢
        Get the nesting level of a list structure.

        Args:
            input_list (`list`):
                The list to get the nesting level of.
        r   r*   )	r?   rt   r6   Ú_get_nesting_levelrr   rs   r   r@   rp   )r   Ú
input_lists     r   r•   z Sam2Processor._get_nesting_levele  sz   € õ �j¥$Ñ'Ô'ð 	)Ý�:‰Œ !Ò#Ð#Ø�qØ�t×.Ò.¨z¸!¬}Ñ=Ô=Ñ=Ð=Ý˜
¥R¤Zµ´Ð$>Ñ?Ô?ð 	)å�zÔ'Ñ(Ô(Ð(Øˆqr   rx   r.   r/   r0   r1   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 (2 for points, 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   r@   rr   rs   ÚndimrC   rp   rh   rt   r•   )r   rx   r.   r/   r0   r1   rk   s          r   rD   z$Sam2Processor._validate_single_inputv  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         }|                      | j        ||         ||¬¦  «        }	|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 points).
        r[   T)r�   Úkeepdimr   r=   N)
r   Úallr‹   r6   rp   rc   r   r   ÚwhereÚ	expand_as)r   rH   r%   r>   r<   ÚmaskÚ
coord_maskÚimg_idxr^   Únormalized_coordsÚimg_masks              r   rJ   z+Sam2Processor._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�Ø$(×$?Ò$?ØÔ$ f¨W¤o°}ÐVeð %@ñ %ô %Ð!ð $ð 8à)¨'Ô2�HÝ&+¤kØ ×*Ò*¨6°'¬?Ñ;Ô;Ð=NÐPVÐW^ÔP_ñ'ô '�F˜7‘O�Oð '8�F˜7‘Oøð	8ð 	8r   ç        Tc           	      ó4   —  | j         j        |||||||fi |¤ŽS )a-  
        Remove padding and upscale masks to the original image size.

        Args:
            masks (`Union[List[torch.Tensor], List[np.ndarray]]`):
                Batched masks from the mask_decoder in (batch_size, num_channels, height, width) format.
            original_sizes (`Union[torch.Tensor, List[Tuple[int,int]]]`):
                The original sizes of each image before it was resized to the model's expected input shape, in (height,
                width) format.
            mask_threshold (`float`, *optional*, defaults to 0.0):
                Threshold for binarization and post-processing operations.
            binarize (`bool`, *optional*, defaults to `True`):
                Whether to binarize the masks.
            max_hole_area (`float`, *optional*, defaults to 0.0):
                The maximum area of a hole to fill.
            max_sprinkle_area (`float`, *optional*, defaults to 0.0):
                The maximum area of a sprinkle to fill.
            apply_non_overlapping_constraints (`bool`, *optional*, defaults to `False`):
                Whether to apply non-overlapping constraints to the masks.

        Returns:
            (`torch.Tensor`): Batched masks in batch_size, num_channels, height, width) format, where (height, width)
            is given by original_size.
        )r   Úpost_process_masks)	r   Úmasksr%   Úmask_thresholdÚbinarizeÚmax_hole_areaÚmax_sprinkle_areaÚ!apply_non_overlapping_constraintsr   s	            r   r¦   z Sam2Processor.post_process_masksË  sC   € ðF 7ˆtÔ#Ô6ØØØØØØØ-ð	
ð 	
ð ð	
ð 	
ð 		
r   c                 ó@   — | j         j        }t          |dgz   ¦  «        S )Nr%   )r   Úmodel_input_namesrt   )r   Úimage_processor_input_namess     r   r®   zSam2Processor.model_input_namesù  s&   € à&*Ô&:Ô&LÐ#ÝÐ/Ð3CÐ2DÑDÑEÔEÐEr   )Nr   )NNNNNNN)F)r   )N)r   N)FF)r¤   Tr¤   r¤   F)Ú__name__Ú
__module__Ú__qualname__ru   r   r
   r   rt   r\   r   r@   Ústrr	   r   rX   rc   rh   rE   rG   rŠ   r•   rr   rs   rD   rJ   r¦   Úpropertyr®   Ú__classcell__)r   s   @r   r   r   #   sà  ø€ € € € € ðkð k°S¸4±Zð kÐY\ð kð kð kð kð kð kð ð %)Ø/3ØLPØDHØEIØBFØ26ðw(ð w(à˜TÑ!ðw(ð &¨Ñ,ðw(ð ˜4  T¨%¤[Ô 1Ô2Ô3°e´lÑBÀTÑIð	w(ð
 ˜4  S¤	œ?Ô+¨e¬lÑ:¸TÑAðw(ð ˜$˜t Eœ{Ô+Ô,¨u¬|Ñ;¸dÑBðw(ð ˜T %œ[Ô)¨E¬LÑ8¸4Ñ?ðw(ð ˜jÑ(¨4Ñ/ðw(ð 
ðw(ð w(ð w(ñ „^ðw(ðt X]ðð ØðØ(6ðà	ðð ð ð ð<$Dð $Dð $Dð $DðL#ð #ð #ð #ðJ<ð <ð <ð <ð|fð fð fðð ð ð. +/ð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ðN ØØØØ*/ð,
ð ,
ð ,
ð ,
ð\ ðFð Fñ „XðFð Fð Fð Fð Fr   r   )Ú__doc__Úcopyr   rq   rr   Úimage_utilsr   Úprocessing_utilsr   Útokenization_utils_baser   Úutilsr	   r
   r   r   Úutils.import_utilsr   Ú
get_loggerr°   Úloggerr   r   Ú__all__r„   r   r   ú<module>rÀ      s6  ððð ð Ð Ð Ð Ð Ð à Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %Ø .Ð .Ð .Ð .Ð .Ð .Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ *Ð *Ð *Ð *Ð *Ð *ð 
ˆÔ	˜HÑ	%Ô	%€àÐÑÔð Ø€L€L€Lð 
€�:ÐÑÔØðWFð WFð WFð WFð WF�Nñ WFô WFñ „ñ ÔðWFðt Ð
€€€r   