
    RЦiI                        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Jr  SSKJrJrJrJrJrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJrJr  S/r " S S\	R@                  5      r! " S S\	RD                  5      r# " S S\	RD                  5      r$ " S S\	RD                  5      r%\&" \&" / SQ/ SQ/ SQS/ SQSSSS9\&" / SQ/ SQ/ SQS/ SQSSSS9\&" / SQ/ SQ/ SQS/ S QS!S!S"S9\&" / SQ/ SQ/ SQS/ S QS!S!S"S9\&" / SQ/ SQ/ SQS/ S QS!SS"S9\&" / SQ/ SQ/ SQS/ S QS!SS"S9\&" / SQ/ SQ/ SQS/ SQS!SS"S9\&" / SQ/ SQ/ SQS/ SQS!SS"S9\&" / SQ/ SQ/ SQS/ S#QS!SS"S9\&" / SQ/ SQ/ SQS/ SQS!SS$S9S%9
r'\'S&   \'S''   SAS( jr(SBS) jr)\" \)" SS*9\)" SS*9\)" SS*9\)" S+S,S-S.9\)" SS*9\)" S+S,S-S.9\)" S+S/S/S-S0S1S2S3S49\)" SS*9\)" SS*9\)" SS*9S5.
5      r*\SAS6\%4S7 jj5       r+\SAS6\%4S8 jj5       r,\SAS6\%4S9 jj5       r-\SAS6\%4S: jj5       r.\SAS6\%4S; jj5       r/\SAS6\%4S< jj5       r0\SAS6\%4S= jj5       r1\SAS6\%4S> jj5       r2\SAS6\%4S? jj5       r3\SAS6\%4S@ jj5       r4g)Ca  VoVNet (V1 & V2)

Papers:
* `An Energy and GPU-Computation Efficient Backbone Network` - https://arxiv.org/abs/1904.09730
* `CenterMask : Real-Time Anchor-Free Instance Segmentation` - https://arxiv.org/abs/1911.06667

Looked at  https://github.com/youngwanLEE/vovnet-detectron2 &
https://github.com/stigma0617/VoVNet.pytorch/blob/master/models_vovnet/vovnet.py
for some reference, rewrote most of the code.

Hacked together by / Copyright 2020 Ross Wightman
    )ListOptionalTupleUnionTypeNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ConvNormActSeparableConvNormActBatchNormAct2dClassifierHeadDropPathcreate_attncreate_norm_act_layercalculate_drop_path_rates   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsVovNetc                      ^  \ rS rSrU 4S jrS\R                  S\\R                     S\R                  4S jrSr	U =r
$ )SequentialAppendList   c                     > [         TU ]  " U6   g N)super__init__)selfargskwargs	__class__s      Q/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/vovnet.pyr    SequentialAppendList.__init__   s    $    xconcat_listreturnc                     [        U 5       H>  u  p4US:X  a  UR                  U" U5      5        M$  UR                  U" US   5      5        M@     [        R                  " USS9nU$ )Nr   r   )dim)	enumerateappendtorchcat)r!   r(   r)   imodules        r%   forwardSequentialAppendList.forward"   sY    "4IAAv""6!9-""6+b/#:;	 )
 IIkq)r'    )__name__
