Ë
    ÛÓ^jå³  ã                   ó˜  — d dl Z d dlZd dlmZ d dlm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 dd
lmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z&m'Z'm(Z( ee G d„ de«      «       «       Z)ee G d„ de«      «       «       Z*ee G d„ de«      «       «       Z+ G d„ de	jX                  «      Z- G d„ de	jX                  «      Z.	 dHde	jX                  dej^                  dej^                  d ej^                  d!ej^                  dz  d"e0d#e0d$ee   fd%„Z1 G d&„ d'e	jX                  «      Z2 G d(„ d)e	jX                  «      Z3 G d*„ d+e«      Z4 G d,„ d-e«      Z5e G d.„ d/e«      «       Z6 G d0„ d1e	jX                  «      Z7 G d2„ d3e6«      Z8 ed4¬5«       G d6„ d7e6«      «       Z9 ed8¬5«       G d9„ d:e6«      «       Z:d;ej^                  d<ej^                  fd=„Z;d>ej^                  d<ej^                  fd?„Z<d@ej^                  d<ej^                  fdA„Z=e G dB„ dCe6«      «       Z> edD¬5«       G dE„ dFe6«      «       Z?g dG¢Z@y)Ié    N)ÚCallable)Ú	dataclass)ÚAny)Únné   )Úinitialization)ÚACT2FN)Úcreate_causal_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputÚBaseModelOutputWithPooling)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚ	torch_int)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputsé   )ÚCLIPSegConfigÚCLIPSegTextConfigÚCLIPSegVisionConfigc                   ó  — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	ej                  dz  ed<   dZ
ej                  dz  ed<   dZej                  dz  ed<   dZeed<   dZeed	<   d
ee   fd„Zy)ÚCLIPSegOutputaµ  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `return_loss` is `True`):
        Contrastive loss for image-text similarity.
    logits_per_image (`torch.FloatTensor` of shape `(image_batch_size, text_batch_size)`):
        The scaled dot product scores between `image_embeds` and `text_embeds`. This represents the image-text
        similarity scores.
    logits_per_text (`torch.FloatTensor` of shape `(text_batch_size, image_batch_size)`):
        The scaled dot product scores between `text_embeds` and `image_embeds`. This represents the text-image
        similarity scores.
    text_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim`):
        The text embeddings obtained by applying the projection layer to the pooled output of [`CLIPSegTextModel`].
    image_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim`):
        The image embeddings obtained by applying the projection layer to the pooled output of [`CLIPSegVisionModel`].
    text_model_output (`BaseModelOutputWithPooling`):
        The output of the [`CLIPSegTextModel`].
    vision_model_output (`BaseModelOutputWithPooling`):
        The output of the [`CLIPSegVisionModel`].
    NÚlossÚlogits_per_imageÚlogits_per_textÚtext_embedsÚimage_embedsÚtext_model_outputÚvision_model_outputÚreturnc                 óB   — t        d„ | j                  «       D «       «      S )Nc              3   ó`   K  — | ]&  }t        |t        «      r|j                  «       n|–— Œ( y ­w©N©Ú
isinstancer   Úto_tuple©Ú.0Úvs     úw/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/clipseg/modeling_clipseg.pyú	<genexpr>z)CLIPSegOutput.to_tuple.<locals>.<genexpr>J   ó$   è ø€ Ò^È1¤Z°´;Ô%?�Q—Z‘Z”\ÀQÓFÑ^ùó   ‚,.©ÚtupleÚvalues©Úselfs    r/   r+   zCLIPSegOutput.to_tupleI   ó   € ÜÑ^ÐPT×P[ÑP[ÓP]Ô^Ó^Ð^ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r   r    r!   r"   r#   r   r$   r4   r   r+   © r9   r/   r   r   +   s�   … ñð& &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø15Ð�e×'Ñ'¨$Ñ.Ó5Ø04€O�U×&Ñ&¨Ñ-Ó4Ø,0€K�×"Ñ" TÑ)Ó0Ø-1€L�%×#Ñ# dÑ*Ó1Ø48ÐÐ1Ó8Ø6:ÐÐ3Ó:ð_˜% ™*ô _r9   r   c                   óž   — e Zd ZU dZdZej                  dz  ed<   dZe	ej                  df   dz  ed<   dZ
e	ej                  df   dz  ed<   y)ÚCLIPSegDecoderOutputa¡  
    logits (`torch.FloatTensor` of shape `(batch_size, height, width)`):
        Classification scores for each pixel.
    hidden_states (`tuple(torch.FloatTensor)`, *optional*,):
        Hidden-states of the model at the output of each layer plus the optional initial embedding outputs.
        Rreturned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`
    attentions (`tuple(torch.FloatTensor)`, *optional*):
        Attentions weights after the attention softmax, used to compute the weighted average in the self-attention
        heads. Returned when `output_attentions=True` is passed or when `config.output_attentions=True`
    NÚlogits.Úhidden_statesÚ
attentions)r:   r;   r<   r=   rD   r>   r?   r@   rE   r4   rF   rA   r9   r/   rC   rC   M   s\   … ñ	ð (,€FˆE×Ñ Ñ$Ó+Ø:>€M�5˜×*Ñ*¨CÐ/Ñ0°4Ñ7Ó>Ø7;€J��e×'Ñ'¨Ð,Ñ-°Ñ4Ô;r9   rC   c                   óà   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	ej                  dz  ed<   dZ
ej                  dz  ed<   dZeed<   dZeed<   d	ee   fd
„Zy)ÚCLIPSegImageSegmentationOutputaæ  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided):
        Binary cross entropy loss for segmentation.
    logits (`torch.FloatTensor` of shape `(batch_size, height, width)`):
        Classification scores for each pixel.
    conditional_embeddings (`torch.FloatTensor` of shape `(batch_size, projection_dim)`):
        Conditional embeddings used for segmentation.
    pooled_output (`torch.FloatTensor` of shape `(batch_size, embed_dim)`):
        Pooled output of the [`CLIPSegVisionModel`].
    vision_model_output (`BaseModelOutputWithPooling`):
        The output of the [`CLIPSegVisionModel`].
    decoder_output (`CLIPSegDecoderOutput`):
        The output of the [`CLIPSegDecoder`].
    Nr   rD   Úconditional_embeddingsÚpooled_outputr$   Údecoder_outputr%   c                 óB   — t        d„ | j                  «       D «       «      S )Nc              3   ó`   K  — | ]&  }t        |t        «      r|j                  «       n|–— Œ( y ­wr(   r)   r,   s     r/   r0   z:CLIPSegImageSegmentationOutput.to_tuple.<locals>.<genexpr>z   r1   r2   r3   r6   s    r/   r+   z'CLIPSegImageSegmentationOutput.to_tupley   r8   r9   )r:   r;   r<   r=   r   r>   r?   r@   rD   rI   rJ   r$   r   rK   rC   r4   r   r+   rA   r9   r/   rH   rH   `   s‡   … ñð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø7;Ð˜E×-Ñ-°Ñ4Ó;Ø.2€M�5×$Ñ$ tÑ+Ó2Ø6:ÐÐ3Ó:Ø+/€NÐ(Ó/ð_˜% ™*ô _r9   rH   c                   óž   ‡ — e Zd Zdefˆ fd„Zdej                  dededej                  fd„Zd
dej                  dej                  fd	„Z
ˆ xZS )ÚCLIPSegVisionEmbeddingsÚconfigc                 óÚ  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        |j                  | _        t        j                  t        j                  | j                  «      «      | _        t        j                  |j                  | j                  | j                  | j                  d¬«      | _        | j
                  | j                  z  dz  | _        | j                  dz   | _        t        j"                  | j                   | j                  «      | _        | j'                  dt        j(                  | j                   «      j+                  d«      d¬«       y )NF)Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚbiasé   r   Úposition_ids©r   éÿÿÿÿ©Ú
