Ë
    S^(hƒ”  ã                   ót  — d Z ddlZddlmZmZmZmZmZm	Z	m
Z
 ddlZddl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mZ dd	lmZmZ dd
lmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z' ddl(m)Z)  e#jT                  e+«      Z,dZ-dZ.g d¢Z/dZ0dZ1 G d„ dejd                  «      Z3 G d„ dejd                  «      Z4	 dFdejd                  dejj                  dejj                  dejj                  deejj                     de6de6fd„Z7 G d „ d!ejd                  «      Z8 G d"„ d#ejd                  «      Z9 G d$„ d%ejd                  «      Z: G d&„ d'ejd                  «      Z;dGd(ejj                  d)e6d*e<d+ejj                  fd,„Z= G d-„ d.ejd                  «      Z> G d/„ d0ejd                  «      Z? G d1„ d2ejd                  «      Z@ G d3„ d4ejd                  «      ZA G d5„ d6ejd                  «      ZB G d7„ d8e«      ZCd9ZDd:ZEd;ZF e!d<eD«       G d=„ d>eC«      «       ZG e!d?eD«       G d@„ dAeC«      «       ZH e!dBeD«       G dC„ dDeCe'«      «       ZIg dE¢ZJy)HzPyTorch DINOv2 model.é    N)ÚCallableÚDictÚListÚOptionalÚSetÚTupleÚUnion)Únn)ÚBCEWithLogitsLossÚCrossEntropyLossÚMSELossé   )ÚACT2FN)ÚBackboneOutputÚBaseModelOutputÚBaseModelOutputWithPoolingÚImageClassifierOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)Ú find_pruneable_heads_and_indicesÚprune_linear_layer)Úadd_code_sample_docstringsÚadd_start_docstringsÚ%add_start_docstrings_to_model_forwardÚloggingÚreplace_return_docstringsÚ	torch_int)ÚBackboneMixiné   )ÚDinov2Configr    zfacebook/dinov2-base)r   i  i   z(facebook/dinov2-small-imagenet1k-1-layerztabby, tabby catc                   óÄ   ‡ — e Zd ZdZdeddfˆ fd„Zdej                  dededej                  fd	„Z	dd
ej                  de
ej                     dej                  fd„Zˆ xZS )ÚDinov2EmbeddingszM
    Construct the CLS token, mask token, position and patch embeddings.
    ÚconfigÚreturnNc                 óz  •— t         ‰| �  «        t        j                  t	        j
                  dd|j                  «      «      | _        |j                  r8t        j                  t	        j                  d|j                  «      «      | _
        t        |«      | _        | j                  j                  }t        j                  t	        j
                  d|dz   |j                  «      «      | _        t        j                  |j                   «      | _        |j$                  | _        |j                  | _        || _        y )Nr   )ÚsuperÚ__init__r
   Ú	ParameterÚtorchÚrandnÚhidden_sizeÚ	cls_tokenÚuse_mask_tokenÚzerosÚ
mask_tokenÚDinov2PatchEmbeddingsÚpatch_embeddingsÚnum_patchesÚposition_embeddingsÚDropoutÚhidden_dropout_probÚdropoutÚ
patch_sizer#   )Úselfr#   r2   Ú	__class__s      €úh/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/models/dinov2/modeling_dinov2.pyr'   zDinov2Embeddings.__init__A   sÚ   ø€ Ü‰ÑÔäŸ™¤e§k¡k°!°Q¸×8JÑ8JÓ&KÓLˆŒØ× Ò Ü Ÿl™l¬5¯;©;°q¸&×:LÑ:LÓ+MÓNˆDŒOÜ 5°fÓ =ˆÔØ×+Ñ+×7Ñ7ˆÜ#%§<¡<´·±¸A¸{ÈQ¹ÐPV×PbÑPbÓ0cÓ#dˆÔ Ü—z‘z &×"<Ñ"<Ó=ˆŒØ ×+Ñ+ˆŒØ$×3Ñ3ˆÔØˆ�ó    Ú
embeddingsÚheightÚwidthc                 ó  — |j                   d   dz
  }| j                  j                   d   dz
  }t        j                  j	                  «       s||k(  r||k(  r| j                  S | j                  dd…dd…f   }| j                  dd…dd…f   }|j                   d   }|| j
                  z  }	|| j
                  z  }
t        |dz  «      }|j                  d|||«      }|j                  dddd«      }|j                  }t        j                  j                  |j                  t        j                  «      |	|
fdd	¬
«      j                  |¬«      }|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 and interpolation at torch.float32 precision.

        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   Néÿÿÿÿg      à?r   r   é   ÚbicubicF)ÚsizeÚmodeÚalign_corners©Údtype©Údim)Úshaper3   r)   ÚjitÚ
is_tracingr7   r   ÚreshapeÚpermuterG   r
   Ú
functionalÚinterpolateÚtoÚfloat32ÚviewÚcat)r8   r<   r=   r>   r2   Únum_positionsÚclass_pos_embedÚpatch_pos_embedrI   Ú
new_heightÚ	new_widthÚsqrt_num_positionsÚtarget_dtypes                r:   Úinterpolate_pos_encodingz)Dinov2Embeddings.interpolate_pos_encodingO   s‹  € ð !×&Ñ& qÑ)¨AÑ-ˆØ×0Ñ0×6Ñ6°qÑ9¸AÑ=ˆô �y‰y×#Ñ#Ô%¨+¸Ò*FÈ6ÐUZÊ?Ø×+Ñ+Ð+à×2Ñ2²1°b°q°b°5Ñ9ˆØ×2Ñ2²1°a±b°5Ñ9ˆà×Ñ˜rÑ"ˆà˜tŸ™Ñ.ˆ
Ø˜TŸ_™_Ñ,ˆ	ä& }°cÑ'9Ó:ÐØ)×1Ñ1°!Ð5GÐI[Ð]`ÓaˆØ)×1Ñ1°!°Q¸¸1Ó=ˆØ&×,Ñ,ˆÜŸ-™-×3Ñ3Ø×ÑœuŸ}™}Ó-Ø˜iÐ(ØØð	 4ó 
÷
 ‰"�<ˆ"Ó
 ð 	ð *×1Ñ1°!°Q¸¸1Ó=×BÑBÀ1ÀbÈ#ÓNˆä�y‰y˜/¨?Ð;ÀÔCÐCr;   Úpixel_valuesÚbool_masked_posc                 óD  — |j                   \  }}}}| j                  j                  j                  j                  }| j                  |j                  |¬«      «      }|�d| j                  rXt        j                  |j                  d«      | j                  j                  |j                  «      j                  d«      |«      }| j                  j                  |dd«      }	t        j                  |	|fd¬«      }|| j                  |||«      z   }| j                  |«      }|S )NrF   r@   r   r   rH   )rJ   r1   Ú
