§
    ‚Štj=  ã                   ó8  — 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 dd	lmZ dd
l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mZmZmZm Z m!Z! ddl"m#Z#  ej$        e%¦  «        Z& G d„ dej'        ¦  «        Z( G d„ de¦  «        Z) G d„ de¦  «        Z* G d„ de¦  «        Z+ G d„ de¦  «        Z, G d„ de ¦  «        Z-e G d„ de!¦  «        ¦   «         Z.e G d„ d e¦  «        ¦   «         Z/ ed!¬"¦  «         G d#„ d$e.¦  «        ¦   «         Z0g d%¢Z1dS )&zHPyTorch ViViT model - modular file inheriting transformer core from ViT.é    )ÚIterableN)Únné   )Úinitialization)Úcreate_bidirectional_mask)ÚBaseModelOutputÚBaseModelOutputWithPoolingÚImageClassifierOutput)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚlogging)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputsé   )ÚPreTrainedModelÚViTAttentionÚViTEmbeddingsÚViTLayerÚViTMLPÚViTModelÚ	ViTPoolerÚViTPreTrainedModelé   )ÚVivitConfigc                   óL   ‡ — e Zd ZdZdefˆ fd„Zdej        dej        fd„Zˆ xZ	S )ÚVivitTubeletEmbeddingsay  
    This class turns `pixel_values` of shape `(batch_size, num_frames, num_channels, height, width)` into the initial
    `hidden_states` (tubelet embeddings) of shape `(batch_size, seq_length, hidden_size)` to be consumed by a
    Transformer encoder.

    The seq_length equals (num_frames // tubelet_size[0]) * (height // tubelet_size[1]) * (width // tubelet_size[2]).
    Úconfigc                 óh  •— t          ¦   «                              ¦   «          |j        }|j        }t	          |t
          ¦  «        r|n||f}|j        |d         z  |d         |d         z  z  |d         |d         z  z  | _        || _        t          j	        |j
        |j        ||¬¦  «        | _        d S )Nr   r   r   )Úkernel_sizeÚstride)ÚsuperÚ__init__Útubelet_sizeÚ
image_sizeÚ
isinstancer   Ú
num_framesÚnum_patchesr   ÚConv3dÚnum_channelsÚhidden_sizeÚ
projection)Úselfr   r%   r&   Ú	__class__s       €úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/vivit/modular_vivit.pyr$   zVivitTubeletEmbeddings.__init__5   s¿   ø€ Ý‰Œ×ÒÑÔÐØÔ*ˆØÔ&ˆ
Ý#-¨j½(Ñ#CÔ#CÐa�Z�ZÈ*ÐV`ÐIaˆ
ð Ô ,¨q¤/Ñ1Ø˜!Œ} ¨Q¤Ñ/ñ1à˜!Œ} ¨Q¤Ñ/ñ1ð 	Ôð
 %ˆŒÝœ)ØÔ Ô!3ÀÐVbð
