
    kh<I                        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 ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ dgZ G d dej8                        Z G d dej8                        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# G d dej>                        Z$ G d dej>                        Z% G d dej>                        Z& G d dej>                        Z'd,dZ( e e(d !       e(d !       e(d !       e(d !       e(d !       e(d !       e(d !       e(d !       e(d !       e(d !       e(d !       e(d !       e(d !      d"      Z)d-d#Z*ed-d$       Z+ed-d%       Z,ed-d&       Z-ed-d'       Z.ed-d(       Z/ed-d)       Z0ed-d*       Z1ed-d+       Z2y).a   RepViT

Paper: `RepViT: Revisiting Mobile CNN From ViT Perspective`
    - https://arxiv.org/abs/2307.09283

@misc{wang2023repvit,
      title={RepViT: Revisiting Mobile CNN From ViT Perspective},
      author={Ao Wang and Hui Chen and Zijia Lin and Hengjun Pu and Guiguang Ding},
      year={2023},
      eprint={2307.09283},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Adapted from official impl at https://github.com/jameslahm/RepViT
    )ListOptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SqueezeExcitetrunc_normal_	to_ntuple	to_2tuple   )build_model_with_cfg)feature_take_indices)
checkpointcheckpoint_seq)register_modelgenerate_default_cfgsRepVitc                   N     e Zd Zd fd	Z ej
                         d        Z xZS )ConvNormc	                    t         	|           | j                  dt        j                  |||||||d             | j                  dt        j
                  |             t        j                  j                  | j                  j                  |       t        j                  j                  | j                  j                  d       y )NcFbiasbnr   )super__init__
add_modulennConv2dBatchNorm2dinit	constant_r   weightr   )
selfin_dimout_dimksstridepaddilationgroupsbn_weight_init	__class__s
            N/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/repvit.pyr   zConvNorm.__init__!   s    RYYvwFCSY`efgbnnW56
$''...9
$'',,*    c           
      b   | j                   j                         \  }}|j                  |j                  |j                  z   dz  z  }|j                  |d d d d d f   z  }|j
                  |j                  |j                  z  |j                  |j                  z   dz  z  z
  }t        j                  |j                  d      | j                  j                  z  |j                  d      |j                  dd  | j                  j                  | j                  j                  | j                  j                  | j                  j                  |j                  j                         }|j                  j"                  j%                  |       |j
                  j"                  j%                  |       |S )N      ?r   r      )r*   paddingr,   r-   device)_modulesvaluesr%   running_varepsr   running_meanr    r!   sizer   r-   shaper*   r5   r,   r6   datacopy_)r&   r   r   wbms         r0   fusezConvNorm.fuse(   s/   $$&2II"&&0S88HHqD$,--GGboo		1R^^bff5LQT4TTTIIFF1I%FF1IGGABK66==FFNNVV__66==88??	
 	
A	!r1   )r   r   r   r   r   r   __name__
__module____qualname__r   torchno_gradrC   __classcell__r/   s   @r0   r   r       s$    + U]]_ r1   r   c                   N     e Zd Zd fd	Z ej
                         d        Z xZS )
NormLinearc                 l   t         |           | j                  dt        j                  |             | j                  dt        j
                  |||             t        | j                  j                  |       |r5t        j                  j                  | j                  j                  d       y y )Nr   lr   )stdr   )r   r   r   r    BatchNorm1dLinearr   rO   r%   r#   r$   r   )r&   r'   r(   r   rP   r/   s        r0   r   zNormLinear.__init__>   sv    bnnV45RYYvwTBCdffmm-GGdffkk1- r1   c                 l   | j                   j                         \  }}|j                  |j                  |j                  z   dz  z  }|j
                  | j                  j                  | j                  j                  z  |j                  |j                  z   dz  z  z
  }|j                  |d d d f   z  }|j
                  $|| j                  j                  j                  z  }n<|j                  |d d d f   z  j                  d      | j                  j
                  z   }t        j                  |j                  d      |j                  d      |j                  j                        }|j                  j                  j!                  |       |j
                  j                  j!                  |       |S )Nr3   r   r   r6   )r7   r8   r%   r9   r:   r   r   r;   rO   Tviewr    rR   r<   r6   r>   r?   )r&   r   rO   r@   rA   rB   s         r0   rC   zNormLinear.fuseF   s6   $$&AII"&&0S88GGdgg**TWW^^;r~~PRPVPV?V[^>^^^HHqqz!66>DFFMMOO#AAagJ&,,R0466;;>AIIaffQi188??C	A	!r1   )Tg{Gz?rD   rK   s   @r0   rM   rM   =   s$    . U]]_ r1   rM   c                   T     e Zd Zd fd	Zd Z ej                         d        Z xZS )RepVggDwc                 N   t         |           t        |||d|dz
  dz  |      | _        |r0t        ||ddd|      | _        t        j                         | _        n:t        j                  ||ddd|      | _        t        j                  |      | _        || _
        || _        y )Nr   r4   r-   r   )r   r   r   convconv1r    Identityr   r!   r"   dimlegacy)r&   edkernel_sizer`   r/   s       r0   r   zRepVggDw.__init__W   s    R[!kAo!5KTVW	!"b!Q"=DJkkmDG2r1a2>DJnnR(DGr1   c                 l    | j                  | j                  |      | j                  |      z   |z         S N)r   r\   r]   r&   xs     r0   forwardzRepVggDw.forwardd   s+    wwtyy|djjm3a788r1   c           	         | j                   j                         }| j                  r| j                  j                         }n| j                  }|j                  }|j
                  }|j                  }|j
                  }t        j                  j                  |g d      }t        j                  j                  t        j                  |j                  d   |j                  d   dd|j                        g d      }||z   |z   }||z   }	|j                  j                  j                  |       |j
                  j                  j                  |	       | j                  s| j                  }
