U
    ¯Ê¹jŽ.  ã                   @   s@  d 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d�ZG dd„ dejƒZd@dd„Z dAdd„Z!G dd„ dejƒZ"dd„ Z#dBdd „Z$ee$d!d"�e$d!d"�e$d!d"�e$d!d"�e$d!d"�e$ƒ e$ƒ e$ƒ e$d!d#dd$d%d&�e$d!d#dd$d%d&�e$d!d'd#dd$d%d(�e$d!d'd#dd$d%d(�d)œƒZ%edCe"d+œd,d-„ƒZ&edDe"d+œd.d/„ƒZ'edEe"d+œd0d1„ƒZ(edFe"d+œd2d3„ƒZ)edGe"d+œd4d5„ƒZ*edHe"d+œd6d7„ƒZ+edIe"d+œd8d9„ƒZ,edJe"d+œd:d;„ƒZ-edKe"d+œd<d=„ƒZ.edLe"d+œd>d?„ƒZ/dS )Ma…   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©ÚceilN©Ú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)Z
norm_layerc                       s0   e Zd Zd‡ fdd	„	Zddd„Zdd„ Z‡  ZS )ÚLinearBottleneck©r   r   ç      ð?ç        r   ÚswishÚrelu6Nc              	      sâ   t t| ƒ ¡  |dko,|d |d ko,||k| _|| _|| _|dkrjtt|| ƒ|d�}t|||d�| _	n
|}d | _	t||d||d |dd�| _
|dkr¶t|tt|| ƒ|ƒd	�| _nd | _t|	ƒ| _t||ddd
�| _|
| _d S )Nr   r   r   ©Zdivisor©Ú	act_layeré   F)Zkernel_sizeÚstrideÚdilationÚgroupsÚ	apply_act)Z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_layerr0   Zdw_chs©Ú	__class__© úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/rexnet.pyr$   !   s0    "ù	
zLinearBottleneck.__init__Fc                 C   s   |r| j jS | jS ©N)r*   r'   )r1   Úexpr:   r:   r;   Úfeat_channelsL   s    zLinearBottleneck.feat_channelsc                 C   s¢   |}| j d k	r|   |¡}|  |¡}| jd k	r6|  |¡}|  |¡}|  |¡}| jrž| jd k	rd|  |¡}tj|d d …d| j	…f | |d d …| j	d …f gdd�}|S )Nr   r   )Údim)
r)   r*   r-   r.   r/   r%   r0   ÚtorchÚcatr&   )r1   ÚxZshortcutr:   r:   r;   ÚforwardO   s    








:zLinearBottleneck.forward)r   r   r   r   r   r   N)F)Ú__name__Ú
__module__Ú__qualname__r$   r>   rC   Ú__classcell__r:   r:   r8   r;   r       s          õ+
r   r   é   é´   r   c                    s  ddddddg‰ddddddg}‡ fdd„ˆD ƒ‰t ‡fdd„t|ƒD ƒg ƒ}dgˆd  d	gt ˆdd … ƒ  }t ˆd d … ƒd }| d
k r–||  n|}	g }
t|d ƒD ]2}|
 tt|	|  ƒ|d�¡ |	||d d
  7 }	qªdgˆd ˆd   |gt ˆdd … ƒ  }tt|