persistent)ÚsuperÚ__init__rP   Úhidden_sizeÚ	embed_dimÚ
image_sizeÚ
patch_sizer   Ú	Parameterr>   ÚrandnÚclass_embeddingÚConv2dÚnum_channelsÚpatch_embeddingÚnum_patchesÚnum_positionsÚ	EmbeddingÚposition_embeddingÚregister_bufferÚarangeÚexpand©r7   rP   Ú	__class__s     €r/   r^   z CLIPSegVisionEmbeddings.__init__~   s	  ø€ Ü‰ÑÔØˆŒØ×+Ñ+ˆŒØ ×+Ñ+ˆŒØ ×+Ñ+ˆŒä!Ÿ|™|¬E¯K©K¸¿¹Ó,GÓHˆÔä!Ÿy™yØ×+Ñ+ØŸ™ØŸ™Ø—?‘?Øô 
ˆÔð !ŸO™O¨t¯©Ñ>À1ÑDˆÔØ!×-Ñ-°Ñ1ˆÔÜ"$§,¡,¨t×/AÑ/AÀ4Ç>Á>Ó"RˆÔØ×Ñ˜^¬U¯\©\¸$×:LÑ:LÓ-M×-TÑ-TÐU\Ó-]ÐjoÐÕpr9   Ú
embeddingsÚheightÚwidthr%   c                 óÒ  — |j                   d   dz
  }| j                  j                  j                  d«      }|j                   d   dz
  }t        j
                  j                  «       s%||k(  r ||k(  r| j                  | j                  «      S |dd…dd…f   }|dd…dd…f   }|j                   d   }	|| j                  z  }
|| j                  z  }t        |dz  «      }|j                  d|||	«      }|j                  dddd«      }t        j                  j                  ||
|fdd	¬
«      }|j                  dddd«      j                  dd|	«      }t	        j                   ||fd¬«      S )a   
        This method allows to interpolate the pre-trained position encodings, to be able to use the model on higher resolution
        images. This method is also adapted to support torch.jit tracing.

        Adapted from:
        - https://github.com/facebookresearch/dino/blob/de9ee3df6cf39fac952ab558447af1fa1365362a/vision_transformer.py#L174-L194, and
        - https://github.com/facebookresearch/dinov2/blob/e1277af2ba9496fbadf7aec6eba56e8d882d1e35/dinov2/models/vision_transformer.py#L179-L211
        r   r   NrZ   ç      à?r   rW   ÚbicubicF)ÚsizeÚmodeÚalign_corners©Údim)Úshaperl   ÚweightÚ	unsqueezer>   ÚjitÚ
is_tracingrX   rb   r   ÚreshapeÚpermuter   Ú
functionalÚinterpolateÚviewÚcat)r7   rr   rs   rt   ri   rl   rj   Úclass_pos_embedÚpatch_pos_embedr|   Ú
new_heightÚ	new_widthÚsqrt_num_positionss                r/   Úinterpolate_pos_encodingz0CLIPSegVisionEmbeddings.interpolate_pos_encoding”   sv  € ð !×&Ñ& qÑ)¨AÑ-ˆØ!×4Ñ4×;Ñ;×EÑEÀaÓHÐØ*×0Ñ0°Ñ3°aÑ7ˆô �y‰y×#Ñ#Ô%¨+¸Ò*FÈ6ÐUZÊ?Ø×*Ñ*¨4×+<Ñ+<Ó=Ð=à,ªQ°°°¨UÑ3ˆØ,ªQ°±¨UÑ3ˆà×Ñ˜rÑ"ˆà˜tŸ™Ñ.ˆ
Ø˜TŸ_™_Ñ,ˆ	ä& }°cÑ'9Ó:ÐØ)×1Ñ1°!Ð5GÐI[Ð]`ÓaˆØ)×1Ñ1°!°Q¸¸1Ó=ˆäŸ-™-×3Ñ3ØØ˜iÐ(ØØð	 4ó 
ˆð *×1Ñ1°!°Q¸¸1Ó=×BÑBÀ1ÀbÈ#ÓNˆä�y‰y˜/¨?Ð;ÀÔCÐCr9   Úpixel_valuesc                 ó`  — |j                   \  }}}}|sJ|| j                  k7  s|| j                  k7  r,t        d|› d|› d| j                  › d| j                  › d�	«      ‚| j                  j                  j
                  }| j                  |j                  |¬«      «      }|j                  d«      j                  dd«      }| j                  j                  |dd«      }	t        j                  |	|gd¬	«      }
|r|
| j                  |
||«      z   }
|
S |
| j                  | j                  «      z   }
|
S )
NzInput image size (Ú*z) doesn't match model (z).)ÚdtyperW   r   rZ   r{   )r}   ra   Ú
ValueErrorrh   r~   r‘   ÚtoÚflattenÚ	transposere   ro   r>   r‡   r�   rl   rX   )r7   rŽ   r�   Ú
batch_sizeÚ_rs   rt   Útarget_dtypeÚpatch_embedsÚclass_embedsrr   s              r/   ÚforwardzCLIPSegVisionEmbeddings.forward½   s6  € Ø'3×'9Ñ'9Ñ$ˆ
�A�v˜uÙ'¨V°t·±Ò-FÈ%ÐSW×SbÑSbÒJbÜØ$ V H¨A¨e¨WÐ4KÈDÏOÉOÐK\Ð\]Ð^b×^mÑ^mÐ]nÐnpÐqóð ð ×+Ñ+×2Ñ2×8Ñ8ˆØ×+Ñ+¨L¯O©OÀ,¨OÓ,OÓPˆØ#×+Ñ+¨AÓ.×8Ñ8¸¸AÓ>ˆà×+Ñ+×2Ñ2°:¸qÀ"ÓEˆÜ—Y‘Y ¨lÐ;ÀÔCˆ
Ù#Ø# d×&CÑ&CÀJÐPVÐX]Ó&^Ñ^ˆJð Ðð $ d×&=Ñ&=¸d×>OÑ>OÓ&PÑPˆJØÐr9   ©T)r:   r;   r<   r   r^   r>   ÚTensorÚintr�   r?   r›   Ú__classcell__©rq   s   @r/   rO   rO   }   se   ø„ ðqÐ2õ qð,'D°5·<±<ð 'DÈð 'DÐUXð 'DÐ]b×]iÑ]ió 'DñR E×$5Ñ$5ð ÐY^×YeÑYe÷ r9   rO   c            	       ó¦   ‡ — e Zd Zdefˆ fd„Z	 	 	 d	dej                  dz  dej                  dz  dej                  dz  dej                  fd„Z	ˆ xZ
S )
ÚCLIPSegTextEmbeddingsrP   c                 óN  •— t         ‰| �  «        |j                  }t        j                  |j
                  |«      | _        t        j                  |j                  |«      | _        | j                  dt        j                  |j                  «      j                  d«      d¬«       y )NrX   rY   Fr[   )r]   r^   r_   r   rk   Ú
