
    RЦiN                        S r SSKrSSKJr  SSK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Jr  SSKJr  SSKJr  SS	KJrJr  S
/rS r " S S\
R4                  5      r " S S\
R4                  5      r " S S\5      r " S S\5      r " S S\5      r " S S\
R4                  5      r  " S S
\
R4                  5      r!S2S jr"S3S jr#\" \#" SS9\#" SSS9\#" S S9\#" S!S9\#" S"S9\#" S#S9\#" S$SS9\#" S%S9\#" S&S9S'.	5      r$\S2S(\!4S) jj5       r%\S2S(\!4S* jj5       r&\S2S(\!4S+ jj5       r'\S2S(\!4S, jj5       r(\S2S(\!4S- jj5       r)\S2S(\!4S. jj5       r*\S2S(\!4S/ jj5       r+\S2S(\!4S0 jj5       r,\S2S(\!4S1 jj5       r-g)4a:  
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)TypeOptionalTupleIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsSENetc                 ~   [        U [        R                  5      (       a*  [        R                  R	                  U R
                  SSS9  g [        U [        R                  5      (       aU  [        R                  R                  U R
                  S5        [        R                  R                  U R                  S5        g g )Nfan_outrelu)modenonlinearityg      ?        )	
isinstancennConv2dinitkaiming_normal_weightBatchNorm2d	constant_bias)ms    P/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/senet.py_weight_initr!      sv    !RYY
yvN	Ar~~	&	&
!((B'
!&&"% 
'    c                   >   ^  \ rS rSrSS\S\4U 4S jjjrS rSrU =r$ )SEModule&   channels	reductionc                   > X4S.n[         TU ]  5         [        R                  " XU-  4SS0UD6U l        [        R
                  " SS9U l        [        R                  " X-  U4SS0UD6U l        [        R                  " 5       U l	        g )Ndevicedtypekernel_sizer   Tinplace)
super__init__r   r   fc1ReLUr   fc2Sigmoidsigmoid)selfr&   r'   r*   r+   dd	__class__s         r    r0   SEModule.__init__(   sq    /99X9'<R!RrRGGD)	99X2HR!RrRzz|r"   c                     UnUR                  SSS9nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nX!-  $ )N)      T)keepdim)meanr1   r   r3   r5   )r6   xmodule_inputs      r    forwardSEModule.forward0   sV    FF64F(HHQKIIaLHHQKLLOr"   )r1   r3   r   r5   )NN)	__name__
__module____qualname____firstlineno__intr0   rA   __static_attributes____classcell__r8   s   @r    r$   r$   &   s%    $ $ $ $   r"   r$   c                       \ rS rSrSrS rSrg)
Bottleneck:   z@
Base class for bottlenecks that implements `forward()` method.
c                    UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  b  U R                  U5      nU R                  U5      U-   nU R                  U5      nU$ N)	conv1bn1r   conv2bn2conv3bn3
downsample	se_moduler6   r?   shortcutouts       r    rA   Bottleneck.forward?   s    jjmhhsmiinjjohhsmiinjjohhsm??&q)HnnS!H,iin
r"    N)rC   rD   rE   rF   __doc__rA   rH   r\   r"   r    rL   rL   :   s    r"   rL   c                   r   ^  \ rS rSrSrSr    SS\S\S\S\S\S	\\R                     4U 4S
 jjjr
SrU =r$ )SEBottleneckV   z
Bottleneck for SENet154.
   inplanesplanesgroupsr'   striderV   c	           	      <  > XxS.n	[         T