|
j                  |
j                   |
j"                  z   dz  z  }|j                  |d d d d d f   z  }|
j
                  |j
                  |
j$                  z
  |
j                  z  |
j                   |
j"                  z   dz  z  z   }|j                  j                  j                  |       |j
                  j                  j                  |       |S )N)r   r   r   r   r   r   rU   r3   )r\   rC   r`   r]   r%   r   r    
functionalr+   rH   onesr=   r6   r>   r?   r   r9   r:   r;   )r&   r\   r]   conv_wconv_bconv1_wconv1_bidentityfinal_conv_wfinal_conv_br   r@   rA   s                r0   rC   zRepVggDw.fuseg   s   yy~~;;JJOO%EJJE,,**--##G\:==$$JJw}}Q'q)91aWYe
 '(2'|,		\*{{B		R^^bff4<<Aa4t 344A499r6"))Cr~~XZX^X^G^cfFfffAKK""1%IINN  #r1   F	rE   rF   rG   r   rg   rH   rI   rC   rJ   rK   s   @r0   rY   rY   V   s)    9 U]]_   r1   rY   c                   $     e Zd Z fdZd Z xZS )	RepVitMlpc                     t         |           t        ||ddd      | _         |       | _        t        ||dddd      | _        y )Nr   r   )r.   )r   r   r   r]   actconv2)r&   r'   
hidden_dim	act_layerr/   s       r0   r   zRepVitMlp.__init__   sA    fj!Q:
;j&!Q!L
r1   c                 `    | j                  | j                  | j                  |                  S rd   )rx   rw   r]   re   s     r0   rg   zRepVitMlp.forward   s"    zz$((4::a=122r1   rE   rF   rG   r   rg   rJ   rK   s   @r0   ru   ru      s    M3r1   ru   c                   &     e Zd Zd fd	Zd Z xZS )RepViTBlockc                     t         t        |           t        |||      | _        |rt        |d      nt        j                         | _        t        |||z  |      | _
        y )Ng      ?)r   r~   r   rY   token_mixerr
   r    r^   seru   channel_mixer)r&   r'   	mlp_ratiorb   use_serz   r`   r/   s          r0   r   zRepViTBlock.__init__   sO    k4)+#FK@17--R[[]&vv	/A9Mr1   c                 v    | j                  |      }| j                  |      }|}| j                  |      }||z   S rd   )r   r   r   r&   rf   ro   s      r0   rg   zRepViTBlock.forward   s>    QGGAJq!!|r1   rr   r|   rK   s   @r0   r~   r~      s    Nr1   r~   c                   $     e Zd Z fdZd Z xZS )