|||ƒƒS )Nr   é   r   é   c                    s   g | ]}t |ˆ  ƒ‘qS r:   r   )Ú.0Úelement)Ú
depth_multr:   r;   Ú
<listcomp>i   s     z_block_cfg.<locals>.<listcomp>c                    s(   g | ] \}}|gd gˆ | d    ‘qS )r   r:   )rL   ÚidxrM   )Úlayersr:   r;   rO   j   s     r   é   r   r   r   )ÚsumÚ	enumerateÚrangeÚappendr   r(   ÚlistÚzip)Ú
width_multrN   Úinitial_chsÚ	final_chsr5   r6   ÚstridesZ
exp_ratiosÚdepthZbase_chsZout_chs_listÚiZ	se_ratiosr:   )rN   rQ   r;   Ú
_block_cfg_   s    $,r_   é    r   r   c                 C   sH  |g}g }	d}
d}g }t | ƒ}t| ƒD ]Î\}\}}}}|}|dkrˆ|dkrNdnd|d › �}|	t|d |
|d�g7 }	|
|krˆ|| }d}|| |d  }|dkr¨t|ƒnd }| t||||||f|||||d	�
¡ |
|9 }
|}|}||d  ¡ g7 }q&td
| |d�}|	t|d |
dt |ƒd › �d�g7 }	| t|||d�¡ ||	fS )NrJ   r   r   Ústemz	features.éÿÿÿÿ)Znum_chsZ	reductionÚmoduler   )
r2   r3   r4   r   r    r5   r6   r   r7   r0   i   r   r   )	ÚlenrT   Údictr   rV   r   r>   r   r
   )Ú	block_cfgZprev_chsrY   r6   Úoutput_strider   r7   Údrop_path_rateZfeat_chsÚfeature_infoZcurr_strider    ÚfeaturesZ
num_blocksZ	block_idxZchsr4   r   r5   Znext_dilationÚfnameZ	block_dprr0   Zpen_chsr:   r:   r;   Ú_build_blocksz   sH    
ö&rl   c                       s|   e Zd Zd!‡ 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
dd„ Zd%edœdd„Zdd „ Z‡  ZS )&r   r   éè  Úavgr`   rH   rI   r   çUUUUUUµ?r   r   r   çš™™™™™É?r   c              	      sÌ   t t| ƒ ¡  || _|| _d| _|dks,t‚|dk r<d| nd}tt|| ƒ|
d�}t	||dd|d�| _
t|||||	|
ƒ}t||||
||||ƒ\}| _|d	 j| _tj|Ž | _t| j|||ƒ| _t| ƒ d S )
NF)r`   rH   é   r   r`   r   r   rJ   )r   r   rb   )r#   r   r$   Únum_classesÚ	drop_rateÚgrad_checkpointingÚAssertionErrorr   r(   r
   ra   r_   rl   ri   r'   Únum_featuresÚnnZ
Sequentialrj   r   Úheadr   )r1   Zin_chansrr   Úglobal_poolrg   rZ   r[   rY   rN   r5   r6   r   r7   rs   rh   Zstem_base_chsZstem_chsrf   rj   r8   r:   r;   r$   «   s.    ø

zRexNet.__init__Fc                 C   s   t ddd�}|S )Nz^stemz^features\.(\d+))ra   Úblocks)re   )r1   ZcoarseZmatcherr:   r:   r;   Úgroup_matcherØ   s
    þzRexNet.group_matcherTc                 C   s
   || _ d S r<   )rt   )r1   Úenabler:   r:   r;   Úset_grad_checkpointingà   s    zRexNet.set_grad_checkpointingc                 C   s   | j jS r<   )rx   Úfc)r1   r:   r:   r;   Úget_classifierä   s    zRexNet.get_classifierc                 C   s   t | j||| jd�| _d S )N)Z	pool_typers   )r   rv   rs   rx   )r1   rr   ry   r:   r:   r;   Úreset_classifierè   s    zRexNet.reset_classifierc                 C   s:   |   |¡}| jr,tj ¡ s,t| j|dd�}n
|  |¡}|S )NT)Úflatten)ra   rt   r@   ÚjitZis_scriptingr   rj   ©r1   rB   r:   r:   r;   Úforward_featuresë   s
    

zRexNet.forward_features©Ú
pre_logitsc                 C   s   |r| j ||d�S |   |¡S )Nr…   )rx   )r1   rB   r†   r:   r:   r;   Úforward_headó   s    zRexNet.forward_headc                 C   s   |   |¡}|  |¡}|S r<   )r„   r‡   rƒ   r:   r:   r;   rC   ö   s    

zRexNet.forward)r   rm   rn   r`   rH   rI   r   r   ro   r   r   r   rp   r   )F)T)rn   )F)rD   rE   rF   r$   r@   r‚   Úignorer{   r}   r   r€   r„   Úboolr‡   rC   rG   r:   r:   r8   r;   r   ª   s2                 ñ-