U ]  5         [        R                  " XS-  4SSS.U	D6U l        [        R
                  " US-  40 U	D6U l        [        R                  " US-  US-  4SUSUSS.U	D6U l        [        R
                  " US-  40 U	D6U l        [        R                  " US-  US-  4SSS.U	D6U l	        [        R
                  " US-  40 U	D6U l
        [        R                  " S	S
9U l        [        US-  4SU0U	D6U l        X`l        XPl        g )Nr)   r;   r   Fr,   r   ra   r<   r,   re   paddingrd   r   Tr-   r'   r/   r0   r   r   rP   r   rQ   rR   rS   rT   rU   r2   r   r$   rW   rV   re   r6   rb   rc   rd   r'   re   rV   r*   r+   r7   r8   s             r    r0   SEBottleneck.__init__\   s    /YYx!UURTU
>>&1*33YYQJQJ	
 	
 	

 >>&1*33YYvz6A:W15WTVW
>>&1*33GGD)	!&1*H	HRH$r"   
rQ   rS   rU   rP   rR   rT   rV   r   rW   re   r   NNNrC   rD   rE   rF   r]   	expansionrG   r   r   Moduler0   rH   rI   rJ   s   @r    r_   r_   V   sj     I .2  	
   !+ r"   r_   c                   r   ^  \ rS rSrSrSr    SS\S\S\S\S\S	\\R                     4U 4S
 jjjr
SrU =r$ )SEResNetBottleneck~   z
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).
ra   rb   rc   rd   r'   re   rV   c	                   > XxS.n	[         T
U ]  5         [        R                  " X4SSUS.U	D6U l        [        R
                  " U40 U	D6U l        [        R                  " X"4SSUSS.U	D6U l        [        R
                  " U40 U	D6U l        [        R                  " X"S-  4SSS.U	D6U l	        [        R
                  " US-  40 U	D6U l
        [        R                  " S	S
9U l        [        US-  4SU0U	D6U l        X`l        XPl        g )Nr)   r   Fr,   r   re   r<   r,   ri   rd   r   ra   rg   Tr-   r'   rj   rk   s             r    r0   SEResNetBottleneck.__init__   s     /YYx`QUSY`]_`
>>&/B/YYvi1aPV]bifhi
>>&/B/YYvzSquSPRS
>>&1*33GGD)	!&1*H	HRH$r"   rm   rn   ro   rJ   s   @r    rs   rs   ~   sj    
 I .2  	
   !+ r"   rs   c                   x   ^  \ rS rSrSrSr     SS\S\S\S\S\S	\\R                     S
\4U 4S jjjr
SrU =r$ )SEResNeXtBottleneck   zA
ResNeXt bottleneck type C with a Squeeze-and-Excitation module.
ra   rb   rc   rd   r'   re   rV   
base_widthc
           	      R  > XS.n
