Ë
    éÓ^j‹‚  ã                   ó  — d dl m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mZ d dlmc mZ d dlmZmZ d dlmZmZmZmZmZmZmZmZm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) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddgZ1 eejd                  d¬«      Z3e+ G d„ dejh                  «      «       Z5 G d„ dejh                  «      Z6 G d„ dejh                  «      Z7dee8e
jr                  f   dee8e
jr                  f   fd„Z:d/de8de;de7fd„Z<d/de8de;de6fd„Z=	 	 	 	 d0de8de>de;de;de7f
d„Z?d1d e8fd!„Z@ e/ e@d"d#d$d ¬%«       e@d&d"d#d$d d'¬(«       e@d)¬*«      d+œ«      ZAe0d/de;de7fd,„«       ZBe0d/de;de6fd-„«       ZCe0d/de;de6fd.„«       ZDy)2é    )Úpartial)ÚCallableÚDictÚListÚOptionalÚSequenceÚTupleÚUnionN©ÚIMAGENET_INCEPTION_MEANÚIMAGENET_INCEPTION_STD)	ÚSelectAdaptivePool2dÚLinearÚ	LayerTypeÚ	RmsNorm2dÚConvNormActÚcreate_conv2dÚget_norm_layerÚget_norm_act_layerÚ	to_2tupleé   )Úbuild_model_with_cfg)ÚSqueezeExciteÚUniversalInvertedResidual)Ú	BlockArgsÚEfficientNetBuilderÚdecode_arch_defÚefficientnet_init_weightsÚround_channels)Úfeature_take_indices)Úregister_notrace_module)Úcheckpoint_seq)Úgenerate_default_cfgsÚregister_modelÚMobileNetV5ÚMobileNetV5EncoderÚtanh)Úapproximatec                   óº   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 ddeeee   f   dedededede	e   de
d	e	e   d
e	e   fˆ fd„Zdeej                     dej                  fd„Zˆ xZS )Ú"MobileNetV5MultiScaleFusionAdaptera‹  Multi-layer fusion token adapter.

  Args:
    in_chs: List of input channel counts for each feature scale.
    out_chs: The number of output channels.
    output_resolution: The output resolution.
    expansion_ratio: The FFN expansion ratio.
    interpolation_mode: The upsampling interpolation mode.
    layer_scale_init_value: The initial value of the layer scale, no layer scale if None.
  Úin_chsÚout_chsÚoutput_resolutionÚexpansion_ratioÚinterpolation_modeÚlayer_scale_init_valueÚnoskipÚ	act_layerÚ
norm_layerc                 óÄ  •— |
|dœ}t         ‰| �  «        t        |t        «      rt	        |«      n|| _        || _        t        |«      | _        || _	        || _
        || _        || _        |xs t        }|	xs t        }	t        d| j
                  | j                  d| j                  ||	| j                  | j                  dœ|¤Ž| _         |	| j                  fi |¤Ž| _        y )N©ÚdeviceÚdtyper   )r+   r,   Údw_kernel_size_midÚ	exp_ratior2   r3   r1   r0   © )ÚsuperÚ__init__Ú
isinstancer   ÚsumÚin_channelsÚout_channelsr   r-   r.   r/   r0   r1   Ú_GELUr   r   ÚffnÚnorm)Úselfr+   r,   r-   r.   r/   r0   r1   r2   r3   r6   r7   ÚddÚ	__class__s                €úb/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/mobilenetv5.pyr<   z+MobileNetV5MultiScaleFusionAdapter.__init__4   sâ   ø€ ð  UÑ	+€BÜ	�GÑÔÜ&0°¼Ô&B”s˜6”{È€DÔØ€DÔÜ&Ð'8Ó9€DÔØ*€DÔØ0€DÔØ"8€DÔØ€D„KàÒ"œU€IØÒ(œy€JÜ(ð 
Ø×ÑØ×!Ñ!ØØ×&Ñ&ØØØ�{‰{Ø#×:Ñ:ñ
ð ñ
€D„Hñ ˜4×,Ñ,Ñ3°Ñ3€D…Ió    ÚinputsÚreturnc                 óü  — |d   j                   dd  }g }t        |«      D ]]  \  }}|j                   dd  }|d   |d   k  s|d   |d   k  r"t        j                  ||| j                  ¬«      }|j                  |«       Œ_ t        j                  |d¬«      }| j                  |«      }|d   | j                  d   k7  s|d   | j                  d   k7  r™|d   | j                  d   z  dk7  s|d   | j                  d   z  dk7  r#t        j                  || j                  d¬«      }nF|d   | j                  d   z  }|d   | j                  d   z  }	t        j                  |||	f||	f¬«      }| j                  |«      }|S )Nr   éþÿÿÿr   )ÚsizeÚmode)ÚdimÚbilinear)Úkernel_sizeÚstride)ÚshapeÚ	enumerateÚFÚinterpolater/   ÚappendÚtorchÚcatrB   r-   Ú
avg_pool2drC   )
rD   rI   Úhigh_resolutionÚresized_inputsÚ_ÚimgÚ	feat_sizeÚchannel_cat_imgsÚ	h_stridesÚ	w_stridess
             rG   Úforwardz*MobileNetV5MultiScaleFusionAdapter.forward\   s™  € à˜Q‘i—o‘o b cÐ*€OØ€NÜ˜FÓ#ò #‰ˆˆ3Ø—I‘I˜b˜c�Nˆ	Ø�Q‰<˜/¨!Ñ,Ò,°	¸!±¸ÈqÑ?QÒ0QÜ—-‘- ¨/À×@WÑ@WÔXˆCØ×Ñ˜cÕ"ð	#ô —y‘y °QÔ7ÐØ