vocab_sizeÚtoken_embeddingÚmax_position_embeddingsrl   rm   r>   rn   ro   ©r7   rP   r`   rq   s      €r/   r^   zCLIPSegTextEmbeddings.__init__Ñ   sƒ   ø€ Ü‰ÑÔØ×&Ñ&ˆ	ä!Ÿ|™|¨F×,=Ñ,=¸yÓIˆÔÜ"$§,¡,¨v×/MÑ/MÈyÓ"YˆÔð 	×ÑØœEŸL™L¨×)GÑ)GÓH×OÑOÐPWÓXÐejð 	õ 	
r9   NÚ	input_idsrX   Úinputs_embedsr%   c                 ó8  — |�|j                   d   n|j                   d   }| j                  j                  j                   d   }||kD  rt        d|› d|› �«      ‚|€| j                  d d …d |…f   }|€| j                  |«      }| j                  |«      }||z   }|S )NrZ   éþÿÿÿr   zRSequence length must be less than max_position_embeddings (got `sequence length`: z and max_position_embeddings: )r}   rl   r~   r’   rX   r¥   )r7   r¨   rX   r©   Ú
seq_lengthÚmax_position_embeddingÚposition_embeddingsrr   s           r/   r›   zCLIPSegTextEmbeddings.forwardÝ   sÇ   € ð -6Ð,A�Y—_‘_ RÒ(À}×GZÑGZÐ[]ÑG^ˆ
Ø!%×!8Ñ!8×!?Ñ!?×!EÑ!EÀaÑ!HÐàÐ.Ò.ÜØdØ�,Ð<Ð=SÐ<TðVóð ð
 ÐØ×,Ñ,ªQ°°°¨^Ñ<ˆLàÐ Ø ×0Ñ0°Ó;ˆMà"×5Ñ5°lÓCÐØ"Ð%8Ñ8ˆ
àÐr9   ©NNN)r:   r;   r<   r   r^   r>   Ú
LongTensorr?   r�   r›   rŸ   r    s   @r/   r¢   r¢   Ð   sk   ø„ ð

Ð0õ 

ð .2Ø04Ø26ñ	à×#Ñ# dÑ*ðð ×&Ñ&¨Ñ-ðð ×(Ñ(¨4Ñ/ð	ð
 
�‰÷r9   r¢   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingÚdropoutÚkwargsc                 óÀ  — t        j                  ||j                  dd«      «      |z  }|�||z   }t        j                  j                  |dt         j                  ¬«      j                  |j                  «      }t        j                  j                  ||| j                  ¬«      }t        j                  ||«      }	|	j                  dd«      j                  «       }	|	|fS )NrZ   r«   )r|   r‘   )ÚpÚtrainingr   rW   )r>   Úmatmulr•   r   r„   ÚsoftmaxÚfloat32r“   r‘   r·   r»   Ú
contiguous)
r±   r²   r³   r´   rµ   r¶   r·   r¸   Úattn_weightsÚattn_outputs
             r/   Úeager_attention_forwardrÂ   ø   sº   € ô —<‘<  s§}¡}°R¸Ó'<Ó=ÀÑG€LØÐ!Ø# nÑ4ˆÜ—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÓS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨¸È6Ï?É?Ð(Ó[€Lä—,‘,˜|¨UÓ3€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€KØ˜Ð$Ð$r9   c                   ó¶   ‡ — e Zd ZdZdeez  fˆ fd„Z	 d
dej                  dej                  dz  de	e
   deej                  ej                  dz  f   fd	„Zˆ xZS )ÚCLIPSegAttentionz=Multi-headed attention from 'Attention Is All You Need' paperrP   c                 ó€  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        | j                  | j                  z  | _        | j                  dz  | _        |j                  | _
        d| _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        y )Nç      à¿F)r]   r^   rP   r_   r`   Únum_attention_headsÚ	num_headsÚhead_dimÚscaleÚattention_dropoutr·   Ú	is_causalr   ÚLinearÚk_projÚv_projÚq_projÚout_projrp   s     €r/   r^   zCLIPSegAttention.__init__  sÏ   ø€ Ü‰ÑÔØˆŒØ×+Ñ+ˆŒØ×3Ñ3ˆŒØŸ™¨$¯.©.Ñ8ˆŒØ—]‘] DÑ(ˆŒ
Ø×/Ñ/ˆŒØˆŒä—i‘i §¡°·±Ó?ˆŒÜ—i‘i §¡°·±Ó?ˆŒÜ—i‘i §¡°·±Ó?ˆŒÜŸ	™	 $§.¡.°$·.±.ÓAˆ�r9   NrE   rµ   r¸   r%   c                 ó¦  — |j                   dd }g |¢d‘| j                  ‘­}| j                  |«      }| j                  |«      }| j	                  |«      }|j                  |«      j                  dd«      }|j                  |«      j                  dd«      }|j                  |«      j                  dd«      }t        j                  | j                  j                  t        «      }	 |	| ||||f| j                  | j                  sdn| j                  dœ|¤Ž\  }
} |
j                  g |¢d‘­Ž j!                  «       }
| j#                  |
«      }
|
|fS )z#Input shape: Batch x Time x ChannelNrZ   r   rW   ç        )r¶   r·   )r}   rÉ   rÐ   rÎ   rÏ   r†   r•   r   Úget_interfacerP   Ú_attn_implementationrÂ   rÊ   r»   r·   r‚   r¿   rÑ   )r7   rE   rµ   r¸   Úinput_shapeÚhidden_shapeÚqueriesÚkeysr5   Úattention_interfacerÁ   rÀ   s               r/   r›   zCLIPSegAttention.forward  sO  € ð $×)Ñ)¨#¨2Ð.ˆà8˜Ð8 bÐ8¨$¯-©-Ñ8ˆØ—+‘+˜mÓ,ˆØ�{‰{˜=Ó)ˆØ—‘˜]Ó+ˆà—,‘,˜|Ó,×6Ñ6°q¸!Ó<ˆØ�y‰y˜Ó&×0Ñ0°°AÓ6ˆØ—‘˜\Ó*×4Ñ4°Q¸Ó:ˆä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØð	%
ð —J‘JØ#Ÿ}š}‘C°$·,±,ñ	%
ð ñ	%
Ñ!ˆ�\ð *�k×)Ñ)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ—m‘m KÓ0ˆà˜LÐ(Ð(r9   r(   )r:   r;   r<   r=   r   r   r^   r>   r�   r   r   r4   r›   rŸ   r    s   @r/   rÄ   rÄ     su   ø„ ÙGðBÐ2Ð5FÑFõ Bð$ /3ñ%)à—|‘|ð%)ð Ÿ™ tÑ+ð%)ð Ð+Ñ,ð	%)ð
 
ˆu�|‰|˜UŸ\™\¨DÑ0Ð0Ñ	1÷%)r9   rÄ   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )Ú
CLIPSegMLPc                 ó  •— t         ‰| �  «        || _        t        |j                     | _        t        j                  |j                  |j                  «      | _
        t        j                  |j                  |j                  «      | _        y r(   )r]   r^   rP   r	   Ú
hidden_actÚactivation_fnr   rÍ   r_   Úintermediate_sizeÚfc1Úfc2rp   s     €r/   r^   zCLIPSegMLP.__init__H  sd   ø€ Ü‰ÑÔØˆŒÜ# F×$5Ñ$5Ñ6ˆÔÜ—9‘9˜V×/Ñ/°×1IÑ1IÓJˆŒÜ—9‘9˜V×5Ñ5°v×7IÑ7IÓJˆ�r9   rE   r%   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r(   )rá   rß   râ   )r7   rE   s     r/   r›   zCLIPSegMLP.forwardO  s4   € ØŸ™ Ó/ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐr9   )r:   r;   r<   r^   r>   r�   r›   rŸ   r    s   @r/   rÜ   rÜ   G  s$   ø„ ôKð U§\¡\ð °e·l±l÷ r9   rÜ   c                   ó„   ‡ — e Zd Zdeez  fˆ fd„Zdej                  dej                  dee	   dej                  fd„Zˆ xZS )ÚCLIPSegEncoderLayerrP   c                 óD  •— t         ‰| �  «        |j                  | _        t	        |«      | _        t        j                  | j                  |j                  ¬«      | _	        t        |«      | _        t        j                  | j                  |j                  ¬«      | _        y ©N)Úeps©r]   r^   r_   r`   rÄ   Ú	self_attnr   Ú	LayerNormÚlayer_norm_epsÚlayer_norm1rÜ   ÚmlpÚlayer_norm2rp   s     €r/   r^   zCLIPSegEncoderLayer.__init__W  óm   ø€ Ü‰ÑÔØ×+Ñ+ˆŒÜ)¨&Ó1ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÔÜ˜fÓ%ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÕr9   rE   rµ   r¸   r%   c                 ó¸   — |}| j                  |«      } | j                  d||dœ|¤Ž\  }}||z   }|}| j                  |«      }| j                  |«      }||z   }|S ©N)rE   rµ   rA   )rí   rê   rï   rî   ©r7   rE   rµ   r¸   Úresidualr—   s         r/   r›   zCLIPSegEncoderLayer.forward_  s‚   € ð !ˆà×(Ñ(¨Ó7ˆØ)˜4Ÿ>™>ð 
Ø'Ø)ñ
ð ñ
Ñˆ�qð
 ! =Ñ0ˆà ˆØ×(Ñ(¨Ó7ˆØŸ™ Ó/ˆØ  =Ñ0ˆàÐr9   )r:   r;   r<   r   r   r^   r>   r�   r   r   r?   r›   rŸ   r    s   @r/   rå   rå   V  sW   ø„ ðSÐ2Ð5FÑFõ Sðà—|‘|ðð Ÿ™ðð Ð+Ñ,ð	ð
 
×	Ñ	÷r9   rå   c                   ó„   ‡ — e Zd ZdZdeez  fˆ fd„Zdej                  dej                  de	ej                     fd„Zˆ xZS )ÚCLIPSegDecoderLayerz¤
    CLIPSeg decoder layer, which is identical to `CLIPSegEncoderLayer`, except that normalization is applied after
    self-attention/MLP, rather than before.
    rP   c                 óD  •— t         ‰| �  «        |j                  | _        t	        |«      | _        t        j                  | j                  |j                  ¬«      | _	        t        |«      | _        t        j                  | j                  |j                  ¬«      | _        y rç   ré   rp   s     €r/   r^   zCLIPSegDecoderLayer.__init__}  rð   r9   rE   rµ   r%   c                 ó¸   — |} | j                   d||dœ|¤Ž\  }}||z   }| j                  |«      }|}| j                  |«      }||z   }| j                  |«      }|S rò   )rê   rí   rî   rï   ró   s         r/   r›   zCLIPSegDecoderLayer.forward…  s‚   € ð !ˆà)˜4Ÿ>™>ð 