ñ 
ô 
ˆŒˆˆó    Úpixel_valuesÚreturnc                 ó¦   — |                      dd¦  «        }|                      |¦  «                             d¦  «                              dd¦  «        S )Nr   r   )Ú	transposer-   Úflatten)r.   r2   s     r0   ÚforwardzVivitTubeletEmbeddings.forwardE   sG   € à#×-Ò-¨a°Ñ3Ô3ˆØ�Š˜|Ñ,Ô,×4Ò4°QÑ7Ô7×AÒAÀ!ÀQÑGÔGÐGr1   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   ÚtorchÚTensorr7   Ú__classcell__©r/   s   @r0   r   r   ,   s~   ø€ € € € € ðð ð
˜{ð 
ð 
ð 
ð 
ð 
ð 
ð H E¤Lð H°U´\ð Hð Hð Hð Hð Hð Hð Hð Hr1   r   c                   ó‚   ‡ — e Zd ZdZdefˆ fd„Zdej        dededej        fˆ fd„Z	dd
ej        de
dej        fd„Zˆ xZS )ÚVivitEmbeddingszY
    Construct the CLS token, position and tubelet patch embeddings for video input.
    r   c                 ó‚  •— t          ¦   «                              ¦   «          t          j        t	          j        dd|j        ¦  «        ¦  «        | _        t          |¦  «        | _	        | j	        j
        }t          j        t	          j        d|dz   |j        ¦  «        ¦  «        | _        |j        dd …         | _        | `d S )Nr   )r#   r$   r   Ú	Parameterr<   Úzerosr,   Ú	cls_tokenr   Úpatch_embeddingsr)   Úposition_embeddingsr%   Ú
patch_sizeÚ
mask_token)r.   r   r)   r/   s      €r0   r$   zVivitEmbeddings.__init__P   sš   ø€ Ý‰Œ×ÒÑÔÐåœ¥e¤k°!°Q¸Ô8JÑ&KÔ&KÑLÔLˆŒÝ 6°vÑ >Ô >ˆÔØÔ+Ô7ˆÝ#%¤<µ´¸A¸{ÈQ¹ÐPVÔPbÑ0cÔ0cÑ#dÔ#dˆÔ à Ô-¨a¨b¨bÔ1ˆŒØˆOˆOˆOr1   Ú
embeddingsÚheightÚwidthr3   c                 óŽ   •— t          ¦   «                              |||¦  «         || j        d         z  }|| j        d         z  }d S )Nr   r   )r#   Úinterpolate_pos_encodingrH   )r.   rJ   rK   rL   Ú
new_heightÚ	new_widthr/   s         €r0   rN   z(VivitEmbeddings.interpolate_pos_encoding[   sE   ø€ Ý‰Œ×(Ò(¨°V¸UÑCÔCÐCà˜tœ¨qÔ1Ñ1ˆ
Ø˜Tœ_¨QÔ/Ñ/ˆ	ˆ	ˆ	r1   Fr2   rN   c                 óÒ  — |j         \  }}}}}|                      |¦  «        }| j                             |dd¦  «        }	t	          j        |	|fd¬¦  «        }|r||                      |||¦  «        z   }n^|| j        d         k    s|| j        d         k    r2t          d|› d|› d| j        d         › d| j        d         › d�	¦  «        ‚|| j	        z   }|  
                    |¦  «        }|S )	Néÿÿÿÿr   )Údimr   zInput image size (Ú*z) doesn't match model (z).)ÚshaperF   rE   Úexpandr<   ÚcatrN   r&   Ú
ValueErrorrG   Údropout)
r.   r2   rN   Ú
batch_sizer(   r+   rK   rL   rJ   Ú
cls_tokenss
             r0   r7   zVivitEmbeddings.forwarda   s3  € Ø>JÔ>PÑ;ˆ
�J ¨f°eØ×*Ò*¨<Ñ8Ô8ˆ
ð ”^×*Ò*¨:°r¸2Ñ>Ô>ˆ
Ý”Y 
¨JÐ7¸QÐ?Ñ?Ô?ˆ
à#ð 	?Ø# d×&CÒ&CÀJÐPVÐX]Ñ&^Ô&^Ñ^ˆJˆJà˜œ¨Ô+Ò+Ð+¨u¸¼ÈÔ8JÒ/JÐ/JÝ ðE¨ð Eð E°%ð Eð EØœ¨Ô+ðEð EØ.2¬o¸aÔ.@ðEð Eð Eñô ð ð $ dÔ&>Ñ>ˆJà—\’\ *Ñ-Ô-ˆ
àÐr1   )F)r8   r9   r:   r;   r   r$   r<   r=   ÚintrN   Úboolr7   r>   r?   s   @r0   rA   rA   K   sÃ   ø€ € € € € ðð ð	˜{ð 	ð 	ð 	ð 	ð 	ð 	ð0°5´<ð 0Èð 0ÐUXð 0Ð]bÔ]ið 0ð 0ð 0ð 0ð 0ð 0ðð  E¤Lð ÈDð Ð]bÔ]ið ð ð ð ð ð ð ð r1   rA   c                   ó   — e Zd ZdS )ÚVivitAttentionN©r8   r9   r:   © r1   r0   r_   r_   x   ó   € € € € € Ø€Dr1   r_   c                   ó   — e Zd ZdS )ÚVivitMLPNr`   ra   r1   r0   rd   rd   |   rb   r1   rd   c                   ó   — e Zd ZdS )Ú
VivitLayerNr`   ra   r1   r0   rf   rf   €   rb   r1   rf   c                   ó   — e Zd ZdS )ÚVivitPoolerNr`   ra   r1   r0   rh   rh   „   rb   r1   rh   c                   óZ   — e Zd ZU eed<   dZdZddgZ ej	        ¦   «         d„ ¦   «         Z
dS )ÚVivitPreTrainedModelr   Úvivit)ÚvideorA   rf   c                 óÂ   — t          j        | |¦  «         t          |t          ¦  «        r4t	          j        |j        ¦  «         t	          j        |j        ¦  «         dS dS )zInitialize the weightsN)r   Ú_init_weightsr'   rA   ÚinitÚzeros_rE   rG   )r.   Úmodules     r0   rn   z"VivitPreTrainedModel._init_weights�   s_   € õ 	Ô% d¨FÑ3Ô3Ð3Ý�f�oÑ.Ô.ð 	4ÝŒK˜Ô(Ñ)Ô)Ð)ÝŒK˜Ô2Ñ3Ô3Ð3Ð3Ð3ð	4ð 	4r1   N)r8   r9   r:   r   Ú__annotations__Úbase_model_prefixÚinput_modalitiesÚ_no_split_modulesr<   Úno_gradrn   ra   r1   r0   rj   rj   ˆ   sZ   € € € € € € àÐÐÑØÐØ!ÐØ*¨LÐ9Ðà€U„]�_„_ð4ð 4ñ „_ð4ð 4ð 4r1   rj   c                   ó¾   ‡ — e Zd Zddedefˆ fd„Ze ed¬¦  «        e	 	 	 dde	j
        dz  d	ed