RepVitStemc                     t         |           t        ||dz  ddd      | _         |       | _        t        |dz  |ddd      | _        d| _        y )Nr4      r      )r   r   r   r]   act1rx   r*   )r&   in_chsout_chsrz   r/   s       r0   r   zRepVitStem.__init__   sN    fglAq!<
K	glGQ1=
r1   c                 `    | j                  | j                  | j                  |                  S rd   )rx   r   r]   re   s     r0   rg   zRepVitStem.forward   s"    zz$))DJJqM233r1   r|   rK   s   @r0   r   r      s    4r1   r   c                   &     e Zd Zd fd	Zd Z xZS )RepVitDownsamplec                     t         |           t        |||d||      | _        t	        |||d|dz
  dz  |      | _        t	        ||dd      | _        t        |||z  |      | _        y )NF)r   rz   r`   r4   r   r[   )	r   r   r~   	pre_blockr   spatial_downsamplechannel_downsampleru   ffn)r&   r'   r   r(   rb   rz   r`   r/   s          r0   r   zRepVitDownsample.__init__   sq    $VYE]fouv"*66;KZ[O`aKajp"q"*67Aq"AWg	&99Er1   c                     | j                  |      }| j                  |      }| j                  |      }|}| j                  |      }||z   S rd   )r   r   r   r   r   s      r0   rg   zRepVitDownsample.forward   sL    NN1##A&##A&HHQK8|r1   rr   r|   rK   s   @r0   r   r      s    Fr1   r   c                   T     e Zd Zd fd	Zd Z ej                         d        Z xZS )RepVitClassifierc                 .   t         |           t        j                  |      | _        |dkD  rt        ||      nt        j                         | _        || _        d| _	        || _
        |r+|dkD  rt        ||      nt        j                         | _        y y )Nr   F)r   r   r    Dropout	head_droprM   r^   headdistillationdistilled_trainingnum_classes	head_dist)r&   r_   r   r   dropr/   s        r0   r   zRepVitClassifier.__init__   sz    D)4?!OJsK0	("'&=H1_Z[9RTR]R]R_DN r1   c                 *   | j                  |      }| j                  rd| j                  |      | j                  |      }}| j                  r.| j
                  r"t        j                  j                         s||fS ||z   dz  S | j                  |      }|S )Nr4   )	r   r   r   r   trainingr   rH   jitis_scripting)r&   rf   x1x2s       r0   rg   zRepVitClassifier.forward   sz    NN1YYq\4>>!#4B}}!8!8AWAWAY2vR1}$		!AHr1   c                    | j                   dkD  st        j                         S | j                  j	                         }| j
                  r| j                  j	                         }|xj                  |j                  z  c_        |xj                  |j                  z  c_        |xj                  dz  c_        |xj                  dz  c_        |S |S )Nr   r4   )	r   r    r^   r   rC   r   r   r%   r   )r&   r   r   s      r0   rC   zRepVitClassifier.fuse   s    !#;;= yy~~++-IKK9+++KII'IKK1KIINIKKr1   )F        rs   rK   s   @r0   r   r      s*    `
 U]]_ r1   r   c                   &     e Zd Zd fd	Zd Z xZS )RepVitStagec	                 ,   t         |           |rt        ||||||      | _        n ||k(  sJ t	        j
                         | _        g }	d}
t        |      D ]$  }|	j                  t        ||||
||             |
 }
& t	        j                  |	 | _
        y )NT)r   r   r   