projectionÚweightrG   rQ   r-   r)   ÚwhereÚ	unsqueezer/   r,   ÚexpandrT   r\   r6   )
r8   r]   r^   Ú
batch_sizeÚ_r=   r>   r[   r<   Ú
cls_tokenss
             r:   ÚforwardzDinov2Embeddings.forwardw   sý   € Ø'3×'9Ñ'9Ñ$ˆ
�A�v˜uØ×,Ñ,×7Ñ7×>Ñ>×DÑDˆØ×*Ñ*¨<¯?©?À¨?Ó+NÓOˆ
àÐ&¨4×+>Ò+>ÜŸ™Ø×)Ñ)¨"Ó-¨t¯©×/AÑ/AÀ*×BRÑBRÓ/S×/]Ñ/]Ð^_Ó/`ÐblóˆJð
 —^‘^×*Ñ*¨:°r¸2Ó>ˆ
Ü—Y‘Y 
¨JÐ7¸QÔ?ˆ
ð   $×"?Ñ"?À
ÈFÐTYÓ"ZÑZˆ
à—\‘\ *Ó-ˆ
àÐr;   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r'   r)   ÚTensorÚintr\   r   rh   Ú__classcell__©r9   s   @r:   r"   r"   <   s|   ø„ ñð˜|ð °õ ð&D°5·<±<ð &DÈð &DÐUXð &DÐ]b×]iÑ]ió &DñP E§L¡Lð À8ÈEÏLÉLÑCYð Ðej×eqÑeq÷ r;   r"   c                   óZ   ‡ — e Zd ZdZˆ fd„Zdej                  dej                  fd„Zˆ xZS )r0   zì
    This class turns `pixel_values` of shape `(batch_size, num_channels, height, width)` into the initial
    `hidden_states` (patch embeddings) of shape `(batch_size, seq_length, hidden_size)` to be consumed by a
    Transformer.
    c                 óÌ  •— t         ‰| �  «        |j                  |j                  }}|j                  |j
                  }}t        |t        j                  j                  «      r|n||f}t        |t        j                  j                  «      r|n||f}|d   |d   z  |d   |d   z  z  }|| _        || _        || _        || _
        t        j                  ||||¬«      | _        y )Nr   r   )Úkernel_sizeÚstride)r&   r'   Ú
image_sizer7   Únum_channelsr+   Ú
isinstanceÚcollectionsÚabcÚIterabler2   r
   ÚConv2dr`   )r8   r#   rv   r7   rw   r+   r2   r9   s          €r:   r'   zDinov2PatchEmbeddings.__init__”   sÔ   ø€ Ü‰ÑÔØ!'×!2Ñ!2°F×4EÑ4E�Jˆ
Ø$*×$7Ñ$7¸×9KÑ9K�kˆä#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ü#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ø! !‘}¨
°1©Ñ5¸*ÀQ¹-È:ÐVWÉ=Ñ:XÑYˆØ$ˆŒØ$ˆŒØ(ˆÔØ&ˆÔäŸ)™) L°+È:Ð^hÔiˆ�r;   r]   r$   c                 óÚ   — |j                   d   }|| j                  k7  rt        d| j                  › d|› d�«      ‚| j                  |«      j	                  d«      j                  dd«      }|S )Nr   zoMake sure that the channel dimension of the pixel values match with the one set in the configuration. Expected z	 but got ú.rA   )rJ   rw   Ú
ValueErrorr`   ÚflattenÚ	transpose)r8   r]   rw   r<   s       r:   rh   zDinov2PatchEmbeddings.forward£   sz   € Ø#×)Ñ)¨!Ñ,ˆØ˜4×,Ñ,Ò,ÜðØ!×.Ñ.Ð/¨y¸¸ÀaðIóð ð —_‘_ \Ó2×:Ñ:¸1Ó=×GÑGÈÈ1ÓMˆ
ØÐr;   )	rj   rk   rl   rm   r'   r)   rn   rh   rp   rq   s   @r:   r0   r0   �   s)   ø„ ñôjð E§L¡Lð °U·\±\÷ r;   r0   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingr6   c                 óÀ  — t        j                  ||j                  dd«      «      |z  }t        j                  j                  |dt         j                  ¬«      j                  |j                  «      }t        j                  j                  ||| j                  ¬«      }|�||z  }t        j                  ||«      }	|	j                  dd«      j                  «       }	|	|fS )Nr@   éþÿÿÿ)rI   rG   )ÚpÚtrainingr   rA   )r)   Úmatmulr�   r
   rO   ÚsoftmaxrR   rQ   rG   r6   r‹   Ú
contiguous)
r‚   rƒ   r„   r…   r†   r‡   r6   ÚkwargsÚattn_weightsÚattn_outputs
             r:   Úeager_attention_forwardr’   ¯   sÀ   € ô —<‘<  s§}¡}°R¸Ó'<Ó=ÀÑG€Lô —=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÓS×VÑVÐW\×WbÑWbÓc€Lô —=‘=×(Ñ(¨¸È6Ï?É?Ð(Ó[€Lð Ð!Ø# nÑ4ˆä—,‘,˜|¨UÓ3€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€Kà˜Ð$Ð$r;   c            
       óè   ‡ — e Zd Zdeddfˆ fd„Zdej                  dej                  fd„Z	 d
deej                     de	de
eej                  ej                  f   eej                     f   fd	„Zˆ xZS )ÚDinov2SelfAttentionr#   r$   Nc                 ó2  •— t         ‰| �  «        |j                  |j                  z  dk7  r2t	        |d«      s&t        d|j                  › d|j                  › d�«      ‚|| _        |j                  | _        t        |j                  |j                  z  «      | _        | j                  | j                  z  | _	        |j                  | _        | j                  dz  | _        d| _        t        j                  |j                  | j                  |j                   ¬«      | _        t        j                  |j                  | j                  |j                   ¬«      | _        t        j                  |j                  | j                  |j                   ¬«      | _        y )	Nr   Úembedding_sizezThe hidden size z4 is not a multiple of the number of attention heads r~   g      à¿F©Úbias)r&   r'   r+   Únum_attention_headsÚhasattrr   r#   ro   Úattention_head_sizeÚall_head_sizeÚattention_probs_dropout_probÚdropout_probr‡   Ú	is_causalr
   ÚLinearÚqkv_biasrƒ   r„   r…   ©r8   r#   r9   s     €r:   r'   zDinov2SelfAttention.__init__Ï   sF  ø€ Ü‰ÑÔØ×Ñ × :Ñ :Ñ:¸aÒ?ÌÐPVÐXhÔHiÜØ" 6×#5Ñ#5Ð"6ð 7Ø×3Ñ3Ð4°Að7óð ð
 ˆŒØ#)×#=Ñ#=ˆÔ Ü#& v×'9Ñ'9¸F×<VÑ<VÑ'VÓ#WˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔØ"×?Ñ?ˆÔØ×/Ñ/°Ñ5ˆŒØˆŒä—Y‘Y˜v×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆŒ
