
    khuQ                        d Z ddlZddlmZ ddl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 ddlmZmZ ddl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" dgZ# G d dejH                        Z% G d dejL                        Z' G d dejP                        Z) G d dejH                        Z*de+dee,e
jZ                  f   fdZ.de,de/dee/df   de0de*f
dZ1d-de,dee,ef   fdZ2 e! e2dd d!"       e2dd d!"       e2        e2d#       e2d#       e2d#       e2d#      d$      Z3e d.de*fd%       Z4e d.de*fd&       Z5e d.de*fd'       Z6e d.de*fd(       Z7e d.de*fd)       Z8e d.de*fd*       Z9 e"e:d+d,i       y)/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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                       e Zd ZdZeddfdededededed	ed
df fdZ	de
ej                     d
ej                  fdZde
ej                     d
efdZej                  j                   de
ej                     d
ej                  fd       Zej                  j$                  d        Zej                  j$                  d        Zdeej                  e
ej                     f   d
ej                  fdZ xZS )
DenseLayerzbDense layer for DenseNet.

    Implements the bottleneck layer with 1x1 and 3x3 convolutions.
            Fnum_input_featuresgrowth_ratebn_size
norm_layer	drop_rategrad_checkpointingreturnNc                 |   t         t        |           | j                  d ||            f | j                  dt	        j
                  |||z  ddd            f | j                  d |||z              f | j                  dt	        j
                  ||z  |dddd	            f t        |      | _        || _        y
)ad  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.
        norm1conv1r   Fkernel_sizestridebiasnorm2conv2   r'   r(   paddingr)   N)	superr   __init__
add_modulennConv2dfloatr    r!   )selfr   r   r   r   r    r!   	__class__s          P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/densenet.pyr0   zDenseLayer.__init__   s    & 	j$(*,>!?@A+ 51QUZ"\ 	] 	^Gk,A!BCDk!;AaQRY^"` 	a 	by)"4    xsc                 r    t        j                  |d      }| j                  | j                  |            }|S )z.Bottleneck function for concatenated features.r   )torchcatr%   r$   )r5   r9   concated_featuresbottleneck_outputs       r7   bottleneck_fnzDenseLayer.bottleneck_fn:   s2    !IIb!, JJtzz2C'DE  r8   xc                 .    |D ]  }|j                   s y y)z.Check if any tensor in list requires gradient.TF)requires_grad)r5   r@   tensors      r7   any_requires_gradzDenseLayer.any_requires_gradA   s"     	F##	 r8   c                 &      fd}t        |g| S )z5Call bottleneck function with gradient checkpointing.c                  &    j                  |       S N)r?   )r9   r5   s    r7   closurez6DenseLayer.call_checkpoint_bottleneck.<locals>.closureK   s    %%b))r8   )r   )r5   r@   rH   s   `  r7   call_checkpoint_bottleneckz%DenseLayer.call_checkpoint_bottleneckH   s    	* '&A&&r8   c                      y rG    r5   r@   s     r7   forwardzDenseLayer.forwardP        	r8   c                      y rG   rK   rL   s     r7   rM   zDenseLayer.forwardU   rN   r8   c                    t        |t        j                        r|g}n|}| j                  rL| j	                  |      r;t        j
                  j                         rt        d      | j                  |      }n| j                  |      }| j                  | j                  |            }| j                  dkD  r,t        j                  || j                  | j                        }|S )zForward 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)
isinstancer;   Tensorr!   rD   jitis_scripting	ExceptionrI   r?   r+   r*   r    FdropoutrR   )r5   r@   prev_featuresr>   new_featuress        r7   rM   zDenseLayer.forward\   s     a&CMM""t'='=m'Lyy%%' GHH $ ? ? N $ 2 2= Azz$**->"?@>>A99\T^^dmm\Lr8   )__name__
__module____qualname____doc__r   inttyper4   boolr0   r	   r;   rT   r?   rD   rU   unusedrI   _overload_methodrM   r   __classcell__r6   s   @r7   r   r      s;     .!',5 #5 5 	5
 5 5 !%5 
5:!U\\ 2 !u|| !4#5 $  YY'D,> '5<< ' ' YY   YY  u||T%,,-??@ U\\ r8   r   c                        e Zd ZdZdZeddfdedededed	ed
ede	ddf fdZ
dej                  dej                  fdZ xZS )
DenseBlockzTDenseNet Block.

    Contains multiple dense layers with concatenated features.
       r   F
