
    RЦi                         S r SSKJrJrJrJrJr  SSKrSSKJr  SSK	J
r
  SSKJr  SSKJr  S	 r " S
 S\R                   5      r " S S\R                   5      rg)zSelective Kernel Convolution/Attention

Paper: Selective Kernel Networks (https://arxiv.org/abs/1903.06586)

Hacked together by / Copyright 2020 Ross Wightman
    )ListOptionalTupleTypeUnionN)nn   )ConvNormAct)make_divisible)_assertc                     [        U [        [        45      (       a  U  H  n[        U5      s  $    U S:  a
  U S-  (       d   eg )N      )
isinstancelisttuple_kernel_valid)kkis     [/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/selective_kernel.pyr   r      s=    !dE]##B $$ 6a!ee    c                      ^  \ rS rSrSS\R
                  \R                  SS4S\S\S\S\\R                     S	\\R                     4
U 4S
 jjjr
S rSrU =r$ )SelectiveKernelAttn   r       Nchannels	num_pathsattn_channels	act_layer
norm_layerc                    > XgS.n[         T	U ]  5         X l        [        R                  " X4SSS.UD6U l        U" U40 UD6U l        U" SS9U l        [        R                  " X1U-  4SSS.UD6U l        g)zkSelective Kernel Attention Module

Selective Kernel attention mechanism factored out into its own module.

devicedtyper	   F)kernel_sizebiasT)inplaceN)	super__init__r   r   Conv2d	fc_reducebnact	fc_select)
selfr   r   r   r   r    r#   r$   dd	__class__s
            r   r)   SelectiveKernelAttn.__init__   s|     /"8\PU\Y[\]1b1T*=Y2FhTU\aheghr   c                    [        UR                  S   U R                  :H  S5        UR                  S5      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UR                  u  p#pEUR                  X R                  X0R                  -  XE5      n[        R                  " USS9nU$ )Nr	    )r   r   T)keepdimdim)r   shaper   summeanr+   r,   r-   r.   viewtorchsoftmax)r/   xBCHWs         r   forwardSelectiveKernelAttn.forward0   s    
dnn,b1EE!HMM&$M/NN1GGAJHHQKNN1WW
aFF1nna>>&91@MM!#r   )r-   r,   r+   r.   r   )__name__
__module____qualname____firstlineno__r   ReLUBatchNorm2dintr   Moduler)   rC   __static_attributes____classcell__r1   s   @r   r   r      sz     !#)+*,..ii i 	i
 BIIi RYYi i.
 
r   r   c            !       P  ^  \ rS rSrSSSSSSSSSS\R
                  \R                  SSSS4S\S\\   S	\\	\\
\   4      S
\S\S\S\S\\   S\S\S\S\\R                     S\\R                     S\\\R                        S\\\R                        4U 4S jjjrS rSrU =r$ )SelectiveKernel=   Nr	   g      ?   Tin_channelsout_channelsr%   stridedilationgroupsrd_ratiord_channels
rd_divisorkeep_3x3split_inputr   r    aa_layer
drop_layerc                   > UUS.n[         TU ]  5         U=(       d    UnU=(       d    SS/n[        U5        [        U[        5      (       d  U/S-  nU
(       a+  U Vs/ s H  nUUS-
  -  S-  PM     nnS/[        U5      -  nOU/[        U5      -  n[        U5      U l        Xl        X l        Xl	        U R                  (       a"  XR                  -  S:X  d   eXR                  -  n[        X&5      n[        SXFXXS.UD6n[        R                  " [        X55       VVs/ s H  u  nn[        X4UUS.UD6PM     snn5      U l        U=(       d    [#        X'-  U	S	9n[%        X R                  U40 UD6U l        g
s  snf s  snnf )a  Selective Kernel Convolution Module

As described in Selective Kernel Networks (https://arxiv.org/abs/1903.06586) with some modifications.

Largest change is the input split, which divides the input channels across each convolution path, this can
be viewed as a grouping of sorts, but the output channel counts expand to the module level value. This keeps
the parameter count from ballooning when the convolutions themselves don't have groups, but still provides
a noteworthy increase in performance over similar param count models without this attention layer. -Ross W

Args:
    in_channels:  module input (feature) channel count
    out_channels:  module output (feature) channel count
    kernel_size: kernel size for each convolution branch
    stride: stride for convolutions
    dilation: dilation for module as a whole, impacts dilation of each branch
    groups: number of groups for each branch
    rd_ratio: reduction factor for attention features
    keep_3x3: keep all branch convolution kernels as 3x3, changing larger kernels for dilations
    split_input: split input channels evenly across each convolution branch, keeps param count lower,
        can be viewed as grouping by path, output expands to module out_channels count
    act_layer: activation layer to use
    norm_layer: batchnorm/norm layer to use
    aa_layer: anti-aliasing module
    drop_layer: spatial drop module in convs (drop block, etc)
r"   r      r   r	   r   )rV   rX   r   r    r^   r_   )r%   rW   )divisorN )r(   r)   r   r   r   lenr   rT   rU   r]   mindictr   
ModuleListzipr
   pathsr   r   attn)r/   rT   rU   r%   rV   rW   rX   rY   rZ   r[   r\   r]   r   r    r^   r_   r#   r$   r0   r   conv_kwargsdr   r1   s                          r   r)   SelectiveKernel.__init__?   s   Z /#2{!+aVk"+t,,&-!+K9DEAAE*a/HE#K 00K zC$44H[)&(&/1444%7K\* <I<8:< ]]K2$421 \q1\P[\2$4 5
 $b~l6MWa'b'nnmZWYZ	+ F $4s   E<!F
c                    U R                   (       a`  [        R                  " XR                  U R                  -  S5      n[        U R                  5       VVs/ s H  u  p4U" X#   5      PM     nnnO!U R                   Vs/ s H
  oD" U5      PM     nn[        R                  " USS9nU R                  U5      nX-  n[        R                  " USS9nU$ s  snnf s  snf )Nr	   r6   )
r]   r<   splitrT   r   	enumerateri   stackrj   r9   )r/   r>   x_splitiopx_pathsx_attns          r   rC   SelectiveKernel.forward   s    kk!%5%5%GKG3<TZZ3HI3H%!r'*~3HGIG'+zz2zr!uzG2KKQ'1JIIaQ J2s   C C)rj   rT   r   rU   ri   r]   )rE   rF   rG   rH   r   rI   rJ   rK   r   r   r   floatboolr   rL   r)   rC   rM   rN   rO   s   @r   rQ   rQ   =   sL   
 +/;?#)-! $)+)+2648%J[J[ #3-J[ "%T#Y"78	J[
 J[ J[ J[ J[ "#J[ J[ J[ J[ BIIJ[ RYYJ[ tBII/J[  !bii1!J[ J[X
 
r   rQ   )__doc__typingr   r   r   r   r   r<   r   conv_bn_actr
   helpersr   trace_utilsr   r   rL   r   rQ   rc   r   r   <module>r      sI    6 5   $ #  "")) "JXbii Xr   