Ü—9‘9˜V×/Ñ/°×1CÑ1CÈ&Ï/É/ÔZˆŒÜ—Y‘Y˜v×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆ�
r;   Úxc                 ó¤   — |j                  «       d d | j                  | j                  fz   }|j                  |«      }|j	                  dddd«      S )Nr@   r   rA   r   r   )rC   r™   r›   rS   rN   )r8   r£   Únew_x_shapes      r:   Útranspose_for_scoresz(Dinov2SelfAttention.transpose_for_scoresã   sL   € Ø—f‘f“h˜s �m t×'?Ñ'?À×AYÑAYÐ&ZÑZˆØ�F‰F�;ÓˆØ�y‰y˜˜A˜q !Ó$Ð$r;   Ú	head_maskÚoutput_attentionsc           
      ó˜  — | j                  | j                  |«      «      }| j                  | j                  |«      «      }| j                  | j                  |«      «      }t        }| j
                  j                  dk7  rN| j
                  j                  dk(  r|rt        j                  d«       nt        | j
                  j                     } || ||||| j                  | j                  | j                  sdn| j                  ¬«      \  }}	|j                  «       d d | j                  fz   }
|j!                  |
«      }|r||	f}|S |f}|S )NÚeagerÚsdpazã`torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to eager attention. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.ç        )rŸ   r‡   r6   r‰   )r¦   r„   r…   rƒ   r’   r#   Ú_attn_implementationÚloggerÚwarning_oncer   rŸ   r‡   r‹   rž   rC   rœ   rM   )r8   Úhidden_statesr§   r¨   Ú	key_layerÚvalue_layerÚquery_layerÚattention_interfaceÚcontext_layerÚattention_probsÚnew_context_layer_shapeÚoutputss               r:   rh   zDinov2SelfAttention.forwardè   s=  € ð ×-Ñ-¨d¯h©h°}Ó.EÓFˆ	Ø×/Ñ/°·
±
¸=Ó0IÓJˆØ×/Ñ/°·
±
¸=Ó0IÓJˆä(?ÐØ�;‰;×+Ñ+¨wÒ6Ø�{‰{×/Ñ/°6Ò9Ñ>OÜ×#Ñ#ðLõô
 '>¸d¿k¹k×>^Ñ>^Ñ&_Ð#á)<ØØØØØØ—n‘nØ—L‘LØ#Ÿ}š}‘C°$×2CÑ2Cô	*
Ñ&ˆ�ð #0×"4Ñ"4Ó"6°s¸Ð";¸t×?QÑ?QÐ>SÑ"SÐØ%×-Ñ-Ð.EÓFˆá6G�= /Ð2ˆàˆð O\ÐM]ˆàˆr;   ©NF)rj   rk   rl   r    r'   r)   rn   r¦   r   Úboolr	   r   rh   rp   rq   s   @r:   r”   r”   Î   s†   ø„ ð]˜|ð ]°õ ]ð(% e§l¡lð %°u·|±|ó %ð bgñ!Ø(0°·±Ñ(>ð!ØZ^ð!à	ˆu�U—\‘\ 5§<¡<Ð/Ñ0°%¸¿¹Ñ2EÐEÑ	F÷!r;   r”   c                   ó|   ‡ — e Zd ZdZdeddfˆ fd„Zdej                  dej                  dej                  fd„Zˆ xZ	S )	ÚDinov2SelfOutputz£
    The residual connection is defined in Dinov2Layer instead of here (as is the case with other models), due to the
    layernorm applied before each block.
    r#   r$   Nc                 óÈ   •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        j                  |j                  «      | _        y ri   )	r&   r'   r
   r    r+   Údenser4   r5   r6   r¢   s     €r:   r'   zDinov2SelfOutput.__init__  sB   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r;   r°   Úinput_tensorc                 óJ   — | j                  |«      }| j                  |«      }|S ri   )r¾   r6   )r8   r°   r¿   s      r:   rh   zDinov2SelfOutput.forward  s$   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆàÐr;   )
rj   rk   rl   rm   r    r'   r)   rn   rh   rp   rq   s   @r:   r¼   r¼     sD   ø„ ñð
>˜|ð >°õ >ð
 U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r;   r¼   c                   óà   ‡ — e Zd Zdeddfˆ fd„Zdee   ddfd„Z	 	 ddej                  de
ej                     d	edeeej                  ej                  f   eej                     f   fd
„Zˆ xZS )ÚDinov2Attentionr#   r$   Nc                 ó€   •— t         ‰| �  «        t        |«      | _        t	        |«      | _        t        «       | _        y ri   )r&   r'   r”   Ú	attentionr¼   ÚoutputÚsetÚpruned_headsr¢   s     €r:   r'   zDinov2Attention.__init__!  s0   ø€ Ü‰ÑÔÜ,¨VÓ4ˆŒÜ& vÓ.ˆŒÜ›EˆÕr;   Úheadsc                 ó>  — t        |«      dk(  ry t        || j                  j                  | j                  j                  | j
                  «      \  }}t        | j                  j                  |«      | j                  _        t        | j                  j                  |«      | j                  _        t        | j                  j                  |«      | j                  _	        t        | j                  j                  |d¬«      | j                  _        | j                  j                  t        |«      z
  | j                  _        | j                  j                  | j                  j                  z  | j                  _        | j
                  j                  |«      | _        y )Nr   r   rH   )Úlenr   rÄ   r™   r›   rÇ   r   rƒ   r„   r…   rÅ   r¾   rœ   Úunion)r8   rÈ   Úindexs      r:   Úprune_headszDinov2Attention.prune_heads'  s  € Üˆu‹:˜Š?ØÜ7Ø�4—>‘>×5Ñ5°t·~±~×7YÑ7YÐ[_×[lÑ[ló
‰ˆˆuô
  2°$·.±.×2FÑ2FÈÓNˆ�‰ÔÜ/°·±×0BÑ0BÀEÓJˆ�‰ÔÜ1°$·.±.×2FÑ2FÈÓNˆ�‰ÔÜ.¨t¯{©{×/@Ñ/@À%ÈQÔOˆ�‰Ôð .2¯^©^×-OÑ-OÔRUÐV[ÓR\Ñ-\ˆ�‰Ô*Ø'+§~¡~×'IÑ'IÈDÏNÉN×LnÑLnÑ'nˆ�‰Ô$Ø ×-Ñ-×3Ñ3°EÓ:ˆÕr;   r°   r§   r¨   c                 óh   — | j                  |||«      }| j                  |d   |«      }|f|dd  z   }|S )Nr   r   )rÄ   rÅ   )r8   r°   r§   r¨   Úself_outputsÚattention_outputr¸   s          r:   rh   zDinov2Attention.forward9  sE   € ð —~‘~ m°YÐ@QÓRˆàŸ;™; |°A¡¸ÓFÐà#Ð%¨°Q°RÐ(8Ñ8ˆØˆr;   r¹   )rj   rk   rl   r    r'   r   ro   rÍ   r)   rn   r   rº   r	   r   rh   rp   rq   s   @r:   rÂ   rÂ      s’   ø„ ð"˜|ð "°õ "ð;  S¡ð ;¨dó ;ð* -1Ø"'ñ	à—|‘|ðð ˜EŸL™LÑ)ðð  ð	ð
 
ˆu�U—\‘\ 5§<¡<Ð/Ñ0°%¸¿¹Ñ2EÐEÑ	F÷r;   rÂ   c                   óX   ‡ — e Zd Zdˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )ÚDinov2LayerScaler$   c                 óª   •— t         ‰| �  «        t        j                  |j                  t        j                  |j                  «      z  «      | _        y ri   )	r&   r'   r
   r(   Úlayerscale_valuer)   Úonesr+   Úlambda1r¢   s     €r:   r'   zDinov2LayerScale.__init__H  s8   ø€ Ü‰ÑÔÜ—|‘| F×$;Ñ$;¼e¿j¹jÈ×I[ÑI[Ó>\Ñ$\Ó]ˆ�r;   Úhidden_statec                 ó    — || j                   z  S ri   )rÖ   ©r8   r×   s     r:   rh   zDinov2LayerScale.forwardL  s   € Ø˜dŸl™lÑ*Ð*r;   ©r$   N©rj   rk   rl   r'   r)   rn   rh   rp   rq   s   @r:   rÒ   rÒ   G  s$   ø„ õ^ð+ E§L¡Lð +°U·\±\÷ +r;   rÒ   ÚinputÚ	drop_probr‹   r$   c                 ó  — |dk(  s|s| S d|z
  }| j                   d   fd| j                  dz
  z  z   }|t        j                  || j                  | j
                  ¬«      z   }|j                  «        | j                  |«      |z  }|S )aF  
    Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).

    Comment by Ross Wightman: This is the same as the DropConnect impl I created for EfficientNet, etc networks,
    however, the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper...
    See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for changing the
    layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use 'survival rate' as the
    argument.
    r¬   r   r   )r   )rG   Údevice)rJ   Úndimr)   ÚrandrG   rß   Úfloor_Údiv)rÜ   rÝ   r‹   Ú	keep_probrJ   Úrandom_tensorrÅ   s          r:   Ú	drop_pathræ   Q  s�   € ð �CÒ™xØˆØ�I‘€IØ�[‰[˜‰^Ð ¨¯
©
°Q©Ñ 7Ñ7€EØ¤§
¡
¨5¸¿¹ÈEÏLÉLÔ YÑY€MØ×ÑÔØ�Y‰Y�yÓ! MÑ1€FØ€Mr;   c                   óx   ‡ — e Zd ZdZd	dee   ddfˆ fd„Zdej                  dej                  fd„Z	de
fd„Zˆ xZS )
ÚDinov2DropPathzXDrop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).NrÝ   r$   c                 ó0   •— t         ‰| �  «        || _        y ri   )r&   r'   rÝ   )r8   rÝ   r9   s     €r:   r'   zDinov2DropPath.__init__i  s   ø€ Ü‰ÑÔØ"ˆ�r;   r°   c                 óD   — t        || j                  | j                  «      S ri   )ræ   rÝ   r‹   )r8   r°   s     r:   rh   zDinov2DropPath.forwardm  s   € Ü˜¨¯©¸¿¹ÓFÐFr;   c                 ó8   — dj                  | j                  «      S )Nzp={})ÚformatrÝ   ©r8   s    r:   Ú
extra_reprzDinov2DropPath.extra_reprp  s   € Ø�}‰}˜TŸ^™^Ó,Ð,r;   ri   )rj   rk   rl   rm   r   Úfloatr'   r)   rn   rh   Ústrrî   rp   rq   s   @r:   rè   rè   f  sG   ø„ Ùbñ# (¨5¡/ð #¸Tõ #ðG U§\¡\ð G°e·l±ló Gð-˜C÷ -r;   rè   c                   óX   ‡ — e Zd Zdˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )Ú	Dinov2MLPr$   c                 ó~  •— t         ‰| �  «        |j                  x}}t        |j                  |j                  z  «      }t        j                  ||d¬«      | _        t        |j                  t        «      rt        |j                     | _        n|j                  | _        t        j                  ||d¬«      | _        y )NTr—   )r&   r'   r+   ro   Ú	mlp_ratior
   r    Úfc1rx   Ú
hidden_actrð   r   Ú
activationÚfc2©r8   r#   Úin_featuresÚout_featuresÚhidden_featuresr9   s        €r:   r'   zDinov2MLP.__init__u  s�   ø€ Ü‰ÑÔØ%+×%7Ñ%7Ð7ˆ�lÜ˜f×0Ñ0°6×3CÑ3CÑCÓDˆÜ—9‘9˜[¨/ÀÔEˆŒÜ�f×'Ñ'¬Ô-Ü$ V×%6Ñ%6Ñ7ˆD�Oà$×/Ñ/ˆDŒOÜ—9‘9˜_¨lÀÔFˆ�r;   r×   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S ri   )rõ   r÷   rø   rÙ   s     r:   rh   zDinov2MLP.forward€  s2   € Ø—x‘x Ó-ˆØ—‘ |Ó4ˆØ—x‘x Ó-ˆØÐr;   rÚ   rÛ   rq   s   @r:   rò   rò   t  s$   ø„ õ	Gð E§L¡Lð °U·\±\÷ r;   rò   c                   óX   ‡ — e Zd Zdˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )ÚDinov2SwiGLUFFNr$   c                 ó0  •— t         ‰| �  «        |j                  x}}t        |j                  |j                  z  «      }t        |dz  dz  «      dz   dz  dz  }t        j                  |d|z  d¬«      | _        t        j                  ||d¬«      | _        y )NrA   r   é   é   Tr—   )	r&   r'   r+   ro   rô   r
   r    Ú
weights_inÚweights_outrù   s        €r:   r'   zDinov2SwiGLUFFN.__init__ˆ  sŠ   ø€ Ü‰ÑÔØ%+×%7Ñ%7Ð7ˆ�lÜ˜f×0Ñ0°6×3CÑ3CÑCÓDˆÜ˜°Ñ2°QÑ6Ó7¸!Ñ;ÀÑAÀAÑEˆäŸ)™) K°°_Ñ1DÈ4ÔPˆŒÜŸ9™9 _°lÈÔNˆÕr;   r×   c                 ó¶   — | j                  |«      }|j                  dd¬«      \  }}t        j                  j	                  |«      |z  }| j                  |«      S )NrA   r@   rH   )r  Úchunkr
   rO   Úsilur  )r8   r×   Úx1Úx2Úhiddens        r:   rh   zDinov2SwiGLUFFN.forward‘  sS   € Ø—‘ |Ó4ˆØ×#Ñ# A¨2Ð#Ó.‰ˆˆBÜ—‘×#Ñ# BÓ'¨"Ñ,ˆØ×Ñ Ó'Ð'r;   rÚ   rÛ   rq   s   @r:   rÿ   rÿ   ‡  s$   ø„ õOð( E§L¡Lð (°U·\±\÷ (r;   rÿ   c                   óÎ   ‡ — e Zd ZdZdeddfˆ fd„Z	 	 d
dej                  deej                     de	de
eej                  ej                  f   eej                     f   fd	„Zˆ xZS )ÚDinov2LayerzCThis corresponds to the Block class in the original implementation.r#   r$   Nc                 ó  •— t         ‰| �  «        t        j                  |j                  |j
                  ¬«      | _        t        |«      | _        t        |«      | _
        |j                  dkD  rt        |j                  «      nt        j                  «       | _        t        j                  |j                  |j
                  ¬«      | _        |j                   rt#        |«      | _        nt'        |«      | _        t        |«      | _        y )N©Úepsr¬   )r&   r'   r
   Ú	LayerNormr+   Úlayer_norm_epsÚnorm1rÂ   rÄ   rÒ   Úlayer_scale1Údrop_path_raterè   ÚIdentityræ   Únorm2Úuse_swiglu_ffnrÿ   Úmlprò   Úlayer_scale2r¢   s     €r:   r'   zDinov2Layer.__init__›  s½   ø€ Ü‰ÑÔä—\‘\ &×"4Ñ"4¸&×:OÑ:OÔPˆŒ
Ü(¨Ó0ˆŒÜ,¨VÓ4ˆÔØBH×BWÑBWÐZ]ÒB]œ¨×(=Ñ(=Ô>Ôce×cnÑcnÓcpˆŒä—\‘\ &×"4Ñ"4¸&×:OÑ:OÔPˆŒ
à× Ò Ü& vÓ.ˆD�Hä  Ó(ˆDŒHÜ,¨VÓ4ˆÕr;   r°   r§   r¨   c                 óD  — | j                  | j                  |«      ||¬«      }|d   }| j                  |«      }|dd  }| j                  |«      |z   }| j	                  |«      }| j                  |«      }| j                  |«      }| j                  |«      |z   }|f|z   }|S )N)r¨   r   r   )rÄ   r  r  ræ   r  r  r  )r8   r°   r§   r¨   Úself_attention_outputsrÐ   r¸   Úlayer_outputs           r:   rh   zDinov2Layer.forward«  s¿   € ð "&§¡Ø�J‰J�}Ó%ØØ/ð "0ó "
Ðð
 2°!Ñ4Ðà×,Ñ,Ð-=Ó>ÐØ(¨¨Ð,ˆð Ÿ™Ð'7Ó8¸=ÑHˆð —z‘z -Ó0ˆØ—x‘x Ó-ˆØ×(Ñ(¨Ó6ˆð —~‘~ lÓ3°mÑCˆà�/ GÑ+ˆàˆr;   r¹   )rj   rk   rl   rm   r    r'   r)   rn   r   rº   r	   r   rh   rp   rq   s   @r:   r  r  ˜  s~   ø„ ÙMð5˜|ð 5°õ 5ð& -1Ø"'ñ	à—|‘|ðð ˜EŸL™LÑ)ðð  ð	ð
 
ˆu�U—\‘\ 5§<¡<Ð/Ñ0°%¸¿¹Ñ2EÐEÑ	F÷r;   r  c                   óŠ   ‡ — e Zd Zdeddfˆ fd„Z	 	 	 	 ddej                  deej                     deded	ede	e
ef   fd
„Zˆ xZS )ÚDinov2Encoderr#   r$   Nc                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w r¹   )
r&   r'   r#   r
   Ú
ModuleListÚrangeÚnum_hidden_layersr  ÚlayerÚgradient_checkpointing©r8   r#   rf   r9   s      €r:   r'   zDinov2Encoder.__init__Í  sN   ø€ Ü‰ÑÔØˆŒÜ—]‘]ÄÀv×G_ÑG_ÓA`Ö#a¸A¤K°Õ$7Ò#aÓbˆŒ
Ø&+ˆÕ#ùò $bs   ½A#r°   r§   r¨   Úoutput_hidden_statesÚreturn_dictc                 ót  — |rdnd }|rdnd }t        | j                  «      D ]h  \  }}	|r||fz   }|�||   nd }
| j                  r+| j                  r| j	                  |	j
                  ||