Ø'Ø)ñ
ð ñ
Ñˆ�qð ! =Ñ0ˆØ×(Ñ(¨Ó7ˆà ˆØŸ™ Ó/ˆØ  =Ñ0ˆØ×(Ñ(¨Ó7ˆàÐr9   )r:   r;   r<   r=   r   r   r^   r>   r�   r4   r?   r›   rŸ   r    s   @r/   rö   rö   w  sQ   ø„ ñð
SÐ2Ð5FÑFõ Sðà—|‘|ðð Ÿ™ðð
 
ˆu× Ñ Ñ	!÷r9   rö   c                   ó„   ‡ — e Zd ZU eed<   dZdZg d¢ZdZdZ	dZ
dZdZeegedœZ ej$                  «       ˆ fd„«       Zˆ xZS )ÚCLIPSegPreTrainedModelrP   Úclipseg)ÚimageÚtext)r¢   rå   rO   T)rE   rF   c                 ó�  •— t         ‰| �  |«       | j                  j                  }t	        |t
        «      r¸t        j                  |j                  j                  d|dz  ¬«       t        j                  |j                  j                  d|dz  ¬«       t        j                  |j                  t        j                  |j                  j                  d   «      j!                  d«      «       y	t	        |t"        «      �rt        j                  |j$                  d|j&                  dz  |z  ¬«       t        j                  |j(                  j                  |j                  j*                  |z  ¬«       t        j                  |j                  j                  |j                  j*                  |z  ¬«       t        j                  |j                  t        j                  |j,                  «      j!                  d«      «       y	t	        |t.        «      rî|j&                  dz  d|j                  j0                  z  dz  z  |z  }|j&                  dz  |z  }t        j                  |j2                  j                  |¬«       t        j                  |j4                  j                  |¬«       t        j                  |j6                  j                  |¬«       t        j                  |j8                  j                  |¬«       y	t	        |t:        «      r¯|j                  j<                  dz  d|j                  j0                  z  dz  z  |z  }d|j                  j<                  z  dz  |z  }t        j                  |j>                  j                  |¬«       t        j                  |j@                  j                  |¬«       y	t	        |tB        «      rwt        j                  |jD                  j                  |jF                  dz  |z  ¬«       t        j                  |jH                  j                  |jJ                  dz  |z  ¬«       y	y	)
zInitialize the weightsrÓ   g{®Gáz”?)ÚmeanÚstdrZ   rY   rÆ   )r   rW   N)&r]   Ú_init_weightsrP   Úinitializer_factorr*   r¢   ÚinitÚnormal_r¥   r~   rl   Úcopy_rX   r>   rn   r}   ro   rO   re   r`   rh   Úinitializer_rangerj   rÄ   Únum_hidden_layersrÐ   rÎ   rÏ   rÑ   rÜ   r_   rá   râ   ÚCLIPSegModelÚtext_projectionÚtext_embed_dimÚvisual_projectionÚvision_embed_dim)r7   r±   ÚfactorÚin_proj_stdÚout_proj_stdÚfc_stdrq   s         €r/   r  z$CLIPSegPreTrainedModel._init_weights¯  s  ø€ ô 	‰Ñ˜fÔ%Ø—‘×/Ñ/ˆÜ�fÔ3Ô4Ü�L‰L˜×/Ñ/×6Ñ6¸SÀfÈtÁmÕTÜ�L‰L˜×2Ñ2×9Ñ9ÀÈÐRVÉÕWÜ�J‰J�v×*Ñ*¬E¯L©L¸×9LÑ9L×9RÑ9RÐSUÑ9VÓ,W×,^Ñ,^Ð_fÓ,gÕhÜ˜Ô 7Õ8Ü�L‰L˜×/Ñ/°c¸v×?OÑ?OÐQUÑ?UÐX^Ñ?^Õ_Ü�L‰L˜×/Ñ/×6Ñ6¸F¿M¹M×<[Ñ<[Ð^dÑ<dÕeÜ�L‰L˜×2Ñ2×9Ñ9¸v¿}¹}×?^Ñ?^ÐagÑ?gÕhÜ�J‰J�v×*Ñ*¬E¯L©L¸×9MÑ9MÓ,N×,UÑ,UÐV]Ó,^Õ_Ü˜Ô 0Ô1Ø!×+Ñ+¨TÑ1°q¸6¿=¹=×;ZÑ;ZÑ7ZÐ_cÑ6cÑdÐgmÑmˆKØ"×,Ñ,¨dÑ2°fÑ<ˆLÜ�L‰L˜Ÿ™×-Ñ-°;Õ?Ü�L‰L˜Ÿ™×-Ñ-°;Õ?Ü�L‰L˜Ÿ™×-Ñ-°;Õ?Ü�L‰L˜Ÿ™×/Ñ/°\ÖBÜ˜¤
Ô+Ø!Ÿ=™=×4Ñ4°dÑ:ÀÀFÇMÁM×DcÑDcÑ@cÐhlÑ?lÑmÐpvÑvˆKØ˜&Ÿ-™-×3Ñ3Ñ3¸Ñ<¸vÑEˆFÜ�L‰L˜Ÿ™×*Ñ*°Õ7Ü�L‰L˜Ÿ™×*Ñ*°Ö<Ü˜¤Ô-Ü�L‰LØ×&Ñ&×-Ñ-Ø×)Ñ)¨4Ñ/°&Ñ8õô �L‰LØ×(Ñ(×/Ñ/Ø×+Ñ+¨TÑ1°FÑ:öð .r9   )r:   r;   r<   r   r@   Úbase_model_prefixÚinput_modalitiesÚ_no_split_modulesÚsupports_gradient_checkpointingÚ_supports_sdpaÚ_supports_flash_attnÚ_supports_flex_attnÚ_supports_attention_backendrå   rö   rÄ   Ú_can_record_outputsr>   Úno_gradr  rŸ   r    s   @r/   rú   rú   ž  sh   ø… àÓØ!ÐØ(ÐÚcÐà&*Ð#Ø€NØÐØÐØ"&Ðà-Ð/BÐCØ&ñÐð
 €U‡]�]ƒ_ó!ó ô!r9   rú   c                   ó`   ‡ — e Zd ZdZdefˆ fd„Z	 d	dej                  dz  dee	   de
fd„Zˆ xZS )
ÚCLIPSegEncoderz³
    Transformer encoder consisting of `config.num_hidden_layers` self attention layers. Each layer is a
    [`CLIPSegEncoderLayer`].

    Args:
        config: CLIPSegConfig
    rP   c                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w )NF)
r]   r^   rP   r   Ú
ModuleListÚranger  rå   ÚlayersÚgradient_checkpointing)r7   rP   r—   rq   s      €r/   r^   zCLIPSegEncoder.__init__Ý  sP   ø€ Ü‰ÑÔØˆŒÜ—m‘mÌ%ÐPV×PhÑPhÓJiÖ$jÀQÔ%8¸Õ%@Ò$jÓkˆŒØ&+ˆÕ#ùò %ks   ½A#Nrµ   r¸   r%   c                 óT   — |}| j                   D ]  } |||fi |¤Ž}Œ t        |¬«      S )N)Úlast_hidden_state)r   r   )r7   r©   rµ   r¸   rE   Úencoder_layers         r/   r›   zCLIPSegEncoder.forwardã  sH   € ð &ˆØ!Ÿ[™[ò 	ˆMÙ)ØØñð ñ‰Mð	ô Ø+ô
ð 	
r9   r(   )r:   r;   r<   r=   r   r^   r>   r�   r   r   r   r›   rŸ   r    s   @r/   r  r  Ô  sK   ø„ ñð,˜}õ ,ð /3ñ
ð Ÿ™ tÑ+ð
ð Ð+Ñ,ð	
ð
 
