
    Ng.                        d Z ddlmZ ddlmZ ddl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 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 eee	j                  Z G d de	j                   Z!	 	 	 	 	 	 d3dZ"	 	 	 	 	 d4dZ# G d de	j                   Z$d Z%d5dZ& e e&d           e&d           e&d           e&d           e&d           e&             e&             e&             e&dd dd!d"#           e&dd dd!d"#           e&dd$d dd!d"%           e&dd$d dd!d"%          d&          Z'ed6d(e$fd)            Z(ed6d(e$fd*            Z)ed6d(e$fd+            Z*ed6d(e$fd,            Z+ed6d(e$fd-            Z,ed6d(e$fd.            Z-ed6d(e$fd/            Z.ed6d(e$fd0            Z/ed6d(e$fd1            Z0ed6d(e$fd2            Z1dS )7a   ReXNet

A PyTorch impl of `ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network` -
https://arxiv.org/abs/2007.00992

Adapted from original impl at https://github.com/clovaai/rexnet
Copyright (c) 2020-present NAVER Corp. MIT license

Changes for timm, feature extraction, and rounded channel variant hacked together by Ross Wightman
Copyright 2020 Ross Wightman
    )partialceil)OptionalNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ClassifierHeadcreate_act_layerConvNormActDropPathmake_divisibleSEModule   )build_model_with_cfg)efficientnet_init_weights)checkpoint_seq)generate_default_cfgsregister_modelRexNet)
norm_layerc                   <     e Zd Z	 	 	 	 	 	 	 d fd	Zdd
Zd Z xZS )LinearBottleneckr   r         ?        r   swishrelu6Nc           	      t   t          t          |                                            |dk    o|d         |d         k    o||k    | _        || _        || _        |dk    r9t          t          ||z            |          }t          |||          | _	        n	|}d | _	        t          ||d||d         |d          | _
        |dk    r5t          |t          t          ||z            |          	          | _        nd | _        t          |	          | _        t          ||dd
          | _        |
| _        d S )Nr   r   r   divisor	act_layer   F)kernel_sizestridedilationgroups	apply_act)rd_channels)r)   )superr   __init__use_shortcutin_channelsout_channelsr   roundr   conv_expconv_dw
SEWithNormintser   act_dwconv_pwl	drop_path)selfin_chsout_chsr&   r'   	exp_ratiose_ratioch_divr#   dw_act_layerr8   dw_chs	__class__s               N/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/rexnet.pyr,   zLinearBottleneck.__init__"   sI    	%%..000"aK\HQK8A;,F\6U\K\!#??#E&9*<$=$=vNNNF')LLLDMMF DM"a[
 
 
 a<< ^CQYHYDZDZ\b5c5cdddDGGDG&|44#FGQ%HHH"    Fc                 ,    |r| j         j        n| j        S N)r2   r/   )r9   exps     rB   feat_channelszLinearBottleneck.feat_channelsM   s    ,/Ft|((T5FFrC   c                    |}| j         |                      |          }|                     |          }| j        |                     |          }|                     |          }|                     |          }| j        rY| j        |                     |          }t          j        |d d d| j	        f         |z   |d d | j	        d f         gd          }|S )Nr   r   )dim)
r1   r2   r5   r6   r7   r-   r8   torchcatr.   )r9   xshortcuts      rB   forwardzLinearBottleneck.forwardP   s    =$a  ALLOO7

AKKNNMM! 	a~)NN1%%	1QQQ$"2 223h>!!!TEUEVEVBV@WX^_```ArC   )r   r   r   r   r   r   NF)__name__
__module____qualname__r,   rG   rN   __classcell__rA   s   @rB   r   r   !   s|          )# )# )# )# )# )#VG G G G      rC   r   r         r   c           	      t   g dg d}fdD             t          fdt          |          D             g           }dgd         z  dgt          dd                    z  z   }t          d d                    dz  }| d	k     r|| z  n|}	g }
t          |dz            D ]D}|
                    t	          t          |	| z            |
                     |	||dz  d	z  z  z  }	Edgd         d         z   z  |gt          dd                    z  z   }t          t          |
|||                    S )N)r      rX   r$   r$      )r   rX   rX   rX   r   rX   c                 4    g | ]}t          |z            S  r   ).0element
depth_mults     rB   
<listcomp>z_block_cfg.<locals>.<listcomp>j   s&    ???Wd7Z'((???rC   c                 <    g | ]\  }}|gd g|         d z
  z  z   S )r   r[   )r\   idxr]   layerss      rB   r_   z_block_cfg.<locals>.<listcomp>k   s3    ^^^<3G9sfSkAo66^^^rC   r   r      r$   r   r    r   rX   )sum	enumeraterangeappendr   r0   listzip)
