
    NgJ                     2   d 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  G d d	ej                  Z G d
 de          Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  ZdS )ak   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
    N)nn   )ConvNormAct)create_act_layerget_act_layer)make_divisiblec                   @     e Zd ZdZdddej        ddf fd	Zd Z xZS )	ChannelAttnzT Original CBAM channel attention module, currently avg + max pool variant only.
          ?Nr   sigmoidFc                 B   t          t          |                                            |st          ||z  |d          }t	          j        ||d|          | _         |d          | _        t	          j        ||d|          | _        t          |          | _
        d S )Ng        )round_limitr   )biasT)inplace)superr
   __init__r   r   Conv2dfc1actfc2r   gate	selfchannelsrd_ratiord_channels
rd_divisor	act_layer
gate_layermlp_bias	__class__s	           L/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/cbam.pyr   zChannelAttn.__init__   s     	k4  ))+++ 	Z(H)<jVXYYYK9X{AHEEE9T***9[(AHEEE$Z00			    c           
      x   |                      |                     |                     |                    dd                                        }|                      |                     |                     |                    dd                                        }||                     ||z             z  S )N      Tkeepdim)r   r   r   meanamaxr   )r   xx_avgx_maxs       r"   forwardzChannelAttn.forward!   s    $((166&$6+G+G"H"HIIJJ$((166&$6+G+G"H"HIIJJ499UU]++++r#   	__name__
__module____qualname____doc__r   ReLUr   r/   __classcell__r!   s   @r"   r
   r
      sh          &+g)e	1 	1 	1 	1 	1 	1, , , , , , ,r#   r
   c                   @     e Zd ZdZdddej        ddf fd	Zd Z xZS )	LightChannelAttnzAAn experimental 'lightweight' that sums avg + max pool first
    r   Nr   r   Fc           	      d    t          t          |                               |||||||           d S N)r   r9   r   r   s	           r"   r   zLightChannelAttn.__init__*   sG     	%%..hZJPX	Z 	Z 	Z 	Z 	Zr#   c                    d|                     dd          z  d|                    dd          z  z   }|                     |                     |                     |                              }|t          j        |          z  S )N      ?r%   Tr(   )r*   r+   r   r   r   Fr   )r   r,   x_poolx_attns       r"   r/   zLightChannelAttn.forward0   su    qvvfdv333cAFF6SWF<X<X6XX$((488F#3#3445519V$$$$r#   r0   r7   s   @r"   r9   r9   '   sn          &+g)eZ Z Z Z Z Z% % % % % % %r#   r9   c                   *     e Zd ZdZd fd	Zd Z xZS )SpatialAttnz, Original CBAM spatial attention module
       r   c                     t          t          |                                            t          dd|d          | _        t          |          | _        d S )Nr&   r   F	apply_act)r   rB   r   r   convr   r   r   kernel_sizer   r!   s      r"   r   zSpatialAttn.__init__9   sJ    k4  ))+++1kUCCC	$Z00			r#   c                     t          j        |                    dd          |                    dd          gd          }|                     |          }||                     |          z  S )Nr   Tdimr)   )rL   )torchcatr*   r+   rG   r   r   r,   r@   s      r"   r/   zSpatialAttn.forward>   sd    AFFq$F77At9T9TU[\]]]6""499V$$$$r#   rC   r   r1   r2   r3   r4   r   r/   r6   r7   s   @r"   rB   rB   6   V         1 1 1 1 1 1
% % % % % % %r#   rB   c                   *     e Zd ZdZd fd	Zd Z xZS )LightSpatialAttnzSAn experimental 'lightweight' variant that sums avg_pool and max_pool results.
    rC   r   c                     t          t          |                                            t          dd|d          | _        t          |          | _        d S )Nr   FrE   )r   rT   r   r   rG   r   r   rH   s      r"   r   zLightSpatialAttn.__init__G   sK    %%..0001kUCCC	$Z00			r#   c                     d|                     dd          z  d|                    dd          z  z   }|                     |          }||                     |          z  S )Nr=   r   TrK   )r*   r+   rG   r   rO   s      r"   r/   zLightSpatialAttn.forwardL   s_    qvv!Tv222S166aQU6;V;V5VV6""499V$$$$r#   rP   rQ   r7   s   @r"   rT   rT   D   rR   r#   rT   c                   >     e Zd Zddddej        ddf fd	Zd Z xZS )	
CbamModuler   Nr   rC   r   Fc	           	          t          t          |                                            t          |||||||          | _        t          ||          | _        d S )Nr   r   r   r   r   r    )r   )r   rX   r   r
   channelrB   spatial
r   r   r   r   r   spatial_kernel_sizer   r   r    r!   s
            r"   r   zCbamModule.__init__S   sf     	j$((***"x[!Y:X`b b b ##6:NNNr#   c                 Z    |                      |          }|                     |          }|S r;   r[   r\   r   r,   s     r"   r/   zCbamModule.forward\   %    LLOOLLOOr#   r1   r2   r3   r   r5   r   r/   r6   r7   s   @r"   rX   rX   R   se        %* !RWUZO O O O O O      r#   rX   c                   >     e Zd Zddddej        ddf fd	Zd Z xZS )	LightCbamModuler   Nr   rC   r   Fc	           	          t          t          |                                            t          |||||||          | _        t          |          | _        d S )NrZ   )r   re   r   r9   r[   rT   r\   r]   s
            r"   r   zLightCbamModule.__init__c   sa     	ot$$--///'x[!Y:X`b b b ((;<<r#   c                 Z    |                      |          }|                     |          }|S r;   r`   ra   s     r"   r/   zLightCbamModule.forwardl   rb   r#   rc   r7   s   @r"   re   re   b   s_        %* !RWUZ= = = = = =      r#   re   )r4   rM   r   torch.nn.functional
functionalr>   conv_bn_actr   
create_actr   r   helpersr   Moduler
   r9   rB   rT   rX   re    r#   r"   <module>ro      s                    $ $ $ $ $ $ 7 7 7 7 7 7 7 7 # # # # # #, , , , ,") , , ,(% % % % %{ % % %% % % % %") % % %% % % % %ry % % %            bi     r#   