[         TU ]  5         [        R                  " X'S-  -  5      U-  n[        R
                  " X4SSSS.U
D6U l        [        R                  " U40 U
D6U l        [        R
                  " X4SUSUSS.U
D6U l	        [        R                  " U40 U
D6U l
        [        R
                  " XS-  4SSS	.U
D6U l        [        R                  " US-  40 U
D6U l        [        R                  " S
S9U l        [        US-  4SU0U
D6U l        X`l        XPl        g )Nr)   @   r   Frv   r<   rh   ra   rg   Tr-   r'   )r/   r0   mathfloorr   r   rP   r   rQ   rR   rS   rT   rU   r2   r   r$   rW   rV   re   )r6   rb   rc   rd   r'   re   rV   r|   r*   r+   r7   widthr8   s               r    r0   SEResNeXtBottleneck.__init__   s    /

6"_56?YYxZAERSZWYZ
>>%.2.YYuv6ST]cjovsuv
>>%.2.YYuqjRaeRrR
>>&1*33GGD)	!&1*H	HRH$r"   rm   )r   Nra   NNro   rJ   s   @r    rz   rz      sw     I .2  	
   !+  r"   rz   c                   t   ^  \ rS rSrSr    SS\S\S\S\S\S\\R                     4U 4S	 jjjr	S
 r
SrU =r$ )SEResNetBlock   r   rb   rc   rd   r'   re   rV   c	                   > XxS.n	[         T
U ]  5         [        R                  " X4SSUSS.U	D6U l        [        R
                  " U40 U	D6U l        [        R                  " X"4SSUSS.U	D6U l        [        R
                  " U40 U	D6U l        [        R                  " SS9U l
        [        U4S	U0U	D6U l        X`l        XPl        g )
Nr)   r<   r   F)r,   ri   re   r   rw   Tr-   r'   )r/   r0   r   r   rP   r   rQ   rR   rS   r2   r   r$   rW   rV   re   rk   s             r    r0   SEResNetBlock.__init__   s     /YYxkQRX_dkhjk
>>&/B/YYvi1aPV]bifhi
>>&/B/GGD)	!&DIDD$r"   c                 \   UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R
                  b  U R                  U5      nU R                  U5      U-   nU R                  U5      nU$ rO   )rP   rQ   r   rR   rS   rV   rW   rX   s       r    rA   SEResNetBlock.forward   s    jjmhhsmiinjjohhsmiin??&q)HnnS!H,iin
r"   )rQ   rS   rP   rR   rV   r   rW   re   rn   )rC   rD   rE   rF   rp   rG   r   r   rq   r0   rA   rH   rI   rJ   s   @r    r   r      sm    I .2  	
   !+ , r"   r   c                     ^  \ rS rSr          SS\\R                     S\\S4   S\S\S\	S\S	\S
\
S\S\S\S\4U 4S jjjr  SS jr\R                  R                   SS j5       r\R                  R                   SS j5       r\R                  R                   S\R                  4S j5       rSS\S\4S jjrS rSS\
4S jjrS rSrU =r$ ) r      blocklayers.rd   r'   	drop_ratein_chansrb   	input_3x3downsample_kernel_sizedownsample_paddingnum_classesglobal_poolc                   > [         TU ]  5         XS.nXpl        Xl        X`l        XPl        U(       a  S[        R                  " USS4SSSS.UD64S	[        R                  " S)0 UD64S
[        R                  " SS94S[        R                  " SSSSS.UD64S[        R                  " S)0 UD64S[        R                  " SS94S[        R                  " SUS4SSSS.UD64S[        R                  " U40 UD64S[        R                  " SS94/	nOLS[        R                  " Xg4SSSSS.UD64S	[        R                  " U40 UD64S
[        R                  " SS94/n[        R                  " [        U5      5      U l        [        R                  " SSSS9U l        [        USSS9/U l        U R"                  " U4SUS   UUSSS.UD6U l        U =R                   [        SUR&                  -  SSS9/-  sl        U R"                  " U4SUS   SUUU	U
S.UD6U l        U =R                   [        SUR&                  -  SS S9/-  sl        U R"                  " U4S!US   SUUU	U
S.UD6U l        U =R                   [        S!UR&                  -  S"S#S9/-  sl        U R"                  " U4S$US   SUUU	U
S.UD6U l        U =R                   [        S$UR&                  -  S%S&S9/-  sl        S$UR&                  -  =U l        U l        [3        U R.                  U R                  4S'U0UD6u  U l        U l        U R9                  5        H  n[;        U5        M     g()*a  
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
r)   rP   r~   r<   r;   r   F)re   ri   r   rQ   relu1Tr-   rR   )r~   r~   r<   rS   relu2rT   rU   relu3   r,   re   ri   r   )re   	ceil_modelayer0)num_chsr'   moduler   )rc   blocksrd   r'   r   r   ra   layer1   )rc   r   re   rd   r'   r   r      layer2      layer3i       layer4	pool_typeN)r~   )r/   r0   rb   r   r   r   r   r   r   r2   
Sequentialr   r   	MaxPool2dpool0dictfeature_info_make_layerr   rp   r   r   r   num_featureshead_hidden_sizer
   r   last_linearmodulesr!   )r6   r   r   rd   r'   r   r   rb   r   r   r   r   r   r*   r+   r7   layer0_modulesr   r8   s                     r    r0   SENet.__init__   s   x 	/ & ""))Hb![Aqu[XZ[\0R01"''$/0"))UaURTUV0R01"''$/0"))B![Aqu[XZ[\x6267"''$/0
N "))HmAaYZafmjlmnx6267"''$/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->.
 ".
 	.
*$* AO  r"   c           
      
   XS.nS nUS:w  d  U R                   X!R                  -  :w  ah  [        R                  " [        R                  " U R                   X!R                  -  4UXhSS.UD6[        R
                  " X!R                  -  40 UD65      nU" U R                   X$XVU40 UD6/nX!R                  -  U l         [        SU5       H'  nUR                  U" U R                   X$U40 UD65        M)     [        R                  " U6 $ )Nr)   r   Fr   )rb   rp   r   r   r   r   rangeappend)r6   r   rc   r   rd   r'   re   r   r   r*   r+   r7   rV   r   is                  r    r   SENet._make_layer  s    /
Q;$--6OO+CC		MM6OO#;QI_!EQMOQ v7>2>	J vy*[XZ[\0q&!AMM%vyOBOP " }}f%%r"   c                 ,    [        SU(       a  SOSS9nU$ )Nz^layer0z^layer(\d+)z^layer(\d+)\.(\d+))stemr   )r   )r6   coarsematchers      r    group_matcherSENet.group_matcher  s    J~Mbcr"   c                      U(       a   S5       eg )Nz$gradient checkpointing not supportedr\   )r6   enables     r    set_grad_checkpointingSENet.set_grad_checkpointing  s    AAAz6r"   returnc                     U R                   $ rO   )r   )r6   s    r    get_classifierSENet.get_classifier  s    r"   c                 h    Xl         [        U R                  U R                   US9u  U l        U l        g )N)r   )r   r
   r   r   r   )r6   r   r   s      r    reset_classifierSENet.reset_classifier  s1    &->t//;.H*$*r"   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU$ rO   )r   r   r   r   r   r   r6   r?   s     r    forward_featuresSENet.forward_features  sU    KKNJJqMKKNKKNKKNKKNr"   
pre_logitsc                     U R                  U5      nU R                  S:  a)  [        R                  " XR                  U R                  S9nU(       a  U$ U R                  U5      $ )Nr   )ptraining)r   r   Fdropoutr   r   )r6   r?   r   s      r    forward_headSENet.forward_head  sN    Q>>B		!~~FAq7D$4$4Q$77r"   c                 J    U R                  U5      nU R                  U5      nU$ rO   )r   r   r   s     r    rA   SENet.forward  s'    !!!$a r"   )r   r   r   r   r   rb   r   r   r   r   r   r   r   r   r   )
g?r<   r~   Fr   r     avgNN)r   r   r   NNF)T)r   )rC   rD   rE   rF   r   r   rq   r   rG   floatboolstrr0   r   torchjitignorer   r   r   r   r   r   rA   rH   rI   rJ   s   @r    r   r      si     ##*+&'#$P		?P #s(OP 	P
 P P P P P %(P !$P P P Pd LMW[&& YY  YYB B YY 		    HC Hc H
8$ 8 r"   c                 $    [        [        X40 UD6$ rO   )r   r   )variant
pretrainedkwargss      r    _create_senetr     s    wEfEEr"   c                 2    U SSSSS[         [        SSSS	.UE$ )
Nr   )r<      r   )r   r   g      ?bilinearzlayer0.conv1r   z
apache-2.0)urlr   
input_size	pool_sizecrop_pctinterpolationr>   std
first_conv
classifierlicenser   )r   r   s     r    _cfgr     s2    4}SYJ%.B$Ml	
  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           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr;   r;   r;   r;   r   r   r   r   rd   r'   legacy_seresnet18r   r   r   r   r   
