Ë
    éÓ^j+&  ã            	       ó²  — d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZ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j*                  «      Zdd„Zdd„Z e ed¬«       ed¬«       e«        ed¬«       ed¬«      dœ«      Zeddefd„«       Zeddefd„«       Zeddefd„«       Zeddefd„«       Zeddefd„«       Zy)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            "       óˆ  ‡ — e Zd ZdZddddddddej
                  ej                  ddddddfdedededeej                     ded	ed
ee
   dededee   deej                     deej                     deeej                        deeej                        deej                     deej                     f ˆ fd„Zd„ Zd„ Zˆ xZS )ÚSelectiveKernelBasicr   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                 ór  •— ||dœ}t         ‰| �  «        |xs i }t        d||dœ|¤Ž}|dk(  sJ d«       ‚|dk(  sJ d«       ‚||z  }|| j                  z  }|
xs |	}
t	        ||f||
||dœ|¤|¤Ž| _        t        ||fd|	d	d
œ|¤Ž| _        t        ||fi |¤Ž| _	         |d¬«      | _
        || _        || _        y )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                          €ú\/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/sknet.pyr1   zSelectiveKernelBasic.__init__   s  ø€ ð* ¨Ñ/ˆÜ‰ÑÔà’O ˆ	ÜÐL Y¸:ÑLÈÑLˆØ˜aÒÐLÐ!LÓLÐØ˜RÒÐSÐ!SÓSÐØ Ñ-ˆØ˜TŸ^™^Ñ+ˆ	Ø'Ò3¨8ˆä$ØØð	
ð Ø#ØØ!ñ	
ð ð	
ð ñ	
ˆŒ
ô !ØØð
ð ØØñ
ð ñ
ˆŒ
ô ˜j¨)Ñ:°rÑ:ˆŒÙ TÔ*ˆŒØ$ˆŒØ"ˆ�ó    c                 óÂ   — t        | j                  j                  dd «      �>t        j                  j                  | j                  j                  j                  «       y y ©NÚweight)Úgetattrr5   Úbnr   ÚinitÚzeros_rB   ©r8   s    r>   Úzero_init_lastz#SelectiveKernelBasic.zero_init_lastQ   ó<   € Ü�4—:‘:—=‘= (¨DÓ1Ð=Ü�G‰G�N‰N˜4Ÿ:™:Ÿ=™=×/Ñ/Õ0ð >r?   c                 ó(  — |}| j                  |«      }| j                  |«      }| j                  �| j                  |«      }| j                  �| j                  |«      }| j                  �| j	                  |«      }||z  }| j                  |«      }|S ©N)r4   r5   r6   r#   r   r7   ©r8   ÚxÚshortcuts      r>   ÚforwardzSelectiveKernelBasic.forwardU   sƒ   € ØˆØ�J‰J�q‹MˆØ�J‰J�q‹MˆØ�7‰7ÐØ—‘˜“
ˆAØ�>‰>Ð%Ø—‘˜qÓ!ˆAØ�?‰?Ð&Ø—‘ xÓ0ˆHØ	ˆX‰ˆØ�H‰H�Q‹KˆØˆr?   ©Ú__name__Ú
__module__Ú__qualname__r3   r   ÚReLUÚBatchNorm2dÚintr   ÚModuler2   r   r1   rH   rO   Ú__classcell__©r=   s   @r>   r   r      s=  ø„ Ø€Ið Ø.2Ø Ø Ø(,Ø !ØØ,0Ø)+¯©Ø*,¯.©.Ø48Ø26Ø.2Ø-1ØØñ'5#àð5#ð ð5#ð ð	5#ð
 ! §¡Ñ+ð5#ð ð5#ð ð5#ð   ‘~ð5#ð ð5#ð ð5#ð % S™Mð5#ð ˜BŸI™I‘ð5#ð ˜RŸY™Y™ð5#ð !  b§i¡i¡Ñ1ð5#ð ˜t B§I¡I™Ñ/ð5#ð  ! §¡Ñ+ð!5#ð"   §	¡	Ñ*õ#5#òn1ör?   r   c            "       óˆ  ‡ — e Zd ZdZddddddddej
                  ej                  ddddddfdedededeej                     d	ed