e	j        dz  dee         def
d„¦   «         ¦   «         ¦   «         Zˆ xZS )Ú
VivitModelTr   Úadd_pooling_layerc                 ór   •— t          ¦   «                              |¦  «         t          |¦  «        | _        dS )zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        N)r#   r$   rA   rJ   )r.   r   ry   r/   s      €r0   r$   zVivitModel.__init__š   s0   ø€ õ
 	‰Œ×Ò˜Ñ Ô Ð Ý)¨&Ñ1Ô1ˆŒˆˆr1   F)Útie_last_hidden_statesNr2   rN   Úattention_maskÚkwargsr3   c                 ó  — |                       ||¬¦  «        }t          | j        ||¬¦  «        }|}| j        D ]} |||fi |¤Ž}Œ|                      |¦  «        }| j        �|                      |¦  «        nd}	t          ||	¬¦  «        S )a  
        Examples:

        ```python
        >>> import av
        >>> import numpy as np

        >>> from transformers import VivitImageProcessor, VivitModel
        >>> from huggingface_hub import hf_hub_download

        >>> np.random.seed(0)


        >>> def read_video_pyav(container, indices):
        ...     '''
        ...     Decode the video with PyAV decoder.
        ...     Args:
        ...         container (`av.container.input.InputContainer`): PyAV container.
        ...         indices (`list[int]`): List of frame indices to decode.
        ...     Returns:
        ...         result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3).
        ...     '''
        ...     frames = []
        ...     container.seek(0)
        ...     start_index = indices[0]
        ...     end_index = indices[-1]
        ...     for i, frame in enumerate(container.decode(video=0)):
        ...         if i > end_index:
        ...             break
        ...         if i >= start_index and i in indices:
        ...             frames.append(frame)
        ...     return np.stack([x.to_ndarray(format="rgb24") for x in frames])


        >>> def sample_frame_indices(clip_len, frame_sample_rate, seg_len):
        ...     '''
        ...     Sample a given number of frame indices from the video.
        ...     Args:
        ...         clip_len (`int`): Total number of frames to sample.
        ...         frame_sample_rate (`int`): Sample every n-th frame.
        ...         seg_len (`int`): Maximum allowed index of sample's last frame.
        ...     Returns:
        ...         indices (`list[int]`): List of sampled frame indices
        ...     '''
        ...     converted_len = int(clip_len * frame_sample_rate)
        ...     end_idx = np.random.randint(converted_len, seg_len)
        ...     start_idx = end_idx - converted_len
        ...     indices = np.linspace(start_idx, end_idx, num=clip_len)
        ...     indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64)
        ...     return indices


        >>> # video clip consists of 300 frames (10 seconds at 30 FPS)
        >>> file_path = hf_hub_download(
        ...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
        ... )
        >>> container = av.open(file_path)

        >>> # sample 32 frames
        >>> indices = sample_frame_indices(clip_len=32, frame_sample_rate=1, seg_len=container.streams.video[0].frames)
        >>> video = read_video_pyav(container=container, indices=indices)

        >>> image_processor = VivitImageProcessor.from_pretrained("google/vivit-b-16x2-kinetics400")
        >>> model = VivitModel.from_pretrained("google/vivit-b-16x2-kinetics400")

        >>> # prepare video for the model
        >>> inputs = image_processor(list(video), return_tensors="pt")

        >>> # forward pass
        >>> outputs = model(**inputs)
        >>> last_hidden_states = outputs.last_hidden_state
        >>> list(last_hidden_states.shape)
        [1, 3137, 768]
        ```)rN   )r   Úinputs_embedsr|   N)Úlast_hidden_stateÚpooler_output)rJ   r   r   ÚlayersÚ	layernormÚpoolerr	   )
