
    NgS=                        d Z ddl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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&<   d:d'Z"d;d(Z# e e#d)           e#d)           e#d)           e#d*d+d,-           e#d)           e#d*d+d,-           e#d)           e#d)           e#d)           e#d)          d.
          Z$ed:d/efd0            Z%ed:d/efd1            Z&ed:d/efd2            Z'ed:d/efd3            Z(ed:d/efd4            Z)ed:d/efd5            Z*ed:d/efd6            Z+ed:d/efd7            Z,ed:d/efd8            Z-ed:d/efd9            Z.dS )<a   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OptionalNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ConvNormActSeparableConvNormActBatchNormAct2dClassifierHeadDropPathcreate_attncreate_norm_act_layer   )build_model_with_cfg)checkpoint_seq)register_modelgenerate_default_cfgsVovNetc                   \     e Zd Z fdZdej        deej                 dej        fdZ xZS )SequentialAppendListc                 B     t          t          |           j        |  d S N)superr   __init__)selfargs	__class__s     N/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/vovnet.pyr   zSequentialAppendList.__init__   s$    2"D))2D9999    xconcat_listreturnc                     t          |           D ]N\  }}|dk    r|                     ||                     *|                     ||d                              Ot          j        |d          }|S )Nr   r   )dim)	enumerateappendtorchcat)r   r    r!   imodules        r   forwardzSequentialAppendList.forward!   s    "4 	< 	<IAvAvv""66!99----""66+b/#:#:;;;;Ikq)))r   )	__name__
__module____qualname__r   r(   Tensorr   r,   __classcell__r   s   @r   r   r      sl        : : : : : D4F 5<        r   r   c                   <     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||k    r|rJ t          ||dfi || _        nd | _        g }t          |          D ]>}| j        rt          ||fi |}nt          ||dfi |}|}|
                    |           ?t          | | _        |||z  z   }t          ||fi || _        |rt          ||          nd | _        |
| _        d S )N
norm_layer	act_layerr      )r   r4   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<   rB   r8   r9   rC   conv_kwargsnext_in_chs	mid_convsr*   convr   s                   r   r   zOsaBlock.__init__-   s_    	h&&((( "jIFFF> 	'kW44"-k7A"U"U"U"UD"&D	'' 	# 	#A~ K+GWLLLL";JJkJJ!KT"""",i8 88&{GKK{KK26@Kg...D	"r   c                 .   |g}| j         |                      |          }|                     ||          }|                     |          }| j        |                     |          }| j        |                     |          }| j        r||d         z   }|S )Nr   )r>   r@   rA   rB   rC   r;   )r   r    outputs      r   r,   zOsaBlock.forwardY   s    *##A&&AMM!V$$Q9 		!A>%q!!A= 	F1IAr   	r-   r.   r/   r
   nnReLUr   r,   r1   r2   s   @r   r4   r4   +   sc         %g*# *# *# *# *# *#X      r   r4   c                   >     e Zd Zddddeej        df fd	Zd Z xZS )OsaStageTFeseNc                    t          t          |                                            d| _        |rt	          j        ddd          | _        nd | _        g }t          |          D ]Z}||dz
  k    }|"||         dk    rt          ||                   }nd }|t          |||||o|dk    ||r|	nd	|
||

  
        gz  }|}[t	          j
        | | _        d S )NFr:      T)kernel_sizestride	ceil_moder           r   r5   )r;   r<   rB   r8   r9   rC   )r   rR   r   grad_checkpointingrO   	MaxPool2dpoolr?   r   r4   
Sequentialblocks)r   rD   rE   rF   block_per_stagerG   
downsampler;   r<   rB   r8   r9   drop_path_ratesr^   r*   
last_blockrC   r   s                    r   r   zOsaStage.__init__j   s    	h&&((("' 	1MMMDIIDI'' 	 	Ao11J*q/AB/F/F$_Q%788		 	x!+a!e#'/TTR%##    F FFmV,r   c                     | j         |                      |          }| j        r4t          j                                        st          | j        |          }n|                     |          }|S r   )r\   rZ   r(   jitis_scriptingr   r^   r   r    s     r   r,   zOsaStage.forward   s`    9 		!A" 	59+A+A+C+C 	t{A..AAAAr   rN   r2   s   @r   rR   rR   h   sf         %g +- +- +- +- +- +-Z      r   rR   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 ZddefdZd Z xZS )r   r:     avg    rY   c
           	      (   t          t          |                                            || _        || _        |dk    sJ t          |fi |
}|                    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 ]}|d
k    p|dk    }|t%          ||         ||         ||         ||         |f|||         d|gz  }||         | _        ||rd
ndz  }| xj        t          | j        |d|           gz  c_        t          j
        | | _        | j        | _        t-          | j        |||          | _        |                                 D ]\  }}t3          |t          j                  r(t          j                            |j        dd           Gt3          |t          j                  r$t          j                            |j                    dS )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
        rj   stem_stride   stem_chsstage_conv_chsstage_out_chsr_   rG   r7   rU   r<   r   r:   rW   r   zstem.)num_chs	reductionr+   r$   Nr;   rB   )r;   r<   rB   )r`   ra   zstages.)	pool_type	drop_ratefan_outrelu)modenonlinearity )!r   r   r   num_classesrt   r=   getr	   r   rO   r]   stemfeature_infor(   splitlinspacesumr?   rR   num_featuresstageshead_hidden_sizer   headnamed_modules
isinstanceConv2dinitkaiming_normal_weightLinearzeros_bias)r   cfgin_chansrz   global_pooloutput_strider8   r9   rt   drop_path_ratekwargsrl   rn   ro   rp   r_   rG   rH   last_stem_stride	conv_typecurrent_stride	stage_dpr
in_ch_list
stage_argsr   r*   r`   nmr   s                                r   r   zVovNet.__init__   s   4 	fd$$&&&&"""""3!!&!!ggmQ//z?-.O,/0/0jIFFF '!+,/,<M((+	M(1+qJJJkJJIhqk8A;KK!K{KKIhqk8A;ZZ:JZkZZ$
 	
 "QK15[+QRBRBRQQXY5[5[] ] ] ^$ Kq.#oBVBV W WYhii	bcc]]3B3%77
p3z?c+>NUXY_U`ppdopp
q 	s 	sA$)2QUJx1q!a "	 & )!	 	 	 	 	 	F !.a 0D:4aa14N$t/@Ncpmncpcp"q"q"q!rrmV, $ 1"4#4k[dmnnn	&&(( 	' 	'DAq!RY'' '''yv'VVVVAry)) 'qv&&&		' 	'r   Fc                 ,    t          d|rdnd          S )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))r|   r^   )r=   )r   coarses     r   group_matcherzVovNet.group_matcher   s+    (.S$$4S
 
 
 	
r   Tc                 (    | j         D ]	}||_        
d S r   )r   rZ   )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    y|r   Nr   c                 J    || _         | j                            ||           d S r   )rz   r   reset)r   rz   r   s      r   reset_classifierzVovNet.reset_classifier  s&    &	[11111r   c                 V    |                      |          }|                     |          S r   )r|   r   rf   s     r   forward_featureszVovNet.forward_features  s!    IIaLL{{1~~r   
pre_logitsc                 ^    |r|                      ||          n|                      |          S )N)r   )r   )r   r    r   s      r   forward_headzVovNet.forward_head  s-    6@Rtyyzy222diiPQllRr   c                 Z    |                      |          }|                     |          }|S r   )r   r   rf   s     r   r,   zVovNet.forward  s-    !!!$$a  r   F)Tr   )r-   r.   r/   r
   rO   rP   r   r(   rd   ignorer   r   Moduler   r   strr   r   boolr   r,   r1   r2   s   @r   r   r      sC       
 %gR' R' R' R' R' R'h Y
 
 
 
 Y* * * * Y	    2 2# 2 2 2 2  S S$ S S S S      r   )@   r      )r            )      i   i      )r   r   rU   rU   Fr5   )rn   ro   rp   rG   r_   r;   r<   rB   )r   r   rm   r:   )r   r   r   )r   P   `   p   )r   r   i  r   r:   )r   r   r   r   TrS   )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                 b    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     sI     W%D111    r   c                 4    | dddddt           t          ddd