�(‰(Ð#Ó
$€Cà�qÑ˜T×3Ñ3°AÑ6Ò6¸/È!Ñ:LÐPT×PfÑPfÐghÑPiÒ:ið ˜AÑ ×!7Ñ!7¸Ñ!:Ñ:¸aÒ?Ø˜AÑ ×!7Ñ!7¸Ñ!:Ñ:¸aÒ?ä—-‘- ¨$×*@Ñ*@ÀzÔR‰Cà'¨Ñ*¨d×.DÑ.DÀQÑ.GÑGˆIØ'¨Ñ*¨d×.DÑ.DÀQÑ.GÑGˆIÜ—,‘,ØØ&¨	Ð2Ø! 9Ð-ôˆCð �)‰)�C‹.€Cà€JrH   )g       @ÚnearestNTNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Úintr   ÚfloatÚstrr   Úboolr   r<   rX   ÚTensorrc   Ú__classcell__©rF   s   @rG   r*   r*   '   s»   ø„ ñ	ð  "%Ø"+Ø26ØØ)-Ø*.ØØñ&4à�c˜4 ™9�nÑ%ð&4ð ð&4ð ð	&4ð
 ð&4ð  ð&4ð !)¨¡ð&4ð ð&4ð ˜IÑ&ð&4ð ˜YÑ'õ&4ðP˜D §¡Ñ.ð °5·<±<÷ rH   r*   c            +       óP  ‡ — e Zd ZdZddddddddd	dd
d
d
d
deddd
dd
d
fdededededededededede	e   dede
e   de
e   de
e   de
e   dedededed e
e   d!ef*ˆ fd"„Zd#„ Zej"                  j$                  d:d$efd%„«       Zej"                  j$                  d;d&efd'„«       Zej"                  j$                  d(ej,                  fd)„«       Zd<ded!efd*„Z	 	 	 	 	 	 d=d+ej2                  d,e
eee	e   f      d-ed.ed/ed0ed1ed(ee	ej2                     eej2                  e	ej2                     f   f   fd2„Z	 	 	 	 d>d,eee	e   f   d3ed4ed1efd5„Zd+ej2                  d(ej2                  fd6„Zd:d+ej2                  d7ed(ej2                  fd8„Zd+ej2                  d(ej2                  fd9„Z ˆ xZ!S )?r%   z MobiletNet-V5
    éè  é   é   TFé   Ú ©rL   éÿÿÿÿNç        ÚavgÚ
block_argsÚnum_classesÚin_chansÚ	stem_sizeÚ	stem_biasÚfix_stemÚnum_featuresÚpad_typeÚuse_msfaÚmsfa_indicesÚmsfa_output_resolutionr2   r3   Úaa_layerÚse_layerÚse_from_expÚround_chs_fnÚ	drop_rateÚdrop_path_rater0   Úglobal_poolc                 ó²  •— t         ‰| �  «        ||dœ}|xs t        }t        |«      xs t        }t        ||«      }|xs t        }|| _        || _        || _	        d| _
        |
| _        || _        |s ||«      }t        ||fdd||||dœ|¤Ž| _        t        dd|||||||||dœ
|¤Ž}t!        j"                   |||«      Ž | _        |j&                  | _        | j(                  D �cg c]  }|d   ‘Œ	 c}| _        |j,                  | _        |	rÁ|x| _        | _        t3        t5        | j(                  «      | j                  «      d	   | _        t7        | j                  D �cg c]  }| j(                  |   d
   ‘Œ c}«      | _        t;        d| j8                  || j                  ||dœ|¤Ž| _        t?        |¬«      | _         d| _!        d| _"        nŽ|j,                  | _        || _        d| _        t?        |¬«      | _         | j.                  | j@                  jG                  «       z  }tI        || j0                  dfd|i|¤Ž| _!         || j0                  fi |¤Ž| _"        |rt!        jJ                  d«      nt!        jL                  «       | _'        |d	kD  rtQ        | j0                  |fi |¤Žnt!        jL                  «       | _)        tU        | «       yc c}w c c}w )aÓ  
        Args:
            block_args: Arguments for blocks of the network.
            num_classes: Number of classes for classification head.
            in_chans: Number of input image channels.
            stem_size: Number of output channels of the initial stem convolution.
            fix_stem: If True, don't scale stem by round_chs_fn.
            num_features: Number of output channels of the conv head layer.
            head_bias: If True, add a learnable bias to the conv head layer.
            pad_type: Type of padding to use for convolution layers.
            act_layer: Type of activation layer.
            norm_layer: Type of normalization layer.
            aa_layer: Type of anti-aliasing layer.
            se_layer: Type of Squeeze-and-Excite layer.
            se_from_exp: If True, calculate SE channel reduction from expanded mid channels.
            round_chs_fn: Callable to round number of filters based on depth multiplier.
            drop_rate: Dropout rate.
            drop_path_rate: Stochastic depth rate.
            layer_scale_init_value: Enable layer scale on compatible blocks if not None.
            global_pool: Type of pooling to use for global pooling features of the FC head.
        r5   Frr   é   ©rQ   rR   ÚpaddingÚbiasr3   r2   é    ©
