
    ^jI                        d Z ddlmZmZmZmZmZ ddlZddlm	Z	 ddl
mZmZ ddlmZmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ dgZ G d de	j@                        Z! G d de	jD                        Z# G d de	jD                        Z$ G d de	jD                        Z% e& e&g dg dg ddg dddd       e&g dg dg ddg dddd       e&g dg dg ddg d d!d!d"       e&g dg dg ddg d d!d!d"       e&g dg dg ddg d d!dd"       e&g dg dg ddg d d!dd"       e&g dg dg ddg dd!dd"       e&g dg dg ddg dd!dd"       e&g dg dg ddg d#d!dd"       e&g dg dg ddg dd!dd$      %
      Z'e'd&   e'd'<   dAd(Z(dBd)Z) e e)d*       e)d*       e)d*       e)d+d,d-.       e)d*       e)d+d,d-.       e)d+d/d/d-d0d1d2d34       e)d*       e)d*       e)d*      d5
      Z*edAd6e%fd7       Z+edAd6e%fd8       Z,edAd6e%fd9       Z-edAd6e%fd:       Z.edAd6e%fd;       Z/edAd6e%fd<       Z0edAd6e%fd=       Z1edAd6e%fd>       Z2edAd6e%fd?       Z3edAd6e%fd@       Z4y)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                   t     e Zd Z fdZdej
                  deej
                     dej
                  fdZ xZS )SequentialAppendListc                     t        |   |  y N)super__init__)selfargskwargs	__class__s      ]/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/vovnet.pyr   zSequentialAppendList.__init__   s    $    xconcat_listreturnc                     t        |       D ]<  \  }}|dk(  r|j                   ||             #|j                   ||d                > t        j                  |d      }|S )Nr   r   )dim)	enumerateappendtorchcat)r    r&   r'   imodules        r$   forwardzSequentialAppendList.forward"   s`    "4 	<IAvAv""6!9-""6+b/#:;		<
 IIkq)r%   )	__name__
__module____qualname__r   r.   Tensorr   r2   __classcell__r#   s   @r$   r   r      s3      D4F 5<< r%   r   c                        e Zd Zdddeej
                  dddfdededededed	ed
ede	ej                     de	ej                     deej                     f fdZd Z xZS )OsaBlockF Nin_chsmid_chsout_chslayer_per_blockresidual	depthwiseattn
norm_layer	act_layer	drop_pathc                    ||d}t         |           || _        || _        t	        d||	d|}|}| j                  r||k7  r|rJ t        ||dfi || _        nd | _        g }t        |      D ]=  }| j                  rt        ||fi |}nt        ||dfi |}|}|j                  |       ? t        | | _        |||z  z   }t        ||fi || _        |rt        ||fi |nd | _        |
| _        y )NdevicedtyperC   rD   r       )r   r   r@   rA   dictr   conv_reductionranger   r-   r   conv_midconv_concatr   rB   rE   )r    r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rH   rI   ddconv_kwargsnext_in_chs	mid_convsr0   convr#   s                      r$   r   zOsaBlock.__init__.   s    / "LjILL>>kW4<"-k7A"U"UD"&D	' 	#A~~+GWLL";JkJ!KT"	# -i8 88&{GK{K8<Kg44$	"r%   c                 (   |g}| j                   | j                  |      }| j                  ||      }| j                  |      }| j                  | j                  |      }| j                  | j	                  |      }| j
                  r||d   z   }|S )Nr   )rN   rP   rQ   rB   rE   r@   )r    r&   outputs      r$   r2   zOsaBlock.forward]   s    *##A&AMM!V$Q99 		!A>>%q!A==F1IAr%   )r3   r4   r5   r   nnReLUintboolstrr   Moduler   r   r2   r7   r8   s   @r$   r:   r:   ,   s     ##*8)+-1-#-# -# 	-#
 !-# -# -# -# RYY-# BII-#  		*-#^r%   r:   c                        e Zd Zddddeej
                  dddf	dedededed	ed
edededede	ej                     de	ej                     deee      f fdZd Z xZS )OsaStageTFeseNr<   r=   r>   block_per_stager?   
downsampler@   rA   rB   rC   rD   drop_path_ratesc                 n   ||d}t         |           d| _        |rt        j                  ddd      | _        nd | _        g }t        |      D ]L  }||dz
  k(  }|||   dkD  rt        ||         }nd }|t        ||||f|xr |d	kD  ||r|	nd