r.   r2   rN   r|   r}   Úembedding_outputÚhidden_statesÚlayerÚsequence_outputÚpooled_outputs
             r0   r7   zVivitModel.forward¢   s³   € ðj  Ÿ?š?¨<ÐRj˜?ÑkÔkÐÝ2Ø”;Ø*Ø)ð
ñ 
ô 
ˆð
 )ˆØ”[ð 	Kð 	KˆEØ!˜E -°ÐJÐJÀ6ÐJÐJˆMˆMØŸ.š.¨Ñ7Ô7ˆØ8<¼Ð8O˜Ÿš OÑ4Ô4Ð4ÐUYˆå)¸OÐ[hÐiÑiÔiÐir1   )T)NFN)r8   r9   r:   r   r]   r$   r   r   r   r<   ÚFloatTensorr=   r   r   r	   r7   r>   r?   s   @r0   rx   rx   ˜   s  ø€ € € € € ð2ð 2˜{ð 2¸tð 2ð 2ð 2ð 2ð 2ð 2ð  Ø€_¨EÐ2Ñ2Ô2Øð 26Ø).Ø.2ð	^jð ^jàÔ'¨$Ñ.ð^jð #'ð^jð œ tÑ+ð	^jð
 Ð+Ô,ð^jð 
$ð^jð ^jð ^jñ „^ñ 3Ô2ñ  Ôð^jð ^jð ^jð ^jð ^jr1   rx   aý  
        ViViT Transformer model with a video classification head on top (a linear layer on top of the final hidden state of the
    [CLS] token) e.g. for Kinetics-400.

        <Tip>

            Note that it's possible to fine-tune ViT on higher resolution images than the ones it has been trained on, by
            setting `interpolate_pos_encoding` to `True` in the forward of the model. This will interpolate the pre-trained
            position embeddings to the higher resolution.

        </Tip>
    )Úcustom_introc                   ó”   ‡ — e Zd Zdefˆ fd„Zee	 	 	 ddej        dz  dej	        dz  de
dee         d	ef
d
„¦   «         ¦   «         Zˆ xZS )ÚVivitForVideoClassificationr   c                 ó:  •— t          ¦   «                              |¦  «         |j        | _        t          |d¬¦  «        | _        |j        dk    rt          j        |j        |j        ¦  «        nt          j        ¦   «         | _	        |  
                    ¦   «          d S )NF)ry   r   )r#   r$   Ú