Úoutput_strider�   rˆ   r‡   r2   r3   r…   r†   rŠ   r0   Ústager   Únum_chs©r+   r,   r-   r3   r2   ©Ú	pool_typeNr   r�   r:   )+r;   r<   rA   r   r   r   r   r{   r|   r‰   Úgrad_checkpointingrƒ   r„   r   Ú	conv_stemr   ÚnnÚ
SequentialÚblocksÚfeaturesÚfeature_infoÚ
stage_endsr+   r€   Úhead_hidden_sizer    Úlenr>   Úmsfa_in_chsr*   Úmsfar   r‹   Ú	conv_headÚ	norm_headÚ	feat_multr   ÚFlattenÚIdentityÚflattenr   Ú
classifierr   )rD   rz   r{   r|   r}   r~   r   r€   r�   r‚   rƒ   r„   r2   r3   r…   r†   r‡   rˆ   r‰   rŠ   r0   r‹   r6   r7   rE   Únorm_act_layerÚbuilderÚfÚmiÚnum_pooled_chsrF   s                                 €rG   r<   zMobileNetV5.__init__‚   sÛ  ø€ ô^ 	‰ÑÔØ¨Ñ/ˆØÒ&¤ˆ	Ü# JÓ/Ò<´9ˆ
Ü+¨J¸	ÓBˆØÒ,œ}ˆØ&ˆÔØ ˆŒØ"ˆŒØ"'ˆÔØ(ˆÔØ&<ˆÔ#ñ Ù$ YÓ/ˆIÜ$ØØð

ð ØØØØ!Øñ

ð ñ

ˆŒô &ð 
ØØØ%Ø#ØØ!ØØØ)Ø#9ñ
ð ñ
ˆô —m‘m¡W¨Y¸
Ó%CÐDˆŒØ#×,Ñ,ˆÔØ/3×/@Ñ/@ÖA¨!˜1˜W›:ÒAˆŒØ#ŸN™NˆÔñ Ø8DÐDˆDÔ Ô 5ä 4´S¸×9JÑ9JÓ5KÈT×M^ÑM^Ó _Ð`aÑ bˆDÔÜ"Èt×O`ÑO`Ö#aÈ D×$5Ñ$5°bÑ$9¸)Ó$DÒ#aÓbˆDÔä:ð Ø×'Ñ'Ø$Ø"&×"=Ñ"=Ø%Ø#ñð ñˆDŒIô  4¸kÔJˆDÔØ!ˆDŒNØ!ˆD�Nà '§¡ˆDÔØ$0ˆDÔ!ØˆDŒIÜ3¸kÔJˆDÔØ!×.Ñ.°×1AÑ1A×1KÑ1KÓ1MÑMˆNä*¨>¸4×;PÑ;PÐRSÑlÐ]eÐlÐikÑlˆDŒNÙ+¨D×,AÑ,AÑHÀRÑHˆDŒNá(3”r—z‘z !”}¼¿¹»ˆŒØNYÐ\]Êoœ& ×!6Ñ!6¸ÑJÀrÒJÔce×cnÑcnÓcpˆŒä! $Õ'ùòE Bùò $bs   Ã(KÅ!Kc                 óø  — | j                   | j                  g}|j                  | j                  «       |j	                  | j
                  «       | j                  �|j	                  | j                  «       | j                  �|j	                  | j                  «       |j                  t        j                  «       t        j                  | j                  «      | j                  g«       t        j                  |Ž S ©N)rš   Úbn1Úextendr�   rW   r‹   r¥   r¦   r›   r¨   ÚDropoutr‰   r«   rœ   )rD   Úlayerss     rG   Úas_sequentialzMobileNetV5.as_sequential  s£   € Ø—.‘. $§(¡(Ð+ˆØ�‰�d—k‘kÔ"Ø�‰�d×&Ñ&Ô'Ø�>‰>Ð%Ø�M‰M˜$Ÿ.™.Ô)Ø�>‰>Ð%Ø�M‰M˜$Ÿ.™.Ô)Ø�‰”r—z‘z“|¤R§Z¡Z°·±Ó%?ÀÇÁÐQÔRÜ�}‰}˜fÐ%Ð%rH   Úcoarsec                 ó.   — t        d|rd¬«      S d¬«      S )Nz^conv_stem|bn1z^blocks\.(\d+)z^blocks\.(\d+)\.(\d+))Ústemr�   )Údict)rD   r¸   s     rG   Úgroup_matcherzMobileNetV5.group_matcher  s%   € äØ"Ù(.Ð$ô
ð 	
à4Lô
ð 	
rH   Úenablec                 ó   — || _         y r²   )r™   )rD   r½   s     rG   Úset_grad_checkpointingz"MobileNetV5.set_grad_checkpointing  s
   € à"(ˆÕrH   rJ   c                 ó   — | j                   S r²   )r«   )rD   s    rG   Úget_classifierzMobileNetV5.get_classifier  s   € à�‰ÐrH   c                 ó  — || _         t        |¬«      | _        |rt        j                  d«      nt        j
                  «       | _        |dkD  rt        | j                  |«      | _	        y t        j
                  «       | _	        y )Nr—   r   r   )