num_layersr   r   r   r   r    r!   r"   Nc           	          t         t        |           t        |      D ]1  }t	        |||z  z   |||||      }	| j                  d|dz   z  |	       3 y)a  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!   zdenselayer%dr   N)r/   rh   r0   ranger   r1   )r5   rj   r   r   r   r   r    r!   ilayerr6   s             r7   r0   zDenseBlock.__init__~   sd    * 	j$(*z" 		=A"Q_4'%##5E OONa!e4e<		=r8   init_featuresc                     |g}| j                         D ]  \  }} ||      }|j                  |         t        j                  |d      S )zForward pass through all layers in the block.

        Args:
            init_features: Initial features from previous layer.

        Returns:
            Concatenated features from all layers.
        r   )itemsappendr;   r<   )r5   ro   featuresnamern   r[   s         r7   rM   zDenseBlock.forward   sL     "?::< 	*KD% ?LOOL)	* yy1%%r8   )r\   r]   r^   r_   _versionr   r`   ra   r4   rb   r0   r;   rT   rM   re   rf   s   @r7   rh   rh   w   s     H  .!',== !$= 	=
 = = = !%= 
=B&U\\ &ell &r8   rh   c                   D     e Zd ZdZedfdedededee   ddf
 fdZ xZ	S )	DenseTransitionzfTransition layer between DenseNet blocks.

    Reduces feature dimensions and spatial resolution.
    Nr   num_output_featuresr   aa_layerr"   c           
      6   t         t        |           | j                  d ||             | j                  dt	        j
                  ||ddd             || j                  d ||d	             y| j                  dt	        j                  dd
             y)a  Initialize 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.
        normconvr   Fr&   Npoolri   )r(   )r'   r(   )r/   rw   r0   r1   r2   r3   	AvgPool2d)r5   r   rx   r   ry   r6   s        r7   r0   zDenseTransition.__init__   s     	ot-/