|S )	Nrh   )r:   r   r   )   r   g      ?bicubiczstem.0.convzhead.fc)
urlrz   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   s     r   _cfgr     s7    4}SYI%.B#9	  AG	 r   )r   ztimm/)r:      r   gffffff?)	hf_hub_idtest_input_sizetest_crop_pct)
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.untrainedzese_vovnet99b.untrainedzeca_vovnet39b.untrainedzese_vovnet39b_evos.untrainedr"   c                     t          dd| i|S )Nr   r   )r   r   r   r   s     r   r   r         GG*GGGGr   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r     r   r   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r     s    SSjSFSSSr   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r     s    NNNvNNNr   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r     s    PP:PPPPr   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r         KKjKFKKKr   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r     r   r   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r     r   r   c                     t          dd| i|S )Nr   r   )r   r   r   s     r   r   r     r   r   c                 &    d }t          d| |d|S )Nc                 "    t          d| fddi|S )N	evonorms0rd   F)r   )r   nkwargss     r   norm_act_fnz'ese_vovnet39b_evos.<locals>.norm_act_fn  s    $[,UUEUWUUUr   r   )r   r8   )r   r   )r   r   r   s      r   r   r     s1    V V Vh:R]hhaghhhr   r   )r5   )/__doc__typingr   r   r(   torch.nnrO   	timm.datar   r   timm.layersr   r	   r
   r   r   r   r   _builderr   _manipulater   	_registryr   r   __all__r]   r   r   r4   rR   r   r=   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   r   ry   r   r   <module>r     s_    " ! ! ! ! ! ! !        A A A A A A A A' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' * * * * * * ' ' ' ' ' ' < < < < < < < <*    2=   : : : : :ry : : :z6 6 6 6 6ry 6 6 6rt t t t tRY t t tr Td++++++$	 	 	 d++++++$
 
 
 $(((***$
 
 
 T++++++$	 	 	 t(((***$	 	 	 $++++++$
 
 
 $++++++$	 	 	 $++++++$
 
 
 $++++++$	 	 	 $++++++$	 	 	i i i
T $.o#>
         %$4B<<<4B<<<'+t||| $%T!; !; !; %)DRLLL!T%T; ; ;  $t|||#t|||#t|||$(DRLLL& &  $ H HV H H H H H HV H H H H T T T T T T O OF O O O O Q Qf Q Q Q Q L L L L L L L L L L L L L L L L L L L L L L L L i if i i i i i ir   