r{   r   r‹   r›   r¨   r©   rª   r   r¡   r«   )rD   r{   r‹   s      rG   Úreset_classifierzMobileNetV5.reset_classifier  s[   € Ø&ˆÔä/¸+ÔFˆÔÙ(3”r—z‘z !”}¼¿¹»ˆŒØHSÐVWÊœ& ×!6Ñ!6¸ÓDˆ�Ô]_×]hÑ]hÓ]jˆ�rH   ÚxÚindicesrC   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyÚextra_blocksc                 óR  — |dv sJ d«       ‚|r	|sJ d«       ‚g }|r&t        t        | j                  «      dz   |«      \  }	}
nMt        t        | j                  «      |«      \  }	}
|	D �cg c]  }| j                  |   ‘Œ }	}| j                  |
   }
d}| j	                  |«      }||	v r|j                  |«       t        j                  j                  «       s|s| j                  }n| j                  d|
 }|D ]%  }|dz  } ||«      }||	v sŒ|j                  |«       Œ' |r|S ||fS c c}w )aa   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
            extra_blocks: Include outputs of all blocks and head conv in output, does not align with feature_info
        Returns:

        ©ÚNCHWúOutput shape must be NCHW.ú/Must use intermediates_only for early stopping.r   r   N)	r    r¢   r�   r    rš   rW   rX   ÚjitÚis_scripting)rD   rÄ   rÅ   rC   rÆ   rÇ   rÈ   rÉ   ÚintermediatesÚtake_indicesÚ	max_indexÚiÚfeat_idxr�   Úblks                  rG   Úforward_intermediatesz!MobileNetV5.forward_intermediates"  sB  € ð. ˜YÑ&ÐDÐ(DÓDÐ&ÙÙ%ÐXÐ'XÓXÐ%ØˆÙÜ&:¼3¸t¿{¹{Ó;KÈaÑ;OÐQXÓ&YÑ#ˆL™)ä&:¼3¸t¿¹Ó;OÐQXÓ&YÑ#ˆL˜)Ø8DÖE°1˜DŸO™O¨AÓ.ÐEˆLÐEØŸ™¨	Ñ2ˆIð ˆØ�N‰N˜1ÓˆØ�|Ñ#Ø× Ñ  Ô#ä�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )Ð,ˆFØò 	(ˆCØ˜‰MˆHÙ�A“ˆAØ˜<Ò'Ø×$Ñ$ QÕ'ð		(ñ Ø Ð ð
 �-ÐÐùò; Fs   Á'D$Ú