÷
r9   r  c                   óŽ   ‡ — e Zd Zdefˆ fd„Zeeedee	j                     de	j                  dee   defd„«       «       «       Zˆ xZS )ÚCLIPSegDecoderrP   c                 ó&  •— t         ‰| �  |«       |j                  | _        t        j                  |j
                  |j                  «      | _        t        j                  |j
                  |j                  «      | _        |j                  rþ|j                  j                  dz  |j                  j                  dz  f}t        j                  t        j                  |j                  |j                  dd¬«      t        j                  «       t        j                  |j                  |j                  dz  |d   |d   ¬«      t        j                  «       t        j                  |j                  dz  d|d   |d   ¬«      «      | _        nPt        j                  |j                  d|j                  j                  |j                  j                  ¬«      | _        t#        |j$                  «      }t        j&                  t)        |«      D �cg c]6  }t        j                  |j                  j*                  |j                  «      ‘Œ8 c}«      | _        t/        j0                  |j                  «      }|j                  |_        |j2                  |_        |j6                  |_        d	|_        t        j&                  t)        t#        |j$                  «      «      D �cg c]  }t=        |«      ‘Œ c}«      | _        | jA                  «        y c c}w c c}w )
Né   r   r   )rT   ÚpaddingrW   r   )rT   rU   )rU   Úrelu)!r]   r^   Úconditional_layerr   rÍ   Úprojection_dimÚ
reduce_dimÚfilm_mulÚfilm_addÚ"use_complex_transposed_convolutionÚvision_configrb   Ú
Sequentialrf   ÚReLUÚConvTranspose2dÚtransposed_convolutionÚlenÚextract_layersr  r  r_   ÚreducesÚcopyÚdeepcopyÚdecoder_num_attention_headsrÇ   Údecoder_intermediate_sizerà   rÞ   rö   r   Ú	post_init)r7   rP   Útransposed_kernelsÚdepthr—   Údecoder_configrq   s         €r/   r^   zCLIPSegDecoder.__init__÷  s[  ø€ Ü‰Ñ˜Ô à!'×!9Ñ!9ˆÔäŸ	™	 &×"7Ñ"7¸×9JÑ9JÓKˆŒÜŸ	™	 &×"7Ñ"7¸×9JÑ9JÓKˆŒà×4Ò4Ø"(×"6Ñ"6×"AÑ"AÀQÑ"FÈ×H\ÑH\×HgÑHgÐklÑHlÐ!mÐä*,¯-©-Ü—	‘	˜&×+Ñ+¨V×->Ñ->ÈAÐWXÔYÜ—‘“	Ü×"Ñ"Ø×%Ñ%Ø×%Ñ%¨Ñ*Ø 2°1Ñ 5Ø-¨aÑ0ô	ô —‘“	Ü×"Ñ"Ø×%Ñ%¨Ñ*¨AÐ;MÈaÑ;PÐYkÐlmÑYnôó+ˆDÕ'ô +-×*<Ñ*<Ø×!Ñ! 1 f×&:Ñ&:×&EÑ&EÈf×NbÑNb×NmÑNmô+ˆDÔ'ô �F×)Ñ)Ó*ˆÜ—}‘}ÜUZÐ[`ÓUaÖbÐPQŒR�Y‰Y�v×+Ñ+×7Ñ7¸×9JÑ9JÕKÒbó
ˆŒô Ÿ™ v×';Ñ';Ó<ˆØ%+×%6Ñ%6ˆÔ"Ø-3×-OÑ-OˆÔ*Ø+1×+KÑ+KˆÔ(Ø$*ˆÔ!Ü—m‘mÔRWÔX[Ð\b×\qÑ\qÓXrÓRsÖ$tÈQÔ%8¸Õ%HÒ$tÓuˆŒà�‰Õùò cùò %us   È;L	ËLrE   rI   r¸   r%   c                 óÀ  — |ddd…   }d}t        t        || j                  | j                  «      «      D ]ƒ  \  }\  }}}	|� |	|«      |z   }n |	|«      }|| j                  k(  rJ| j                  |«      |j                  ddd«      z  | j                  |«      z   }|j                  ddd«      } ||fddi|¤Ž}Œ… |dd…dd…dd…f   j                  dd«      }t        t        j                  |j                  d   «      «      }
|j                  d   }|j                  ||j                  d   |
|
«      }| j                  |«      j                  d«      }t!        |¬«      S )a/  
        conditional_embeddings (`torch.FloatTensor` of shape `(batch_size, config.projection_dim)`, *optional*):
            The conditional embeddings for the query images. If provided, the model will use this instead of computing
            the embeddings from the conditional_pixel_values.
        NrZ   r   r   rW   rµ   ©rD   )Ú	enumerateÚzipr   r8  r+  r.  rƒ   r/  r•   rž   ÚmathÚsqrtr}   r†   r5  ÚsqueezerC   )r7   rE   rI   r¸   ÚactivationsÚoutputÚiÚ
activationÚlayerÚreducerx   r–   rD   s                r/   r›   zCLIPSegDecoder.forward#  sk  € ð $¡D b DÑ)ˆàˆÜ.7¼¸KÈÏÉÐVZ×VbÑVbÓ8cÓ.dò 	BÑ*ˆAÑ*�
˜E 6ØÐ!Ù 
Ó+¨fÑ4‘á 
Ó+�à�D×*Ñ*Ò*ØŸ™Ð'=Ó>ÀÇÁÐPQÐSTÐVWÓAXÑXÐ[_×[hÑ[hØ*ó\ñ �ð  Ÿ™¨¨1¨aÓ0�á˜6ÑA°$ÐA¸&ÑA‰Fð	Bð š˜1™2šq˜Ñ!×+Ñ+¨A¨qÓ1ˆä”4—9‘9˜VŸ\™\¨!™_Ó-Ó.ˆà+×1Ñ1°!Ñ4ˆ
Ø—‘˜Z¨¯©°a©¸$ÀÓEˆà×,Ñ,¨VÓ4×<Ñ<¸QÓ?ˆä#¨6Ô2Ð2r9   )r:   r;   r<   r   r^   r   r   r   r4   r>   r�   r   r   rC   r›   rŸ   r    s   @r/   r&  r&  ö  sm   ø„ ð*˜}õ *ðX  ØØð%3à˜UŸ\™\Ñ*ð%3ð !&§¡ð%3ð Ð+Ñ,ð	%3ð
 
ò%3ó ó ó  ô%3r9   r&  zL
    The text model from CLIPSEG without any head or projection on top.
    )Úcustom_introc                   óâ   ‡ — e Zd ZU eed<   dZdZdefˆ fd„Ze e	d¬«      e
	 	 	 ddej                  dz  d	ej                  dz  d
