
    RЦiR                        S r SSKrSSKJr  SSKJrJrJrJrJ	r	J
r
  SSKrSSKJr  SSKJs  Jr  SSKJr  SSKJrJr  SSKJrJrJrJr  SS	KJr  SS
KJrJr  SSK J!r!J"r"J#r#  S/r$ " S S\RJ                  5      r& " S S\RN                  5      r( " S S\RR                  5      r* " S S\RJ                  5      r+S\,S\\-\R\                  4   4S jr/S\-S\0S\\0S4   S\1S\+4
S jr2S-S\-S\\-\4   4S jjr3\"" \3" SS S!S"9\3" SS S!S"9\3" 5       \3" SS#9\3" SS#9\3" SS#9\3" SS#9S$.5      r4\!S.S\+4S% jj5       r5\!S.S\+4S& jj5       r6\!S.S\+4S' jj5       r7\!S.S\+4S( jj5       r8\!S.S\+4S) jj5       r9\!S.S\+4S* jj5       r:\#" \;S+S,05        g)/zPytorch Densenet implementation w/ tweaks
This file is a copy of https://github.com/pytorch/vision 'densenet.py' (BSD-3-Clause) with
fixed kwargs passthrough and addition of dynamic global avg/max pool.
    N)OrderedDict)AnyDictOptionalTupleTypeUnion)ListIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)BatchNormAct2dget_norm_act_layer
BlurPool2dcreate_classifier   )build_model_with_cfg)MATCH_PREV_GROUP
checkpoint)register_modelgenerate_default_cfgsregister_model_deprecationsDenseNetc                   ~  ^  \ rS rSrSr\SSSS4S\S\S\S	\\R                     S
\
S\SS4U 4S jjjrS\\R                     S\R                  4S jrS\\R                     S\4S jrS\\R                     S\R                  4S jrS\\R                  \\R                     4   S\R                  4S jrSrU =r$ )
DenseLayer   zZDense layer for DenseNet.

Implements the bottleneck layer with 1x1 and 3x3 convolutions.
        FNnum_input_featuresgrowth_ratebn_size