prune_normÚ
prune_headc                 óp  — |r&t        t        | j                  «      dz   |«      \  }}n1t        t        | j                  «      |«      \  }}| j                  |   }| j                  d| | _        |t        | j                  «      k  rd| _        d| _        |r d| _        d| _        | j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        r   Nr   ru   )r    r¢   r�   r    r¥   r¦   rÃ   )rD   rÅ   rØ   rÙ   rÉ   rÒ   rÓ   s          rG   Úprune_intermediate_layersz%MobileNetV5.prune_intermediate_layers`  s¨   € ñ Ü&:¼3¸t¿{¹{Ó;KÈaÑ;OÐQXÓ&YÑ#ˆL™)ä&:¼3¸t¿¹Ó;OÐQXÓ&YÑ#ˆL˜)ØŸ™¨	Ñ2ˆIØ—k‘k * 9Ð-ˆŒØ”s˜4Ÿ;™;Ó'Ò'Ø!ˆDŒNØ!ˆDŒNÙØ!ˆDŒNØ!ˆDŒNØ×!Ñ! ! RÔ(ØÐrH   c                 óô  — | j                   �…d}g }| j                  |«      }|| j                  v r|j                  |«       | j                  D ]/  }|dz  } ||«      }|| j                  v sŒ|j                  |«       Œ1 | j                  |«      }|S | j                  |«      }| j
                  r8t        j                  j                  «       st        | j                  |d¬«      }|S | j	                  |«      }|S )Nr   r   T)rª   )
r¤   rš   rƒ   rW   r�   r™   rX   rÏ   rÐ   r"   ©rD   rÄ   rÕ   rÑ   rÖ   s        rG   Úforward_featureszMobileNetV5.forward_featuresx  sí   € Ø�9‰9Ð àˆHØˆMØ—‘˜qÓ!ˆAØ˜4×,Ñ,Ñ,Ø×$Ñ$ QÔ'Ø—{‘{ò ,�Ø˜A‘�á˜“F�Ø˜t×0Ñ0Ò0Ø!×(Ñ(¨Õ+ð,ð —	‘	˜-Ó(ˆAð ˆð —‘˜qÓ!ˆAØ×&Ò&¬u¯y©y×/EÑ/EÔ/GÜ" 4§;¡;°¸4Ô@�ð ˆð —K‘K “N�ØˆrH   Ú
pre_logitsc                 óZ  — | j                  |«      }| j                  �| j                  |«      }| j                  �| j                  |«      }| j                  |«      }| j                  dkD  r,t        j                  || j                  | j                  ¬«      }|r|S | j                  |«      S )Nrx   )ÚpÚtraining)	r‹   r¥   r¦   rª   r‰   rU   Údropoutrâ   r«   )rD   rÄ   rß   s      rG   Úforward_headzMobileNetV5.forward_head�  sŒ   € Ø×Ñ˜QÓˆØ�>‰>Ð%Ø—‘˜qÓ!ˆAØ�>‰>Ð%Ø—‘˜qÓ!ˆAØ�L‰L˜‹OˆØ�>‰>˜BÒÜ—	‘	˜!˜tŸ~™~¸¿¹ÔFˆAÙØˆHØ�‰˜qÓ!Ð!rH   c                 óJ   — | j                  |«      }| j                  |«      }|S r²   )rÞ   rä   ©rD   rÄ   s     rG   rc   zMobileNetV5.forwardœ  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆrH   ©F)T)ry   ©NFFrÌ   FF)r   FTF)"re   rf   rg   rh   r   r   ri   rl   rk   r   r   r   r   rj   r<   r·   rX   rÏ   Úignorer¼   r¿   r›   ÚModulerÁ   rÃ   rm   r
   r	   r×   rÛ   rÞ   rä   rc   rn   ro   s   @rG   r%   r%   ~   s(  ø„ ñð  $ØØØ"Ø"Ø $ØØ!Ø&.Ø*,Ø-1Ø.2Ø,0Ø,0Ø $Ø%3Ø!Ø$&Ø6:Ø$ØØñ1}(à!ð}(ð ð}(ð ð	}(ð
 ð}(ð ð}(ð ð}(ð ð}(ð ð}(ð ð}(ð ˜s™)ð}(ð %(ð}(ð   	Ñ*ð}(ð ! Ñ+ð}(ð ˜yÑ)ð}(ð  ˜yÑ)ð!}(ð" ð#}(ð$ #ð%}(ð& ð'}(ð( "ð)}(ð* %-¨U¡Oð+}(ð, õ-}(ò~	&ð ‡Y�Y×Ññ
 Dò 
ó ð
ð ‡Y�Y×Ññ)¨Tò )ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñk¨Cð k¸có kð 8<ØØ$Ø$Ø',Ø!&ñ< à�|‰|ð< ð ˜e C¨¨c© NÑ3Ñ4ð< ð ð	< ð
 ð< ð ð< ð !%ð< ð ð< ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó< ð@ ./Ø$Ø#Ø!&ñà˜3  S¡	˜>Ñ*ðð ðð ð	ð
 óð0 %§,¡,ð °5·<±<ó ñ."˜eŸl™lð "¸ð "ÈÏÉó "ð˜Ÿ™ð ¨%¯,©,÷ rH   c            $       ó  ‡ — e Zd ZdZdddddddd	d	d	d	ded
d
d	d	d	fdedededededede	e   dede
e   de
e   de
e   de
e   dedededede
e   f"ˆ fd„Z	 	 	 	 	 	 d)dej                   de
eeee   f      ded ed!ed"ed#ed$eeej                      eej                   eej                      f   f   fd%„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d(„Zˆ xZS )*r&   zMobileNetV5 Vision Encoderrr   é@   TFru   rv   rs   Nrx   rz   r|   r}   r~   r   r�   rƒ   r„   r2   r3   r…   r†   r‡   rˆ   r‰   rŠ   r0   c                 ó@  •— t         ‰| �  «        ||dœ}|	xs t        }	t        |
«      xs t        }
|xs t
        }d| _        || _        || _        d| _	        |s ||«      }t        ||fdd|||
|	dœ|¤Ž| _        t        dd||||	|
||||dœ
|¤Ž}t        j                   |||«      Ž | _        |j                   | _        | j"                  D �cg c]  }|d	   ‘Œ	 c}| _        d
x| _        | _        t+        t-        | j"                  «      |«      d   | _        t1        | j.                  D �cg c]  }| j"                  |   d   ‘Œ c}«      | _        || _        t7        d| j2                  | j&                  | j4                  |
|	dœ|¤Ž| _        t;        | «       y c c}w c c}w )Nr5   r   Frr   r�   rŽ   r‘   r’   r”   rt   r•   r–   r:   )r;   r<   rA   r   r   r   r{   r|   r‰   r™   r   rš   r   r›   rœ   r�   rž   rŸ   r    r€   r¡   r    r¢   rƒ   r>   r£   r„   r*   r¤   r   )rD   rz   r|   r}   r~   r   r�   rƒ   r„   r2   r3   r…   r†   r‡   rˆ   r‰   rŠ   r0   r6   r7   rE   r­   r®   r¯   rF   s                           €rG   r<   zMobileNetV5Encoder.__init__¥  sÓ  ø€ ô, 	‰ÑÔØ¨Ñ/ˆØÒ&¤ˆ	Ü# JÓ/Ò<´9ˆ
ØÒ,œ}ˆØˆÔØ ˆŒØ"ˆŒØ"'ˆÔñ Ù$ YÓ/ˆIÜ$ØØð

ð ØØØØ!Øñ

ð ñ

ˆŒô &ð 
ØØØ%Ø#ØØ!ØØØ)Ø#9ñ
ð ñ
ˆô —m‘m¡W¨Y¸
Ó%CÐDˆŒØ#×,Ñ,ˆÔØ/3×/@Ñ/@ÖA¨!˜1˜W›:ÒAˆŒà48Ð8ˆÔ˜DÔ1ä0´°T×5FÑ5FÓ1GÈÓVÐWXÑYˆÔÜÈ4×K\ÑK\Ö]ÀR × 1Ñ 1°"Ñ 5°iÓ @Ò]Ó^ˆÔØ&<ˆÔ#ä6ð 
Ø×#Ñ#Ø×%Ñ%Ø"×9Ñ9Ø!Øñ
ð ñ
ˆŒ	ô 	" $Õ'ùò# Bùò
  ^s   ÃFÄ*FrÄ   rÅ   rC   rÆ   rÇ   rÈ   rÉ   rJ   c                 óò  — ~|dv sJ d«       ‚|r	|sJ d«       ‚g }g }	|r&t        t        | j                  «      dz   |«      \  }
}nMt        t        | j                  «      |«      \  }
}|
D �cg c]  }| j                  |   ‘Œ }
}| j                  |   }d}| j	                  |«      }||
v r|j                  |«       || j                  v r|	j                  |«       t        j                  j                  «       s|s| j                  }n| j                  d| }|D ]D  }|dz  } ||«      }||
v r|j                  |«       || j                  v sŒ4|	j                  |«       ŒF |r|S | j                  |	«      |fS c c}w )al   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: (Unused) Applies norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
            extra_blocks: Include outputs of all blocks and head conv in output, does not align with feature_info
        Returns:

        rË   rÍ   rÎ   r   r   N)r    r¢   r�   r    rš   rW   rƒ   rX   rÏ   rÐ   r¤   )rD   rÄ   rÅ   rC   rÆ   rÇ   rÈ   rÉ   rÑ   Úmsfa_intermediatesrÒ   rÓ   rÔ   rÕ   r�   rÖ   s                   rG   r×   z(MobileNetV5Encoder.forward_intermediatesö  s�  € ð. à˜YÑ&ÐDÐ(DÓDÐ&ÙÙ%ÐXÐ'XÓXÐ%ð ˆØÐáÜ&:¼3¸t¿{¹{Ó;KÈaÑ;OÐQXÓ&YÑ#ˆL™)ä&:¼3¸t¿¹Ó;OÐQXÓ&YÑ#ˆL˜)Ø8DÖE°1˜DŸO™O¨AÓ.ÐEˆLÐEØŸ™¨	Ñ2ˆIð ˆØ�N‰N˜1ÓˆØ�|Ñ#Ø× Ñ  Ô#Ø�t×(Ñ(Ñ(Ø×%Ñ% aÔ(ä�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )Ð,ˆFàò 	-ˆCØ˜‰MˆHÙ�A“ˆAØ˜<Ñ'Ø×$Ñ$ QÔ'Ø˜4×,Ñ,Ò,Ø"×)Ñ)¨!Õ,ð	-ñ Ø Ð à�y‰yÐ+Ó,¨mÐ;Ð;ùò7 Fs   Á*E4c                 ó  — d}g }| j                  |«      }|| j                  v r|j                  |«       | j                  D ]/  }|dz  } ||«      }|| j                  v sŒ|j                  |«       Œ1 | j	                  |«      S )Nr   r   )rš   rƒ   rW   r�   r¤   rÝ   s        rG   rÞ   z#MobileNetV5Encoder.forward_features;  sˆ   € ØˆØˆà�N‰N˜1ÓˆØ�t×(Ñ(Ñ(Ø× Ñ  Ô#à—;‘;ò 	(ˆCØ˜‰MˆHá�A“ˆAØ˜4×,Ñ,Ò,Ø×$Ñ$ QÕ'ð	(ð �y‰y˜Ó'Ð'rH   c                 ó   — t        d«      ‚)Nz=MobileNetV5Encoder does not support classification use cases.)ÚNotImplementedErrorræ   s     rG   rä   zMobileNetV5Encoder.forward_headL  s   € Ü!Ð"aÓbÐbrH   c                 ó$   — | j                  |«      S r²   )rÞ   ræ   s     rG   rc   zMobileNetV5Encoder.forwardO  s   € Ø×$Ñ$ QÓ'Ð'rH   rè   )re   rf   rg   rh   r   r   ri   rl   rk   r   r   r   r   rj   r<   rX   rm   r
   r   r	   r×   rÞ   rä   rc   rn   ro   s   @rG   r&   r&   ¢  s  ø„ Ù$ð
 ØØ"Ø"ØØ*2Ø*,Ø-1Ø.2Ø,0Ø,0Ø $Ø%3Ø!Ø$&Ø6:ØØñ)O(à!ðO(ð ðO(ð ð	O(ð
 ðO(ð ðO(ð ðO(ð # 3™-ðO(ð %(ðO(ð   	Ñ*ðO(ð ! Ñ+ðO(ð ˜yÑ)ðO(ð ˜yÑ)ðO(ð ðO(ð #ðO(ð  ð!O(ð" "ð#O(ð$ %-¨U¡Oõ%O(ðh 8<ØØ$Ø$Ø',Ø!&ñC<à�|‰|ðC<ð ˜e C¨¨c© NÑ3Ñ4ðC<ð ð	C<ð
 ðC<ð ðC<ð !%ðC<ð ðC<ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	KóC<ðJ( %§,¡,ð (°5·<±<ó (ð"c˜eŸl™lð c¨u¯|©|ó cð(˜Ÿ™ð (¨%¯,©,÷ (rH   Ú
state_dictrJ   c                 óÖ   — | j                  d| «      } | j                  d| «      } d| v r:d}| j                  «       D ��ci c]  \  }}||v sŒ|j                  |d«      |“Œ } }}| S c c}}w )z% convert weights from gemma encoders Úmodelrô   z3model.vision_tower.timm_model.conv_stem.conv.weightzmodel.vision_tower.timm_model.ru   )ÚgetÚitemsÚreplace)rô   rö   ÚprefixÚkÚvs        rG   Úcheckpoint_filter_fnrý   S  sv   € ð
 —‘ ¨Ó4€JØ—‘ ¨jÓ9€JØ<À
ÑJØ1ˆØ;E×;KÑ;KÓ;M×]±4°1°aÐQWÐ[\ÒQ\�a—i‘i ¨Ó+¨QÑ.Ð]ˆ
Ñ]ØÐùó ^s   ¾A%ÁA%ÚvariantÚ
pretrainedc                 ó~   — |j                  dd«      }t        |d¬«      }d}t        t        | |fdt        ||dœ|¤Ž}|S )NÚout_indices©r   r   r�   rr   é   Úgetter©r  Úfeature_cls)r{   r€   Ú	head_convÚ	head_biasÚ	head_normr‹   F)Úpretrained_strictÚpretrained_filter_fnÚfeature_cfgÚkwargs_filter)Úpopr»   r   r&   rý   )rþ   rÿ   Úkwargsr  r  r  rö   s          rG   Ú_create_mnv5_encoderr  `  s^   € Ø—*‘*˜]¨OÓ<€KÜ ;¸HÔE€Kð€Mô !ÜØØð	ð  Ü1ØØ#ñ	ð ñ	€Eð €LrH   c                 óv   — |j                  dd«      }t        |d¬«      }t        t        | |ft        |dœ|¤Ž}|S )Nr  r  r  r  )r  r  )r  r»   r   r%   rý   )rþ   rÿ   r  r  r  rö   s         rG   Ú_create_mnv5r  x  sO   € Ø—*‘*˜]¨OÓ<€KÜ ;¸HÔE€KÜ ÜØØðô 2Øñð ñ€Eð €LrH   Úchannel_multiplierÚencoderc           	      ó
  — d| v rg d¢g d¢g d¢g d¢g}ng d¢g d¢g d¢g d¢g}t        t        ||¬«      d	|d