|«      }n
 |	||
|«      }|d   }|sŒ`||d   fz   }Œj |r||fz   }|st        d„ |||fD «       «      S t        |||¬«      S )N© r   r   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wri   r)  )Ú.0Úvs     r:   ú	<genexpr>z(Dinov2Encoder.forward.<locals>.<genexpr>÷  s   è ø€ Òm˜qÐ_`Ñ_lœÑmùs   ‚Š)Úlast_hidden_stater°   Ú
attentions)Ú	enumerater#  r$  r‹   Ú_gradient_checkpointing_funcÚ__call__Útupler   )r8   r°   r§   r¨   r&  r'  Úall_hidden_statesÚall_self_attentionsÚiÚlayer_moduleÚlayer_head_maskÚlayer_outputss               r:   rh   zDinov2Encoder.forwardÓ  sÿ   € ñ #7™B¸DÐÙ$5™b¸4Ðä(¨¯©Ó4ò 	P‰OˆAˆ|Ù#Ø$5¸Ð8HÑ$HÐ!à.7Ð.C˜i¨šlÈˆOà×*Ò*¨t¯}ª}Ø $× AÑ AØ ×)Ñ)Ø!Ø#Ø%ó	!‘ñ !-¨]¸OÐM^Ó _�à)¨!Ñ,ˆMâ Ø&9¸]È1Ñ=MÐ<OÑ&OÑ#ð'	Pñ*  Ø 1°]Ð4DÑ DÐáÜÑm ]Ð4EÐGZÐ$[ÔmÓmÐmÜØ+Ø+Ø*ô
ð 	
r;   )NFFT)rj   rk   rl   r    r'   r)   rn   r   rº   r	   r3  r   rh   rp   rq   s   @r:   r  r  Ì  sz   ø„ ð,˜|ð ,°õ ,ð -1Ø"'Ø%*Ø ñ)
à—|‘|ð)
ð ˜EŸL™LÑ)ð)
ð  ð	)
ð
 #ð)
