
    kh\G                        d Z ddlZddl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 ddlmZ ddlmZmZ d	gZd
 Z G d dej,                        Z G d dej,                        Z G d de      Z G d de      Z G d de      Z G d dej,                        Z G d d	ej,                        Zd1dZd2dZ e ed       edd       ed       ed        ed!       ed"       ed#d       ed$       ed%      d&	      Z ed1d'efd(       Z!ed1d'efd)       Z"ed1d'efd*       Z#ed1d'efd+       Z$ed1d'efd,       Z%ed1d'efd-       Z&ed1d'efd.       Z'ed1d'efd/       Z(ed1d'efd0       Z)y)3a:  
SEResNet implementation from Cadene's pretrained models
https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/senet.py
Additional credit to https://github.com/creafz

Original model: https://github.com/hujie-frank/SENet

ResNet code gently borrowed from
https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py

FIXME I'm deprecating this model and moving them to ResNet as I don't want to maintain duplicate
support for extras like dilation, switchable BN/activations, feature extraction, etc that don't exist here.
    N)OrderedDictIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsSENetc                 p   t        | t        j                        r-t        j                  j	                  | j
                  dd       y t        | t        j                        rUt        j                  j                  | j
                  d       t        j                  j                  | j                  d       y y )Nfan_outrelu)modenonlinearityg      ?        )	
isinstancennConv2dinitkaiming_normal_weightBatchNorm2d	constant_bias)ms    M/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/senet.py_weight_initr      sp    !RYY
yvN	Ar~~	&
!((B'
!&&"% 
'    c                   $     e Zd Z fdZd Z xZS )SEModulec                    t         t        |           t        j                  |||z  d      | _        t        j                  d      | _        t        j                  ||z  |d      | _        t        j                         | _
        y )Nr   )kernel_sizeTinplace)superr!   __init__r   r   fc1ReLUr   fc2Sigmoidsigmoid)selfchannels	reduction	__class__s      r   r'   zSEModule.__init__'   s_    h&(99Xx9'<!LGGD)	99X2H!Lzz|r   c                     |}|j                  dd      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }||z  S )N)      T)keepdim)meanr(   r   r*   r,   )r-   xmodule_inputs      r   forwardzSEModule.forward.   sX    FF64F(HHQKIIaLHHQKLLOar   )__name__
__module____qualname__r'   r8   __classcell__r0   s   @r   r!   r!   %   s    $ r   r!   c                       e Zd ZdZd Zy)
BottleneckzH
    Base class for bottlenecks that implements `forward()` method.
    c                    |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  | j                  |      }| j                  |      |z   }| j                  |      }|S N)	conv1bn1r   conv2bn2conv3bn3
downsample	se_moduler-   r6   shortcutouts       r   r8   zBottleneck.forward=   s    jjmhhsmiinjjohhsmiinjjohhsm??&q)HnnS!H,iin
r   N)r9   r:   r;   __doc__r8    r   r   r?   r?   8   s    r   r?   c                   (     e Zd ZdZdZd fd	Z xZS )SEBottleneckz"
    Bottleneck for SENet154.
       c           	      ,   t         t        |           t        j                  ||dz  dd      | _        t        j                  |dz        | _        t        j                  |dz  |dz  d|d|d      | _        t        j                  |dz        | _	        t        j                  |dz  |dz  dd      | _
        t        j                  |dz        | _        t        j                  d	      | _        t        |dz  |
      | _        || _        || _        y )Nr2   r   Fr#   r   rQ   r3   r#   stridepaddinggroupsr   Tr$   r/   )r&   rP   r'   r   r   rB   r   rC   rD   rE   rF   rG   r)   r   r!   rI   rH   rU   r-   inplanesplanesrW   r/   rU   rH   r0   s          r   r'   zSEBottleneck.__init__Z   s    lD*,YYx!O
>>&1*-YYQJ
&f52
 >>&1*-YYvz6A:15Q