norm_layer	drop_rategrad_checkpointingreturnc	                   > XxS.n	[         T
U ]  5         U R                  SU" U40 U	D65      4  U R                  S[        R                  " XU-  4SSSS.U	D65      4  U R                  SU" X2-  40 U	D65      4  U R                  S[        R                  " X2-  U4S	SSSS
.U	D65      4  [        U5      U l        X`l        g)a$  Initialize DenseLayer.

Args:
    num_input_features: Number of input features.
    growth_rate: Growth rate (k) of the layer.
    bn_size: Bottleneck size multiplier.
    norm_layer: Normalization layer class.
    drop_rate: Dropout rate.
    grad_checkpointing: Use gradient checkpointing.
devicedtypenorm1conv1r   Fkernel_sizestridebiasnorm2conv2   r,   r-   paddingr.   N)super__init__
add_modulennConv2dfloatr"   r#   )selfr   r   r    r!   r"   r#   r'   r(   dd	__class__s             S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/densenet.pyr5   DenseLayer.__init__   s    * /,>!E"!EFG+ 5"bCDQUZ"b^`"b 	c 	dG,A!HR!HIJ!;"f<=aQRY^"fbd"f 	g 	hy)"4    xsc                 t    [         R                  " US5      nU R                  U R                  U5      5      nU$ )z.Bottleneck function for concatenated features.r   )torchcatr*   r)   )r:   r@   concated_featuresbottleneck_outputs       r=   bottleneck_fnDenseLayer.bottleneck_fn=   s2    !IIb!, JJtzz2C'DE  r?   xc                 <    U H  nUR                   (       d  M    g   g)z.Check if any tensor in list requires gradient.TF)requires_grad)r:   rH   tensors      r=   any_requires_gradDenseLayer.any_requires_gradD   s     F###  r?   c                 (   ^  U 4S jn[        U/UQ76 $ )z5Call bottleneck function with gradient checkpointing.c                  &   > TR                  U 5      $ )N)rF   )r@   r:   s    r=   closure6DenseLayer.call_checkpoint_bottleneck.<locals>.closureM   s    %%b))r?   )r   )r:   rH   rP   s   `  r=   call_checkpoint_bottleneck%DenseLayer.call_checkpoint_bottleneckK   s    	* '&A&&r?   c                    [        U[        R                  5      (       a  U/nOUnU R                  (       aV  U R	                  U5      (       a@  [        R
                  R                  5       (       a  [        S5      eU R                  U5      nOU R                  U5      nU R                  U R                  U5      5      nU R                  S:  a)  [        R                  " X@R                  U R                  S9nU$ )z~Forward pass.

Args:
    x: Input features (single tensor or list of tensors).

Returns:
    New features to be concatenated.
z%Memory Efficient not supported in JITr   )ptraining)
isinstancerB   Tensorr#   rL   jitis_scripting	ExceptionrR   rF   r0   r/   r"   FdropoutrV   )r:   rH   prev_featuresrE   new_featuress        r=   forwardDenseLayer.forwardT   s     a&&CMM""t'='=m'L'Lyy%%'' GHH $ ? ? N $ 2 2= Azz$**->"?@>>A99\^^dmm\Lr?   )r"   r#   )__name__
__module____qualname____firstlineno____doc__r   intr   r7   Moduler9   boolr5   r
   rB   rX   rF   rL   rR   r	   r`   __static_attributes____classcell__r<   s   @r=   r   r      s     +9!',5 #5 5 	5
 RYY5 5 !%5 
5 5@!U\\ 2 !u|| !4#5 $ 'D,> '5<< 'u||T%,,-??@ U\\  r?   r   c                      ^  \ rS rSrSrSr\SSSS4S\S\S	\S
\S\\	R                     S\S\SS4U 4S jjjrS\R                  S\R                  4S jrSrU =r$ )
DenseBlocko   zLDenseNet Block.

Contains multiple dense layers with concatenated features.
   r   FN
num_layersr   r    r   r!   r"   r#   r$   c
           
         > XS.n
[         TU ]  5         [        U5       H2  n[        X+U-  -   4UUUUUS.U
D6nU R	                  SUS-   -  U5        M4     g)aU  Initialize DenseBlock.

Args:
    num_layers: Number of layers in the block.
    num_input_features: Number of input features.
    bn_size: Bottleneck size multiplier.
    growth_rate: Growth rate (k) for each layer.
    norm_layer: Normalization layer class.
    drop_rate: Dropout rate.
    grad_checkpointing: Use gradient checkpointing.
r&   )r   r    r!   r"   r#   zdenselayer%dr   N)r4   r5   ranger   r6   )r:   rq   r   r    r   r!   r"   r#   r'   r(   r;   ilayerr<   s                r=   r5   DenseBlock.__init__v   sr    . /z"A"_4'%##5 E OONa!e4e< #r?   init_featuresc                     U/nU R                  5        H  u  p4U" U5      nUR                  U5        M      [        R                  " US5      $ )zForward pass through all layers in the block.

Args:
    init_features: Initial features from previous layer.

Returns:
    Concatenated features from all layers.
r   )itemsappendrB   rC   )r:   rw   featuresnameru   r_   s         r=   r`   DenseBlock.forward   sE     "?::<KD ?LOOL) ( yy1%%r?    )rb   rc   rd   re   rf   _versionr   rg   r   r7   rh   r9   ri   r5   rB   rX   r`   rj   rk   rl   s   @r=   rn   rn   o   s     H +9!',#=#= !$#= 	#=
 #= RYY#= #= !%#= 
#= #=J&U\\ &ell & &r?   rn   c                      ^  \ rS rSrSr\SSS4S\S\S\\R                     S\
\\R                        SS4
U 4S	 jjjrS
rU =r$ )DenseTransition   z^Transition layer between DenseNet blocks.

Reduces feature dimensions and spatial resolution.
Nr   num_output_featuresr!   aa_layerr$   c           
      :  > XVS.n[         TU ]  5         U R                  SU" U40 UD65        U R                  S[        R                  " X4SSSS.UD65        Ub  U R                  SU" U4S	S
0UD65        gU R                  S[        R
                  " S
S
S95        g)zInitialize DenseTransition.

Args:
    num_input_features: Number of input features.
    num_output_features: Number of output features.
    norm_layer: Normalization layer class.
    aa_layer: Anti-aliasing layer class.
r&   normconvr   Fr+   Npoolr-   rp   )r,   r-   )r4   r5   r6   r7   r8   	AvgPool2d)	r:   r   r   r!   r   r'   r(   r;   r<   s	           r=   r5   DenseTransition.__init__   s    " /
+= D DE		!`AB1SX!`\^!` 	aOOFH-@$Q$Qb$QROOFBLLQq$IJr?   r~   )rb   rc   rd   re   rf   r   rg   r   r7   rh   r   r5   rj   rk   rl   s   @r=   r   r      sl     +926K #K "%K RYY	K
 tBII/K 
K Kr?   r   c                   x  ^  \ rS rSrSr                S!S\S\\S4   S\S\S	\S
\S\S\S\S\\	\
R                        S\S\S\S\SS4U 4S jjjr\R                   R"                  S"S\S\\\4   4S jj5       r\R                   R"                  S#S\SS4S jj5       r\R                   R"                  S\
R                  4S j5       rS$S\S	\SS4S jjrS\R0                  S\R0                  4S jrS"S\R0                  S\S\R0                  4S jjrS\R0                  S\R0                  4S jrS rU =r$ )%r      a  Densenet-BC model class.

Based on `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`_

Args:
    growth_rate: How many filters to add each layer (`k` in paper).
    block_config: How many layers in each pooling block.
    bn_size: Multiplicative factor for number of bottle neck layers
      (i.e. bn_size * k features in the bottleneck layer).
    drop_rate: Dropout rate before classifier layer.
    proj_drop_rate: Dropout rate after each dense layer.
    num_classes: Number of classification classes.
    memory_efficient: If True, uses checkpointing. Much more memory efficient,
      but slower. Default: *False*. See `"paper" <https://arxiv.org/pdf/1707.06990.pdf>`_.
Nr   block_config.num_classesin_chansglobal_poolr    	stem_type	act_layerr!   r   r"   proj_drop_ratememory_efficientaa_stem_onlyr$   c                   > UUS.nX0l         X@l        [        T!U ]  5         [	        XS9n	SU;   nUS-  nU
c  [
        R                  " SSSS9nO2[
        R                  " [
        R                  " SSSS9U
" S$USS	.UD6/6 nU(       a  U=nnS
U;   a  SUS-  -  nSU;   a  UOSUS-  -  n[
        R                  " [        S[
        R                  " UUS4SSSS.UD64SU	" U40 UD64S[
        R                  " UUS4SSSS.UD64SU	" U40 UD64S[
        R                  " UUS4SSSS.UD64SU	" U40 UD64SU4/5      5      U l
        OO[
        R                  " [        S[
        R                  " UU4SSSSS.UD64SU	" U40 UD64SU4/5      5      U l
        [        USSU(       a  SOS 3S9/U l        SnUn[        U5       H  u  nn[        S$UUUUU	UUS.UD6nSUS-    3nU R                  R                  UU5        UUU-  -   nU(       a  SOU
nU[!        U5      S-
  :w  d  Md  U =R                  [        UUSU-   S9/-  sl        US-  n[#        S$UUS-  U	US.UD6nU R                  R                  S US-    3U5        US-  nM     U R                  R                  S!U	" U40 UD65        U =R                  [        UUS"S9/-  sl        U=U l        U l        [)        U R$                  U R                   4S#U0UD6u  nnXPl        [
        R,                  " U5      U l        UU l        U R3                  5        GH  n [5        U [
        R                  5      (       a+  [
        R6                  R9                  U R:                  5        MN  [5        U [
        R<                  5      (       aV  [
        R6                  R?                  U R:                  S5        [
        R6                  R?                  U R@                  S5        M  [5        U [
        RB                  5      (       d  M  [
        R6                  R?                  U R@                  S5        GM     g)%a  Initialize DenseNet.

Args:
    growth_rate: How many filters to add each layer (k in paper).
    block_config: How many layers in each pooling block.
    num_classes: Number of classification classes.
    in_chans: Number of input channels.
    global_pool: Global pooling type.
    bn_size: Multiplicative factor for number of bottle neck layers.
    stem_type: Type of stem ('', 'deep', 'deep_tiered').
    act_layer: Activation layer.
    norm_layer: Normalization layer.
    aa_layer: Anti-aliasing layer.
    drop_rate: Dropout rate before classifier layer.
    proj_drop_rate: Dropout rate after each dense layer.
    memory_efficient: If True, uses checkpointing for memory efficiency.
    aa_stem_only: Apply anti-aliasing only to stem.
r&   )r   deeprp   Nr1   r   )r,   r-   r3   )channelsr-   tiered   narrow   conv0F)r-   r3   r.   norm0r*   r)   r0   r/   pool0   r2   zfeatures.normr   )num_chs	reductionmodule)rq   r   r    r   r!   r"   r#   
denseblockz	features.)r   r   r!   r   
transitionnorm5zfeatures.norm5	pool_typer~   )"r   r   r4   r5   r   r7   	MaxPool2d
Sequentialr   r8   r{   dictfeature_info	enumeratern   r6   lenr   num_featureshead_hidden_sizer   r   Dropout	head_drop
classifiermodulesrW   initkaiming_normal_weightBatchNorm2d	constant_r.   Linear)"r:   r   r   r   r   r   r    r   r   r!   r   r"   r   r   r   r'   r(   r;   	deep_stemnum_init_features	stem_pool
stem_chs_1
stem_chs_2current_strider   rt   rq   blockmodule_nametransition_aa_layertransr   mr<   s"                                    r=   r5   DenseNet.__init__   s   J /& '
H
 i'	'!O1aHI1a@D"3ADD(F GI &11J9$+"23
2:i2G.QR]abRbMc
MM+"))Hj!cAqW\c`bcd*Z6267"))J
AeaQRY^ebdef*Z6267"))J0A1lQXY`eliklm*%6="=>)$7 + DM MM+"))H.?vQWXbcjovsuvw*%6="=>)$7 + DM *a-U^PQdeOf@ghj )&|4MAz 	%#/'%(#3	 	E 'Ai0KMM$$[%8'*{*BBL*6$HC%))!!P[^iPij&l l!!#' '3(4(9)0	
  ((:a!eW)=uE+q07 5< 	  *\*HR*HId<>Zjkll4@@D1 #4#
 "#
 	#
Z 'I.$ A!RYY''''1Ar~~..!!!((A.!!!&&!,Aryy))!!!&&!,  r?   coarsec                 <    [        SU(       a  SO	SS[        4/S9nU$ )z"Group parameters for optimization.z<^features\.conv[012]|features\.norm[012]|features\.pool[012]z)^features\.(?:denseblock|transition)(\d+))z+^features\.denseblock(\d+)\.denselayer(\d+)Nz^features\.transition(\d+))stemblocks)r   r   )r:   r   matchers      r=   group_matcherDenseNet.group_matcherd  s0     PCI?F.0@AP
 r?   enablec                     U R                   R                  5        H   n[        U[        5      (       d  M  Xl        M"     g)z)Enable or disable gradient checkpointing.N)r{   r   rW   r   r#   )r:   r   bs      r=   set_grad_checkpointingDenseNet.set_grad_checkpointingp  s.     &&(A!Z(('-$ )r?   c                     U R                   $ )zGet the classifier head.)r   )r:   s    r=   get_classifierDenseNet.get_classifierw  s     r?   c                 h    Xl         [        U R                  U R                   US9u  U l        U l        g)zReset the classifier head.

Args:
    num_classes: Number of classes for new classifier.
    global_pool: Global pooling type.
)r   N)r   r   r   r   r   )r:   r   r   s      r=   reset_classifierDenseNet.reset_classifier|  s2     ',=t//;-H)$/r?   rH   c                 $    U R                  U5      $ )z/Forward pass through feature extraction layers.)r{   r:   rH   s     r=   forward_featuresDenseNet.forward_features  s    }}Qr?   
pre_logitsc                 z    U R                  U5      nU R                  U5      nU(       a  U$ U R                  U5      $ )zForward pass through classifier head.

Args:
    x: Feature tensor.
    pre_logits: Return features before final classifier.

Returns:
    Output tensor.
)r   r   r   )r:   rH   r   s      r=   forward_headDenseNet.forward_head  s8     QNN1q6DOOA$66r?   c                 J    U R                  U5      nU R                  U5      nU$ )zGForward pass.

Args:
    x: Input tensor.

Returns:
    Output logits.
)r   r   r   s     r=   r`   DenseNet.forward  s)     !!!$a r?   )	r   r   r{   r   r   r   r   r   r   )    r              r1   avgr    relubatchnorm2dNr   r   FTNNF)T)r   )rb   rc   rd   re   rf   rg   r   strr   r   r7   rh   r9   ri   r5   rB   rY   ignorer   r   r   r   r   r   rX   r   r   r`   rj   rk   rl   s   @r=   r   r      s   $  ",;#$#+26!$&%*!%#D-D-  S/D- 	D-
 D- D- D- D- D- D- tBII/D- D- "D- #D- D-$ 
%D- D-L YY	D 	T#s(^ 	 	 YY.T .T . . YY		  	HC 	Hc 	Hd 	H %,,  5<<  7ell 7 7 7 %,,  r?   
state_dictr$   c                     [         R                  " S5      n[        U R                  5       5       HH  nUR	                  U5      nU(       d  M  UR                  S5      UR                  S5      -   nX   X'   X	 MJ     U $ )zFilter torchvision pretrained state dict for compatibility.

Args:
    state_dict: State dictionary from torchvision checkpoint.

Returns:
    Filtered state dictionary.
z]^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$r   rp   )recompilelistkeysmatchgroup)r   patternkeyresnew_keys        r=   _filter_torchvision_pretrainedr     sr     jjhjG JOO%&mmC 3iilSYYq\1G",/J ' r?   variantr   r   .
pretrainedc                 R    XS'   X$S'   [        [        U U4[        SS9[        S.UD6$ )a
  Create a DenseNet model.

Args:
    variant: Model variant name.
    growth_rate: Growth rate parameter.
    block_config: Block configuration.
    pretrained: Load pretrained weights.
    **kwargs: Additional model arguments.

Returns:
    DenseNet model instance.
r   r   T)flatten_sequential)feature_cfgpretrained_filter_fn)r   r   r   r   )r   r   r   r   kwargss        r=   _create_densenetr    sF    & (=)> D1;  r?   urlc                 2    U SSSSS[         [        SSSS	.UE$ )
z1Create default configuration for DenseNet models.r   )r1      r  )r   r   g      ?bicubiczfeatures.conv0r   z
apache-2.0)r  r   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   licenser   )r  r  s     r=   _cfgr    s4     4}SYI%.B&l|	
  r?   ztimm/)r1      r  gffffff?)	hf_hub_idtest_input_sizetest_crop_pct)r  )zdensenet121.ra_in1kzdensenetblur121d.ra_in1kzdensenet264d.untraineddensenet121.tv_in1kzdensenet169.tv_in1kzdensenet201.tv_in1kzdensenet161.tv_in1kc           	      H    [        SSS9n[        SSU 0[        U40 UD6D6nU$ )zlDensenet-121 model from
`"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
r   r   r   r   r   )densenet121r   r  r   r  
model_argsmodels       r=   r  r    2    
 "?CJ`z`T*E_X^E_`ELr?   c           	      T    [        SSS[        S9n[        SSU 0[        U40 UD6D6nU$ )zDensenet-121 w/ blur-pooling & 3-layer 3x3 stem
`"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
r   r   r   )r   r   r   r   r   )densenetblur121d)r   r   r  r  s       r=   r  r    s7    
 "?f_ijJeJe$zJd]cJdeELr?   c           	      H    [        SSS9n[        SSU 0[        U40 UD6D6nU$ )zlDensenet-169 model from
`"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
r   )r   r   r   r   r  r   )densenet169r  r  s       r=   r!  r!  	  r  r?   c           	      H    [        SSS9n[        SSU 0[        U40 UD6D6nU$ )zlDensenet-201 model from
`"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
r   )r   r   0   r   r  r   )densenet201r  r  s       r=   r$  r$    r  r?   c           	      H    [        SSS9n[        SSU 0[        U40 UD6D6nU$ )zlDensenet-161 model from
`"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
r#  )r   r   $   r   r  r   )densenet161r  r  s       r=   r'  r'    r  r?   c           	      J    [        SSSS9n[        SSU 0[        U40 UD6D6nU$ )zlDensenet-264 model from
`"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
r#  )r   r   @   r#  r   )r   r   r   r   )densenet264dr  r  s       r=   r*  r*  '  s4    
 "?fUJa
ad:F`Y_F`aELr?   tv_densenet121r  )r   r   )<rf   r   collectionsr   typingr   r   r   r   r   r	   rB   torch.nnr7   torch.nn.functional
functionalr\   torch.jit.annotationsr
   	timm.datar   r   timm.layersr   r   r   r   _builderr   _manipulater   r   	_registryr   r   r   __all__rh   r   
ModuleDictrn   r   r   r   r   r   rX   r   rg   ri   r  r  default_cfgsr  r  r!  r$  r'  r*  rb   r~   r?   r=   <module>r:     s   
 # : :     & A Y Y * 5 Y Y,U Up9& 9&xKbmm KDWryy Wtt S%,,=N8O * CHo 	 >c T#s(^  %%T; !%%T!; #f'2'2'2'2&  x   H   x   x   x      H+' r?   