ð ð)
ð 
ˆu�oÐ%Ñ	&÷)
r;   r  c                   ó†   — e Zd ZdZeZdZdZdZdgZ	dZ
dZdeej                  ej                  ej                   f   ddfd	„Zy)
ÚDinov2PreTrainedModelz†
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    Údinov2r]   Trÿ   r‚   r$   Nc                 óH  — t        |t        j                  t        j                  f«      rËt        j                  j                  |j                  j                  j                  t        j                  «      d| j                  j                  ¬«      j                  |j                  j                  «      |j                  _        |j                  �%|j                  j                  j                  «        yyt        |t        j                   «      rJ|j                  j                  j                  «        |j                  j                  j#                  d«       yt        |t$        «      �rnt        j                  j                  |j&                  j                  j                  t        j                  «      d| j                  j                  ¬«      j                  |j&                  j                  «      |j&                  _        t        j                  j                  |j(                  j                  j                  t        j                  «      d| j                  j                  ¬«      j                  |j(                  j                  «      |j(                  _        | j                  j*                  r%|j,                  j                  j                  «        yyt        |t.        «      r:|j0                  j                  j#                  | j                  j2                  «       yy)zInitialize the weightsr¬   )ÚmeanÚstdNg      ð?)rx   r
   r    r|   ÚinitÚtrunc_normal_ra   ÚdatarQ   r)   rR   r#   Úinitializer_rangerG   r˜   Úzero_r  Úfill_r"   r3   r,   r-   r/   rÒ   rÖ   rÔ   )r8   r‚   s     r:   Ú_init_weightsz#Dinov2PreTrainedModel._init_weights  s!  € ä�fœrŸy™y¬"¯)©)Ð4Ô5ô "$§¡×!6Ñ!6Ø—‘×"Ñ"×%Ñ%¤e§m¡mÓ4¸3ÀDÇKÁK×DaÑDað "7ó "ç‰b�—‘×$Ñ$Ó%ð �M‰MÔð �{‰{Ð&Ø—‘× Ñ ×&Ñ&Õ(ð 'ä˜¤§¡Ô-Ø�K‰K×Ñ×"Ñ"Ô$Ø�M‰M×Ñ×$Ñ$ SÕ)Ü˜Ô 0Õ1Ü.0¯g©g×.CÑ.CØ×*Ñ*×/Ñ/×2Ñ2´5·=±=ÓAØØ—K‘K×1Ñ1ð /Dó /÷ ‰b�×+Ñ+×1Ñ1Ó2ð	 ×&Ñ&Ô+ô %'§G¡G×$9Ñ$9Ø× Ñ ×%Ñ%×(Ñ(¬¯©Ó7ØØ—K‘K×1Ñ1ð %:ó %÷ ‰b�×!Ñ!×'Ñ'Ó(ð	 ×ÑÔ!ð �{‰{×)Ò)Ø×!Ñ!×&Ñ&×,Ñ,Õ.ð *ä˜Ô 0Ô1Ø�N‰N×Ñ×%Ñ% d§k¡k×&BÑ&BÕCð 2r;   )rj   rk   rl   rm   r    Úconfig_classÚbase_model_prefixÚmain_input_nameÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_supports_sdpaÚ_supports_flash_attn_2r	   r
   r    r|   r  rF  r)  r;   r:   r;  r;  ÿ  sb   „ ñð
  €LØ ÐØ$€OØ&*Ð#Ø*Ð+ÐØ€NØ!ÐðD E¨"¯)©)°R·Y±YÀÇÁÐ*LÑ$Mð DÐRVô Dr;   r;  aH  
    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. Use it
    as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and
    behavior.

    Parameters:
        config ([`Dinov2Config`]): Model configuration class with all the parameters of the model.
            Initializing with a config file does not load the weights associated with the model, only the
            configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