__module____qualname____firstlineno__r    r0   Tensorr   r4   __static_attributes____classcell__r$   s   @r%   r   r      s8      D4F 5<<  r'   r   c                      ^  \ rS rSrSSS\\R                  SSS4S\S\S\S\S	\S
\S\	S\
\R                     S\
\R                     S\\R                     4U 4S jjjrS rSrU =r$ )OsaBlock,   F Nin_chsmid_chsout_chslayer_per_blockresidual	depthwiseattn
norm_layer	act_layer	drop_pathc                    > XS.n[         TU ]  5         XPl        X`l        [	        SXS.UD6nUnU R                  (       a!  X:w  a  U(       a   e[        XS40 UD6U l        OS U l        / n[        U5       HA  nU R                  (       a  [        X"40 UD6nO[        XS40 UD6nUnUR                  U5        MC     [        U6 U l        XU-  -   n[        X40 UD6U l        U(       a  [        Xs40 UD6OS U l        Xl        g )NdevicedtyperJ   rK   r      r6   )r   r    rG   rH   dictr   conv_reductionranger   r/   r   conv_midconv_concatr   rI   rL   )r!   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rO   rP   ddconv_kwargsnext_in_chs	mid_convsr2   convr$   s                      r%   r    OsaBlock.__init__.   s     / "LjLL>>k4<"-kA"U"UD"&D	'A~~+GLL";JkJ!KT" ( -i8 88&{K{K8<K44$	"r'   c                 4   U/nU R                   b  U R                  U5      nU R                  X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
                  (       a  XS   -   nU$ )Nr   )rT   rV   rW   rI   rL   rG   )r!   r(   outputs      r%   r4   OsaBlock.forward]   s    *##A&AMM!$Q99 		!A>>%q!A==1IAr'   )rI   rW   rV   rT   rH   rL   rG   )r7   r8   r9   r:   r   nnReLUintboolstrr   Moduler   r    r4   r<   r=   r>   s   @r%   r@   r@   ,   s     ##*8)+-1-#-# -# 	-#
 !-# -# -# -# RYY-# BII-#  		*-# -#^ r'   r@   c                      ^  \ rS rSrSSSS\\R                  SSS4	S\S\S\S	\S
\S\S\S\S\	S\
\R                     S\
\R                     S\\\      4U 4S jjjrS rSrU =r$ )OsaStagel   TFeseNrC   rD   rE   block_per_stagerF   
downsamplerG   rH   rI   rJ   rK   drop_path_ratesc                   > XS.n[         TU ]  5         SU l        U(       a  [        R                  " SSSS9U l        OS U l        / n[        U5       HY  nUUS-
  :H  nUb  UU   S:  a  [        UU   5      nOS nU[        UUUU4U=(       a    US	:  UU(       a  U	OS
U
UUS.UD6/-  nUnM[     [        R                  " U6 U l
        g )NrN   FrR      T)kernel_sizestride	ceil_moder           r   rB   )rG   rH   rI   rJ   rK   rL   )r   r    grad_checkpointingra   	MaxPool2dpoolrU   r   r@   
Sequentialblocks)r!   rC   rD   rE   rk   rF   rl   rG   rH   rI   rJ   rK   rm   rO   rP   rX   rx   r2   
last_blockrL   r$   s                       r%   r    OsaStage.__init__n   s    " /"'1MDIDI'Ao11J*q/AB/F$_Q%78	 	x	
 "+a!e#'TR%##   F F' (( mmV,r'   c                     U R                   b  U R                  U5      nU R                  (       a;  [        R                  R	                  5       (       d  [        U R                  U5      nU$ U R                  U5      nU$ r   )rv   rt   r0   jitis_scriptingr   rx   r!   r(   s     r%   r4   OsaStage.forward   s_    99 		!A""599+A+A+C+Ct{{A.A  AAr'   )rx   rt   rv   )r7   r8   r9   r:   r   ra   rb   rc   rd   re   r   rf   r   r   floatr    r4   r<   r=   r>   s   @r%   rh   rh   l   s      $!#*8)+59/-/- /- 	/-
 !/- !/- /- /- /- /- RYY/- BII/- &d5k2/- /-b r'   rh   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                     S\S\4U 4S jjjr\R                  R                   S&S j5       r\R                  R                   S'S j5       r\R                  R                   S\R                  4S j5       rS(S\\	   4S jjr     S)S\R,                  S\\\\\   4      S\S\S\	S\S\\\R,                     \\R,                  \\R,                     4   4   4S jjr   S*S\\\\   4   S\S\4S  jjrS! rS&S"\4S# jjrS$ rS%r U =r!$ )+r      rR     avg    rs   Ncfgin_chansnum_classesglobal_pooloutput_striderJ   rK   	drop_ratedrop_path_ratec           	      \  > [         T U ]  5         XS.nX0l        X l        Xl        US:X  d   e[        U40 UD6nUR                  SS5      nUS   nUS   nUS   nUS   nUS	   n[        S XgS
.UD6nUS-  nUS   (       a  [        O[        n[        R                  " [        X/S   S4SS0UD6U" US   US   S4SS0UD6U" US   US   S4SU0UD6/6 U l        [        US   SSUS:X  a  SOS 3S9/U l        Un[        U	USS9nUSS USS -   n[        S US   US   US   S.UD6n/ n[        S5       H~  nUS:H  =(       d    US:  nU[        UU   UU   UU   UU   U4UUU   S.UD6/-  nUU   U l        UU(       a  SOS-  nU =R                  [        U R                   USU 3S9/-  sl        M     [        R                  " U6 U l        U R                   U l        ['        U R                   U4XHS.UD6U l        U R+                  5        H  u  nn[-        U[        R.                  5      (       a+  [        R0                  R3                  UR4                  SSS9  MP  [-        U[        R6                  5      (       d  Mq  [        R0                  R9                  UR:                  5        M     g)!ai  
Args:
    cfg (dict): Model architecture configuration
    in_chans (int): Number of input channels (default: 3)
    num_classes (int): Number of classifier classes (default: 1000)
    global_pool (str): Global pooling type (default: 'avg')
    output_stride (int): Output stride of network, one of (8, 16, 32) (default: 32)
    norm_layer (Union[str, nn.Module]): normalization layer
    act_layer (Union[str, nn.Module]): activation layer
    drop_rate (float): Dropout rate (default: 0.)
    drop_path_rate (float): Stochastic depth drop-path rate (default: 0.)
    kwargs (dict): Extra kwargs overlayed onto cfg
rN   r   stem_stride   stem_chsstage_conv_chsstage_out_chsrk   rF   rQ   ro   rH   r   rR   rq   r   zstem.)num_chs	reductionr3   T)	stagewiser,   NrG   rI   )rG   rH   rI   )rl   rm   zstages.)	pool_typer   fan_outrelu)modenonlinearityr6   )r   r    r   r   r   rS   getr   r   ra   rw   stemfeature_infor   rU   rh   num_featuresstageshead_hidden_sizer   headnamed_modules
isinstanceConv2dinitkaiming_normal_weightLinearzeros_bias)!r!   r   r   r   r   r   rJ   rK   r   r   rO   rP   r#   rX   r   r   r   r   rk   rF   rY   last_stem_stride	conv_typecurrent_stride	stage_dpr
in_ch_list
stage_argsr   r2   rl   nmr$   s!                                   r%   r    VovNet.__init__   s   8 	/& """"3!&!ggmQ/z?-.O,/0/0LjLL '!+,/,<(+	MM1+qJJkJhqk8A;K!K{Khqk8A;Z:JZkZ$
 	
 "QK1u+QRBRQXY<Z5[] ^$ .noY]^	bc]]3B%77
p3z?c+>NUXY_U`pdop
qA$)2QUJx1q!a "	 & )!	 	 	 	F !.a 0D:a14N$t/@/@Nelmnlocp"q!rr   mmV, $ 1 1"4#4#4kt[tqst	&&(DAq!RYY''''yv'VAryy))qvv&	 )r'   c                 ,    [        SU(       a  SS9$ SS9$ )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))r   rx   )rS   )r!   coarses     r%   group_matcherVovNet.group_matcher  s%    (.$
 	
