§
    e�’j-'  ã                   óV  — d Z ddlZddlmZ ddlmZmZ ddlm	Z	m
Z
mZmZmZ ddlmZmZmZ ddlmZmZ  ej        e¦  «        Zd	Zd
„  ed¦  «        D ¦   «         d„  ed¦  «        D ¦   «         z   Z G d„ de¦  «        Z G d„ de
d¬¦  «        Ze G d„ de¦  «        ¦   «         ZdgZdS )z 
Processor class for PaliGemma.
é    Né   )ÚBatchFeature)Ú
ImageInputÚis_valid_image)ÚMultiModalDataÚProcessingKwargsÚProcessorMixinÚ
TextKwargsÚUnpack)Ú
AddedTokenÚPreTokenizedInputÚ	TextInput)Úauto_docstringÚloggingz<image>c                 ó   — g | ]	}d |d›d�‘Œ
S )z<locz0>4ú>© ©Ú.0Úis     ú`C:\Projects\DSCons\.venv\Lib\site-packages\transformers\models\paligemma\processing_paligemma.pyú
<listcomp>r   $   s"   € Ð5Ð5Ð5 A��q����Ð5Ð5Ð5ó    i   c                 ó   — g | ]	}d |d›d�‘Œ
S )z<segz0>3r   r   r   s     r   r   r   $   s"   € Ð8]Ð8]Ð8]ÈQ¸À¸¸¸¸Ð8]Ð8]Ð8]r   é€   c                   óN   — e Zd ZU dZeez  ee         z  ee         z  dz  ed<   dS )ÚPaliGemmaTextKwargsa—  
    suffix (`str`, `list[str]`, `list[list[str]]`):
        The suffixes or batch of suffixes to be encoded. Only necessary for finetuning. See https://github.com/google-research/big_vision/blob/main/big_vision/configs/proj/paligemma/README.md
        for more information. If your prompt is "<image> What is on the image", the suffix corresponds to the expected prediction "a cow sitting on a bench".
    NÚsuffix)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚlistÚ__annotations__r   r   r   r   r   '   sJ   € € € € € € ðð ð Ð)Ñ)¨D°¬OÑ;¸dÐCTÔ>UÑUÐX\Ñ\Ð\Ð\Ñ\Ð\Ð\r   r   c                   ó.   — e Zd ZU eed<   dddœddidœZdS )ÚPaliGemmaProcessorKwargsÚtext_kwargsF)ÚpaddingÚreturn_mm_token_type_idsÚdata_formatÚchannels_first)r'   Úimages_kwargsN)r   r    r!   r   r$   Ú	_defaultsr   r   r   r&   r&   1   sG   € € € € € € Ø$Ð$Ð$Ñ$ð Ø(-ð
ð 
ð
 Ð+ð
ðð €I€I€Ir   r&   F)Útotalc            
       ó:  ‡ — e Zd ZeZ	 	 	 dˆ fd„	Ze	 	 ddedz  dee	z  e
e         z  e
e	         z  dee         defˆ fd„¦   «         Zdˆ fd„	Z	 	 ddedz  dee	z  e
e         z  e
e	         z  dz  dee         fˆ fd	„Zd
ededefd„Zdd„Zeˆ fd„¦   «         Zˆ xZS )ÚPaliGemmaProcessorNc                 ó   •— t          |d¦  «        st          d¦  «        ‚|j        | _        t          |d¦  «        s]t          t          dd¬¦  «        }d|gi}|                     |¦  «         |                     t          ¦  «        | _        t          | _        n|j        | _        |j        | _        | 	                    t          ¦  «         d|_        d|_        t          ¦   «                              |||¬¦  «         d S )	NÚimage_seq_lengthz;Image processor is missing an `image_seq_length` attribute.Úimage_tokenFT)Ú
normalizedÚspecialÚadditional_special_tokens)Úchat_template)ÚhasattrÚ
ValueErrorr2   r   ÚIMAGE_TOKENÚadd_special_tokensÚconvert_tokens_to_idsÚimage_token_idr3   Ú
add_tokensÚEXTRA_TOKENSÚadd_bos_tokenÚadd_eos_tokenÚsuperÚ__init__)ÚselfÚimage_processorÚ	tokenizerr7   Úkwargsr3   Útokens_to_addÚ	__class__s          €r   rC   zPaliGemmaProcessor.__init__B   sù   ø€ õ �Ð(:Ñ;Ô;ð 	\ÝÐZÑ[Ô[Ð[à /Ô @ˆÔå�y -Ñ0Ô0ð 	5Ý$¥[¸UÈDÐQÑQÔQˆKØ8¸;¸-ÐHˆMØ×(Ò(¨Ñ7Ô7Ð7Ø"+×"AÒ"AÅ+Ñ"NÔ"NˆDÔÝ*ˆDÔÐà"+Ô":ˆDÔØ(Ô4ˆDÔà×Ò�\Ñ*Ô*Ð*Ø"'ˆ	ÔØ"'ˆ	Ôå‰Œ×Ò˜¨)À=ÐÑQÔQÐQÐQÐQr   ÚimagesÚtextrG   Úreturnc                 óú  •‡ — |                      dd¦  «        x}�2t          |t          t          f¦  «        s|g}ˆ fd„|D ¦   «         }||d<   d|d<    ‰ j        t
          fd‰ j        j        i|¤Ž}|d                              d	¦  «        } t          ¦   «         j
        d||d
œ|¤Ž}d|v r@t          j        |d         ¦  «        }d|t          j        |d         ¦  «        dk    <   ||d<   t          ||¬¦  «        S )aô  
        Returns:
            [`BatchFeature`]: A [`BatchFeature`] with the following fields:

            - **input_ids** -- List of token ids to be fed to a model. Returned when `text` is not `None`. If `suffix`
              is provided, the `input_ids` will also contain the suffix input ids.
            - **attention_mask** -- List of indices specifying which tokens should be attended to by the model (when
              `return_attention_mask=True` or if *"attention_mask"* is in `self.model_input_names` and if `text` is not
              `None`).
            - **pixel_values** -- Pixel values to be fed to a model. Returned when `images` is not `None`.
            - **labels** -- Labels compatible with training if `suffix` is not None
        r   Nc                 ó.   •— g | ]}|‰j         j        z   ‘ŒS r   )rF   Ú	eos_token)r   ÚsamplerD   s     €r   r   z/PaliGemmaProcessor.__call__.<locals>.<listcomp>t   s#   ø€ ÐMÐMÐM¸F�f˜tœ~Ô7Ñ7ÐMÐMÐMr   Ú	text_pairTÚreturn_token_type_idsÚtokenizer_init_kwargsr'   Úreturn_tensors©rJ   rK   Útoken_type_idsÚ	input_idsiœÿÿÿr   Úlabels)ÚdataÚtensor_typer   )ÚpopÚ
isinstancer#   ÚtupleÚ_merge_kwargsr&   rF   Úinit_kwargsÚgetrB   Ú__call__ÚnpÚarrayr   )	rD   rJ   rK   rG   r   rT   ÚresultrX   rI   s	   `       €r   ra   zPaliGemmaProcessor.__call__^   s8  øø€ ð& —j’j ¨4Ñ0Ô0Ð0ˆFÐ=Ý˜f¥t­U mÑ4Ô4ð "Ø ˜�ØMÐMÐMÐMÀfÐMÑMÔMˆFØ"(ˆF�;Ñà*.ˆÐ&Ñ'Ø#�Ô#Ý$ð
ð 
à"&¤.Ô"<ð
ð ð
ð 
ˆð
   Ô.×2Ò2Ð3CÑDÔDˆØ!•‘”Ô!ÐE¨°dÐEÐE¸fÐEÐEˆð ˜vÐ%Ð%Ý”X˜f [Ô1Ñ2Ô2ˆFØ>BˆF•2”8˜FÐ#3Ô4Ñ5Ô5¸Ò:Ñ;Ø%ˆF�8Ñå °^ÐDÑDÔDÐDr   c                 ó  •‡ — |} t          ¦   «         j        d||dœ|¤Ž^}}}|��á|��Þt          d„ |D ¦   «         ¦  «        �sTt                               d¦  «         t          |¦  «        r|ggt          |¦  «        z  }nùt          |t          t          f¦  «        rrt          |d         ¦  «        r]t          |¦  «        t          |¦  «        k    r0t          dt          |¦  «        › dt          |¦  «        › d�¦  «        ‚d	„ |D ¦   «         }nkt          |t          t          f¦  «        r@t          |d         t          t          f¦  «        rt          |d         d         ¦  «        r|}nt          d
¦  «        ‚ˆ fd„t          ||¦  «        D ¦   «         }npg }|D ]i}|                     t          ¦  «        t          t          ¦  «        z   }|                     |d |…         ‰ j        j        z   ||d …         z   dz   ¦  «         Œj|}||d d fS )NÚ rU   c              3   ó(   K  — | ]}t           |v V — Œd S ©N)r:   )r   rP   s     r   ú	<genexpr>z;PaliGemmaProcessor.prepare_inputs_layout.<locals>.<genexpr>Ž   s'   è è € Ð@Ð@°•{ fÐ,Ð@Ð@Ð@Ð@Ð@Ð@r   aL  You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `<image>` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens.r   z	Received z images for zK prompts. Each prompt should be associated with an image or list of images.c                 ó   — g | ]}|g‘ŒS r   r   )r   Úimages     r   r   z<PaliGemmaProcessor.prepare_inputs_layout.<locals>.<listcomp>Ÿ   s   € Ð(EÐ(EÐ(E°U¨%¨Ð(EÐ(EÐ(Er   zAimages must be an image, list of images or list of list of imagesc                 ó”   •— g | ]D\  }}t           t          |t          ¦  «        rt          |¦  «        nd z  › ‰j        j        › |› d�‘ŒES )é   ú
)r:   r\   r#   ÚlenrF   Ú	bos_token)r   ÚpromptÚ
image_listrD   s      €r   r   z<PaliGemmaProcessor.prepare_inputs_layout.<locals>.<listcomp>©   sw   ø€ ð ð ð á*˜ 
õ #½ÀJÕPTÑ9UÔ9UÐ&\¥c¨*¡o¤o oÐ[\Ñ]ð  DÐ_cÔ_mÔ_wð  DÐyð  Dð  Dð  Dðð ð r   rn   r   )rB   Úprepare_inputs_layoutÚanyÚloggerÚwarningr   ro   r\   r#   r]   r9   ÚzipÚrfindr:   ÚappendrF   rp   )
rD   rJ   rK   rG   Ú_Úimages_per_sampleÚnew_textrP   Úlast_image_endrI   s
   `        €r   rs   z(PaliGemmaProcessor.prepare_inputs_layout‰   su  øø€ ØˆØ8�5™7œ7Ô8Ð\ÀÈTÐ\Ð\ÐU[Ð\Ð\Ðˆ��qàÑ $Ñ"2ÝÐ@Ð@¸4Ð@Ñ@Ô@Ñ@Ô@ñ & å—’ð<ñô ð õ " &Ñ)Ô)ð jØ*0¨¨
µS¸±Y´YÑ(>Ð%Ð%Ý ­­u¨Ñ6Ô6ð j½>È&ÐQRÌ)Ñ;TÔ;Tð jÝ˜6‘{”{¥c¨$¡i¤iÒ/Ð/Ý(ð X­¨F©¬ð  Xð  XÅÀTÁÄð  Xð  Xð  Xñô ð ð )FÐ(E¸fÐ(EÑ(EÔ(EÐ%Ð%å˜v­­e }Ñ5Ô5ðjå" 6¨!¤9­tµU¨mÑ<Ô<ðjõ ' v¨a¤y°¤|Ñ4Ô4ðjð
 )/Ð%Ð%å$Ð%hÑiÔiÐiðð ð ð å.1°$Ð8IÑ.JÔ.Jðñ ô ��ð
 �Ø"ð ð �FØ%+§\¢\µ+Ñ%>Ô%>ÅÅ[ÑAQÔAQÑ%Q�NØ—O’OØ˜ ˜Ô/°$´.Ô2JÑJÈVÐTbÐTcÐTcÔMdÑdÐgkÑkñô ð ð ð  �à�t˜T 4Ð'Ð'r   c                 óž   •—  t          ¦   «         j        d||dœ|¤Ž |€t          d¦  «        ‚|€t                               d¦  «         d S d S )NrU   zF`images` are expected as arguments to a `PaliGemmaProcessor` instance.z]You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.r   )rB   Úvalidate_inputsr9   ru   Úwarning_once)rD   rJ   rK   rG   rI   s       €r   r   z"PaliGemmaProcessor.validate_inputs¸   sn   ø€ ð 	 �‰ŒÔÐC v°DÐCÐC¸FÐCÐCÐCàˆ>ÝÐeÑfÔfÐfàˆ<Ý×ÒØoñô ð ð ð ð ˆ<r   Úimage_inputsÚ	image_idxc                 ó    — | j         | j        z  S rh   )r3   r2   )rD   r�   r‚   rG   s       r   Úreplace_image_tokenz&PaliGemmaProcessor.replace_image_tokenÈ   s   € ØÔ $Ô"7Ñ7Ð7r   c                 ó¨   — i }|�C| j         gt          |¦  «        z  }dgt          |¦  «        z  }|                     ||dœ¦  «         t          di |¤ŽS )a¸  
        Computes the number of placeholder tokens needed for multimodal inputs with the given sizes.

        Args:
            image_sizes (list[list[str]], *optional*):
                The input sizes formatted as (height, width) per each image.
        Returns:
            `MultiModalData`: A `MultiModalData` object holding number of tokens per each of the provided
            input modalities, along with other useful data.
        Nrm   )Únum_image_tokensÚnum_image_patchesr   )r2   ro   Úupdater   )rD   Úimage_sizesrG   Úvision_datar†   r‡   s         r   Ú_get_num_multimodal_tokensz-PaliGemmaProcessor._get_num_multimodal_tokensË   so   € ð ˆØÐ"Ø $Ô 5Ð6½¸[Ñ9IÔ9IÑIÐØ!" ¥c¨+Ñ&6Ô&6Ñ 6ÐØ×ÒÐ4DÐ[lÐmÐmÑnÔnÐnÝÐ,Ð, Ð,Ð,Ð,r   c                 ó4   •— t          ¦   «         j        ddgz   S )NrV   rX   )rB   Úmodel_input_names)rD   rI   s    €r   r�   z$PaliGemmaProcessor.model_input_namesÝ   s   ø€ å‰wŒwÔ(Ð,<¸hÐ+GÑGÐGr   )NNN)NNrh   )r   r    r!   r&   Úvalid_processor_kwargsrC   r   r   r   r   r#   r   r   ra   rs   r   r   ÚdictÚintÚstrr„   r‹   Úpropertyr�   Ú__classcell__)rI   s   @r   r0   r0   >   sß  ø€ € € € € à5Ðð ØØð	Rð Rð Rð Rð Rð Rð8 ð %)ØZ^ð(Eð (Eà˜TÑ!ð(Eð Ð+Ñ+¨d°9¬oÑ=ÀÐEVÔ@WÑWð(Eð Ð1Ô2ð	(Eð
 
ð(Eð (Eð (Eð (Eð (Eñ „^ð(EðT-(ð -(ð -(ð -(ð -(ð -(ðb %)Øaeðð à˜TÑ!ðð Ð+Ñ+¨d°9¬oÑ=ÀÐEVÔ@WÑWÐZ^Ñ^ðð Ð)Ô*ð	ð ð ð ð ð ð 8°ð 8Àð 8ÐSVð 8ð 8ð 8ð 8ð-ð -ð -ð -ð$ ðHð Hð Hð Hñ „XðHð Hð Hð Hð Hr   r0   )r"   Únumpyrb   Úfeature_extraction_utilsr   Úimage_utilsr   r   Úprocessing_utilsr   r   r	   r
   r   Útokenization_utils_baser   r   r   Úutilsr   r   Ú
get_loggerr   ru   r:   Úranger?   r   r&   r0   Ú__all__r   r   r   ú<module>r�      sÔ  ððð ð Ð Ð Ð à 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ð ð ð ð ð ð ð ð ð ð ð ð PÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ð 
ˆÔ	˜HÑ	%Ô	%€à€Ø5Ð5¨¨¨t©¬Ð5Ñ5Ô5Ð8]Ð8]ÐRWÐRWÐX[ÑR\ÔR\Ð8]Ñ8]Ô8]Ñ]€ð]ð ]ð ]ð ]ð ]˜*ñ ]ô ]ð ]ð
ð 
ð 
ð 
ð 
Ð/°uð 
ñ 
ô 
ð 
ð ð`Hð `Hð `Hð `Hð `H˜ñ `Hô `Hñ „ð`HðF  Ð
 €€€r   