downsampler    r^   rangeappendr~   
Sequentialblocks)r&   r'   r(   depthr   rz   rb   r   r`   r   r   _r/   s               r0   r   zRepVitStage.__init__   s    .vy';XacijDOW$$$ kkmDOu 	 AMM+gy+vyZ`abZF	  mmV,r1   c                 J    | j                  |      }| j                  |      }|S rd   )r   r   re   s     r0   rg   zRepVitStage.forward   s"    OOAKKNr1   )r   TFr|   rK   s   @r0   r   r      s    - r1   r   c                       e Zd Zddddddddej                  d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dee   defdZej                  j                  d%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 ej8                         d#        Z xZS ))r   r      )0   )r4   r4   avg  Tr   Fc                    t         t        |           d| _        || _        || _        || _        |d   }t        |||	      | _        | j                  j                  }t        t        t        |      t        |            D cg c]
  \  }}||z   c}}      }t        |      } t        |      |      }g | _        g }t!        |      D ]  }|dk7  rdnd}|j#                  t%        |||   ||   ||   |	|||             |rdnd}||z  }t        |D cg c]  }|dz
  |z  dz    c}      }| xj                  t'        ||   |d|       gz  c_        ||   } t)        j*                  | | _        |d	   x| _        | _        t)        j2                  |      | _        t7        |d	   ||
      | _        y c c}}w c c}w )
NFr   T)r   rz   rb   r   r`   r4   r   zstages.)num_chs	reductionmodulerT   )r   r   r   grad_checkpointingglobal_pool	embed_dimr   r   stemr*   tuplezipr   lenr   feature_infor   r   r   dictr    r   stagesnum_featureshead_hidden_sizer   r   r   r   )r&   in_chansimg_sizer   r   r   r   rb   r   rz   r   	drop_rater`   r'   r*   ip
resolution
num_stages
mlp_ratiosr   r   stage_striderr/   s                           r0   r   zRepVit.__init__  s    	fd$&"'&"&1x;	!!s9X3F	RXHY/Z[tq!AF[\
^
*Yz*95
z" 	"A!"aUJMMaL!H(m' +)!	 !+1Ll"FZPQ< 7! ;PQJ$y|vX_`a_bVc"d!eeq\F%	"& mmV,4=bMAD1I.$Yr]KN	= \.  Qs   F5
F;
c                 $    t        dddg      }|S )Nz^stem)z^blocks\.(\d+)N)z^norm)i )r   r   )r   )r&   coarsematchers      r0   group_matcherzRepVit.group_matcher:  s    H.GI]-^_r1   c                     || _         y rd   )r   r&   enables     r0   set_grad_checkpointingzRepVit.set_grad_checkpointing?  s
    "(r1   returnc                     | j                   S rd   )r   )r&   s    r0   get_classifierzRepVit.get_classifierC  s    yyr1   r   r   r   c                 b    || _         ||| _        t        | j                  d   ||      | _        y )NrT   )r   r   r   r   r   )r&   r   r   r   s       r0   reset_classifierzRepVit.reset_classifierG  s1    &"*D$T^^B%7lS	r1   c                 &    || j                   _        y rd   )r   r   r   s     r0   set_distilled_trainingzRepVit.set_distilled_trainingM  s    '-		$r1   rf   indicesnorm
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }t        j
                  j                         s|s| j                  }
n| j                  d|	dz    }
t        |
      D ]Z  \  }}| j                  r+t        j
                  j                         st        ||      }n ||      }||v sJ|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.Nr   )r   r   r   r   rH   r   r   	enumerater   r   r   )r&   rf   r   r   r   r   r   intermediatestake_indices	max_indexr   feat_idxstages                r0   forward_intermediateszRepVit.forward_intermediatesQ  s    * Y&D(DD&"6s4;;7G"Qi IIaL99!!#:[[F[[)a-0F(0 	(OHe&&uyy/E/E/Gua(!H<'$$Q'	(   -r1   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   r   )r&   r   r   r   r   r   s         r0   prune_intermediate_layersz RepVit.prune_intermediate_layers~  sM     #7s4;;7G"Qikk.9q=1!!!R(r1   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S rd   )r   r   rH   r   r   r   r   re   s     r0   forward_featureszRepVit.forward_features  sR    IIaL""599+A+A+Ct{{A.A  AAr1   
pre_logitsc                     | j                   dk(  r|j                  dd      }| j                  |      }|r|S | j                  |      S )Nr   )r4   r   F)keepdim)r   meanr   r   )r&   rf   r   s      r0   forward_headzRepVit.forward_head  sF    u$vu-ANN1Hyy|r1   c                 J    | j                  |      }| j                  |      }|S rd   )r   r   re   s     r0   rg   zRepVit.forward  s'    !!!$a r1   c                      fd |        y )Nc                     | j                         D ]?  \  }}t        |d      r&|j                         }t        | ||        |       8 |       A y )NrC   )named_childrenhasattrrC   setattr)net
child_namechildfusedfuse_childrens       r0   r  z"RepVit.fuse.<locals>.fuse_children  sQ    %(%7%7%9 )!
E5&)!JJLECU3!%(!%()r1    )r&   r  s    @r0   rC   zRepVit.fuse  s    	) 	dr1   rr   )T)NF)NFFr   F)r   FT)rE   rF   rG   r    GELUr   rH   r   ignorer   r   Moduler   intr   strboolr   r   Tensorr   r   r   r   r   r   r   rg   rI   rC   rJ   rK   s   @r0   r   r     s    ''6Op YY  YY) ) YY		  TC Thsm Tbf T YY. . 8<$$',+ ||+  eCcN34+  	+ 
 +  +  !%+  