c                 K   s"   t dd�}tt| |fd|i|—ŽS )NT)Zflatten_sequentialÚfeature_cfg)re   r   r   )ÚvariantÚ
pretrainedÚkwargsrŠ   r:   r:   r;   Ú_create_rexnetü   s    
ýüûrŽ   Ú c                 K   s    | dddddt tdddd	œ|–S )
Nrm   )r   éà   r�   )é   r‘   g      ì?Zbicubicz	stem.convzhead.fcZmit)Úurlrr   Z
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierÚlicenser   )r’   r�   r:   r:   r;   Ú_cfg  s          ûûr—   ztimm/)Ú	hf_hub_idgffffffî?)r   é   r™   z
apache-2.0)r˜   r“   Útest_crop_pctÚtest_input_sizer–   i-.  )r˜   rr   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_in12kF)Úreturnc                 K   s   t d| f|ŽS )zReXNet V1 1.0xÚ
rexnet_100©rŽ   ©rŒ   r�   r:   r:   r;   r�   +  s    r�   c                 K   s   t d| fddi|—ŽS )zReXNet V1 1.3xÚ
rexnet_130rY   çÍÌÌÌÌÌô?rž   rŸ   r:   r:   r;   r    1  s    r    c                 K   s   t d| fddi|—ŽS )zReXNet V1 1.5xÚ
rexnet_150rY   ç      ø?rž   rŸ   r:   r:   r;   r¢   7  s    r¢   c                 K   s   t d| fddi|—ŽS )zReXNet V1 2.0xÚ
rexnet_200rY   ç       @rž   rŸ   r:   r:   r;   r¤   =  s    r¤   c                 K   s   t d| fddi|—ŽS )zReXNet V1 3.0xÚ
rexnet_300rY   ç      @rž   rŸ   r:   r:   r;   r¦   C  s    r¦   c                 K   s   t d| fddi|—ŽS )z*ReXNet V1 1.0x w/ rounded (mod 8) channelsÚrexnetr_100r6   rq   rž   rŸ   r:   r:   r;   r¨   I  s    r¨   c                 K   s   t d| fdddœ|—ŽS )z*ReXNet V1 1.3x w/ rounded (mod 8) channelsÚrexnetr_130r¡   rq   ©rY   r6   rž   rŸ   r:   r:   r;   r©   O  s    r©   c                 K   s   t d| fdddœ|—ŽS )z*ReXNet V1 1.5x w/ rounded (mod 8) channelsÚrexnetr_150r£   rq   rª   rž   rŸ   r:   r:   r;   r«   U  s    r«   c                 K   s   t d| fdddœ|—ŽS )z*ReXNet V1 2.0x w/ rounded (mod 8) channelsÚrexnetr_200r¥   rq   rª   rž   rŸ   r:   r:   r;   r¬   [  s    r¬   c                 K   s   t d| fdddœ|—ŽS )z+ReXNet V1 3.0x w/ rounded (mod 16) channelsÚrexnetr_300r§   rH   rª   rž   rŸ   r:   r:   r;   r­   a  s    r­   )r   r   rH   rI   r   r   )r   r`   r   r   r   )r�   )F)F)F)F)F)F)F)F)F)F)0Ú__doc__Ú	functoolsr   Úmathr   r@   Ztorch.nnrw   Z	timm.datar   r   Ztimm.layersr   r	   r
   r   r   r   Z_builderr   Z_efficientnet_builderr   Z_manipulater   Ú	_registryr   r   Ú__all__ZBatchNorm2dr+   ÚModuler   r_   rl   r   rŽ   r—   Zdefault_cfgsr�   r    r¢   r¤   r¦   r¨   r©   r«   r¬   r­   r:   r:   r:   r;   Ú<module>   s²    @      ú
     ø
0R

   þ   þ   ý   ýí