a4  
    Args:
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See
            [`BitImageProcessor.preprocess`] for details.

        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, sequence_length)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0). Only relevant for
            pre-training.

        head_mask (`torch.FloatTensor` of shape `(num_heads,)` or `(num_layers, num_heads)`, *optional*):
            Mask to nullify selected heads of the self-attention modules. Mask values selected in `[0, 1]`:

            - 1 indicates the head is **not masked**,
            - 0 indicates the head is **masked**.

        output_attentions (`bool`, *optional*):
            Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
            tensors for more detail.
        output_hidden_states (`bool`, *optional*):
            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
            more detail.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
aM  
    Args:
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See
            [`BitImageProcessor.preprocess`] for details.

        head_mask (`torch.FloatTensor` of shape `(num_heads,)` or `(num_layers, num_heads)`, *optional*):
            Mask to nullify selected heads of the self-attention modules. Mask values selected in `[0, 1]`:

            - 1 indicates the head is **not masked**,
            - 0 indicates the head is **masked**.

        output_attentions (`bool`, *optional*):
            Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
            tensors for more detail.
        output_hidden_states (`bool`, *optional*):
            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
            more detail.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
z`The bare DINOv2 Model transformer outputting raw hidden-states without any specific head on top.c                   ó"  ‡ — e Zd Zdefˆ fd„Zdefd„Zdeee	e   f   ddfd„Z
 ee«       eeeede¬	«      	 	 	 	 	 	 dd
eej(                     deej(                     deej(                     dee   dee   dee   deeef   fd„«       «       Zˆ xZS )ÚDinov2Modelr#   c                 óò   •— t         ‰| �  |«       || _        t        |«      | _        t        |«      | _        t        j                  |j                  |j                  ¬«      | _        | j                  «        y )Nr  )r&   r'   r#   r"   r<   r  Úencoderr
   r  r+   r  Ú	layernormÚ	post_initr¢   s     €r:   r'   zDinov2Model.__init__n  sY   ø€ Ü‰Ñ˜Ô ØˆŒä*¨6Ó2ˆŒÜ$ VÓ,ˆŒäŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒð 	�‰Õr;   r$   c                 ó.   — | j                   j                  S ri   ©r<   r1   rí   s    r:   Úget_input_embeddingsz Dinov2Model.get_input_embeddingsz  ó   € Ø�‰×/Ñ/Ð/r;   Úheads_to_pruneNc                 ó˜   — |j                  «       D ]7  \  }}| j                  j                  |   j                  j	                  |«       Œ9 y)z�
        Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base
        class PreTrainedModel
        N)ÚitemsrQ  r#  rÄ   rÍ   )r8   rX  r#  rÈ   s       r:   Ú_prune_headszDinov2Model._prune_heads}  sE   € ð
 +×0Ñ0Ó2ò 	C‰LˆE�5Ø�L‰L×Ñ˜uÑ%×/Ñ/×;Ñ;¸EÕBñ	Cr;   Úvision)Ú
checkpointÚoutput_typerG  ÚmodalityÚexpected_outputr]   r^   r§   r¨   r&  r'  c                 óü  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|€t	        d«      ‚| j                  || j                   j                  «      }| j                  ||¬«      }| j                  |||||¬«      }|d   }	| j                  |	«      }	|	d d …dd d …f   }
|s|	|
f}||dd  z   S t        |	|
|j                  |j                  ¬«      S )Nz You have to specify pixel_values)r^   ©r§   r¨   r&  r'  r   r   )r.  Úpooler_outputr°   r/  )r#   r¨   r&  Úuse_return_dictr   Úget_head_maskr"  r<   rQ  rR  r   r°   r/  )r8   r]   r^   r§   r¨   r&  r'  Úembedding_outputÚencoder_outputsÚsequence_outputÚpooled_outputÚhead_outputss               r:   rh   zDinov2Model.forward…  s%  € ð" 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆàÐÜÐ?Ó@Ð@ð ×&Ñ& y°$·+±+×2OÑ2OÓPˆ	àŸ?™?¨<È˜?ÓYÐàŸ,™,ØØØ/Ø!5Ø#ð 'ó 
ˆð *¨!Ñ,ˆØŸ.™.¨Ó9ˆØ'ª¨1ªa¨Ñ0ˆáØ+¨]Ð;ˆLØ /°!°"Ð"5Ñ5Ð5ä)Ø-Ø'Ø)×7Ñ7Ø&×1Ñ1ô	
ð 	
r;   ©NNNNNN)rj   rk   rl   r    r'   r0   rV  r   ro   r   r[  r   ÚDINOV2_BASE_INPUTS_DOCSTRINGr   Ú_CHECKPOINT_FOR_DOCr   Ú_CONFIG_FOR_DOCÚ_EXPECTED_OUTPUT_SHAPEr   r)   rn   rº   r	   r   rh   rp   rq   s   @r:   rO  rO  i  s   ø„ ð

˜|õ 
ð0Ð&;ó 0ðC¨4°°T¸#±Y°Ñ+?ð CÀDó Cñ +Ð+GÓHÙØ&Ø.Ø$ØØ.ôð 04Ø26Ø,0Ø,0Ø/3Ø&*ñ/
à˜uŸ|™|Ñ,ð/
ð " %§,¡,Ñ/ð/
ð ˜EŸL™LÑ)ð	/
ð
 $ D™>ð/
ð ' t™nð/
ð ˜d‘^ð/
ð 
ˆuÐ0Ð0Ñ	1ò/
óó Iô/
r;   rO  z§
    Dinov2 Model transformer with an image classification head on top (a linear layer on top of the final hidden state
    of the [CLS] token) e.g. for ImageNet.
    c                   óø   ‡ — e Zd Zdeddfˆ fd„Z ee«       eee	e
e¬«      	 	 	 	 	 	 ddeej                     deej                     deej                     d	ee   d
ee   dee   deee	f   fd„«       «       Zˆ xZS )ÚDinov2ForImageClassificationr#   r$   Nc                 ó0  •— t         ‰| �  |«       |j                  | _        t        |«      | _        |j                  dkD  r-t        j                  |j                  dz  |j                  «      nt        j                  «       | _	        | j                  «        y )Nr   rA   )r&   r'   Ú
num_labelsrO  r<  r
   r    r+   r  Ú
classifierrS  r¢   s     €r:   r'   z%Dinov2ForImageClassification.__init__Ç  sy   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ! &Ó)ˆŒð EK×DUÑDUÐXYÒDYŒB�I‰I�f×(Ñ(¨1Ñ,¨f×.?Ñ.?Ô@Ô_a×_jÑ_jÓ_lð 	Œð
 	�‰Õr;   )r]  r^  rG  r`  r]   r§   Úlabelsr¨   r&  r'  c                 óÆ  — |�|n| j                   j                  }| j                  |||||¬«      }|d   }|dd…df   }	|dd…dd…f   }
