U
    ¯Ê¹j@  ã                   @   s  d Z dgZddlmZ ddlmZmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZmZ dd	lmZ ddlZG d
d„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZd6dd„Z e	e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�e d d!�d"œƒZ!d7d$d%„Z"ed8d&d'„ƒZ#ed9d(d)„ƒZ$ed:d*d+„ƒZ%ed;d,d-„ƒZ&ed<d.d/„ƒZ'ed=d0d1„ƒZ(ed>d2d3„ƒZ)ed?d4d5„ƒZ*dS )@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
ÚRepVité    N©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDé   )Úregister_modelÚgenerate_default_cfgs)Úbuild_model_with_cfg)ÚSqueezeExciteÚtrunc_normal_Ú	to_ntupleÚ	to_2tuple)Úcheckpoint_seqc                       s.   e Zd Zd‡ fdd„	Ze ¡ dd„ ƒZ‡  ZS )ÚConvNormr   r   c	           	         sf   t ƒ  ¡  |  dtj|||||||dd�¡ |  dt |¡¡ tj | jj	|¡ tj | jj
d¡ d S )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__© úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/repvit.pyr      s
    
"zConvNorm.__init__c              
   C   sÌ   | j  ¡ \}}|j|j|j d  }|j|d d …d d d f  }|j|j|j |j|j d   }tj| 	d¡| j
j | 	d¡|jdd … | j
j| j
j| j
j| j
j|jjd�}|jj |¡ |jj |¡ |S )Nç      à?r   r   é   )r!   Úpaddingr#   r$   Údevice)Ú_modulesÚvaluesr   Úrunning_varÚepsr   Úrunning_meanr   r   Úsizer   r$   Úshaper!   r,   r#   r-   ÚdataÚcopy_)r   r   r   ÚwÚbÚmr(   r(   r)   Úfuse&   s"    "ø
zConvNorm.fuse)r   r   r   r   r   r   ©Ú__name__Ú
__module__Ú__qualname__r   ÚtorchÚno_gradr:   Ú__classcell__r(   r(   r&   r)   r      s   r   c                       s.   e Zd Zd‡ fdd„	Ze ¡ dd„ ƒZ‡  ZS )Ú
NormLinearTç{®Gáz”?c                    s^   t ƒ  ¡  |  dt |¡¡ |  dtj|||d�¡ t| jj|d� |rZtj	 
| jjd¡ d S )Nr   Úlr   )Ústdr   )r   r   r   r   ZBatchNorm1dÚLinearr   rD   r   r   r   r   )r   r   r   r   rE   r&   r(   r)   r   <   s    
zNormLinear.__init__c                 C   sÞ   | j  ¡ \}}|j|j|j d  }|j| jj| jj |j|j d   }|j|d d d …f  }|jd krz|| jjj	 }n$|j|d d …d f   
d¡| jj }tj| d¡| d¡|jjd�}|jj |¡ |jj |¡ |S )Nr*   éÿÿÿÿr   r   ©r-   )r.   r/   r   r0   r1   r   r   r2   rD   ÚTÚviewr   rF   r3   r-   r5   r6   )r   r   rD   r7   r8   r9   r(   r(   r)   r:   D   s    &
$ zNormLinear.fuse)TrC   r;   r(   r(   r&   r)   rB   ;   s   rB   c                       s6   e Zd Zd‡ fdd„	Zdd„ Ze ¡ dd„ ƒZ‡  ZS )	ÚRepVggDwFc                    s‚   t ƒ  ¡  t|||d|d d |d�| _|rNt||ddd|d�| _t ¡ | _n$tj||ddd|d�| _t 	|¡| _|| _
|| _d S )Nr   r+   ©r$   r   )r   r   r   ÚconvÚconv1r   ÚIdentityr   r   r   ÚdimÚlegacy)r   ZedÚkernel_sizerQ   r&   r(   r)   r   U   s    
zRepVggDw.__init__c                 C   s   |   |  |¡|  |¡ | ¡S ©N)r   rM   rN   ©r   Úxr(   r(   r)   Úforwardb   s    zRepVggDw.forwardc              	   C   s:  | j  ¡ }| jr| j ¡ }n| j}|j}|j}|j}|j}tj |ddddg¡}tj t	j
|jd |jd dd|jd�ddddg¡}|| | }|| }	|jj |¡ |jj |	¡ | j�s6| j}
|
j|
j|
j d  }|j|d d …d d d f  }|
j|j|
j |
j |
j|
j d   }|jj |¡ |jj |¡ |S )Nr   r   rH   r*   )rM   r:   rQ   rN   r   r   r   Z
functionalr"   r?   Zonesr4   r-   r5   r6   r   r0   r1   r2   )r   rM   rN   Zconv_wZconv_bZconv1_wZconv1_bÚidentityZfinal_conv_wZfinal_conv_br   r7   r8   r(   r(   r)   r:   e   s2    
  