num_labelsrx   rk   r   ÚLinearr,   ÚIdentityÚ
classifierÚ	post_init)r.   r   r/   s     €r0   r$   z$VivitForVideoClassification.__init__  s‹   ø€ Ý‰Œ×Ò˜Ñ Ô Ð à Ô+ˆŒÝ ¸%Ð@Ñ@Ô@ˆŒ
ð OUÔN_ÐbcÒNcÐNc�"œ) FÔ$6¸Ô8IÑJÔJÐJÕikÔitÑivÔivˆŒð 	�ŠÑÔÐÐÐr1   NFr2   ÚlabelsrN   r}   r3   c                 óà   —  | j         |fd|i|¤Ž}|j        }|                      |dd…ddd…f         ¦  «        }d}|� | j        ||| j        fi |¤Ž}t          |||j        |j        ¬¦  «        S )a  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the image 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 av
        >>> import numpy as np
        >>> import torch

        >>> from transformers import VivitImageProcessor, VivitForVideoClassification
        >>> from huggingface_hub import hf_hub_download

        >>> np.random.seed(0)


        >>> def read_video_pyav(container, indices):
        ...     '''
        ...     Decode the video with PyAV decoder.
        ...     Args:
        ...         container (`av.container.input.InputContainer`): PyAV container.
        ...         indices (`list[int]`): List of frame indices to decode.
        ...     Returns:
        ...         result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3).
        ...     '''
        ...     frames = []
        ...     container.seek(0)
        ...     start_index = indices[0]
        ...     end_index = indices[-1]
        ...     for i, frame in enumerate(container.decode(video=0)):
        ...         if i > end_index:
        ...             break
        ...         if i >= start_index and i in indices:
        ...             frames.append(frame)
        ...     return np.stack([x.to_ndarray(format="rgb24") for x in frames])


        >>> def sample_frame_indices(clip_len, frame_sample_rate, seg_len):
        ...     '''
        ...     Sample a given number of frame indices from the video.
        ...     Args:
        ...         clip_len (`int`): Total number of frames to sample.
        ...         frame_sample_rate (`int`): Sample every n-th frame.
        ...         seg_len (`int`): Maximum allowed index of sample's last frame.
        ...     Returns:
        ...         indices (`list[int]`): List of sampled frame indices
        ...     '''
        ...     converted_len = int(clip_len * frame_sample_rate)
        ...     end_idx = np.random.randint(converted_len, seg_len)
        ...     start_idx = end_idx - converted_len
        ...     indices = np.linspace(start_idx, end_idx, num=clip_len)
        ...     indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64)
        ...     return indices


        >>> # video clip consists of 300 frames (10 seconds at 30 FPS)
        >>> file_path = hf_hub_download(
        ...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
        ... )
        >>> container = av.open(file_path)

        >>> # sample 32 frames
        >>> indices = sample_frame_indices(clip_len=32, frame_sample_rate=4, seg_len=container.streams.video[0].frames)
        >>> video = read_video_pyav(container=container, indices=indices)

        >>> image_processor = VivitImageProcessor.from_pretrained("google/vivit-b-16x2-kinetics400")
        >>> model = VivitForVideoClassification.from_pretrained("google/vivit-b-16x2-kinetics400")

        >>> inputs = image_processor(list(video), return_tensors="pt")

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

        >>> # model predicts one of the 400 Kinetics-400 classes
        >>> predicted_label = logits.argmax(-1).item()
        >>> print(model.config.id2label[predicted_label])
        LABEL_116
        ```rN   Nr   )ÚlossÚlogitsr†   Ú
attentions)rk   r€   r’   Úloss_functionr   r
   r†   r˜   )	r.   r2   r”   rN   r}   Úoutputsrˆ   r—   r–   s	            r0   r7   z#VivitForVideoClassification.forward!  s²   € ðx $. 4¤:Øð$
ð $
Ø3Kð$
ØOUð$
ð $
ˆð "Ô3ˆØ—’ °°°°A°q°q°q°Ô!9Ñ:Ô:ˆàˆØÐØ%�4Ô% f¨f°d´kÐLÐLÀVÐLÐLˆDå$ØØØ!Ô/ØÔ)ð	
ñ 
ô 
ð 	
r1   )NNF)r8   r9   r:   r   r$   r   r   r<   rŠ   Ú
LongTensorr]   r   r   r
   r7   r>   r?   s   @r0   r�   r�     sÓ   ø€ € € € € ð
˜{ð 
ð 
ð 
ð 
ð 
ð 
ð Øð 26Ø*.Ø).ð	i
ð i
àÔ'¨$Ñ.ði
ð Ô  4Ñ'ði
ð #'ð	i
ð
 Ð+Ô,ði
ð 
ði
ð i
ð i
ñ „^ñ Ôði
ð i
ð i
ð i
ð i
r1   r�   )rx   rj   r�   )2r;   Úcollections.abcr   r<   r   Ú r   ro   Úmasking_utilsr   Úmodeling_outputsr   r	   r
   Úprocessing_utilsr   Úutilsr   r   r   Úutils.genericr   r   Úutils.output_capturingr   Úvit.modeling_vitr   r   r   r   r   r   r   r   Úconfiguration_vivitr   Ú
get_loggerr8   ÚloggerÚModuler   rA   r_   rd   rf   rh   rj   rx   r�   Ú__all__ra   r1   r0   ú<module>rª      sS  ðð OÐ Nà $Ð $Ð $Ð $Ð $Ð $à €€€Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bØ &Ð &Ð &Ð &Ð &Ð &Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ 5Ð 5Ð 5Ð 5Ð 5Ð 5ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð -Ð ,Ð ,Ð ,Ð ,Ð ,ð 
ˆÔ	˜HÑ	%Ô	%€ðHð Hð Hð Hð H˜RœYñ Hô Hð Hð>*ð *ð *ð *ð *�mñ *ô *ð *ðZ	ð 	ð 	ð 	ð 	�\ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	ˆvñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�)ñ 	ô 	ð 	ð ð4ð 4ð 4ð 4ð 4Ð-ñ 4ô 4ñ „ð4ð ðjjð jjð jjð jjð jj�ñ jjô jjñ „ðjjðZ €ððñ ô ðx
ð x
ð x
ð x
ð x
Ð"6ñ x
ô x
ñô ðx
ðv PÐ
OÐ
O€€€r1   