model_argss      r    r   r     3    LbJJ,jWD<Vv<VWWr"   c           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr<   ra      r<   r   r   r   legacy_seresnet34r   r   s      r    r  r    r   r"   c           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr   r   r   r   legacy_seresnet50r   rs   r   r   s      r    r  r    s3     a2OJ,jWD<Vv<VWWr"   c           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr<   ra      r<   r   r   r   legacy_seresnet101r  r   s      r    r  r    4     qBPJ-zXT*=WPV=WXXr"   c           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr<   r   $   r<   r   r   r   legacy_seresnet152r  r   s      r    r  r    r	  r"   c                 \    [        [        / SQSSSSSSS9n[        S	U 40 [        U40 UD6D6$ )
Nr  r~   r   r<   r   r   T)r   r   rd   r'   r   r   rb   r   legacy_senet154)r   r_   r   r   s      r    r  r    s?    =r Q#QUWJ *JU$z:TV:TUUr"   c           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr   r   r   r   legacy_seresnext26_32x4dr   rz   r   r   s      r    r  r    4    !,rRQJ3Z^4
C]V\C]^^r"   c           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr   r   r   r   legacy_seresnext50_32x4dr  r   s      r    r  r    r  r"   c           	      T    [        [        / SQSSS9n[        SU 40 [        U40 UD6D6$ )Nr  r   r   r   legacy_seresnext101_32x4dr  r   s      r    r  r    s4    !-bRJ4j_DD^W]D^__r"   r   ) ).r]   r   collectionsr   typingr   r   r   r   torch.nnr   torch.nn.functional
functionalr   	timm.datar   r	   timm.layersr
   _builderr   	_registryr   r   __all__r!   rq   r$   rL   r_   rs   rz   r   r   r   r   default_cfgsr   r  r  r  r  r  r  r  r  r\   r"   r    <module>r$     sK    # ( (     A ) * <)& ryy  ( 8%: %P B* B*BII *ZKBII K\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"   