4S
 	
r'   c                 6    U R                    H	  nXl        M     g r   )r   rt   )r!   enabless      r%   set_grad_checkpointingVovNet.set_grad_checkpointing
  s    A#)  r'   r*   c                 .    U R                   R                  $ r   )r   fc)r!   s    r%   get_classifierVovNet.get_classifier  s    yy||r'   c                 F    Xl         U R                  R                  X5        g r   )r   r   reset)r!   r   r   s      r%   reset_classifierVovNet.reset_classifier  s    &		1r'   r(   indicesnorm
stop_early
output_fmtintermediates_onlyc                    US;   d   S5       e/ n[        SU5      u  pSn
U R                  SS " U5      nX;   a  UR                  U5        U R                  S   " U5      n[        R                  R                  5       (       d  U(       d  U R                  nOU R                  SU	 n[        USS9 H%  u  pU" U5      nX;   d  M  UR                  U5        M'     U(       a  U$ X4$ )	a  Forward features that returns intermediates.

Args:
    x: Input image tensor
    indices: Take last n blocks if int, all if None, select matching indices if sequence
    norm: Apply norm layer to compatible intermediates
    stop_early: Stop iterating over blocks when last desired intermediate hit
    output_fmt: Shape of intermediate feature outputs
    intermediates_only: Only return intermediate features
Returns:

)NCHWzOutput shape must be NCHW.   r   Nr,   r   )start)r   r   r/   r0   r|   r}   r   r.   )r!   r(   r   r   r   r   r   intermediatestake_indices	max_indexfeat_idxr   stages                r%   forward_intermediatesVovNet.forward_intermediates  s    * Y&D(DD&"6q'"B IIcrN1#  #IIbM!99!!##:[[F[[),F(q9OHaA'$$Q'  :
   r'   
prune_norm
prune_headc                 |    [        SU5      u  pEU R                  SU U l        U(       a  U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        r   Nr   rB   )r   r   r   )r!   r   r   r   r   r   s         r%   prune_intermediate_layers VovNet.prune_intermediate_layersF  s>     #7q'"Bkk*9-!!!R(r'   c                 F    U R                  U5      nU R                  U5      $ r   )r   r   r~   s     r%   forward_featuresVovNet.forward_featuresT  s    IIaL{{1~r'   
pre_logitsc                 P    U(       a  U R                  XS9$ U R                  U5      $ )N)r   )r   )r!   r(   r   s      r%   forward_headVovNet.forward_headX  s#    6@tyyy2RdiiPQlRr'   c                 J    U R                  U5      nU R                  U5      nU$ r   )r   r   r~   s     r%   r4   VovNet.forward[  s'    !!!$a r'   )	r   r   r   r   r   r   r   r   r   F)Tr   )NFFr   F)r   FT)"r7   r8   r9   r:   r   ra   rb   rS   rc   re   r   rf   r   r    r0   r|   ignorer   r   r   r   r   r;   r   r   rd   r   r   r   r   r   r4   r<   r=   r>   s   @r%   r   r      s   
 #$!#*8)+!$&V'V' V' 	V'
 V' V' RYYV' BIIV' V' "V' V'p YY
 
 YY* * YY		  2# 2 8<$$',- ||-  eCcN34-  	- 
 -  -  !%-  
tELL!5tELL7I)I#JJ	K- b ./$#	3S	>*  	S$ S r'   )@   r      )r            )      i   i   r   )r   r   ro   ro   FrB   )r   r   r   rF   rk   rG   rH   rI   )r   r   r   rR   )r   r   r   )r   P   `   p   )r   r   i  r   rR   )r   r   r   r   Trj   )r   rR   	   rR   eca)
	vovnet39a	vovnet57aese_vovnet19b_slim_dwese_vovnet19b_dwese_vovnet19b_slimese_vovnet19bese_vovnet39bese_vovnet57bese_vovnet99beca_vovnet39br   ese_vovnet39b_evosc                 H    [        [        U U4[        U    [        SS9S.UD6$ )NT)flatten_sequential)	model_cfgfeature_cfg)r   r   
