
    RЦi+&              
          S r SSKrSSKJrJr  SSKJr  SSKJrJ	r	  SSK
JrJr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\R*                  5      rSS jrSS jr\" \" SS9\" SS9\" 5       \" SS9\" SS9S.5      r\SS\4S jj5       r\SS\4S jj5       r\SS\4S jj5       r\SS\4S jj5       r\SS\4S jj5       rg)a  Selective Kernel Networks (ResNet base)

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

This was inspired by reading 'Compounding the Performance Improvements...' (https://arxiv.org/abs/2001.06268)
and a streamlined impl at https://github.com/clovaai/assembled-cnn but I ended up building something closer
to the original paper with some modifications of my own to better balance param count vs accuracy.

Hacked together by / Copyright 2020 Ross Wightman
    N)OptionalType)nnIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectiveKernelConvNormActcreate_attn   )build_model_with_cfg)register_modelgenerate_default_cfgs)ResNetc            "         ^  \ rS rSrSrSSSSSSSS\R                  \R                  SSSSSS4S\S\S\S\	\R                     S	\S
\S\	\   S\S\S\	\   S\\R                     S\\R                     S\	\\R                        S\	\\R                        S\	\R                     S\	\R                     4 U 4S jjjrS rS rSrU =r$ )SelectiveKernelBasic   r   N@   inplanesplanesstride
downsamplecardinality
base_width	sk_kwargsreduce_firstdilationfirst_dilation	act_layer
norm_layer
attn_layeraa_layer
drop_block	drop_pathc                 |  > UUS.n[         TU ]  5         U=(       d    0 n[        SXS.UD6nUS:X  d   S5       eUS:X  d   S5       eX(-  nX R                  -  nU
=(       d    U	n
[	        UU4UU
UUS.UDUD6U l        [        UU4SU	S	S
.UD6U l        [        UU40 UD6U l	        U" SS9U l
        X@l        UU l        g )Ndevicedtyper   r    r   z)BasicBlock only supports cardinality of 1r   z0BasicBlock doest not support changing base width)r   r   r"   
drop_layer   F)kernel_sizer   	apply_actTinplace )super__init__dict	expansionr	   conv1r
   conv2r   seactr   r$   )selfr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r'   r(   ddconv_kwargsfirst_planes	outplanes	__class__s                          P/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/sknet.pyr2   SelectiveKernelBasic.__init__   s   * /O	LYLLaL!LLRS!SS-^^+	'38$	
 #!	
 	
 	

 !
 
 

 j):r:T*$"    c                     [        U R                  R                  SS 5      b>  [        R                  R                  U R                  R                  R                  5        g g Nweight)getattrr6   bnr   initzeros_rD   r9   s    r?   zero_init_last#SelectiveKernelBasic.zero_init_lastQ   <    4::==(D1=GGNN4::==//0 >rA   c                 ,   UnU R                  U5      nU R                  U5      nU R                  b  U R                  U5      nU R                  b  U R                  U5      nU R                  b  U R	                  U5      nX-  nU R                  U5      nU$ N)r5   r6   r7   r$   r   r8   r9   xshortcuts      r?   forwardSelectiveKernelBasic.forwardU   s    JJqMJJqM77
A>>%q!A??&x0H	HHQKrA   )r8   r5   r6   r   r$   r7   __name__
__module____qualname____firstlineno__r4   r   ReLUBatchNorm2dintr   Moduler3   r   r2   rJ   rR   __static_attributes____classcell__r>   s   @r?   r   r      sG   I .2  (, !,0)+*,..4826.2-1'5#5# 5# 	5#
 !+5# 5# 5#  ~5# 5# 5# %SM5# BII5# RYY5# !bii15# tBII/5#  !+!5#"  		*#5# 5#n1 rA   r   c            "         ^  \ rS rSrSrSSSSSSSS\R                  \R                  SSSSSS4S\S\S\S	\	\R                     S