ÿ(zRepVggDw.fuse)F©	r<   r=   r>   r   rV   r?   r@   r:   rA   r(   r(   r&   r)   rK   T   s   rK   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú	RepVitMlpc                    s>   t ƒ  ¡  t||dddƒ| _|ƒ | _t||ddddd�| _d S )Nr   r   )r%   )r   r   r   rN   ÚactÚconv2)r   r   Z
hidden_dimÚ	act_layerr&   r(   r)   r   Š   s    
zRepVitMlp.__init__c                 C   s   |   |  |  |¡¡¡S rS   )r[   rZ   rN   rT   r(   r(   r)   rV   �   s    zRepVitMlp.forward©r<   r=   r>   r   rV   rA   r(   r(   r&   r)   rY   ‰   s   rY   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚRepViTBlockFc                    sJ   t t| ƒ ¡  t|||ƒ| _|r*t|dƒnt ¡ | _t	||| |ƒ| _
d S )Ng      Ð?)r   r^   r   rK   Útoken_mixerr
   r   rO   ÚserY   Úchannel_mixer)r   r   Ú	mlp_ratiorR   Úuse_ser\   rQ   r&   r(   r)   r   •   s    zRepViTBlock.__init__c                 C   s*   |   |¡}|  |¡}|}|  |¡}|| S rS   )r_   r`   ra   ©r   rU   rW   r(   r(   r)   rV   œ   s
    


zRepViTBlock.forward)Fr]   r(   r(   r&   r)   r^   ”   s   r^   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
RepVitStemc                    sH   t ƒ  ¡  t||d dddƒ| _|ƒ | _t|d |dddƒ| _d| _d S )Nr+   é   r   é   )r   r   r   rN   Úact1r[   r!   )r   Zin_chsZout_chsr\   r&   r(   r)   r   ¥   s
    
zRepVitStem.__init__c                 C   s   |   |  |  |¡¡¡S rS   )r[   rh   rN   rT   r(   r(   r)   rV   ¬   s    zRepVitStem.forwardr]   r(   r(   r&   r)   re   ¤   s   re   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚRepVitDownsampleFc                    sd   t ƒ  ¡  t|||d||d�| _t|||d|d d |d�| _t||ddƒ| _t||| |ƒ| _d S )NF)rc   r\   rQ   r+   r   rL   )	r   r   r^   Ú	pre_blockr   Úspatial_downsampleÚchannel_downsamplerY   Úffn)r   r   rb   r   rR   r\   rQ   r&   r(   r)   r   ±   s
    
zRepVitDownsample.__init__c                 C   s4   |   |¡}|  |¡}|  |¡}|}|  |¡}|| S rS   )rj   rk   rl   rm   rd   r(   r(   r)   rV   ¸   s    



zRepVitDownsample.forward)Fr]   r(   r(   r&   r)   ri   °   s   ri   c                       s6   e Zd Zd	‡ fdd„	Zdd„ Ze ¡ dd„ ƒZ‡  ZS )
ÚRepVitClassifierFç        c                    sh   t ƒ  ¡  t |¡| _|dkr(t||ƒnt ¡ | _|| _d| _	|| _
|rd|dkrZt||ƒnt ¡ | _d S )Nr   F)r   r   r   ÚDropoutÚ	head_droprB   rO   ÚheadÚdistillationÚdistilled_trainingÚnum_classesÚ	head_dist)r   rP   ru   rs   Zdropr&   r(   r)   r   Â   s    
zRepVitClassifier.__init__c                 C   sd   |   |¡}| jrR|  |¡|  |¡ }}| jrD| jrDtj ¡ sD||fS || d S n|  |¡}|S d S )Nr+   )	rq   rs   rr   rv   Ztrainingrt   r?   ÚjitÚis_scripting)r   rU   Úx1Zx2r(   r(   r)   rV   Ì   s    

zRepVitClassifier.forwardc                 C   st   | j dkst ¡ S | j ¡ }| jrl| j ¡ }| j|j7  _| j|j7  _| jd  _| jd  _|S |S d S )Nr   r+   )	ru   r   rO   rr   r:   rs   rv   r   r   )r   rr   rv   r(   r(   r)   r:   Ø   s    


zRepVitClassifier.fuse)Fro   rX   r(   r(   r&   r)   rn   Á   s   
rn   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	ÚRepVitStagerf   TFc	              
      s~   t ƒ  ¡  |r$t||||||ƒ| _n||ks0t‚t ¡ | _g }	d}
t|ƒD ]"}|	 t	||||
||ƒ¡ |
 }
qJtj
|	Ž | _d S )NT)r   r   ri   Ú
downsampleÚAssertionErrorr   rO   ÚrangeÚappendr^   Ú
SequentialÚblocks)r   r   r   Údepthrb   r\   rR   r{   rQ   r€   rc   Ú_r&   r(   r)   r   é   s    

zRepVitStage.__init__c                 C   s   |   |¡}|  |¡}|S rS   )r{   r€   rT   r(   r(   r)   rV   ù   s    

zRepVitStage.forward)rf   TFr]   r(   r(   r&   r)   rz   è   s   rz   c                       s¸   e Zd Zddddddddejdd	d
f‡ fdd„	Zejjd!dd„ƒZ	ejjd"dd„ƒZ
ejjdd„ ƒZd#dd„Zejjd$dd„ƒZdd„ Zd%edœdd„Zdd„ Ze ¡ dd „ ƒZ‡  ZS )&r   rf   éà   )é0   )r+   r+   Úavgéè  Tro   Fc                    sX  t t| ƒ ¡  d| _|| _|| _|| _|d }t|||	ƒ| _| jj	}t
dd„ tt|ƒt|ƒƒD ƒƒ}t|ƒ}t|ƒ|ƒ}g | _g }t|ƒD ]”}|dkršdnd}| t||| || || |	|||d�¡ |rÐdnd‰ |ˆ 9 }t
‡ fd	d„|D ƒƒ}|  jt|| |d
|› �d�g7  _|| }qŠtj|Ž | _|d | _t |¡| _t|d ||
ƒ| _d S )NFr   c                 S   s   g | ]\}}|| ‘qS r(   r(   )Ú.0ÚiÚpr(   r(   r)   Ú
<listcomp>  s     z#RepVit.__init__.<locals>.<listcomp>T)rb   r\   rR   r{   rQ   r+   r   c                    s   g | ]}|d  ˆ  d  ‘qS )r   r(   )r‡   Úr©Zstage_strider(   r)   rŠ   /  s     zstages.)Znum_chsZ	reductionÚmodulerG   )r   r   r   Úgrad_checkpointingÚglobal_poolÚ	embed_dimru   re   Ústemr!   ÚtupleÚzipr   Úlenr   Zfeature_infor}   r~   rz   Údictr   r   ÚstagesZnum_featuresrp   rq   rn   rr   )r   Zin_chansZimg_sizer�   r�   rb   r�   rR   ru   r\   rs   Z	drop_raterQ   r   r!   Ú
resolutionZ
num_stagesZ
mlp_ratiosr–   rˆ   r{   r&   rŒ   r)   r      sH     øÿ$

zRepVit.__init__c                 C   s   t dddgd�}|S )Nz^stem)z^blocks\.(\d+)N)z^norm)iŸ† )r‘   r€   )r•   )r   ZcoarseZmatcherr(   r(   r)   Úgroup_matcher8  s    zRepVit.group_matcherc                 C   s
   || _ d S rS   )rŽ   ©r   Úenabler(   r(   r)   Úset_grad_checkpointing=  s    zRepVit.set_grad_checkpointingc                 C   s   | j S rS   )rr   ©r   r(   r(   r)   Úget_classifierA  s    zRepVit.get_classifierNc                 C   s<   || _ |d k	r|| _|dkr.t| jd ||ƒnt ¡ | _d S )Nr   rG   )ru   r�   rn   r�   r   rO   rr   )r   ru   r�   rs   r(   r(   r)   Úreset_classifierE  s
     ÿzRepVit.reset_classifierc                 C   s   || j _d S rS   )rr   rt   r™   r(   r(   r)   Úset_distilled_trainingM  s    zRepVit.set_distilled_trainingc                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S rS   )r‘   rŽ   r?   rw   rx   r   r–   rT   r(   r(   r)   Úforward_featuresQ  s
    

zRepVit.forward_features)Ú
pre_logitsc                 C   s,   | j dkr|jddd�}|  |¡}|  |¡S )Nr…   )r+   rf   F)Zkeepdim)r�   Úmeanrq   rr   )r   rU   r¡   r(   r(   r)   Úforward_headY  s    

zRepVit.forward_headc                 C   s   |   |¡}|  |¡}|S rS   )r    r£   rT   r(   r(   r)   rV   _  s    

zRepVit.forwardc                    s   ‡ fdd„‰ ˆ | ƒ d S )Nc                    sF   |   ¡ D ]8\}}t|dƒr8| ¡ }t| ||ƒ ˆ |ƒ qˆ |ƒ qd S )Nr:   )Znamed_childrenÚhasattrr:   Úsetattr)ÚnetZ
child_nameÚchildZfused©Úfuse_childrenr(   r)   r©   f  s    

z"RepVit.fuse.<locals>.fuse_childrenr(   rœ   r(   r¨   r)   r:   d  s    	zRepVit.fuse)F)T)NF)T)F)r<   r=   r>   r   ZGELUr   r?   rw   Úignorer˜   r›   r�   rž   rŸ   r    Úboolr£   rV   r@   r:   rA   r(   r(   r&   r)   r   ÿ   s6   ó8

Ú c                 K   s   | dddddt tdddœ
|–S )	Nr†   )rf   rƒ   rƒ   )é   r­   gffffffî?Zbicubiczstem.conv1.c)zhead.head.lzhead.head_dist.l)
Úurlru   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationr¢   rE   Z
first_convÚ
classifierr   )r®   Úkwargsr(   r(   r)   Ú_cfgr  s    öõr²   ztimm/)Z	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_in1kFc                 K   s0   |  dd¡}tt| |fdtd|d�i|—Ž}|S )NÚout_indices)r   r   r+   rf   Zfeature_cfgT)Zflatten_sequentialr³   )Úpopr	   r   r•   )ÚvariantÚ
pretrainedr±   r³   Úmodelr(   r(   r)   Ú_create_repvit¯  s    ý
üûr¸   c                 K   s(   t dddd�}tdd| it |f|Ž—ŽS )z&
    Constructs a RepViT-M1 model
    ©r„   é`   éÀ   i€  ©r+   r+   é   r+   T©r�   r�   rQ   Ú	repvit_m1r¶   )r¿   ©r•   r¸   ©r¶   r±   Z