edee
   dededee   deej                     deej                     deeej                        deeej                        deej                     deej                     f ˆ fd„Zd„ Zd„ Zˆ xZS )ÚSelectiveKernelBottlenecké   r   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   c           	      ó¸  •— ||dœ}t         ‰| �  «        |xs i }t        d||dœ|¤Ž}t        t	        j
                  ||dz  z  «      |z  «      }||z  }|| j                  z  }|
xs |	}
t        ||fddi|¤Ž| _        t        ||f||
|||dœ|¤|¤Ž| _
        t        ||fdddœ|¤Ž| _        t        ||fi |¤Ž| _         |d	¬
«      | _        || _        || _        y )Nr%   r(   r   r+   r   )r   r   Úgroupsr!   r)   F)r+   r,   Tr-   r/   )r0   r1   r2   rV   ÚmathÚfloorr3   r
   r4   r	   r5   Úconv3r   r6   r7   r   r#   )r8   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r&   r'   r9   r:   Úwidthr;   r<   r=   s                           €r>   r1   z"SelectiveKernelBottleneck.__init__g   s  ø€ ð* ¨Ñ/ˆÜ‰ÑÔà’O ˆ	ÜÐL Y¸:ÑLÈÑLˆÜ”D—J‘J˜v¨°b©Ñ9Ó:¸[ÑHÓIˆØ Ñ,ˆØ˜TŸ^™^Ñ+ˆ	Ø'Ò3¨8ˆä  ¨<ÑVÀQÐVÈ+ÑVˆŒ
Ü$ØØð

ð Ø#ØØØ!ñ

ð ð

ð ñ

