
    RЦiS                     V   S r SSKJrJrJrJr  SSKrSSKJr  SSKJs  J	r
  SSKJr  SSKJrJr  SSKJr   " S	 S
\R$                  5      r " S S\5      r " S S\R$                  5      r " S S\R$                  5      r " S S\R$                  5      r " S S\R$                  5      rg)aj  CBAM (sort-of) Attention

Experimental impl of CBAM: Convolutional Block Attention Module: https://arxiv.org/abs/1807.06521

WARNING: Results with these attention layers have been mixed. They can significantly reduce performance on
some tasks, especially fine-grained it seems. I may end up removing this impl.

Hacked together by / Copyright 2020 Ross Wightman
    )OptionalTupleTypeUnionN)nn   )ConvNormAct)create_act_layerget_act_layer)make_divisiblec                      ^  \ rS rSrSrSSS\R                  SSSS4S\S	\S
\	\   S\S\
\R                     S\\\
\R                     4   4U 4S jjjrS rSrU =r$ )ChannelAttn   zSOriginal CBAM channel attention module, currently avg + max pool variant only.
          ?Nr   sigmoidFchannelsrd_ratiord_channels
rd_divisor	act_layer
gate_layerc
                   > XS.n
[         TU ]  5         U(       d  [        X-  USS9n[        R                  " XS4SU0U
D6U l        U" SS9U l        [        R                  " X1S4SU0U
D6U l        [        U5      U l	        g )Ndevicedtypeg        )round_limitr   biasT)inplace)
super__init__r   r   Conv2dfc1actfc2r
   gate)selfr   r   r   r   r   r   mlp_biasr   r   dd	__class__s              O/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/cbam.pyr    ChannelAttn.__init__   s}     /()<jVXYK99XAKHKKT*99[AKHKK$Z0	    c                     U R                  U R                  U R                  UR                  SSS95      5      5      nU R                  U R                  U R                  UR	                  SSS95      5      5      nXR                  X#-   5      -  $ )N      Tkeepdim)r$   r#   r"   meanamaxr%   )r&   xx_avgx_maxs       r*   forwardChannelAttn.forward-   sp    $((166&$6+G"HIJ$((166&$6+G"HIJ99U]+++r,   )r#   r"   r$   r%   )__name__
__module____qualname____firstlineno____doc__r   ReLUintfloatr   r   Moduler   strr    r8   __static_attributes____classcell__r)   s   @r*   r   r      s    
 &)-)+6?11 1 "#	1
 1 BII1 c4		?231 1*, ,r,   r   c                      ^  \ rS rSrSrSSS\R                  SSSS4S\S	\S