ej                  dz  dee   deez  f
d„«       «       «       Zˆ xZS )ÚCLIPSegTextModelrP   )rý   r¥   c                 ó
  •— t         ‰| �  |«       |j                  }t        |«      | _        t        |«      | _        t        j                  ||j                  ¬«      | _
        |j                  | _        | j                  «        y rç   )r]   r^   r_   r¢   rr   r  Úencoderr   rë   rì   Úfinal_layer_normÚeos_token_idr=  r§   s      €r/   r^   zCLIPSegTextModel.__init__X  sf   ø€ Ü‰Ñ˜Ô Ø×&Ñ&ˆ	Ü/°Ó7ˆŒÜ% fÓ-ˆŒÜ "§¡¨Y¸F×<QÑ<QÔ RˆÔð #×/Ñ/ˆÔØ�‰Õr9   F©Útie_last_hidden_statesNr¨   rµ   rX   r¸   r%   c                 óh  — |€t        d«      ‚|j                  «       }|j                  d|d   «      }| j                  ||¬«      }t	        | j
                  ||d¬«      }|j                  dd«        | j                  d||ddœ|¤Ž}|j                  }| j                  |«      }| j                  d	k(  rm|t        j                  |j                  d
   |j                  ¬«      |j                  t        j                   |j                  ¬«      j#                  d¬«      f   }	n‡|t        j                  |j                  d
   |j                  ¬«      |j                  t        j                   |j                  ¬«      | j                  k(  j!                  «       j#                  d¬«      f   }	t%        ||	¬«      S )a;  
        Examples:

        ```python
        >>> from transformers import AutoTokenizer, CLIPSegTextModel

        >>> tokenizer = AutoTokenizer.from_pretrained("CIDAS/clipseg-rd64-refined")
        >>> model = CLIPSegTextModel.from_pretrained("CIDAS/clipseg-rd64-refined")

        >>> inputs = tokenizer(["a photo of a cat", "a photo of a dog"], padding=True, return_tensors="pt")

        >>> outputs = model(**inputs)
        >>> last_hidden_state = outputs.last_hidden_state
        >>> pooled_output = outputs.pooler_output  # pooled (EOS token) states
        ```NzYou have to specify input_idsrZ   )r¨   rX   )rP   r©   rµ   Úpast_key_valuesrÌ   T)r©   rµ   rÌ   rW   r   ©Údevice)r‘   rZ  r{   ©r#  Úpooler_outputrA   )r’   rx   r†   rr   r
   rP   ÚpoprR  r#  rS  rT  r>   rn   r}   rZ  r“   rž   Úargmaxr   )
r7   r¨   rµ   rX   r¸   rÖ   rE   Úencoder_outputsr#  rJ   s
             r/   r›   zCLIPSegTextModel.forwardc  s§  € ð2 ÐÜÐ<Ó=Ð=à—n‘nÓ&ˆØ—N‘N 2 {°2¡Ó7ˆ	àŸ™°)È,˜ÓWˆä+Ø—;‘;Ø'Ø)Ø ô	
ˆð 	�
‰
�; Ô%Ø+7¨4¯<©<ð ,
Ø'Ø)Øñ,
ð ñ	,
ˆð ,×=Ñ=ÐØ ×1Ñ1Ð2CÓDÐà×Ñ Ò!ð .Ü—‘Ð.×4Ñ4°QÑ7Ð@Q×@XÑ@XÔYØ—‘¤5§9¡9Ð5F×5MÑ5M�ÓN×UÑUÐZ\ÐUÓ]ð_ñ‰Mð .Ü—‘Ð.×4Ñ4°QÑ7Ð@Q×@XÑ@XÔYð —‘¤E§I¡IÐ6G×6NÑ6N�ÓOÐSW×SdÑSdÑdß‘“ß‘˜B�“ð!ñˆMô *Ø/Ø'ô
ð 	
r9   r¯   )r:   r;   r<   r   r@   r  Ú_input_embed_layerr^   r   r   r   r>   r�   r   r   r4   r   r›   rŸ   r    s   @r/   rP  rP  N  s¶   ø… ð ÓØ ÐØ*Ðð	Ð0õ 	ð  Ù¨EÔ2Øð *.Ø.2Ø,0ñ	I
à—<‘< $Ñ&ðI
ð Ÿ™ tÑ+ðI
ð —l‘l TÑ)ð	I
ð
 Ð+Ñ,ðI
ð 
Ð+Ñ	+òI
ó ó 3ó  ôI
r9   rP  zN
    The vision model from CLIPSEG without any head or projection on top.
    c                   ó°   ‡ — e Zd ZU eed<   dZdZdZdefˆ fd„Ze	 e
d¬«      e	 ddej                  dz  d	edz  d
ee   deez  fd„«       «       «       Zˆ xZS )ÚCLIPSegVisionModelrP   rŽ   )rü   rh   c                 ó4  •— t         ‰| �  |«       |j                  }t        |«      | _        t        j                  ||j                  ¬«      | _        t        |«      | _
        t        j                  ||j                  ¬«      | _        | j                  «        y rç   )r]   r^   r_   rO   rr   r   rë   rì   Úpre_layrnormr  rR  Úpost_layernormr=  r§   s      €r/   r^   zCLIPSegVisionModel.__init__½  so   ø€ Ü‰Ñ˜Ô Ø×&Ñ&ˆ	ä1°&Ó9ˆŒÜŸL™L¨¸×8MÑ8MÔNˆÔÜ% fÓ-ˆŒÜ Ÿl™l¨9¸&×:OÑ:OÔPˆÔØ�‰Õr9   FrU  Nr�   r¸   r%   c                 óÞ   — | j                  ||¬«      }| j                  |«      } | j                  dd|i|¤Ž}|j                  }|dd…ddd…f   }| j	                  |«      }t        ||¬«      S )a+  
        Examples:

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

        >>> processor = AutoProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
        >>> model = CLIPSegVisionModel.from_pretrained("CIDAS/clipseg-rd64-refined")

        >>> 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, return_tensors="pt")

        >>> outputs = model(**inputs)
        >>> last_hidden_state = outputs.last_hidden_state
        >>> pooled_output = outputs.pooler_output  # pooled CLS states
        ```)r�   r©   Nr   r[  rA   )rr   rd  rR  r#  re  r   )r7   rŽ   r�   r¸   rE   r_  r#  rJ   s           r/   r›   zCLIPSegVisionModel.forwardÇ  sˆ   € ð> Ÿ™¨ÐOg˜ÓhˆØ×)Ñ)¨-Ó8ˆà+7¨4¯<©<ñ ,
Ø'ð,
àñ,
ˆð
 ,×=Ñ=ÐØ)ª!¨Q²¨'Ñ2ˆØ×+Ñ+¨MÓ:ˆä)Ø/Ø'ô
ð 	
r9   rœ   )r:   r;   r<   r   r@   Úmain_input_namer  r`  r^   r   r   r   r>   r?   Úboolr   r   r4   r   r›   rŸ   r    s   @r/   rb  rb  ²  s˜   ø… ð  ÓØ$€OØ!ÐØ*ÐðÐ2õ ð  Ù¨EÔ2Øð 15ñ+
à×'Ñ'¨$Ñ.ð+
ð #'¨¡+ð+
ð Ð+Ñ,ð	+
ð
 
Ð+Ñ	+ò+
ó ó 3ó  ô+
r9   rb  rD   r%   c                 ó’   — t         j                  j                  | t        j                  t        | «      | j                  ¬«      «      S )NrY  )r   r„   Úcross_entropyr>   rn   r6  rZ  rB  s    r/   Úcontrastive_lossrk  ú  s/   € Ü�=‰=×&Ñ& v¬u¯|©|¼CÀ»KÐPV×P]ÑP]Ô/^Ó_Ð_r9   Ú
similarityc                 óR   — t        | «      }t        | j                  «      }||z   dz  S )Ng       @)rk  ÚT)rl  Úcaption_lossÚ
image_losss      r/   Úimage_text_contrastive_lossrq  þ  s*   € Ü# JÓ/€LÜ! *§,¡,Ó/€JØ˜:Ñ%¨Ñ,Ð,r9   Útensorc                 óŽ   — t        j                  | d«      }t        j                  |dd¬«      }t        j                  |d«      }|S )z½
    This method is equivalent to tensor.norm(p=2, dim=-1, keepdim=True) and used to make
    model `executorch` exportable. See issue https://github.com/pytorch/executorch/issues/3566
    rW   rZ   T)r|   Úkeepdimrv   )r>   ÚpowÚsum)rr  Úsquare_tensorÚ
sum_tensorÚnormed_tensors       r/   Ú_get_vector_normrz    s<   € ô
 —I‘I˜f aÓ(€MÜ—‘˜=¨b¸$Ô?€JÜ—I‘I˜j¨#Ó.€MØÐr9   c                   ó¼  ‡ — e Zd Zdefˆ fd„Zee	 	 ddej                  dej                  dz  dej                  dz  de	e
   deez  f
d	„«       «       Zee	 dd
ej                  dede	e
   deez  fd„«       «       Zee	 	 	 	 	 	 ddej"                  dz  d
ej                  dz  dej                  dz  dej"                  dz  dedz  dede	e
   defd„«       «       Zˆ xZS )r  rP   c                 óˆ  •— t         ‰| �  |«       |j                  }|j                  }|j                  | _        |j
                  | _        |j
                  | _        t        j                  |«      | _
        t        j                  |«      | _        t        j                  | j                  | j                  d¬«      | _        t        j                  | j                  | j                  d¬«      | _        t        j"                  t%        j&                  | j(                  j*                  «      «      | _        | j/                  «        y )NF)rV   )r]   r^   Útext_configr1  r,  r_   r
  r  rP  Ú_from_configÚ