width_multr^   initial_chs	final_chsr=   r>   strides
exp_ratiosdepthbase_chsout_chs_listi	se_ratiosrb   s    `           @rB   
_block_cfgrt   `   sw     F   G???????F^^^^9U\K]K]^^^`bccGvayA3VABBZ#88Jqqq	NNQE+5+;+;{Z''H L5A: 3 3N5J1F+G+GQWXXXYYYI!c!122q	F1I-.(c&*oo1MMIL*gyAABBBrC       r   r   c                    |g}g }	d}
d}g }t          |           }t          |           D ]\  }\  }}}}|}|dk    r9|dk    rdnd|dz
   }|	t          |d         |
|          gz  }	|
|k    r||z  }d}||z  |dz
  z  }|dk    rt          |          nd }|                    t          ||||||f|||||	
  
                   |
|z  }
|}|}||d                                         gz  }t          d
|z  |          }|	t          |d         |
dt          |          dz
             gz  }	|                    t          |||                     ||	fS )NrX   r   r   stemz	features.)num_chs	reductionmoduler   )
r:   r;   r<   r&   r'   r=   r>   r#   r?   r8   i   r    r"   )	lenre   dictr   rg   r   rG   r   r   )	block_cfgprev_chsrj   r>   output_strider#   r?   drop_path_ratefeat_chsfeature_infocurr_strider'   features
num_blocks	block_idxchsr<   r&   r=   next_dilationfname	block_dprr8   pen_chss                           rB   _build_blocksr   {   s    zHLKHHYJ9B99M9M 3 35	5CFH A::'1nnFF2Mi!m2M2MET(2,+V[\\\]]Lm++ (6 1"Y.*q.A	+4r>>HY'''t	(.%
 
 
 	 	 	 	v Xb\//1122TJ.???GT(2,+NmZ]^fZgZgjkZkNmNmnnnooLOOK'YGGGHHH\!!rC   c                       e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d 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dee         fdZd ZddefdZd Z xZS )!r   r$     avgru   rU   rV   r   UUUUUU?r   r   r   皙?r   c           
      ,   t          t          |                                            || _        || _        d| _        |dv sJ |dk     rd|z  nd}t          t          ||z            |
          }t          ||dd|          | _	        t          |||||	|
          }t          ||||
||||          \  }| _        |d	         j        x| _        | _        t!          j        | | _        t'          | j        |||          | _        t+          |            d S )
NF)ru   rU      r   ru   r    r$   rX   )r&   r#   rx   )r+   r   r,   num_classes	drop_rategrad_checkpointingr   r0   r   rw   rt   r   r   r/   num_featureshead_hidden_sizenn
Sequentialr   r
   headr   )r9   in_chansr   global_poolr   rk   rl   rj   r^   r=   r>   r#   r?   r   r   stem_base_chsstem_chsr~   r   rA   s                      rB   r,   zRexNet.__init__   s4   " 	fd$$&&&&""'+++++5+;+;Z!%
(B"C"CVTTT(Aa9UUU	z:{IxY_``	&3	'
 	'
#$# 5=RL4MMD1x0"4#4k;PYZZ	!$'''''rC   Fc                 (    t          dd          }|S )Nz^stemz^features\.(\d+))rw   blocks)r}   )r9   coarsematchers      rB   group_matcherzRexNet.group_matcher   s#    &
 
 
 rC   Tc                     || _         d S rE   )r   )r9   enables     rB   set_grad_checkpointingzRexNet.set_grad_checkpointing   s    "(rC   returnc                     | j         j        S rE   )r   fc)r9   s    rB   get_classifierzRexNet.get_classifier   s    y|rC   Nr   r   c                 J    || _         | j                            ||           d S rE   )r   r   reset)r9   r   r   s      rB   reset_classifierzRexNet.reset_classifier   s&    &	[11111rC   c                     |                      |          }| j        r6t          j                                        st          | j        |d          }n|                     |          }|S )NT)flatten)rw   r   rJ   jitis_scriptingr   r   r9   rL   s     rB   forward_featureszRexNet.forward_features   s_    IIaLL" 	!59+A+A+C+C 	!t}a>>>AAa  ArC   
pre_logitsc                 ^    |r|                      ||          n|                      |          S )N)r   )r   )r9   rL   r   s      rB   forward_headzRexNet.forward_head   s-    6@Rtyyzy222diiPQllRrC   c                 Z    |                      |          }|                     |          }|S rE   )r   r   r   s     rB   rN   zRexNet.forward   s-    !!!$$a  rC   )r$   r   r   ru   rU   rV   r   r   r   r   r   r   r   r   rO   )TrE   )rP   rQ   rR   r,   rJ   r   ignorer   r   r   Moduler   r4   r   strr   r   boolr   rN   rS   rT   s   @rB   r   r      sT         +( +( +( +( +( +(Z Y    Y) ) ) ) Y	    2 2C 2hsm 2 2 2 2  S S$ S S S S      rC   c                 N    t          d          }t          t          | |fd|i|S )NT)flatten_sequentialfeature_cfg)r}   r   r   )variant
pretrainedkwargsr   s       rB   _create_rexnetr      sF    $///K   	
   rC    c                 6    | dddddt           t          dddd	|S )
Nr   )r$      r   )   r   g      ?bicubicz	stem.convzhead.fcmit)urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierlicenser   )r   r   s     rB   _cfgr   	  s8    4}SYI%.B! 
 # rC   ztimm/)	hf_hub_idgffffff?)r$      r   z
apache-2.0)r   r   test_crop_pcttest_input_sizer   i-.  )r   r   r   r   r   r   )zrexnet_100.nav_in1kzrexnet_130.nav_in1kzrexnet_150.nav_in1kzrexnet_200.nav_in1kzrexnet_300.nav_in1kzrexnetr_100.untrainedzrexnetr_130.untrainedzrexnetr_150.untrainedzrexnetr_200.sw_in12k_ft_in1kzrexnetr_300.sw_in12k_ft_in1kzrexnetr_200.sw_in12kzrexnetr_300.sw_in12kFr   c                     t          d| fi |S )zReXNet V1 1.0x
rexnet_100r   r   r   s     rB   r   r   -  s     ,
==f===rC   c                 "    t          d| fddi|S )zReXNet V1 1.3x
rexnet_130rj   ?r   r   s     rB   r   r   3  !     ,
MMsMfMMMrC   c                 "    t          d| fddi|S )zReXNet V1 1.5x
rexnet_150rj         ?r   r   s     rB   r   r   9  r   rC   c                 "    t          d| fddi|S )zReXNet V1 2.0x
rexnet_200rj          @r   r   s     rB   r   r   ?  r   rC   c                 "    t          d| fddi|S )zReXNet V1 3.0x
rexnet_300rj         @r   r   s     rB   r   r   E  r   rC   c                 "    t          d| fddi|S )z*ReXNet V1 1.0x w/ rounded (mod 8) channelsrexnetr_100r>   r   r   r   s     rB   r   r   K  s!     -HHAHHHHrC   c                 $    t          d| fddd|S )z*ReXNet V1 1.3x w/ rounded (mod 8) channelsrexnetr_130r   r   rj   r>   r   r   s     rB   r   r   Q  $     -XAXXQWXXXrC   c                 $    t          d| fddd|S )z*ReXNet V1 1.5x w/ rounded (mod 8) channelsrexnetr_150r   r   r   r   r   s     rB   r   r   W  r   rC   c                 $    t          d| fddd|S )z*ReXNet V1 2.0x w/ rounded (mod 8) channelsrexnetr_200r   r   r   r   r   s     rB   r   r   ]  r   rC   c                 $    t          d| fddd|S )z+ReXNet V1 3.0x w/ rounded (mod 16) channelsrexnetr_300r   rU   r   r   r   s     rB   r   r   c  s$     -YBYYRXYYYrC   )r   r   rU   rV   r   r   )r   ru   r   r   r   )r   rO   )2__doc__	functoolsr   mathr   typingr   rJ   torch.nnr   	timm.datar   r	   timm.layersr
   r   r   r   r   r   _builderr   _efficientnet_builderr   _manipulater   	_registryr   r   __all__BatchNorm2dr3   r   r   rt   r   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   r   r[   rC   rB   <module>r     s  
 
                          A A A A A A A A i i i i i i i i i i i i i i i i * * * * * * < < < < < < ' ' ' ' ' ' < < < < < < < <* WX".999
< < < < <ry < < <@ C C C C> -" -" -" -"`P P P P PRY P P Pf      %$4'2224'2224'2224'2224'222!TVV!TVV!TVV$(DS-Q]%_ %_ %_ %)DS-Q]%_ %_ %_ !DS-Q]_ _ _ !DS-Q]_ _ _'& &  4 > >f > > > >
 N Nf N N N N
 N Nf N N N N
 N Nf N N N N
 N Nf N N N N
 I Iv I I I I
 Y Yv Y Y Y Y
 Y Yv Y Y Y Y
 Y Yv Y Y Y Y
 Z Zv Z Z Z Z Z ZrC   