
    khF                        d Z ddl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 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j@                        Z! G d dej@                        Z" G d dej@                        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<       Z.edAd6e#fd=       Z/edAd6e#fd>       Z0edAd6e#fd?       Z1edAd6e#fd@       Z2y)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UnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ConvNormActSeparableConvNormActBatchNormAct2dClassifierHeadDropPathcreate_attncreate_norm_act_layer   )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        t        | 
  |  y N)superr   __init__)selfargs	__class__s     N/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/vovnet.pyr   zSequentialAppendList.__init__   s    "D2D9    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   r/   __classcell__r    s   @r!   r   r      s3    : D4F 5<< r"   r   c                   F     e Zd Zdddeej
                  df fd	Zd Z xZS )OsaBlockF Nc                    t         t        |           || _        || _        t        ||	      }|}| 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        ||      nd | _        |
| _        y )N
norm_layer	act_layerr      )r   r7   r   residual	depthwisedictr
   conv_reductionranger   r*   r   conv_midconv_concatr   attn	drop_path)r   in_chsmid_chsout_chslayer_per_blockr>   r?   rE   r;   r<   rF   conv_kwargsnext_in_chs	mid_convsr-   convr    s                   r!   r   zOsaBlock.__init__.   s    	h&( "jIF>>kW4<"-k7A"U"UD"&D	' 	#A~~+GWLL";JkJ!KT"	# -i8 88&{GK{K26Kg.D	"r"   c                 (   |g}| j                   | j                  |      }| j                  ||      }| j                  |      }| j                  | j                  |      }| j                  | j	                  |      }| j
                  r||d   z   }|S )Nr   )rA   rC   rD   rE   rF   r>   )r   r#   outputs      r!   r/   zOsaBlock.forwardZ   s    *##A&AMM!V$Q99 		!A>>%q!A==F1IAr"   	r0   r1   r2   r   nnReLUr   r/   r4   r5   s   @r!   r7   r7   ,   s&     %gg*#Xr"   r7   c                   H     e Zd Zddddeej
                  df fd	Zd Z xZS )OsaStageTFeseNc                 j   t         t        |           d| _        |rt	        j
                  ddd      | _        nd | _        g }t        |      D ]K  }||dz
  k(  }|||   dkD  rt        ||         }nd }|t        |||||xr |dkD  ||r|	nd	|
||

      gz  }|}M t	        j                  | | _        y )NFr=      T)kernel_sizestride	ceil_moder           r   r8   )r>   r?   rE   r;   r<   rF   )r   rU   r   grad_checkpointingrR   	MaxPool2dpoolrB   r   r7   
Sequentialblocks)r   rG   rH   rI   block_per_stagerJ   
downsampler>   r?   rE   r;   r<   drop_path_ratesra   r-   
last_blockrF   r    s                    r!   r   zOsaStage.__init__k   s     	h&("'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   )r_   r]   r+   jitis_scriptingr   ra   r   r#   s     r!   r/   zOsaStage.forward   s\    99 		!A""599+A+A+Ct{{A.A  AAr"   rQ   r5   s   @r!   rU   rU   i   s)     %gg +-Zr"   rU   c                       e Zd Zddddeej
                  dd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   r=     avg    r\   c
           	      t   t         t        |           || _        || _        |dk(  sJ t        |fi |
}|j                  dd      }|d   }|d   }|d   }|d   }|d   }t        ||	      }|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        j                  t        j                  d|	t!        |            |      }|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&                  |||      | _        | j1                         D ]  \  }}t3        |t        j4                        r-t        j6                  j9                  |j:                  dd       Mt3        |t        j<                        sht        j6                  j?                  |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
        rm   stem_stride   stem_chsstage_conv_chsstage_out_chsrb   rJ   r:   rX   r?   r   r=   rZ   r   zstem.)num_chs	reductionr.   r'   Nr>   rE   )r>   r?   rE   )rc   rd   zstages.)	pool_type	drop_ratefan_outrelu)modenonlinearity )!r   r   r   num_classesrw   r@   getr   r
   rR   r`   stemfeature_infor+   splitlinspacesumrB   rU   num_featuresstageshead_hidden_sizer   headnamed_modules
isinstanceConv2dinitkaiming_normal_weightLinearzeros_bias)r   cfgin_chansr}   global_pooloutput_strider;   r<   rw   drop_path_ratekwargsro   rq   rr   rs   rb   rJ   rK   last_stem_stride	conv_typecurrent_stride	stage_dpr
in_ch_list
stage_argsr   r-   rc   nmr    s                                r!   r   zVovNet.__init__   s   4 	fd$&&""""3!&!ggmQ/z?-.O,/0/0jIF '!+,/,<(+	MM(1+qJJkJhqk8A;K!K{Khqk8A;Z:JZkZ$
 	
 "QK1u+QRBRQXY<Z5[] ^$ KKq.#oBV WYhi	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[dmn	&&( 	'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   ra   )r@   )r   coarses     r!   group_matcherzVovNet.group_matcher   s%    (.$
 	
4S
 	
r"   c                 4    | j                   D ]	  }||_         y r   )r   r]   )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"   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+   rg   rh   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   r8   )r   r   r   )r   r   r   r   r   r   s         r!   prune_intermediate_layersz VovNet.prune_intermediate_layers;  s@     #7q'"Bikk*9-!!!R(r"   c                 F    | j                  |      }| j                  |      S r   )r   r   ri   s     r!   forward_featureszVovNet.forward_featuresI  s    IIaL{{1~r"   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )N)r   )r   )r   r#   r   s      r!   forward_headzVovNet.forward_headM  s%    6@tyyzy2RdiiPQlRr"   c                 J    | j                  |      }| j                  |      }|S r   )r   r   ri   s     r!   r/   zVovNet.forwardP  s'    !!!$a r"   F)Tr   )NFFr   F)r   FT)r0   r1   r2   r   rR   rS   r   r+   rg   ignorer   r   Moduler   r   strr   r3   r   intr   boolr   r   r   r   r   r/   r4   r5   s   @r!   r   r      s   
 %ggR'h 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   rX   rX   Fr8   )rq   rr   rs   rJ   rb   r>   r?   rE   )r   r   rp   r=   )r   r   r   )r   P   `   p   )r   r   i  r   r=   )r   r   r   r   TrV   )r   r=   	   r=   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_cfgsr@   )variant
pretrainedr   s      r!   _create_vovnetr     s9     W%D1  r"   c                 0    | dddddt         t        ddd
|S )	Nrk   )r=   r   r   )   r   g      ?bicubiczstem.0.convzhead.fc)
urlr}   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   s     r!   _cfgr     s2    4}SYI%.B#9	 AG	 r"   )r   ztimm/)r=      r   gffffff?)	hf_hub_idtest_input_sizetest_crop_pct)      ?r   r   )r=   r   r   )   r   )r=   @  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	evonorms0rg   F)r   )r   nkwargss     r!   norm_act_fnz'ese_vovnet39b_evos.<locals>.norm_act_fn!  s    $[,UEUWUUr"   )r   r;   )r   r   )r   r   r  s      r!   r   r     s    Vh:R]haghhr"   r   )r8   )3__doc__typingr   r   r   r   r+   torch.nnrR   	timm.datar   r	   timm.layersr
   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r`   r   r   r7   rU   r   r@   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   r   r|   r"   r!   <module>r     s   0 /   A' ' ' * + ' <*2== :ryy :z6ryy 6rqRYY ql ++$	 ++$
 (*$
 ++$	 (*$	 ++$
 ++$	 ++$
 ++$	 ++$	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"   