text_modelrb  Úvision_modelr   rÍ   r  r	  rc   r>   rr  rP   Úlogit_scale_init_valueÚlogit_scaler=  )r7   rP   r}  r1  rq   s       €r/   r^   zCLIPSegModel.__init__  sé   ø€ Ü‰Ñ˜Ô à×(Ñ(ˆØ×,Ñ,ˆà$×3Ñ3ˆÔØ)×5Ñ5ˆÔØ -× 9Ñ 9ˆÔä*×7Ñ7¸ÓDˆŒÜ.×;Ñ;¸MÓJˆÔä!#§¡¨4×+@Ñ+@À$×BUÑBUÐ\aÔ!bˆÔÜ!Ÿy™y¨×)<Ñ)<¸d×>QÑ>QÐX]Ô^ˆÔÜŸ<™<¬¯©°T·[±[×5WÑ5WÓ(XÓYˆÔð 	�‰Õr9   Nr¨   rµ   rX   r¸   r%   c                 óx   —  | j                   d|||ddœ|¤Ž}|j                  }| j                  |«      |_        |S )a  
        Examples:

        ```python
        >>> import torch
        >>> from transformers import AutoTokenizer, CLIPSegModel

        >>> tokenizer = AutoTokenizer.from_pretrained("CIDAS/clipseg-rd64-refined")
        >>> model = CLIPSegModel.from_pretrained("CIDAS/clipseg-rd64-refined")

        >>> inputs = tokenizer(["a photo of a cat", "a photo of a dog"], padding=True, return_tensors="pt")
        >>> with torch.inference_mode():
        ...     text_features = model.get_text_features(**inputs)
        ```T)r¨   rµ   rX   Úreturn_dictrA   )r  r\  r	  )r7   r¨   rµ   rX   r¸   Útext_outputsrJ   s          r/   Úget_text_featureszCLIPSegModel.get_text_features%  sV   € ð. 4C°4·?±?ð 4
ØØ)Ø%Øñ	4
ð
 ñ4
ˆð %×2Ñ2ˆØ%)×%9Ñ%9¸-Ó%HˆÔ"àÐr9   rŽ   r�   c                 óv   —  | j                   d||ddœ|¤Ž}|j                  }| j                  |«      |_        |S )aŒ  
        Examples:

        ```python
        >>> import torch
        >>> from transformers import AutoProcessor, CLIPSegModel
        >>> from transformers.image_utils import load_image

        >>> processor = AutoProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
        >>> model = CLIPSegModel.from_pretrained("CIDAS/clipseg-rd64-refined")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = load_image(url)

        >>> inputs = processor(images=image, return_tensors="pt")

        >>> with torch.inference_mode():
        ...     image_features = model.get_image_features(**inputs)
        ```T)rŽ   r�   r„  rA   )r€  r\  r  )r7   rŽ   r�   r¸   Úvision_outputsrJ   s         r/   Úget_image_featureszCLIPSegModel.get_image_featuresH  sU   € ð6 6G°T×5FÑ5Fð 6
Ø%Ø%=Øñ6
ð ñ	6
ˆð '×4Ñ4ˆØ'+×'=Ñ'=¸mÓ'LˆÔ$àÐr9   Úreturn_lossc           	      ó  —  | j                   d||dœ|¤Ž} | j                  d|||dœ|¤Ž}	|j                  }
|	j                  }|
t        |
«      z  }
|t        |«      z  }t	        j
                  ||
j                  «       j                  |j                  «      «      }|| j                  j                  «       j                  |j                  «      z  }|j                  «       }d}|rt        |«      }t        |||||
|	|¬«      S )a  
        return_loss (`bool`, *optional*):
            Whether or not to return the contrastive loss.

        Examples:

        ```python
        >>> import torch
        >>> from transformers import AutoProcessor, CLIPSegModel
        >>> from transformers.image_utils import load_image

        >>> processor = AutoProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
        >>> model = CLIPSegModel.from_pretrained("CIDAS/clipseg-rd64-refined")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = load_image(url)

        >>> inputs = processor(
        ...     text=["a photo of a cat", "a photo of a dog"], images=image, return_tensors="pt", padding=True
        ... )

        >>> with torch.inference_mode():
        ...     outputs = model(**inputs)
        >>> logits_per_image = outputs.logits_per_image  # this is the image-text similarity score
        >>> probs = logits_per_image.softmax(dim=1)  # we can take the softmax to get the label probabilities
        ```©rŽ   r�   )r¨   rµ   rX   N)r   r   r    r!   r"   r#   r$   rA   )r‰  r†  r\  rz  r>   r¼   Útr“   rZ  r‚  Úexprq  r   )r7   r¨   rŽ   rµ   rX   rŠ  r�   r¸   rˆ  r…  r"   r!   r    r   r   s                  r/   r›   zCLIPSegModel.forwardn  s+  € ðL 6M°T×5LÑ5Lð 6
Ø%Ø%=ñ6
ð ñ6
ˆð 4J°4×3IÑ3Ið 4
ØØ)Ø%ñ4
ð ñ	4
ˆð &×3Ñ3ˆØ"×0Ñ0ˆð $Ô&6°|Ó&DÑDˆØ!Ô$4°[Ó$AÑAˆô  Ÿ,™, {°L·N±NÓ4D×4GÑ4GÈ×HZÑHZÓ4[Ó\ˆØ)¨D×,<Ñ,<×,@Ñ,@Ó,B×,EÑ,EÀk×FXÑFXÓ,YÑYˆà*×,Ñ,Ó.ÐàˆÙÜ.¨Ó?ˆDäØØ-Ø+Ø#Ø%Ø*Ø .ô
ð 	
r9   )NNrœ   )NNNNNT)r:   r;   r<   r   r^   r   r   r>   r�   r   r   r4   r   r†  r?   rh  r‰  r°   r   r›   rŸ   r    s   @r/   r  r    sœ  ø„ ð˜}õ ð( Øð /3Ø,0ñ	à—<‘<ðð Ÿ™ tÑ+ðð —l‘l TÑ)ð	ð
 Ð+Ñ,ðð 
Ð+Ñ	+òó ó ððB Øð *.ñ"à×'Ñ'ð"ð #'ð"ð Ð+Ñ,ð	"ð
 
Ð+Ñ	+ò"ó ó ð"ðH Øð .2Ø15Ø.2Ø04Ø#'Ø)-ñJ
à×#Ñ# dÑ*ðJ
ð ×'Ñ'¨$Ñ.ðJ
ð Ÿ™ tÑ+ð	J
ð
 ×&Ñ&¨Ñ-ðJ