k  t        t        |¬«      t        t
        d¬«      }t        |fi |¤Ž}|rt        | |fi |¤Ž}|S t        | |fi |¤Ž}|S )NÚmobilenetv5_base)Úer_r1_k3_s2_e4_c128Úer_r1_k3_s1_e4_c128r  )Úuir_r1_a3_k5_s2_e6_c256Úuir_r1_a5_k0_s1_e4_c256Úuir_r1_a3_k0_s1_e4_c256r  r  )Úuir_r1_a5_k5_s2_e6_c512Úuir_r1_a5_k0_s1_e4_c512r  Úuir_r1_a0_k0_s1_e1_c512Úmqa_r1_k3_h8_s2_d64_c512Úuir_r1_a0_k0_s1_e2_c512r  r   r  r   r  r   r  r   r  r   )Úuir_r1_a5_k5_s2_e6_c1024Úmqa_r1_k3_h16_s1_d64_c1024Úuir_r1_a0_k0_s1_e2_c1024r"  r#  r"  r#  r"  r#  r"  r#  r"  r#  r"  r#  )%Úuir_r1_a5_k5_s2_e6_c640Úuir_r1_a5_k0_s1_e4_c640r%  r%  r%  r%  r%  r%  Úuir_r1_a0_k0_s1_e1_c640Úmqa_r1_k3_h12_v2_s1_d64_c640Úuir_r1_a0_k0_s1_e2_c640r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  r'  r(  )'Úuir_r1_a5_k5_s2_e6_c1280Úmqa_r1_k3_h16_s1_d96_c1280Úuir_r1_a0_k0_s1_e2_c1280r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  r*  r+  )Ú