>>&1*-GGD)	!&1*	B$r   r   Nr9   r:   r;   rM   	expansionr'   r<   r=   s   @r   rP   rP   T   s     I r   rP   c                   (     e Zd ZdZdZd fd	Z xZS )SEResNetBottleneckz
    ResNet bottleneck with a Squeeze-and-Excitation module. It follows Caffe
    implementation and uses `stride=stride` in `conv1` and not in `conv2`
    (the latter is used in the torchvision implementation of ResNet).
    rQ   c                    t         t        |           t        j                  ||dd|      | _        t        j                  |      | _        t        j                  ||dd|d      | _        t        j                  |      | _	        t        j                  ||dz  dd      | _
        t        j                  |dz        | _        t        j                  d	      | _        t        |dz  |
      | _        || _        || _        y )Nr   Fr#   r   rU   r3   r#   rV   rW   r   rQ   rS   Tr$   rX   )r&   r`   r'   r   r   rB   r   rC   rD   rE   rF   rG   r)   r   r!   rI   rH   rU   rY   s          r   r'   zSEResNetBottleneck.__init__r   s     $02YYxQUSYZ
>>&)YYvv1aPV]bc
>>&)YYvvzquM
>>&1*-GGD)	!&1*	B$r   r\   r]   r=   s   @r   r`   r`   j   s    
 I r   r`   c                   (     e Zd ZdZdZd fd	Z xZS )SEResNeXtBottleneckzI
    ResNeXt bottleneck type C with a Squeeze-and-Excitation module.
    rQ   c           	      F   t         t        |           t        j                  ||dz  z        |z  }t        j                  ||ddd      | _        t        j                  |      | _	        t        j                  ||d|d|d      | _
        t        j                  |      | _        t        j                  ||dz  dd      | _        t        j                  |dz        | _        t        j                  d	
      | _        t!        |dz  |      | _        || _        || _        y )N@   r   Frb   r3   rT   rQ   rS   Tr$   rX   )r&   re   r'   mathfloorr   r   rB   r   rC   rD   rE   rF   rG   r)   r   r!   rI   rH   rU   )
r-   rZ   r[   rW   r/   rU   rH   
base_widthwidthr0   s
            r   r'   zSEResNeXtBottleneck.__init__   s    !413

6Z"_56?YYxAERST
>>%(YYue6ST]cjop
>>%(YYufqjaeL
>>&1*-GGD)	!&1*	B$r   )r   NrQ   r]   r=   s   @r   re   re      s     I r   re   c                   *     e Zd ZdZd fd	Zd Z xZS )SEResNetBlockr   c                    t         t        |           t        j                  ||dd|d      | _        t        j                  |      | _        t        j                  ||dd|d      | _        t        j                  |      | _	        t        j                  d      | _        t        ||      | _        || _        || _        y )	Nr3   r   F)r#   rV   rU   r   rc   Tr$   rX   )r&   rm   r'   r   r   rB   r   rC   rD   rE   r)   r   r!   rI   rH   rU   rY   s          r   r'   zSEResNetBlock.__init__   s    mT+-YYxQRX_de
>>&)YYvv1aPV]bc
>>&)GGD)	!&I>$r   c                 Z   |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j
                  | j                  |      }| j                  |      |z   }| j                  |      }|S rA   )rB   rC   r   rD   rE   rH   rI   rJ   s       r   r8   zSEResNetBlock.forward   s    jjmhhsmiinjjohhsmiin??&q)HnnS!H,iin
r   r\   )r9   r:   r;   r^   r'   r8   r<   r=   s   @r   rm   rm      s    I	r   rm   c                   $    e Zd Z	 	 	 d fd	Z	 	 ddZej                  j                  dd       Zej                  j                  dd       Z	ej                  j                  de
j                  fd       Zddedefd	Zd
 ZddefdZd Z xZS )r   c                    t         t        |           || _        || _        || _        |rdt        j                  |ddddd      fdt        j                  d      fd	t        j                  d
      fdt        j                  dddddd      fdt        j                  d      fdt        j                  d
      fdt        j                  d|dddd      fdt        j                  |      fdt        j                  d
      fg	}nKdt        j                  ||dddd      fdt        j                  |      fd	t        j                  d
      fg}t        j                  t        |            | _        t        j                  ddd
      | _        t        |dd      g| _        | j#                  |d|d   ||dd      | _        | xj                   t        d|j&                  z  dd      gz  c_        | j#                  |d|d   d|||	|
      | _        | xj                   t        d|j&                  z  dd      gz  c_        | j#                  |d|d   d|||	|
      | _        | xj                   t        d|j&                  z  d d!      gz  c_        | j#                  |d"|d   d|||	|
      | _        | xj                   t        d"|j&                  z  d#d$      gz  c_        d"|j&                  z  x| _        | _        t3        | j.                  | j                  |%      \  | _        | _        | j9                         D ]  }t;        |        y&)'af  
        Parameters
        ----------
        block (nn.Module): Bottleneck class.
            - For SENet154: SEBottleneck
            - For SE-ResNet models: SEResNetBottleneck
            - For SE-ResNeXt models:  SEResNeXtBottleneck
        layers (list of ints): Number of residual blocks for 4 layers of the
            network (layer1...layer4).
        groups (int): Number of groups for the 3x3 convolution in each
            bottleneck block.
            - For SENet154: 64
            - For SE-ResNet models: 1
            - For SE-ResNeXt models:  32
        reduction (int): Reduction ratio for Squeeze-and-Excitation modules.
            - For all models: 16
        dropout_p (float or None): Drop probability for the Dropout layer.
            If `None` the Dropout layer is not used.
            - For SENet154: 0.2
            - For SE-ResNet models: None
            - For SE-ResNeXt models: None
        inplanes (int):  Number of input channels for layer1.
            - For SENet154: 128
            - For SE-ResNet models: 64
            - For SE-ResNeXt models: 64
        input_3x3 (bool): If `True`, use three 3x3 convolutions instead of
            a single 7x7 convolution in layer0.
            - For SENet154: True
            - For SE-ResNet models: False
            - For SE-ResNeXt models: False
        downsample_kernel_size (int): Kernel size for downsampling convolutions
            in layer2, layer3 and layer4.
            - For SENet154: 3
            - For SE-ResNet models: 1
            - For SE-ResNeXt models: 1
        downsample_padding (int): Padding for downsampling convolutions in
            layer2, layer3 and layer4.
            - For SENet154: 1
            - For SE-ResNet models: 0
            - For SE-ResNeXt models: 0
        num_classes (int): Number of outputs in `last_linear` layer.
            - For all models: 1000
        rB   rg   r3   r2   r   F)rU   rV   r   rC   relu1Tr$   rD   rE   relu2rF   rG   relu3   r#   rU   rV   r   )rU   	ceil_modelayer0)num_chsr/   moduler   )r[   blocksrW   r/   downsample_kernel_sizedownsample_paddingrQ   layer1   )r[   r{   rU   rW   r/   r|   r}      layer2      layer3i       layer4	pool_typeN)r&   r   r'   rZ   num_classes	drop_rater   r   r   r)   
Sequentialr   rx   	MaxPool2dpool0dictfeature_info_make_layerr~   r^   r   r   r   num_featureshead_hidden_sizer   global_poollast_linearmodulesr   )r-   blocklayersrW   r/   r   in_chansrZ   	input_3x3r|   r}   r   r   layer0_modulesr   r0   s                  r   r'   zSENet.__init__   sD   ^ 	eT#% &""))Hb!AquUVr*+"''$/0"))BAaOPr*+"''$/0"))B!AquUVx01"''$/0
N "))hAaQVX Yx01"''$/0	N mmK$?@\\!A>
!(aQR&&!9#$  ' 
 	d2+?1U]^__&&!9#91 ' 	
 	d3+@AV^_``&&!9#91 ' 	
 	d3+@BW_`aa&&!9#91 ' 	
 	d3+@BW_`aa47%//4IID1->t//;.H*$*  	AO	r   c	           
         d }	|dk7  s| j                   ||j                  z  k7  rft        j                  t        j                  | j                   ||j                  z  |||d      t        j
                  ||j                  z              }	 || j                   |||||	      g}
||j                  z  | _         t        d|      D ]&  }|
j                   || j                   |||             ( t        j                  |
 S )Nr   Frv   )rZ   r^   r   r   r   r   rangeappend)r-   r   r[   r{   rW   r/   rU   r|   r}   rH   r   is               r   r   zSENet._make_layer5  s    
Q;$--6EOO+CC		MM6EOO#;I_!+=EK v78	J vvy&*UV0q&! 	KAMM%vvyIJ	K }}f%%r   c                 (    t        d|rdnd      }|S )Nz^layer0z^layer(\d+)z^layer(\d+)\.(\d+))stemr{   )r   )r-   coarsematchers      r   group_matcherzSENet.group_matcherG  s    J~Mbcr   c                     |rJ d       y )Nz$gradient checkpointing not supportedrN   )r-   enables     r   set_grad_checkpointingzSENet.set_grad_checkpointingL  s    AAAz6r   returnc                     | j                   S rA   )r   )r-   s    r   get_classifierzSENet.get_classifierP  s    r   r   r   c                 p    || _         t        | j                  | j                   |      \  | _        | _        y )Nr   )r   r   r   r   r   )r-   r   r   s      r   reset_classifierzSENet.reset_classifierT  s3    &->t//;.H*$*r   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S rA   )rx   r   r~   r   r   r   r-   r6   s     r   forward_featureszSENet.forward_featuresY  sU    KKNJJqMKKNKKNKKNKKNr   
pre_logitsc                     | j                  |      }| j                  dkD  r,t        j                  || j                  | j                        }|r|S | j                  |      S )Nr   )ptraining)r   r   Fdropoutr   r   )r-   r6   r   s      r   forward_headzSENet.forward_headb  sP    Q>>B		!t~~FAq7D$4$4Q$77r   c                 J    | j                  |      }| j                  |      }|S rA   )r   r   r   s     r   r8   zSENet.forwardh  s'    !!!$a r   )g?r3   rg   Fr   r     avg)r   r   r   F)T)r   )r9   r:   r;   r'   r   torchjitignorer   r   r   Moduler   intstrr   r   boolr   r8   r<   r=   s   @r   r   r      s     ?BMN@Ezx LMAB&$ YY  YYB B YY 		    HC Hc H
8$ 8r   c                 &    t        t        | |fi |S rA   )r	   r   )variant
pretrainedkwargss      r   _create_senetr   n  s    w
EfEEr   c                 0    | dddddt         t        ddd
|S )	Nr   )r3      r   )ru   ru   g      ?bilinearzlayer0.conv1r   )
urlr   
input_size	pool_sizecrop_pctinterpolationr5   std
first_conv
classifierr   )r   r   s     r   _cfgr   r  s0    4}SYJ%.B$M	
  r   zmhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_senet154-e9eb9fe6.pth)r   zhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet18-4bb0ce65.pthbicubic)r   r   zhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnet34-a4004e63.pthzhhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet50-ce0d4300.pthzihttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet101-7e38fcc6.pthzihttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/se_resnet152-d17c99b7.pthzphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/seresnext26_32x4d-65ebdb501.pthzwhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_se_resnext50_32x4d-f3651bad.pthzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/legacy_se_resnext101_32x4d-37725eac.pth)	zlegacy_senet154.in1kzlegacy_seresnet18.in1kzlegacy_seresnet34.in1kzlegacy_seresnet50.in1kzlegacy_seresnet101.in1kzlegacy_seresnet152.in1kzlegacy_seresnext26_32x4d.in1kzlegacy_seresnext50_32x4d.in1kzlegacy_seresnext101_32x4d.in1kr   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr2   r2   r2   r2   r   r   r   r   rW   r/   legacy_seresnet18r   rm   r   r   r   
model_argss      r   r   r     3    LbJJ,jWD<Vv<VWWr   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr3   rQ      r3   r   r   r   legacy_seresnet34r   r   s      r   r   r     r   r   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr   r   r   r   legacy_seresnet50r   r`   r   r   s      r   r   r     s3     a2OJ,jWD<Vv<VWWr   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr3   rQ      r3   r   r   r   legacy_seresnet101r   r   s      r   r   r     4     qBPJ-zXT*=WPV=WXXr   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr3   r   $   r3   r   r   r   legacy_seresnet152r   r   s      r   r   r     r   r   c           
      b    t        t        g ddddddd      }t        d	| fi t        |fi |S )
Nr   rg   r   r3   r   r   T)r   r   rW   r/   r|   r}   rZ   r   legacy_senet154)r   rP   r   r   s      r   r   r     s?    =r Q#QUWJ *JU$z:TV:TUUr   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr   r   r   r   legacy_seresnext26_32x4dr   re   r   r   s      r   r   r     4    !,rRQJ3Z^4
C]V\C]^^r   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr   r   r   r   legacy_seresnext50_32x4dr   r   s      r   r   r     r   r   c           	      Z    t        t        g ddd      }t        d| fi t        |fi |S )Nr   r   r   r   legacy_seresnext101_32x4dr   r   s      r   r   r     s4    !-bRJ4j_DD^W]D^__r   r   ) )*rM   rh   collectionsr   r   torch.nnr   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   _builderr	   	_registryr
   r   __all__r   r   r!   r?   rP   r`   re   rm   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   rN   r   r   <module>r      sB    #     A ) * <)& ryy  & 8: , ,* *BII DtBII tnF % {}"v! #vx"vx#w y#w y%)~&! &* F&G&* G'H'& 0 XU X X XU X X XU X X Ye Y Y Ye Y Y V5 V V _E _ _ _E _ _ `U ` `r   