model_cfgsrS   )variant
pretrainedr#   s      r%   _create_vovnetr    s9     W%D1  r'   c                 2    U SSSSS[         [        SSSS	.UE$ )
Nr   )rR   r   r   )   r  g      ?bicubiczstem.0.convzhead.fcz
apache-2.0)urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierlicenser   )r  r#   s     r%   _cfgr    s3    4}SYI%.B#9
 $* r'   )r  ztimm/)rR      r  gffffff?)	hf_hub_idtest_input_sizetest_crop_pct)      ?r  r  )rR   r   r   )   r  )rR   @  r  g      ?)r  r  r  r
  r  r	  r  r  )
zvovnet39a.untrainedzvovnet57a.untrainedzese_vovnet19b_slim_dw.untrainedzese_vovnet19b_dw.ra_in1kzese_vovnet19b_slim.untrainedzese_vovnet39b.ra_in1kz!ese_vovnet57b.ra4_e3600_r256_in1kzese_vovnet99b.untrainedzeca_vovnet39b.untrainedzese_vovnet39b_evos.untrainedr*   c                     [        SSU 0UD6$ )Nr  )r   r  r  r#   s     r%   r   r         G*GGGr'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r     r  r'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r     s    SjSFSSr'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r     s    NNvNNr'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r     s    P:PPPr'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r         KjKFKKr'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r     r"  r'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r     r"  r'   c                     [        SSU 0UD6$ )Nr  )r   r  r  s     r%   r   r   $  r"  r'   c                 "    S n[        SXS.UD6$ )Nc                      [        SU 4SS0UD6$ )N	evonorms0r|   F)r   )r   nkwargss     r%   norm_act_fn'ese_vovnet39b_evos.<locals>.norm_act_fn-  s    $[,UEUWUUr'   )r  rJ   )r   r  )r  r#   r*  s      r%   r   r   +  s    Vh:haghhr'   r   )rB   )5__doc__typingr   r   r   r   r   r0   torch.nnra   	timm.datar	   r
   timm.layersr   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rw   r   rf   r@   rh   r   rS   r   r  r  default_cfgsr   r   r   r   r   r   r   r   r   r   r6   r'   r%   <module>r7     s   6 5   AB B B * + ' <*2== =ryy =@:ryy :zuRYY ut ++$	 ++$
 (*$
 ++$	 (*$	 ++$
 ++$	 ++$
 ++$	 ++$	i
T $.o#>
   %B<B<'+| $%T!; %)RL!%T; *./-6%S	*  $|#|$(RL'& . HV H H HV H H T T T OF O O Qf Q Q L L L L L L L L L L L L if i ir'   