group_sizerì   ç      ð?)Ú
multipliergñhãˆµøä>)rz   r}   r   rˆ   r3   r2   r0   )r»   r   r   r   r   rA   r  r  )	rþ   r  r,  rÿ   r  r  Úarch_defÚmodel_kwargsrö   s	            rG   Ú_gen_mobilenet_v5r1  †  sÁ   € ð ˜WÑ$òòòò&ðG4%
‰òpòò&òP(ðqa%
ˆôF Ü" 8¸
ÔCØØ# cÑ)Üœ^Ð8JÔKÜÜØ#ô€Lô ˜Ñ/¨Ñ/€LÙÜ$ W¨jÑI¸LÑIˆð €Lô ˜W jÑA°LÑAˆØ€LrH   Úurlc                 ó0   — | dddddt         t        dddœ
|¥S )	Nrq   )rr   é   r4  )rs   rs   r-  Úbicubiczconv_stem.convr«   )
r2  r{   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚstdÚ
first_convr«   r   )r2  r  s     rG   Ú_cfgr=  9  s0   € à 4°}ÐS[Ø¨)Ü'Ô0FØ&°lñ	ð
 ðð rH   )rx   rx   rx   )r-  r-  r-  )rr   é   r>  )r:  r;  r6  r{   ztimm/Úgemma)Ú	hf_hub_idr:  r;  r6  r{   Úlicenserq   )r{   )Úmobilenetv5_300m_enczmobilenetv5_300m.gemma3nzmobilenetv5_base.untrainedc                 óJ   — |j                  dd«      }t        	 d| d|dœ|¤Ž}|S )zMobileNet V5 Vision Encoderr�   ÚsameT)rÿ   r  r�   )rB  )r  r1  )rÿ   r  r�   rö   s       rG   rB  rB  Y  s@   € ð �z‰z˜* fÓ-€HÜØðàØØñ	ð
 ñ€Eð €LrH   c                 ó    — t        dd| i|¤Ž}|S )Nrÿ   )Úmobilenetv5_300m©r1  ©rÿ   r  rö   s      rG   rF  rF  g  ó   € äÑR¸ZÐRÈ6ÑR€EØ€LrH   c                 ó    — t        dd| i|¤Ž}|S )Nrÿ   )r  rG  rH  s      rG   r  r  m  rI  rH   rç   )r-  NFF)ru   )EÚ	functoolsr   Útypingr   r   r   r   r   r	   r
   rX   Útorch.nnr›   Útorch.nn.functionalÚ