t        j                  |	|
j                  d¬«      gd¬«      }| j                  |«      }d}|��¢|j                  |j                  «      }| j                   j                  €�| j                  dk(  rd| j                   _	        nl| j                  dkD  rL|j                  t        j                  k(  s|j                  t        j                  k(  rd| j                   _	        nd| j                   _	        | j                   j                  dk(  rIt        «       }| j                  dk(  r& ||j                  «       |j                  «       «      }nŒ |||«      }n‚| j                   j                  dk(  r=t!        «       } ||j#                  d	| j                  «      |j#                  d	«      «      }n,| j                   j                  dk(  rt%        «       } |||«      }|s|f|d
d z   }|�|f|z   S |S 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).
        Nrb  r   r   rH   Ú
regressionÚsingle_label_classificationÚmulti_label_classificationr@   rA   )ÚlossÚlogitsr°   r/  )r#   rd  r<  r)   rT   r>  rt  rQ   rß   Úproblem_typers  rG   Úlongro   r   Úsqueezer   rS   r   r   r°   r/  )r8   r]   r§   ru  r¨   r&  r'  r¸   rh  r,   Úpatch_tokensÚlinear_inputr{  rz  Úloss_fctrÅ   s                   r:   rh   z$Dinov2ForImageClassification.forwardÕ  s!  € ð, &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆà—+‘+ØØØ/Ø!5Ø#ð ó 
ˆð " !™*ˆà#¢A q DÑ)ˆ	Ø&¢q¨!©" uÑ-ˆä—y‘y )¨\×->Ñ->À1Ð->Ó-EÐ!FÈAÔNˆà—‘ Ó.ˆàˆØÑà—Y‘Y˜vŸ}™}Ó-ˆFØ�{‰{×'Ñ'Ð/Ø—?‘? aÒ'Ø/;�D—K‘KÕ,Ø—_‘_ qÒ(¨f¯l©l¼e¿j¹jÒ.HÈFÏLÉLÔ\a×\eÑ\eÒLeØ/L�D—K‘KÕ,à/K�D—K‘KÔ,à�{‰{×'Ñ'¨<Ò7Ü"›9�Ø—?‘? aÒ'Ù# F§N¡NÓ$4°f·n±nÓ6FÓG‘Dá# F¨FÓ3‘DØ—‘×)Ñ)Ð-JÒJÜ+Ó-�Ù §¡¨B°·±Ó @À&Ç+Á+ÈbÃ/ÓR‘Ø—‘×)Ñ)Ð-IÒIÜ,Ó.�Ù ¨Ó/�áØ�Y ¨¨ Ñ,ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä$ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r;   rk  )rj   rk   rl   r    r'   r   ÚDINOV2_INPUTS_DOCSTRINGr   Ú_IMAGE_CLASS_CHECKPOINTr   rn  Ú_IMAGE_CLASS_EXPECTED_OUTPUTr   r)   rn   rº   r	   r3  rh   rp   rq   s   @r:   rq  rq  ¿  sÝ   ø„ ð˜|ð °õ ñ +Ð+BÓCÙØ*Ø)Ø$Ø4ô	ð 04Ø,0Ø)-Ø,0Ø/3Ø&*ñD
à˜uŸ|™|Ñ,ðD
ð ˜EŸL™LÑ)ðD
ð ˜Ÿ™Ñ&ð	D
ð
 $ D™>ðD
ð ' t™nðD
ð ˜d‘^ðD
ð 
ˆuÐ+Ð+Ñ	,òD
óó DôD
r;   rq  zO
    Dinov2 backbone, to be used with frameworks like DETR and MaskFormer.
    c                   ó¤   ‡ — e Zd Zˆ fd„Zdefd„Z ee«       ee	e
¬«      	 	 	 d
dej                  dee   dee   dee   de	f
d	„«       «       Zˆ xZS )ÚDinov2Backbonec                 óv  •— t         ‰| �  |«       t         ‰| �	  |«       t        |j                  dz   «      D �cg c]  }|j
                  ‘Œ c}| _        t        |«      | _        t        |«      | _
        t        j                  |j
                  |j                  ¬«      | _        | j                  «        y c c}w )Nr   r  )r&   r'   Ú_init_backboner!  r"  r+   Únum_featuresr"   r<   r  rQ  r
   r  r  rR  rS  r%  s      €r:   r'   zDinov2Backbone.__init__*  s�   ø€ Ü‰Ñ˜Ô Ü‰Ñ˜vÔ&ä9>¸v×?WÑ?WÐZ[Ñ?[Ó9\Ö]°A˜V×/Ó/Ò]ˆÔÜ*¨6Ó2ˆŒÜ$ VÓ,ˆŒäŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒð 	�‰Õùò ^s   ºB6r$   c                 ó.   — | j                   j                  S ri   rU  rí   s    r:   rV  z#Dinov2Backbone.get_input_embeddings7  rW  r;   )r^  rG  r]   r&  r¨   r'  c                 ób  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }| j	                  |«      }| j                  |d||¬«      }|r|j                  n|d   }d}t        | j                  |«      D ]Å  \  }	}