tELL!5tELL7I)I#JJ	K+ ^ ./$#	3S	>*  	$ 
 U]]_
 
r1   c                 0    | dddddt         t        ddd
|S )	Nr   )r   r   r   )   r  gffffff?bicubiczstem.conv1.c)zhead.head.lzhead.head_dist.l)
urlr   
input_size	pool_sizecrop_pctinterpolationr   rP   
first_conv
classifierr   )r  kwargss     r0   _cfgr    s4    #"%#$9  r1   ztimm/)	hf_hub_id)zrepvit_m1.dist_in1kzrepvit_m2.dist_in1kzrepvit_m3.dist_in1kzrepvit_m0_9.dist_300e_in1kzrepvit_m0_9.dist_450e_in1kzrepvit_m1_0.dist_300e_in1kzrepvit_m1_0.dist_450e_in1kzrepvit_m1_1.dist_300e_in1kzrepvit_m1_1.dist_450e_in1kzrepvit_m1_5.dist_300e_in1kzrepvit_m1_5.dist_450e_in1kzrepvit_m2_3.dist_300e_in1kzrepvit_m2_3.dist_450e_in1kc                 h    |j                  dd      }t        t        | |fdt        d|      i|}|S )Nout_indices)r   r   r4   r   feature_cfgT)flatten_sequentialr  )popr   r   r   )variant
pretrainedr  r  models        r0   _create_repvitr&    sG    **]L9K  DkJ	
 E Lr1   c           	      L    t        ddd      }t        dd| it        |fi |S )z&
    Constructs a RepViT-M1 model
    r   `      i  r4   r4      r4   Tr   r   r`   r$  )	repvit_m1r   r&  r$  r  
model_argss      r0   r.  r.    s2    
  2-PTUJ[*[Z@ZSY@Z[[r1   c           	      L    t        ddd      }t        dd| it        |fi |S )z&
    Constructs a RepViT-M2 model
    @         i   r4   r4      r4   Tr-  r$  )	repvit_m2r/  r0  s      r0   r9  r9    2    
  3=QUVJ[*[Z@ZSY@Z[[r1   c           	      L    t        ddd      }t        dd| it        |fi |S )z&
    Constructs a RepViT-M3 model
    r3  )r   r      r4   Tr-  r$  )	repvit_m3r/  r0  s      r0   r=  r=  
  r:  r1   c           	      J    t        dd      }t        dd| it        |fi |S )z(
    Constructs a RepViT-M0.9 model
    r(  r+  r   r   r$  )repvit_m0_9r/  r0  s      r0   r@  r@    s/    
  2-HJ]J]$zB\U[B\]]r1   c           	      J    t        dd      }t        dd| it        |fi |S )z(
    Constructs a RepViT-M1.0 model
    )8   p   r   i  r+  r?  r$  )repvit_m1_0r/  r0  s      r0   rD  rD    /    
  3=IJ]J]$zB\U[B\]]r1   c           	      J    t        dd      }t        dd| it        |fi |S )z(
    Constructs a RepViT-M1.1 model
    r3  r7  r?  r$  )repvit_m1_1r/  r0  s      r0   rG  rG  %  rE  r1   c           	      J    t        dd      }t        dd| it        |fi |S )z(
    Constructs a RepViT-M1.5 model
    r3  )r   r      r   r?  r$  )repvit_m1_5r/  r0  s      r0   rJ  rJ  .  rE  r1   c           	      J    t        dd      }t        dd| it        |fi |S )z(
    Constructs a RepViT-M2.3 model
    )P      i@  i  )   rN  "   r4   r?  r$  )repvit_m2_3r/  r0  s      r0   rP  rP  7  rE  r1   )r   rr   )3__doc__typingr   r   r   r   rH   torch.nnr    	timm.datar   r	   timm.layersr
   r   r   r   _builderr   	_featuresr   _manipulater   r   	_registryr   r   __all__r   r   rM   r  rY   ru   r~   r   r   r   r   r   r  default_cfgsr&  r.  r9  r=  r@  rD  rG  rJ  rP  r	  r1   r0   <module>r\     sM    0 /   A J J * + 3 <*r}} : 22ryy 2j3		 3"))  	4 	4ryy "$ryy $N")) .kRYY k\  %# 
  $ 
  $ 
 '+'
 '+'
 '+'
 '+'
 '+'
 '+'
 '+'
 '+'
 '+'
 '+'
K(*Z	 \ \ \ \ \ \ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^r1   