functionalrU   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   r   Ú_builderr   Ú_efficientnet_blocksr   r   Ú_efficientnet_builderr   r   r   r   r   Ú	_featuresr    Ú_features_fxr!   Ú_manipulater"   Ú	_registryr#   r$   Ú__all__ÚGELUrA   rê   r*   r%   r&   rk   rm   rý   rl   r  r  rj   r1  r=  Údefault_cfgsrB  rF  r  r:   rH   rG   ú<module>r\     s"  ðÝ ß I× IÑ Iã Ý ß Ð ç E÷
÷ 
õ 
õ +ß J÷õ õ ,Ý 1Ý 'ß <àÐ.Ð
/€á�—‘ VÔ,€ð ôS¨¯©ó Só ðSôla�"—)‘)ô aôH	n(˜Ÿ™ô n(ðb
Ø˜˜eŸl™lÐ*Ñ+ð
ð 
ˆ#ˆu�|‰|Ð
Ñó
ñ #ð °4ð ÐN`ó ñ0˜#ð ¨4ð Àkó ð  %(ØØ ØñpØðpà!ðpð ð	pð
 ðpð ópñfˆcó ñ %á Ø˜|Ø Øôñ !%ØØ˜|Ø ØØô!ñ #'àô#ñ!&ó €ð, ñ
 Tð 
Ð@Rò 
ó ð
ð ñ ð ¸Kò ó ðð
 ñ ð ¸Kò ó ñrH   