model_argsr(   r(   r)   r¿   »  s    r¿   c                 K   s(   t dddd�}tdd| it |f|Ž—ŽS )z&
    Constructs a RepViT-M2 model
    ©é@   é€   é   i   ©r+   r+   é   r+   Tr¾   Ú	repvit_m2r¶   )rÈ   rÀ   rÁ   r(   r(   r)   rÈ   Ä  s    rÈ   c                 K   s(   t dddd�}tdd| it |f|Ž—ŽS )z&
    Constructs a RepViT-M3 model
    rÂ   )rg   rg   é   r+   Tr¾   Ú	repvit_m3r¶   )rÊ   rÀ   rÁ   r(   r(   r)   rÊ   Í  s    rÊ   c                 K   s&   t ddd�}tdd| it |f|Ž—ŽS )z(
    Constructs a RepViT-M0.9 model
    r¹   r¼   ©r�   r�   Úrepvit_m0_9r¶   )rÌ   rÀ   rÁ   r(   r(   r)   rÌ   Ö  s    rÌ   c                 K   s&   t ddd�}tdd| it |f|Ž—ŽS )z(
    Constructs a RepViT-M1.0 model
    )é8   ép   rƒ   iÀ  r¼   rË   Úrepvit_m1_0r¶   )rÏ   rÀ   rÁ   r(   r(   r)   rÏ   ß  s    rÏ   c                 K   s&   t ddd�}tdd| it |f|Ž—ŽS )z(
    Constructs a RepViT-M1.1 model
    rÂ   rÆ   rË   Úrepvit_m1_1r¶   )rÐ   rÀ   rÁ   r(   r(   r)   rÐ   è  s    rÐ   c                 K   s&   t ddd�}tdd| it |f|Ž—ŽS )z(
    Constructs a RepViT-M1.5 model
    rÂ   )rg   rg   é   rg   rË   Úrepvit_m1_5r¶   )rÒ   rÀ   rÁ   r(   r(   r)   rÒ   ñ  s    rÒ   c                 K   s&   t ddd�}tdd| it |f|Ž—ŽS )z(
    Constructs a RepViT-M2.3 model
    )éP   é    i@  i€  )é   rÕ   é"   r+   rË   Úrepvit_m2_3r¶   )r×   rÀ   rÁ   r(   r(   r)   r×   ú  s    r×   )r¬   )F)F)F)F)F)F)F)F)F)+Ú__doc__Ú__all__Ztorch.nnr   Z	timm.datar   r   Ú	_registryr   r   Z_builderr	   Ztimm.layersr
   r   r   r   Z_manipulater   r?   r   r   rB   ÚModulerK   rY   r^   re   ri   rn   rz   r   r²   Zdefault_cfgsr¸   r¿   rÈ   rÊ   rÌ   rÏ   rÐ   rÒ   r×   r(   r(   r(   r)   Ú<module>   sœ   5's
ÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿ-