ˆŒ
ô ! ¨	Ða¸qÈEÑaÐU`ÑaˆŒ
Ü˜j¨)Ñ:°rÑ:ˆŒÙ TÔ*ˆŒØ$ˆŒØ"ˆ�r?   c                 óÂ   — t        | j                  j                  dd «      �>t        j                  j                  | j                  j                  j                  «       y y rA   )rC   ra   rD   r   rE   rF   rB   rG   s    r>   rH   z(SelectiveKernelBottleneck.zero_init_last˜   rI   r?   c                 óJ  — |}| j                  |«      }| j                  |«      }| j                  |«      }| j                  �| j                  |«      }| j                  �| j	                  |«      }| j
                  �| j                  |«      }||z  }| j                  |«      }|S rK   )r4   r5   ra   r6   r#   r   r7   rL   s      r>   rO   z!SelectiveKernelBottleneck.forwardœ   s�   € ØˆØ�J‰J�q‹MˆØ�J‰J�q‹MˆØ�J‰J�q‹MˆØ�7‰7ÐØ—‘˜“
ˆAØ�>‰>Ð%Ø—‘˜qÓ!ˆAØ�?‰?Ð&Ø—‘ xÓ0ˆHØ	ˆX‰ˆØ�H‰H�Q‹KˆØˆr?   rP   rY   s   @r>   r[   r[   d   s=  ø„ Ø€Ið Ø.2Ø Ø Ø(,Ø !ØØ,0Ø)+¯©Ø*,¯.©.Ø48Ø26Ø.2Ø-1ØØñ'/#àð/#ð ð/#ð ð	/#ð
 ! §¡Ñ+ð/#ð ð/#ð ð/#ð   ‘~ð/#ð ð/#ð ð/#ð % S™Mð/#ð ˜BŸI™I‘ð/#ð ˜RŸY™Y™ð/#ð !  b§i¡i¡Ñ1ð/#ð ˜t B§I¡I™Ñ/ð/#ð  ! §¡Ñ+ð!/#ð"   §	¡	Ñ*õ#/#òb1ör?   r[   c                 ó&   — t        t        | |fi |¤ŽS rK   )r   r   )ÚvariantÚ
pretrainedÚkwargss      r>   Ú_create_skresnetri   ¬   s"   € ÜÜØØñð ñ	ð r?   c                 ó2   — | dddddt         t        dddd	œ|¥S )
Niè  )r*   éà   rk   )é   rl   g      ì?Úbicubicr4   Úfcz
apache-2.0)ÚurlÚnum_classesÚ
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚstdÚ
first_convÚ
classifierÚlicenser   )ro   rh   s     r>   Ú_cfgrz   µ   s3   € àØ¨=ÀvØ¨IÜ%Ô.BØ¨TØñð ðð r?   ztimm/)Ú	hf_hub_idzconv1.0)rw   )zskresnet18.ra_in1kzskresnet34.ra_in1kzskresnet50.untrainedzskresnet50d.untrainedzskresnext50_32x4d.ra_in1kÚreturnc           	      óŠ   — t        ddd¬«      }t        t        g d¢t        |¬«      d¬«      }t        d	| fi t        |fi |¤Ž¤ŽS )
züConstructs 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_argsrH   Ú
skresnet18©r2   r   ri   ©rg   rh   r   Ú
model_argss       r>   rŠ   rŠ   Ë   óJ   € ô ˜e°ÀÔE€IÜÜ"ª<ÄDÐS\ÔD]Øô€Jô ˜L¨*ÑS¼¸ZÑ8RÈ6Ñ8RÑSÐSr?   c           	      óŠ   — t        ddd¬«      }t        t        g d¢t        |¬«      d¬«      }t        d	| fi t        |fi |¤Ž¤ŽS )
züConstructs 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*   r\   é   r*   r…   Fr†   Ú
skresnet34r‹   rŒ   s       r>   r’   r’   Ù   rŽ   r?   c           	      ó†   — t        d¬«      }t        t        g d¢t        |¬«      d¬«      }t        d| fi t        |fi |¤Ž¤ŽS )zùConstructs 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©r2   r[   ri   rŒ   s       r>   r•   r•   ç   sF   € ô  Ô&€IÜÜ'²ÌÐXaÔIbØô€Jô ˜L¨*ÑS¼¸ZÑ8RÈ6Ñ8RÑSÐSr?   c           
      óŒ   — t        d¬«      }t        t        g d¢dddt        |¬«      d¬«      }t        d	| fi t        |fi |¤Ž¤ŽS )
zûConstructs 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‰   rH   Úskresnet50dr–   rŒ   s       r>   r�   r�   õ   sN   € ô  Ô&€IÜÜ'²ÈÐW]ÐhlÜ )Ô,¸UôD€Jô ˜M¨:ÑT¼¸jÑ9SÈFÑ9SÑTÐTr?   c           	      óŽ   — t        ddd¬«      }t        t        g d¢ddt        |¬«      d¬«      }t        d	| fi t        |fi |¤Ž¤ŽS )
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�   r\   r…   )r‡   rˆ   r   r   r‰   rH   Úskresnext50_32x4dr–   rŒ   s       r>   rŸ   rŸ     sQ   € ô
 ˜d¨r¸uÔE€IÜÜ'²È"ÐYZÜ )Ô,¸UôD€Jô Ð/°ÑZ¼tÀJÑ?YÐRXÑ?YÑZÐZr?   )F)Ú ) Ú__doc__r_   Útypingr   r   Útorchr   Ú	timm.datar   r   Útimm.layersr	   r
   r   Ú_builderr   Ú	_registryr   r   Úresnetr   rW   r   r[   ri   rz   Údefault_cfgsrŠ   r’   r•   r�   rŸ   r/   r?   r>   ú<module>rª      s&  ðñ	ó ß !å ç Aß AÑ AÝ *ß <Ý ôJ˜2Ÿ9™9ô 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ò [ó ñ[r?   