|	| j                  v sŒ| j                   j                  r| j                  |
«      }
| j                   j                  rn|
dd…dd…f   }
|j                  \  }}}}| j                   j                  }|
j                  |||z  ||z  d«      }
|
j!                  dddd	«      j#                  «       }
||
fz  }ŒÇ |s|r|f|dd z   }|S |f|d	d z   }|S t%        ||r|j                  nd|r|j&                  ¬
«      S d¬
«      S )a7  
        Returns:

        Examples:

        ```python
        >>> from transformers import AutoImageProcessor, AutoBackbone
        >>> import torch
        >>> from PIL import Image
        >>> import requests

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

        >>> processor = AutoImageProcessor.from_pretrained("facebook/dinov2-base")
        >>> model = AutoBackbone.from_pretrained(
        ...     "facebook/dinov2-base", out_features=["stage2", "stage5", "stage8", "stage11"]
        ... )

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

        >>> outputs = model(**inputs)
        >>> feature_maps = outputs.feature_maps
        >>> list(feature_maps[-1].shape)
        [1, 768, 16, 16]
        ```NT)r&  r¨   r'  r   r)  r@   r   r   rA   )Úfeature_mapsr°   r/  )r#   rd  r&  r¨   r<   rQ  r°   ÚzipÚstage_namesrû   Úapply_layernormrR  Úreshape_hidden_statesrJ   r7   rM   rN   rŽ   r   r/  )r8   r]   r&  r¨   r'  rf  r¸   r°   rŒ  Ústager×   re   rf   r=   r>   r7   rÅ   s                    r:   rh   zDinov2Backbone.forward:  sè  € ðF &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐàŸ?™?¨<Ó8Ðà—,‘,Ø°4ÐK\Ðjuð ó 
ˆñ 2=˜×-Ò-À'È!Á*ˆàˆÜ#& t×'7Ñ'7¸Ó#Gò 	0ÑˆE�<Ø˜×)Ñ)Ò)Ø—;‘;×.Ò.Ø#'§>¡>°,Ó#?�LØ—;‘;×4Ò4Ø#/²°1±2°Ñ#6�Lð 4@×3EÑ3EÑ0�J  6¨5Ø!%§¡×!7Ñ!7�JØ#/×#7Ñ#7¸
ÀFÈjÑDXÐZ_ÐcmÑZmÐoqÓ#r�LØ#/×#7Ñ#7¸¸1¸aÀÓ#C×#NÑ#NÓ#P�LØ  Ñ/‘ð	0ñ Ù#Ø&˜¨7°1°2¨;Ñ6�ð ˆMð '˜¨7°1°2¨;Ñ6�ØˆMäØ%Ù3G˜'×/Ò/ÈTÙ->�w×)Ñ)ô
ð 	
ð EIô
ð 	
r;   )NNN)rj   rk   rl   r'   r0   rV  r   r‚  r   r   rn  r)   rn   r   rº   rh   rp   rq   s   @r:   r†  r†  #  s’   ø„ ôð0Ð&;ó 0ñ +Ð+BÓCÙ¨>ÈÔXð 04Ø,0Ø&*ñI
à—l‘lðI
ð ' t™nðI
ð $ D™>ð	I
ð
 ˜d‘^ðI
ð 
òI
ó Yó DôI
r;   r†  )rq  rO  r;  r†  )r¬   )r¬   F)Krm   Úcollections.abcry   Útypingr   r   r   r   r   r   r	   r)   Útorch.utils.checkpointr
   Útorch.nnr   r   r   Úactivationsr   Úmodeling_outputsr   r   r   r   Úmodeling_utilsr   r   Úpytorch_utilsr   r   Úutilsr   r   r   r   r   r   Úutils.backbone_utilsr   Úconfiguration_dinov2r    Ú
get_loggerrj   r®   rn  rm  ro  rƒ  r„  ÚModuler"   r0   rn   rï   r’   r”   r¼   rÂ   rÒ   rº   ræ   rè   rò   rÿ   r  r  r;  ÚDINOV2_START_DOCSTRINGrl  r‚  rO  rq  r†  Ú__all__r)  r;   r:   ú<module>r¡     sˆ  ðñ ã ß D× DÑ Dã Û Ý ß AÑ Aå !÷ó ÷ Gß Q÷÷ õ 2Ý .ð 
ˆ×	Ñ	˜HÓ	%€ð !€ð -Ð Ú&Ð ð EÐ Ø1Ð ôN�r—y‘yô Nôb˜BŸI™Iô ðR ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 ˜UŸ\™\Ñ*ð%ð ð%ð ó%ô>;˜"Ÿ)™)ô ;ô~�r—y‘yô ô&$�b—i‘iô $ôN+�r—y‘yô +ñ�U—\‘\ð ¨eð ÀTð ÐV[×VbÑVbó ô*-�R—Y‘Yô -ô�—	‘	ô ô&(�b—i‘iô (ô"0�"—)‘)ô 0ôh0
�B—I‘Iô 0
ôf+D˜Oô +Dð\	Ð ð Ð ð4Ð ñ. ØfØóôO
Ð'ó O
ó	ðO
ñd ðð óôZ
Ð#8ó Z
óðZ
ñz ðð ó	ô\
Ð*¨Mó \
óð\
ò~ e�r;   