
    Ng&G                     t   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d3dZd4d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d3d)efd*            Z!ed3d)efd+            Z"ed3d)efd,            Z#ed3d)efd-            Z$ed3d)efd.            Z%ed3d)efd/            Z&ed3d)efd0            Z'ed3d)efd1            Z(ed3d)efd2            Z)dS )5a:  
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                 X   t          | t          j                  r)t          j                            | j        dd           d S t          | t          j                  rLt          j                            | j        d           t          j                            | j        d           d S d S )Nfan_outrelu)modenonlinearityg      ?        )	
isinstancennConv2dinitkaiming_normal_weightBatchNorm2d	constant_bias)ms    M/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/senet.py_weight_initr      s    !RY &
yvNNNNN	Ar~	&	& &
!(B'''
!&"%%%%%& &    c                   $     e Zd Z fdZd Z xZS )SEModulec                 6   t          t          |                                            t          j        |||z  d          | _        t          j        d          | _        t          j        ||z  |d          | _        t          j	                    | _
        d S )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&&(((9Xx9'<!LLLGD)))	9X2H!LLLz||r   c                     |}|                     dd          }|                     |          }|                     |          }|                     |          }|                     |          }||z  S )N)      T)keepdim)meanr(   r   r*   r,   )r-   xmodule_inputs      r   forwardzSEModule.forward.   sc    FF64F((HHQKKIIaLLHHQKKLLOOar   )__name__
__module____qualname__r'   r8   __classcell__r0   s   @r   r!   r!   %   sG        $ $ $ $ $             r   r!   c                       e Zd ZdZd ZdS )
BottleneckzH
    Base class for bottlenecks that implements `forward()` method.
    c                    |}|                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }| j        |                     |          }|                     |          |z   }|                     |          }|S N)	conv1bn1r   conv2bn2conv3bn3
downsample	se_moduler-   r6   shortcutouts       r   r8   zBottleneck.forward=   s    jjmmhhsmmiinnjjoohhsmmiinnjjoohhsmm?&q))HnnS!!H,iinn
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.
       r   Nc           	      R   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  |
          | _        || _        || _        d S )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!!**,,,Yx!OOO
>&1*--YQJ
&f52 2 2
 >&1*--Yvz6A:15QQQ
>&1*--GD)))	!&1*	BBB$r   r   Nr9   r:   r;   rM   	expansionr'   r<   r=   s   @r   rP   rP   T   sN          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   r   Nc                 .   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  |
          | _        || _        || _        d S )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0222YxQUSYZZZ
>&))Yvv1aPV]bccc
>&))YvvzquMMM
>&1*--GD)))	!&1*	BBB$r   r\   r]   r=   s   @r   r`   r`   j   sN         
 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   r   Nc           	      j   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  |          | _        || _        || _        d S )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1333
6Z"_566?YxAERSTTT
>%((Yue6ST]cjoppp
>%((YufqjaeLLL
>&1*--GD)))	!&1*	BBB$r   )r   NrQ   r]   r=   s   @r   re   re      sN          I         r   re   c                   *     e Zd ZdZd fd	Zd Z xZS )SEResNetBlockr   Nc                    t          t          |                                            t          j        ||dd|d          | _        t          j        |          | _        t          j        ||dd|d          | _        t          j        |          | _	        t          j
        d          | _        t          ||          | _        || _        || _        d S )	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""++---YxQRX_deee
>&))Yvv1aPV]bccc
>&))GD)))	!&I>>>$r   c                    |}|                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }| j        |                     |          }|                     |          |z   }|                     |          }|S rA   )rB   rC   r   rD   rE   rH   rI   rJ   s       r   r8   zSEResNetBlock.forward   s    jjmmhhsmmiinnjjoohhsmmiinn?&q))HnnS!!H,iinn
r   r\   )r9   r:   r;   r^   r'   r8   r<   r=   s   @r   rm   rm      sQ        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   皙?r3   rg   Fr   r     avgc                    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	}nHd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| _        |                     |d|d         ||dd          | _        | xj        t          d|j        z  dd          gz  c_        |                     |d|d         d|||	|
          | _        | xj        t          d|j        z  dd          gz  c_        |                     |d|d         d|||	|
          | _        | xj        t          d|j        z  d d!          gz  c_        |                     |d"|d         d|||	|
          | _        | xj        t          d"|j        z  d#d$          gz  c_        d"|j        z  x| _        | _        t3          | j        | j        |%          \  | _        | _        |                                 D ]}t;          |           d&S )'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   r{   	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__   s   ^ 	eT##%%% &" 	")Hb!AquUUUVr**+"'$///0")BAaOOOPr**+"'$///0")B!AquUUUVx001"'$///0
NN ")hAaQVX X X Yx001"'$///0	N mK$?$?@@\!A>>>
!(aQQ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 .H .H*$*  	 	AOOOO	 	r   c	           
         d }	|dk    s| j         ||j        z  k    rTt          j        t          j        | j         ||j        z  |||d          t          j        ||j        z                      }	 || j         |||||	          g}
||j        z  | _         t          d|          D ](}|
                     || j         |||                     )t          j        |
 S )Nr   Fry   )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;;$-6EO+CCC	M6EO#;I_!+=EK K K v788	 J %vvy&*UUV0q&!! 	K 	KAMM%%vvyIIJJJJ}f%%r   c                 0    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/b~~Mbcccr   Tc                     |r
J d            d S )Nz$gradient checkpointing not supportedrN   )r-   enables     r   set_grad_checkpointingzSENet.set_grad_checkpointingL  s    AAAAAAAAr   returnc                     | j         S rA   )r   )r-   s    r   get_classifierzSENet.get_classifierP  s    r   r   r   c                 f    || _         t          | j        | j         |          \  | _        | _        d S )Nr   )r   r   r   r   r   )r-   r   r   s      r   reset_classifierzSENet.reset_classifierT  s?    &->t/;.H .H .H*$***r   c                    |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|S rA   )r{   r   r   r   r   r   r-   r6   s     r   forward_featureszSENet.forward_featuresY  sa    KKNNJJqMMKKNNKKNNKKNNKKNNr   
pre_logitsc                     |                      |          }| j        dk    r!t          j        || j        | j                  }|r|n|                     |          S )Nr   )ptraining)r   r   Fdropoutr   r   )r-   r6   r   s      r   forward_headzSENet.forward_headb  sY    Q>B	!t~FFFA7qqD$4$4Q$7$77r   c                 Z    |                      |          }|                     |          }|S rA   )r   r   r   s     r   r8   zSENet.forwardh  s-    !!!$$a  r   )rq   r3   rg   Fr   r   rr   rs   )r   r   r   F)T)rs   )r9   r:   r;   r'   r   torchjitignorer   r   r   Moduler   intstrr   r   boolr   r8   r<   r=   s   @r   r   r      sY        ?BMN@Ez z z z z zx LMAB& & & &$ Y    YB B B B Y 	        H HC Hc H H H H
  8 8$ 8 8 8 8      r   Fc                 *    t          t          | |fi |S rA   )r	   r   )variant
pretrainedkwargss      r   _create_senetr   n  s    w
EEfEEEr    c                 4    | dddddt           t          ddd
|S )	Nrr   )r3      r   )rx   rx   g      ?bilinearzlayer0.conv1r   )
urlr   
input_size	pool_sizecrop_pctinterpolationr5   std
first_conv
classifierr   )r   r   s     r   _cfgr   r  s5    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                 N    t          dt          g dddd|}t          d| fi |S )Nr2   r2   r2   r2   r   r   r   r   rW   r/   legacy_seresnet18rN   r   rm   r   r   r   
model_argss      r   r   r     N     TLLLbT TLRT TJ,jGGJGGGr   c                 N    t          dt          g dddd|}t          d| fi |S )Nr3   rQ      r3   r   r   r   legacy_seresnet34rN   r   r   s      r   r   r     r   r   c                 N    t          dt          g dddd|}t          d| fi |S )Nr   r   r   r   legacy_seresnet50rN   r   r`   r   r   s      r   r   r     sN     Y a2Y YQWY YJ,jGGJGGGr   c                 N    t          dt          g dddd|}t          d| fi |S )Nr3   rQ      r3   r   r   r   legacy_seresnet101rN   r   r   s      r   r   r     N     Z qBZ ZRXZ ZJ-zHHZHHHr   c                 N    t          dt          g dddd|}t          d| fi |S )Nr3   r   $   r3   r   r   r   legacy_seresnet152rN   r   r   s      r   r   r     r   r   c                 V    t          d
t          g dddddddd|}t          d	| fi |S )Nr   rg   r   r3   r   r   T)r   r   rW   r/   r   r   rZ   r   legacy_senet154rN   )r   rP   r   r   s      r   r   r     sZ     a===r Q#QUa aY_a aJ *JEE*EEEr   c                 N    t          dt          g dddd|}t          d| fi |S )Nr   r   r   r   legacy_seresnext26_32x4drN   r   re   r   r   s      r   r   r     N     [!,,,rR[ [SY[ [J3ZNN:NNNr   c                 N    t          dt          g dddd|}t          d| fi |S )Nr   r   r   r   legacy_seresnext50_32x4drN   r   r   s      r   r   r     r   r   c                 N    t          dt          g dddd|}t          d| fi |S )Nr   r   r   r   legacy_seresnext101_32x4drN   r   r   s      r   r   r     sN     \!---b\ \TZ\ \J4jOOJOOOr   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     s     # # # # # #                 A A A A A A A A ) ) ) ) ) ) * * * * * * < < < < < < < <)& & &         ry      &       8    :   ,       ,    *   *    BI   Dt t t t tBI t t tnF F F F    %$ D{} } }"dv! ! ! #dvx x x"dvx x x#tw y  y  y#tw y  y  y%)T~&! &! &! &*T F&G &G &G&*d G'H 'H 'H'& &  0 H HU H H H H H HU H H H H H HU H H H H I Ie I I I I I Ie I I I I F F5 F F F F O OE O O O O O OE O O O O P PU P P P P P Pr   