+= >?		 31SX!Z 	[OOFH-@$KLOOFBLLQq$IJr8   )
r\   r]   r^   r_   r   r`   ra   r   r0   re   rf   s   @r7   rw   rw      sU      .'+K #K "%K 	K
 tnK 
K Kr8   rw   c                   6    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddedeedf   dededed	ed
edededee   de	de	de
de
ddf fdZej                  j                  d de
deeef   fd       Zej                  j                  d!de
ddfd       Zej                  j                  dej(                  fd       Zd"dededdfdZdej.                  dej.                  fdZd dej.                  de
dej.                  fdZdej.                  dej.                  fdZ xZS )#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   ry   r    proj_drop_ratememory_efficientaa_stem_onlyr"   c                 .   || _         t        t        |           t	        |	|      }	d|v }|dz  }|
t        j                  ddd      }n2t        j                  t        j                  ddd       |
|d      g }|r|x}}d	|v rd|d
z  z  }d|v r|nd|d
z  z  }t        j                  t        dt        j                  ||dddd      fd |	|      fdt        j                  ||dddd      fd |	|      fdt        j                  ||dddd      fd |	|      fd|fg            | _
        nKt        j                  t        dt        j                  ||dddd      fd |	|      fd|fg            | _
        t        |dd|rdnd       g| _        d
}|}t        |      D ]  \  }}t        |||||	||      }d|dz    }| j                  j                  ||       |||z  z   }|rdn|
}|t!        |      dz
  k7  s\| xj                  t        ||d|z         gz  c_        |dz  }t#        ||dz  |	|      }| j                  j                  d|dz    |       |dz  } | j                  j                  d  |	|             | xj                  t        ||d!      gz  c_        |x| _        | _        t)        | j$                  | j                   |"      \  }}|| _        t        j,                  |      | _        || _        | j3                         D ]  }t5        |t
        j                        r*t
        j6                  j9                  |j:                         Gt5        |t
        j<                        rUt
        j6                  j?                  |j:                  d       t
        j6                  j?                  |j@                  d       t5        |t
        jB                        st
        j6                  j?                  |j@                  d        y)#aj  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   deepri   Nr,   r   )r'   r(   r.   )channelsr(   tiered   narrow   conv0F)r(   r.   r)   norm0r%   r$   r+   r*   pool0   r-   zfeatures.normr   )num_chs	reductionmodule)rj   r   r   r   r   r    r!   
denseblockz	features.)r   rx   r   ry   
transitionnorm5zfeatures.norm5	pool_type)"r   r/   r   r0   r   r2   	MaxPool2d
Sequentialr   r3   rs   dictfeature_info	enumeraterh   r1   lenrw   num_featureshead_hidden_sizer   r   Dropout	head_drop
classifiermodulesrS   initkaiming_normal_weightBatchNorm2d	constant_r)   Linear)r5   r   r   r   r   r   r   r   r   r   ry   r    r   r   r   	deep_stemnum_init_features	stem_pool
stem_chs_1
stem_chs_2current_strider   rm   rj   blockmodule_nametransition_aa_layertransr   mr6   s                                 r7   r0   zDenseNet.__init__   s#   F 'h&('
iH
 i'	'!O1aHI1a@"3A>(@ AI &11J9$+"23
2:i2G.QR]abRbMc
MM+"))Hj!AqW\]^*Z01"))J
AaQRY^_`*Z01"))J0A1QXY`efg*%678)$7 + DM MM+"))H.?QWXbcjopq*%678)$7 + DM *a-U^PQdeOf@ghj )&|4 	1MAz%#/'%(#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3	18 	  *\*BCd<>Zjkll4@@D1 #4!#
Z
 'I.$  	-A!RYY'''1Ar~~.!!!((A.!!!&&!,Aryy)!!!&&!,	-r8   coarsec                 8    t        d|rdn	ddt        fg      }|S )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   )r5   r   matchers      r7   group_matcherzDenseNet.group_matcher^  s0     PCI?F.0@AP
 r8   enablec                 r    | j                   j                         D ]  }t        |t              s||_         y)z)Enable or disable gradient checkpointing.N)rs   r   rS   r   r!   )r5   r   bs      r7   set_grad_checkpointingzDenseNet.set_grad_checkpointingj  s2     &&( 	.A!Z('-$	.r8   c                     | j                   S )zGet the classifier head.)r   )r5   s    r7   get_classifierzDenseNet.get_classifierq  s     r8   c                 p    || _         t        | j                  | j                   |      \  | _        | _        y)zReset the classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        r   N)r   r   r   r   r   )r5   r   r   s      r7   reset_classifierzDenseNet.reset_classifierv  s4     ',=t//;-H)$/r8   r@   c                 $    | j                  |      S )z/Forward pass through feature extraction layers.)rs   rL   s     r7   forward_featureszDenseNet.forward_features  s    }}Qr8   
pre_logitsc                 p    | j                  |      }| j                  |      }|r|S | j                  |      S )zForward pass through classifier head.

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

        Returns:
            Output tensor.
        )r   r   r   )r5   r@   r   s      r7   forward_headzDenseNet.forward_head  s8     QNN1q6DOOA$66r8   c                 J    | j                  |      }| j                  |      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r   r   rL   s     r7   rM   zDenseNet.forward  s)     !!!$a r8   )    r              r,   avgr    relubatchnorm2dNr   r   FTF)T)r   )r\   r]   r^   r_   r`   r   strr   ra   r4   rb   r0   r;   rU   ignorer   r   r   r   r2   Moduler   r   rT   r   r   rM   re   rf   s   @r7   r   r      s   $  ",;#$#+'+!$&%*!%}-}-  S/}- 	}-
 }- }- }- }- }- }- tn}- }- "}- #}- }-  
!}-~ YY	D 	T#s(^ 	 	 YY.T .T . . YY		  	HC 	Hc 	Hd 	H %,,  5<<  7ell 7 7 7 %,, r8   
state_dictr"   c                     t        j                  d      }t        | j                               D ]D  }|j	                  |      }|s|j                  d      |j                  d      z   }| |   | |<   | |= F | S )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   ri   )recompilelistkeysmatchgroup)r   patternkeyresnew_keys        r7   _filter_torchvision_pretrainedr     s{     jjhjG JOO%&  mmC iilSYYq\1G",S/Jw3  r8   variantr   r   .
pretrainedc                 \    ||d<   ||d<   t        t        | |ft        d      t        d|S )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        r7   _create_densenetr     sJ    & (F=)F> D1;  r8   urlc                 0    | dddddt         t        ddd
|S )	z1Create default configuration for DenseNet models.r   )r,      r   )r   r   g      ?bicubiczfeatures.conv0r   )
r   r   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   r
   )r   r   s     r7   _cfgr     s4     4}SYI%.B&l	 GM	 r8   ztimm/)r,      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           	      N    t        dd      }t        dd| it        |fi |}|S )ztDensenet-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       r7   r  r    2    
 "?CJ`z`T*E_X^E_`ELr8   c           	      Z    t        dddt              }t        dd| it        |fi |}|S )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   ry   r   )densenetblur121d)r   r   r   r  s       r7   r
  r
    s7    
 "?f_ijJeJe$zJd]cJdeELr8   c           	      N    t        dd      }t        dd| it        |fi |}|S )ztDensenet-169 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r   )r   r   r   r   r  r   )densenet169r  r  s       r7   r  r    r  r8   c           	      N    t        dd      }t        dd| it        |fi |}|S )ztDensenet-201 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r   )r   r   0   r   r  r   )densenet201r  r  s       r7   r  r    r  r8   c           	      N    t        dd      }t        dd| it        |fi |}|S )ztDensenet-161 model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`
    r  )r   r   $   r   r  r   )densenet161r  r  s       r7   r  r    r  r8   c           	      P    t        ddd      }t        dd| it        |fi |}|S )ztDensenet-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       r7   r  r     s4    
 "?fUJa
ad:F`Y_F`aELr8   tv_densenet121r   )r   r   );r_   r   collectionsr   typingr   r   r   r   r   r;   torch.nnr2   torch.nn.functional
functionalrX   torch.jit.annotationsr	   	timm.datar   r   timm.layersr   r   r   r   _builderr   _manipulater   r   	_registryr   r   r   __all__r   r   
ModuleDictrh   r   rw   r   r   r   rT   r   r`   rb   r   r   default_cfgsr  r
  r  r  r  r  r\   rK   r8   r7   <module>r%     s   
 # 4 4     & A Y Y * 5 Y Y,] ]@5& 5&pKbmm K>Pryy Pft S%,,=N8O * CHo 	 >c T#s(^  %%T; !%%T!; #f'2'2'2'2&  x   H   x   x   x      H+' r8   