\S\S\	\   S\S\S\	\   S\\R                     S\\R                     S\	\\R                        S\	\\R                        S\	\R                     S\	\R                     4 U 4S jjjrS rS rSrU =r$ )SelectiveKernelBottleneckd      r   Nr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   c           	        > UUS.n[         TU ]  5         U=(       d    0 n[        SXS.UD6n[        [        R
                  " X&S-  -  5      U-  5      nUU-  nX R                  -  nU
=(       d    U	n
[        UU4SS0UD6U l        [        UU4UU
UUUS.UDUD6U l
        [        UU4SSS.UD6U l        [        UU40 UD6U l        U" S	S
9U l        X@l        UU l        g )Nr&   r)   r   r,   r   )r   r   groupsr"   r*   F)r,   r-   Tr.   r0   )r1   r2   r3   r[   mathfloorr4   r
   r5   r	   r6   conv3r   r7   r8   r   r$   )r9   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r'   r(   r:   r;   widthr<   r=   r>   s                           r?   r2   "SelectiveKernelBottleneck.__init__g   s   * /O	LYLLDJJvb9:[HI,^^+	'38 <VQV+V
$

 #!

 

 


 !	aqEaU`a
j):r:T*$"rA   c                     [        U R                  R                  SS 5      b>  [        R                  R                  U R                  R                  R                  5        g g rC   )rE   rh   rF   r   rG   rH   rD   rI   s    r?   rJ   (SelectiveKernelBottleneck.zero_init_last   rL   rA   c                 N   U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                  b  U R	                  U5      nU R
                  b  U R                  U5      nX-  nU R                  U5      nU$ rN   )r5   r6   rh   r7   r$   r   r8   rO   s      r?   rR   !SelectiveKernelBottleneck.forward   s    JJqMJJqMJJqM77
A>>%q!A??&x0H	HHQKrA   )r8   r5   r6   rh   r   r$   r7   rT   r_   s   @r?   ra   ra   d   sG   I .2  (, !,0)+*,..4826.2-1'/#/# /# 	/#
 !+/# /# /#  ~/# /# /# %SM/# BII/# RYY/# !bii1/# tBII//#  !+!/#"  		*#/# /#b1 rA   ra   c                 &    [        [        U U40 UD6$ rN   )r   r   )variant
pretrainedkwargss      r?   _create_skresnetrs      s"     	 rA   c                 2    U SSSSS[         [        SSSS	.UE$ )
Ni  )r+      ru   )   rv   g      ?bicubicr5   fcz
apache-2.0)urlnum_classes
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierlicenser   )ry   rr   s     r?   _cfgr      s3    =vI%.BT  rA   ztimm/)	hf_hub_idzconv1.0)r   )zskresnet18.ra_in1kzskresnet34.ra_in1kzskresnet50.untrainedzskresnet50d.untrainedzskresnext50_32x4d.ra_in1kreturnc           	      x    [        SSSS9n[        [        / SQ[        US9SS9n[        S	U 40 [        U40 UD6D6$ )
zConstructs a Selective Kernel ResNet-18 model.

Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
variation splits the input channels to the selective convolutions to keep param count down.
      ?   Trd_ratio
rd_divisorsplit_input)   r   r   r   r   Fblocklayers
block_argsrJ   
skresnet18r3   r   rs   rq   rr   r   
model_argss       r?   r   r      J     eEI"<DS\D]J L*SZ8R68RSSrA   c           	      x    [        SSSS9n[        [        / SQ[        US9SS9n[        S	U 40 [        U40 UD6D6$ )
zConstructs a Selective Kernel ResNet-34 model.

Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
variation splits the input channels to the selective convolutions to keep param count down.
r   r   Tr   r+   rc      r+   r   Fr   
skresnet34r   r   s       r?   r   r      r   rA   c           	      t    [        SS9n[        [        / SQ[        US9SS9n[        SU 40 [        U40 UD6D6$ )zConstructs a Select Kernel ResNet-50 model.

Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
variation splits the input channels to the selective convolutions to keep param count down.
Tr   r   r   Fr   
skresnet50r3   ra   rs   r   s       r?   r   r      sF     &I'XaIbJ L*SZ8R68RSSrA   c                 z    [        SS9n[        [        / SQSSS[        US9SS9n[        S	U 40 [        U40 UD6D6$ )
zConstructs a Select Kernel ResNet-50-D model.

Different from configs in Select Kernel paper or "Compounding the Performance Improvements..." this
variation splits the input channels to the selective convolutions to keep param count down.
Tr   r       deepr   F)r   r   
stem_width	stem_typeavg_downr   rJ   skresnet50dr   r   s       r?   r   r      sN     &I'W]hl),UDJ M:Tj9SF9STTrA   c           
      |    [        SSSS9n[        [        / SQSS[        US9SS9n[        S	U 40 [        U40 UD6D6$ )
z}Constructs a Select Kernel ResNeXt50-32x4d model. This should be equivalent to
the SKNet-50 model in the Select Kernel Paper
g      ?r   Fr   r   rc   r   )r   r   r   r   r   rJ   skresnext50_32x4dr   r   s       r?   r   r     sQ    
 druEI'"YZ),UDJ /ZtJ?YRX?YZZrA   )F) ) __doc__rf   typingr   r   torchr   	timm.datar   r   timm.layersr	   r
   r   _builderr   	_registryr   r   resnetr   r\   r   ra   rs   r   default_cfgsr   r   r   r   r   r0   rA   r?   <module>r      s&  	  !  A A A * < J299 JZE		 EP	 %11 F!!%!8&  
Tf 
T 
T 
Tf 
T 
T 
Tf 
T 
T 
Uv 
U 
U [V [ [rA   