|
||d|gz  }|}N t        j                  | | _
        y )NrG   FrK      T)kernel_sizestride	ceil_moder           r   r;   )r@   rA   rB   rC   rD   rE   )r   r   grad_checkpointingrY   	MaxPool2dpoolrO   r   r:   
Sequentialblocks)r    r<   r=   r>   rb   r?   rc   r@   rA   rB   rC   rD   rd   rH   rI   rR   ro   r0   
last_blockrE   r#   s                       r$   r   z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                     | j                   | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r   )rm   rk   r.   jitis_scriptingr   ro   r    r&   s     r$   r2   zOsaStage.forward   s\    99 		!A""599+A+A+Ct{{A.A  AAr%   )r3   r4   r5   r   rY   rZ   r[   r\   r]   r   r^   r   r   floatr   r2   r7   r8   s   @r$   r`   r`   l   s      $!#*8)+59/-/- /- 	/-
 !/- !/- /- /- /- /- RYY/- BII/- &d5k2/-br%   r`   c                   x    e Zd Zddddeej
                  ddddf
deded	ed
edede	ej                     de	ej                     dedef fdZej                  j                  d$d       Zej                  j                  d%d       Zej                  j                  dej                  fd       Zd&d
ee   fdZ	 	 	 	 	 d'dej*                  deeeee   f      dededededeeej*                     eej*                  eej*                     f   f   fdZ	 	 	 d(deeee   f   dedefdZd  Zd$d!efd"Zd# Z xZS ))r   rK     avg    rj   Ncfgin_chansnum_classesglobal_pooloutput_striderC   rD   	drop_ratedrop_path_ratec           	      <   t          |           |
|d}|| _        || _        || _        |dk(  sJ t        |fi |}|j                  dd      }|d   }|d   }|d   }|d   }|d	   }t        d ||d
|}|dz  }|d   rt        nt        }t        j                  t        ||d   dfddi| ||d   |d   dfddi| ||d   |d   dfd|i|g | _        t        |d   dd|dk(  rdnd       g| _        |}t        |	|d      }|dd |dd z   }t        d |d   |d   |d   d|}g }t        d      D ]v  }|dk(  xs |dkD  }|t        ||   ||   ||   ||   |f|||   d|gz  }||   | _        ||rdndz  }| xj                  t        | j                   |d|       gz  c_        x t        j                  | | _        | j                   | _        t'        | j                   |f||d|| _        | j+                         D ]  \  }}t-        |t        j.                        r-t        j0                  j3                  |j4                  dd       Mt-        |t        j6                        sht        j0                  j9                  |j:                          y)!a  
        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
        rG   ry   stem_stride   stem_chsstage_conv_chsstage_out_chsrb   r?   rJ   rf   rA   r   rK   rh   r   zstem.)num_chs	reductionr1   T)	stagewiser*   Nr@   rB   )r@   rA   rB   )rc   rd   zstages.)	pool_typer   fan_outrelu)modenonlinearityrL   )r   r   r|   r{   r   rM   getr   r   rY   rn   stemfeature_infor   rO   r`   num_featuresstageshead_hidden_sizer   headnamed_modules
isinstanceConv2dinitkaiming_normal_weightLinearzeros_bias)!r    rz   r{   r|   r}   r~   rC   rD   r   r   rH   rI   r"   rR   r   r   r   r   rb   r?   rS   last_stem_stride	conv_typecurrent_stride	stage_dpr
in_ch_list
stage_argsr   r0   rc   nmr#   s!                                   r$   r   zVovNet.__init__   s*   8 	/& """"3!&!ggmQ/z?-.O,/0/0LjI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 	sA$)2QUJx1q!a "	 & )!	 	 	 	F !.a 0D:a14N$t/@/@Nelmnlocp"q!rr	s  mmV, $ 1 1"4#4#4kt[dmtqst	&&( 	'DAq!RYY'''yv'VAryy)qvv&		'r%   c                 .    t        d|rd      S d      S )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))r   ro   )rM   )r    coarses     r$   group_matcherzVovNet.group_matcher  s%    (.$
 	