\	\   S\S\
\R                     S\\\
\R                     4   S\4U 4S jjjrS rSrU =r$ )LightChannelAttn3   zAAn experimental 'lightweight' that sums avg + max pool first
    r   Nr   r   Fr   r   r   r   r   r   r'   c
                 (   > [         T
U ]  XX4XVXxU	S9	  g )Nr   )r   r    )r&   r   r   r   r   r   r   r'   r   r   r)   s             r*   r    LightChannelAttn.__init__6   s%     	PXot 	 	vr,   c                     SUR                  SSS9-  SUR                  SSS9-  -   nU R                  U R                  U R	                  U5      5      5      nU[
        R                  " U5      -  $ )N      ?r.   Tr1   )r3   r4   r$   r#   r"   Fr   )r&   r5   x_poolx_attns       r*   r8   LightChannelAttn.forwardE   se    qvvfdv33cAFF6SWF<X6XX$((488F#345199V$$$r,    )r:   r;   r<   r=   r>   r   r?   r@   rA   r   r   rB   r   rC   boolr    r8   rD   rE   rF   s   @r*   rH   rH   3   s    
 $)-)+6?"vv v "#	v
 v BIIv c4		?23v v v% %r,   rH   c                   n   ^  \ rS rSrSr    SS\S\\\\	R                     4   4U 4S jjjrS rSrU =r$ )	SpatialAttnK   z+Original CBAM spatial attention module
    kernel_sizer   c           	      f   > [         TU ]  5         [        SSUSX4S9U l        [	        U5      U l        g )Nr/   r   F	apply_actr   r   r   r    r	   convr
   r%   r&   rW   r   r   r   r)   s        r*   r    SpatialAttn.__init__N   0     	1kU6_	$Z0	r,   c                     [         R                  " UR                  SSS9UR                  SSS9/SS9nU R	                  U5      nXR                  U5      -  $ )Nr   Tdimr2   )rb   )torchcatr3   r4   r\   r%   r&   r5   rP   s      r*   r8   SpatialAttn.forwardY   sR    AFFq$F7At9TU[\]6"99V$$$r,   r\   r%      r   NNr:   r;   r<   r=   r>   r@   r   rC   r   r   rB   r    r8   rD   rE   rF   s   @r*   rU   rU   K   N      !6?	1	1 c4		?23	1 	1% %r,   rU   c                   n   ^  \ rS rSrSr    SS\S\\\\	R                     4   4U 4S jjjrS rSrU =r$ )	LightSpatialAttn_   zSAn experimental 'lightweight' variant that sums avg_pool and max_pool results.
    rW   r   c           	      f   > [         TU ]  5         [        SSUSX4S9U l        [	        U5      U l        g )Nr   FrY   r[   r]   s        r*   r    LightSpatialAttn.__init__b   r_   r,   c                     SUR                  SSS9-  SUR                  SSS9-  -   nU R                  U5      nXR                  U5      -  $ )NrM   r   Tra   )r3   r4   r\   r%   re   s      r*   r8   LightSpatialAttn.forwardm   sQ    qvv!Tv22S166aQU6;V5VV6"99V$$$r,   rg   rh   rj   rF   s   @r*   rm   rm   _   rk   r,   rm   c                      ^  \ rS rSrSSSS\R
                  SSSS4	S\S	\S
\\   S\S\S\	\R                     S\\\	\R                     4   S\4U 4S jjjrS rSrU =r$ )
CbamModules   r   Nr   ri   r   Fr   r   r   r   spatial_kernel_sizer   r   r'   c           
         > XS.n[         TU ]  5         [        U4UUUUUUS.UD6U l        [	        U4SU0UD6U l        g )Nr   r   r   r   r   r   r'   r   )r   r    r   channelrU   spatialr&   r   r   r   r   rv   r   r   r'   r   r   r(   r)   s               r*   r    CbamModule.__init__t   sb     /"	
#!!	
 	
 ##6T:TQSTr,   c                 J    U R                  U5      nU R                  U5      nU$ Nry   rz   r&   r5   s     r*   r8   CbamModule.forward   !    LLOLLOr,   r   r:   r;   r<   r=   r   r?   r@   rA   r   r   rB   r   rC   rS   r    r8   rD   rE   rF   s   @r*   rt   rt   s   s     $)-'()+6?"UU U "#	U
 U "%U BIIU c4		?23U U U6 r,   rt   c                      ^  \ rS rSrSSSS\R
                  SSSS4	S\S	\S
\\   S\S\S\	\R                     S\\\	\R                     4   S\4U 4S jjjrS rSrU =r$ )LightCbamModule   r   Nr   ri   r   Fr   r   r   r   rv   r   r   r'   c           
      |   > XS.n[         TU ]  5         [        U4UUUUUUS.UD6U l        [	        U40 UD6U l        g )Nr   rx   )r   r    rH   ry   rm   rz   r{   s               r*   r    LightCbamModule.__init__   s\     /'	
#!!	
 	
 ((;BrBr,   c                 J    U R                  U5      nU R                  U5      nU$ r~   r   r   s     r*   r8   LightCbamModule.forward   r   r,   r   r   rF   s   @r*   r   r      s     $)-'()+6?"CC C "#	C
 C "%C BIIC c4		?23C C C6 r,   r   )r>   typingr   r   r   r   rc   r   torch.nn.functional
functionalrN   conv_bn_actr	   
create_actr
   r   helpersr   rB   r   rH   rU   rm   rt   r   rR   r,   r*   <module>r      s    0 /     $ 7 #,")) ,<%{ %0%")) %(%ryy %( Dbii r,   