ð ˜D‘[ðJ
ð #'ðJ
ð Ð+Ñ,ðJ
ð 
òJ
ó ó ôJ
r9   r  zn
    CLIPSeg model with a Transformer-based decoder on top for zero-shot and one-shot image segmentation.
    c                   óö  ‡ — e Zd ZU eed<   defˆ fd„Z	 	 	 	 	 ddedz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  d	ej                  fd
„Z
ee	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dedee   d	eez  fd„«       «       Zˆ xZS )ÚCLIPSegForImageSegmentationrP   c                 ó¦   •— t         ‰| �  |«       t        |«      | _        |j                  | _        t        |«      | _        | j                  «        y r(   )r]   r^   r  Úclipr7  r&  Údecoderr=  rp   s     €r/   r^   z$CLIPSegForImageSegmentation.__init__Å  s@   ø€ Ü‰Ñ˜Ô Ü  Ó(ˆŒ	Ø$×3Ñ3ˆÔÜ% fÓ-ˆŒà�‰Õr9   Nr–   r¨   rµ   rX   Úconditional_pixel_valuesr%   c                 óÎ  — |�`t        |«      |k7  rt        d«      ‚t        j                  «       5  | j                  j                  |||¬«      j                  }d d d «       |S |�]t        |«      |k7  rt        d«      ‚t        j                  «       5  | j                  j                  |«      j                  }d d d «       |S t        d«      ‚# 1 sw Y   S xY w# 1 sw Y   S xY w)Nz@Make sure to pass as many prompt texts as there are query images)rµ   rX   zAMake sure to pass as many prompt images as there are query imagesz[Invalid conditional, should be either provided as `input_ids` or `conditional_pixel_values`)r6  r’   r>   r  r’  r†  r\  r‰  )r7   r–   r¨   rµ   rX   r”  rI   s          r/   Úget_conditional_embeddingsz6CLIPSegForImageSegmentation.get_conditional_embeddingsÍ  sð   € ð Ð ä�9‹~ Ò+Ü Ð!cÓdÐdÜ—‘“ñ  Ø)-¯©×)DÑ)DØ¨nÈ<ð *Eó *ç‘-ð '÷ ð &Ð%ð &Ð1äÐ+Ó,°
Ò:Ü Ð!dÓeÐeÜ—‘“ñ nØ)-¯©×)EÑ)EÐF^Ó)_×)mÑ)mÐ&÷nð &Ð%ô	 Ømóð ÷ ð &Ð%ú÷nð &Ð%ús   °)CÂ&CÃCÃC$rŽ   rI   Úlabelsr�   r¸   c	                 ó^  — t        j                  «       5  d|	d<    | j                  j                  d||dœ|	¤Ž}
|
j                  }|
j
                  }| j                  D �cg c]
  }||dz      ‘Œ }}t        |
j                  |
j                  |
j
                  |
j                  ¬«      }
ddd«       |€$| j                  |j                  d   ||||¬«      }n[|j                  d   |j                  d   k7  rt        d	«      ‚|j                  d   | j                  j                  k7  rt        d
«      ‚ | j                  |fi |	¤Ž}|j                   }d}|�8|j#                  |j$                  «      }t'        j(                  «       } |||«      }t+        |||
|¬«      S c c}w # 1 sw Y   ŒüxY w)a~  
        conditional_pixel_values (`torch.FloatTensor`, *optional*):
            The pixel values of the conditional images.
        conditional_embeddings (`torch.FloatTensor` of shape `(batch_size, config.projection_dim)`, *optional*):
            The conditional embeddings for the query images. If provided, the model will use this instead of computing
            the embeddings from the conditional_pixel_values.
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).

        Examples:

        ```python
        >>> import torch
        >>> from transformers import AutoProcessor, CLIPSegForImageSegmentation
        >>> from transformers.image_utils import load_image

        >>> processor = AutoProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
        >>> model = CLIPSegForImageSegmentation.from_pretrained("CIDAS/clipseg-rd64-refined")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = load_image(url)

        >>> texts = ["a cat", "a remote", "a blanket"]
        >>> inputs = processor(text=texts, images=[image] * len(texts), padding=True, return_tensors="pt")

        >>> with torch.inference_mode():
        ...     outputs = model(**inputs)

        >>> logits = outputs.logits
        >>> print(logits.shape)
        torch.Size([3, 352, 352])
        ```TÚoutput_hidden_statesrŒ  r   )r#  r\  rE   rF   Nr   )r–   r¨   rµ   rX   r”  zWMake sure to pass as many conditional embeddings as there are query images in the batchzcMake sure that the feature dimension of the conditional embeddings matches `config.projection_dim`.)r   rD   rI   rJ   r$   rK   rA   )r>   r  r’  r‰  r\  rE   r7  r   r#  rF   r–  r}   r’   rP   r,  r“  rD   r“   rZ  r   ÚBCEWithLogitsLossrH   )r7   r¨   rŽ   r”  rI   rµ   rX   r—  r�   r¸   rˆ  rJ   rE   rJ  rH  Údecoder_outputsrD   r   Úloss_fns                      r/   r›   z#CLIPSegForImageSegmentation.forwardê  sé  € ôb �]‰]‹_ñ 	Ø-1ˆFÐ)Ñ*Ø9˜TŸY™Y×9Ñ9ð Ø)Ø)Añð ñˆNð
 +×8Ñ8ˆMà*×8Ñ8ˆMà9=×9LÑ9LÖM°A˜=¨¨Q©Ó/ÐMˆKÐMô 8Ø"0×"BÑ"BØ,×:Ñ:Ø,×:Ñ:Ø)×4Ñ4ô	ˆN÷	ð, "Ð)Ø%)×%DÑ%DØ'×-Ñ-¨aÑ0Ø#Ø-Ø)Ø)Að &Eó &Ñ"ð &×+Ñ+¨AÑ.°,×2DÑ2DÀQÑ2GÒGÜ Ømóð ð &×+Ñ+¨AÑ.°$·+±+×2LÑ2LÒLÜ ð0óð ð '˜$Ÿ,™,ØØ"ñ
ð ñ
ˆð
 !×'Ñ'ˆàˆØÐà—Y‘Y˜vŸ}™}Ó-ˆFÜ×*Ñ*Ó,ˆGÙ˜6 6Ó*ˆDä-ØØØ#9Ø'Ø .Ø*ô
ð 	
ùò[ N÷	ð 	ús   •AF#Á FÁ/9F#ÆF#Æ#F,)NNNNN)NNNNNNNT)r:   r;   r<   r   r@   r^   rž   r>   r�   r?   r–  r   r   r°   rh  r   r   r4   r   r›   rŸ   r    s   @r/   r�  r�  ½  s�  ø… ð Óð˜}õ ð "&Ø)-Ø.2Ø,0Ø8<ñ&à˜$‘Jð&ð —<‘< $Ñ&ð&ð Ÿ™ tÑ+ð	&ð
 —l‘l TÑ)ð&ð #(§,¡,°Ñ"5ð&ð 
×	Ñ	ó&ð: Øð /3Ø15Ø=AØ;?Ø.2Ø04Ø*.Ø)-ñn
à×$Ñ$ tÑ+ðn
ð ×'Ñ'¨$Ñ.ðn
ð #(×"3Ñ"3°dÑ":ð	n
ð
 !&× 1Ñ 1°DÑ 8ðn
ð Ÿ™ tÑ+ðn
ð ×&Ñ&¨Ñ-ðn
ð × Ñ  4Ñ'ðn
ð #'ðn
ð Ð+Ñ,ðn
ð 
�Ñ	òn
ó ó ôn
r9   r�  )r  rú   rP  rb  r�  )rÓ   )Ar9  rE  Úcollections.abcr   Údataclassesr   Útypingr   r>   r   Ú r   r  rH  r	   Úmasking_utilsr
   Úmodeling_layersr   Úmodeling_outputsr   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.genericr   r   Úutils.output_capturingr   Úconfiguration_clipsegr   r   r   r   rC   rH   ÚModulerO   r¢   r�   ÚfloatrÂ   rÄ   rÜ   rå   rö   rú   r  r&  rP  rb  rk  rq  rz  r  r�  Ú__all__rA   r9   r/   ú<module>r­     s¼  ðó* Û Ý $Ý !Ý ã Ý å &Ý !Ý /Ý 9ß Kß FÝ &ß OÓ Oß IÝ 5ß XÑ Xð Ø
ô_�Kó _ó ó ð_ð@ Ø
ô<˜;ó <ó ó ð<ð" Ø
ô_ [ó _ó ó ð_ô6P˜bŸi™iô Pôf%˜BŸI™Iô %ð^ ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð ð%ð ð%ð Ð'Ñ(ó%ô*7)�r—y‘yô 7)ôt�—‘ô ôÐ4ô ôB$Ð4ô $ðN ô2˜_ó 2ó ð2ôj
�R—Y‘Yô 
ôDU3Ð+ô U3ñp ðôô
\
Ð-ó \
óð
\
ñ~ ðôô
>
Ð/ó >
óð
>
ðF`˜UŸ\™\ð `¨e¯l©ló `ð-¨E¯L©Lð -¸U¿\¹\ó -ð˜UŸ\™\ð ¨e¯l©ló ð ôj
Ð)ó j
ó ðj
ñZ ðôô
X
Ð"8ó X
óð
X
òv�r9   