4S
 	
r%   c                 4    | j                   D ]	  }||_         y r   )r   rk   )r    enabless      r$   set_grad_checkpointingzVovNet.set_grad_checkpointing
  s     	*A#)A 	*r%   r(   c                 .    | j                   j                  S r   )r   fc)r    s    r$   get_classifierzVovNet.get_classifier  s    yy||r%   c                 J    || _         | j                  j                  ||       y r   )r|   r   reset)r    r|   r}   s      r$   reset_classifierzVovNet.reset_classifier  s    &		[1r%   r&   indicesnorm
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }t        d|      \  }}	d}
 | j                  dd |      }|
|v r|j                  |        | j                  d   |      }t        j                  j                         s|s| j                  }n| j                  d|	 }t        |d      D ]#  \  }
} ||      }|
|v s|j                  |       % |r|S ||fS )	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-   r.   rr   rs   r   r,   )r    r&   r   r   r   r   r   intermediatestake_indices	max_indexfeat_idxr   stages                r$   forward_intermediateszVovNet.forward_intermediates  s    * Y&D(DD&"6q'"Bi DIIcrN1|#  #DIIbM!99!!#:[[F[[),F(q9 	(OHeaA<'$$Q'	(
   -r%   
prune_norm
prune_headc                 t    t        d|      \  }}| j                  d| | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        r   Nr   r;   )r   r   r   )r    r   r   r   r   r   s         r$   prune_intermediate_layersz VovNet.prune_intermediate_layersF  s@     #7q'"Bikk*9-!!!R(r%   c                 F    | j                  |      }| j                  |      S r   )r   r   rt   s     r$   forward_featureszVovNet.forward_featuresT  s    IIaL{{1~r%   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )N)r   )r   )r    r&   r   s      r$   forward_headzVovNet.forward_headX  s%    6@tyyzy2RdiiPQlRr%   c                 J    | j                  |      }| j                  |      }|S r   )r   r   rt   s     r$   r2   zVovNet.forward[  s'    !!!$a r%   F)Tr   )NFFr   F)r   FT) r3   r4   r5   r   rY   rZ   rM   r[   r]   r   r^   ru   r   r.   rr   ignorer   r   r   r   r   r6   r   r   r\   r   r   r   r   r   r2   r7   r8   s   @r$   r   r      s    
 #$!#*8)+!$&V'V' V' 	V'
 V' V' RYYV' BII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   rf   rf   Fr;   )r   r   r   r?   rb   r@   rA   rB   )r   r   r   rK   )r   r   r   )r   P   `   p   )r   r   i  r   rK   )r   r   r   r   Tra   )r   rK   	   rK   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                 N    t        t        | |ft        |    t        d      d|S )NT)flatten_sequential)	model_cfgfeature_cfg)r   r   
model_cfgsrM   )variant
pretrainedr"   s      r$   _create_vovnetr     s9     W%D1  r%   c                 2    | dddddt         t        dddd	|S )
Nrw   )rK   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/)rK      r   gffffff?)	hf_hub_idtest_input_sizetest_crop_pct)      ?r   r   )rK   r   r   )   r  )rK   @  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                     t        dd| i|S )Nr   )r   r   r   r"   s     r$   r   r         G*GGGr%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r     r  r%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r     s    SjSFSSr%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r     s    NNvNNr%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r     s    P:PPPr%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r         KjKFKKr%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r     r  r%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r     r  r%   c                     t        dd| i|S )Nr   )r   r  r  s     r$   r   r   $  r  r%   c                 $    d }t        d| |d|S )Nc                      t        d| fddi|S )N	evonorms0rr   F)r   )r   nkwargss     r$   norm_act_fnz'ese_vovnet39b_evos.<locals>.norm_act_fn-  s    $[,UEUWUUr%   )r   rC   )r   r  )r   r"   r  s      r$   r   r   +  s    Vh:R]haghhr%   r   )r;   )5__doc__typingr   r   r   r   r   r.   torch.nnrY   	timm.datar	   r
   timm.layersr   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rn   r   r^   r:   r`   r   rM   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   r   rL   r%   r$   <module>r      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%   