U
    ¯Ê¹jô«  ã                F   @   s¶
  d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
 ddl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mZmZmZ d	d
lmZ d	dl m!Z!m"Z" d	dl#m$Z$m%Z%m&Z& ddgZ'eG dd„ dƒƒZ(dd„ Z)�d%dd„Z*�d&dd„Z+�d'dd„Z,�d(dd„Z-�d)dd„Z.G d d!„ d!ej/ƒZ0G d"d#„ d#ej/ƒZ1G d$d%„ d%ej/ƒZ2G d&d„ dej/ƒZ3�d*d(d)„Z4d*d+„ Z5e6e(d,d-d.dd/d0�e(d,d1d2d3d4d0�e(d,d1d2d3d4d5d6�e(d7d8d9d,d3d0�e(d:d;d<d3d3d0�e(d=d>d?d,d@d0�e(dAdBd?d7dCd0�e(dDdEdFdGdHd0�e(dIdJdKd:dLd0�e(d=dMdNdOdHd0�e(dPdQdRdSdTd0�e(dUdVdWdXd4d0�e(dYdZd[dPdHd0�e(d,d-d.dd/d\d]�e(d7d^d_dd3d\d]�e(d7d`dad3dbd\d]�e(d:dcddd3ded\d]�e(d:dcddd3ded\d5df�e(d7dgdhd,did\d]�e(d=djdkd,dld\d]�e(dDdmd9dnd4d\d]�e(dSdodpdqdCd\d]�e(drdsdtd:dLd\d]�e(drdsdtd:dLd\d5df�e(dPdQdRdSdTd\d]�e(dudvdwdSd@d\d]�e(dxdydzdxd{d\d]�e(d|d}ddd~d{d\d]�e(dd€d�d‚did\d]�e(dƒd„dzd…did\d]�e(dDdmd9dnd4d\d†eed3d‡�dˆ�e(d4dDdmd9dnd\d‰d†dŠ�e(dCdSdodpdqd\d‰d†d‹dŒ�	e(dld3d�dŽd�d�d\dd‰d‘d†d’�e(d“d7d”d•dd�d\dd‰dd†d’�e(d“d7d”d•dd�d\dd‰d–d†d’�d—�$Z7d˜d™„ Z8�d+dšd›„Z9�d,dœd�„Z:�d-dždŸ„Z;e$e9d d¡d¢�e9d d£d¢�e9d d¤d¢�e9d d¥d¢�e9d d¦�e9d d¦�e9d d¦�e9d d§d¨�e9d d§d¨�e9d'd©�e9d dªd«d¬�e9d d­d«d¬�e9d'd©�e9d d®d¯d°d±d²d³�e9d d´d¯d°d±d²d³�e9d dµd¢�e;d d¶d¢�e;d d·d¢�e;d d¸d¢�e;d d¹d¢�e;d dºd¢�e;d d»d¢�e;d d¼d¢�e;d d½d¢�e;d d¾d¢�e;d d¿d¢�e;d dÀd¢�e;d dÁd¢�e;d dÂd¢�e;d dÃd¢�e;d dÄdÅdÆdÇd±dÈ�e;d dÉdÅdÆdÇd±dÈ�e;d dÊdÅdÆdÇd±dÈ�e;d dËdÅdÌ�e;d dÍdÅdÌ�e;d dÎdÅdÌ�e;d dÏdÐdÑdÆdÇd±dÒ�e;d dÏdÐdÓdÆdÇd±dÒ�e;d dÏdÐdÔdÆdÇd±dÒ�e;d dÏdÐdÕdÆdÇd±dÒ�e;d dÖddÏdÐd×�e;d dØddÏdÐd×�e;d dÙddÏ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¦�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ÚœCƒZ<e%�d.e3dÛœdÜdÝ„ƒZ=e%�d/e3dÛœdÞdß„ƒZ>e%�d0e3dÛœdàdá„ƒZ?e%�d1e3dÛœdâdã„ƒZ@e%�d2e3dÛœdädå„ƒZAe%�d3e3dÛœdædç„ƒZBe%�d4e3dÛœdèdé„ƒZCe%�d5e3dÛœdêdë„ƒZDe%�d6e3dÛœdìdí„ƒZEe%�d7e3dÛœdîdï„ƒZFe%�d8e3dÛœdðdñ„ƒZGe%�d9e3dÛœdòdó„ƒZHe%�d:e3dÛœdôdõ„ƒZIe%�d;e3dÛœdöd÷„ƒZJe%�d<e3dÛœdødù„ƒZKe%�d=e3dÛœdúdû„ƒZLe%�d>e3dÛœdüdý„ƒZMe%�d?e3dÛœdþdÿ„ƒZNe%�d@e3dÛœ�d �d„ƒZOe%�dAe3dÛœ�d�d„ƒZPe%�dBe3dÛœ�d�d„ƒZQe%�dCe3dÛœ�d�d„ƒZRe%�dDe3dÛœ�d�d	„ƒZSe%�dEe3dÛœ�d
�d„ƒZTe%�dFe3dÛœ�d�d„ƒZUe%�dGe3dÛœ�d�d„ƒZVe%�dHe3dÛœ�d�d„ƒZWe%�dIe3dÛœ�d�d„ƒZXe%�dJe3dÛœ�d�d„ƒZYe%�dKe3dÛœ�d�d„ƒZZe%�dLe3dÛœ�d�d„ƒZ[e%�dMe3dÛœ�d�d„ƒZ\e%�dNe3dÛœ�d�d„ƒZ]e%�dOe3dÛœ�d�d„ƒZ^e%�dPe3dÛœ�d �d!„ƒZ_e%�dQe3dÛœ�d"�d#„ƒZ`e&ea�d$�d#iƒ dS (R  a  RegNet X, Y, Z, and more

Paper: `Designing Network Design Spaces` - https://arxiv.org/abs/2003.13678
Original Impl: https://github.com/facebookresearch/pycls/blob/master/pycls/models/regnet.py

Paper: `Fast and Accurate Model Scaling` - https://arxiv.org/abs/2103.06877
Original Impl: None

Based on original PyTorch impl linked above, but re-wrote to use my own blocks (adapted from ResNet here)
and cleaned up with more descriptive variable names.

Weights from original pycls impl have been modified:
* first layer from BGR -> RGB as most PyTorch models are
* removed training specific dict entries from checkpoints and keep model state_dict only
* remap names to match the ones here

Supports weight loading from torchvision and classy-vision (incl VISSL SEER)

A number of custom timm model definitions additions including:
* stochastic depth, gradient checkpointing, layer-decay, configurable dilation
* a pre-activation 'V' variant
* only known RegNet-Z model definitions with pretrained weights

Hacked together by / Copyright 2020 Ross Wightman
é    N)Ú	dataclassÚreplace)Úpartial)ÚOptionalÚUnionÚCallable©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚClassifierHeadÚAvgPool2dSameÚConvNormActÚSEModuleÚDropPathÚGroupNormAct)Úget_act_layerÚget_norm_act_layerÚcreate_conv2dÚmake_divisibleé   )Úbuild_model_with_cfg)Úcheckpoint_seqÚnamed_apply)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecationsÚRegNetÚ	RegNetCfgc                   @   sÖ   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< d	Z
eed
< dZeed< dZeed< dZeed< dZeed< dZee ed< dZeed< dZeed< dZeed< dZeeef ed< dZeeef ed< dS )r   é   ÚdepthéP   Úw0çq=
×£PE@ÚwaçHáz®G@Úwmé   Ú
group_sizeç      ð?Úbottle_ratioç        Úse_ratioÚgroup_min_ratioé    Ú
stem_widthÚconv1x1Ú
downsampleFÚ
linear_outÚpreactr   Únum_featuresZreluÚ	act_layerZ	batchnormÚ
norm_layerN)Ú__name__Ú
__module__Ú__qualname__r   ÚintÚ__annotations__r!   r#   Úfloatr%   r'   r)   r+   r,   r.   r0   r   Ústrr1   Úboolr2   r3   r4   r   r   r5   © r>   r>   úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/regnet.pyr   -   s   
c                 C   s   t t| | ƒ| ƒS )z<Converts a float to the closest non-zero int divisible by q.)r9   Úround)ÚfÚqr>   r>   r?   Úquantize_float@   s    rC   r*   c                    sv   dd„ t | |ƒD ƒ}dd„ t ||ƒD ƒ}ˆ rF‡ fdd„t ||ƒD ƒ}ndd„ t ||ƒD ƒ}dd„ t ||ƒD ƒ} | |fS )z/Adjusts the compatibility of widths and groups.c                 S   s   g | ]\}}t || ƒ‘qS r>   ©r9   )Ú.0ÚwÚbr>   r>   r?   Ú
<listcomp>G   s     z-adjust_widths_groups_comp.<locals>.<listcomp>c                 S   s   g | ]\}}t ||ƒ‘qS r>   )Úmin)rE   ÚgÚw_botr>   r>   r?   rH   H   s     c                    s   g | ]\}}t ||ˆ ƒ‘qS r>   )r   ©rE   rK   rJ   ©Ú	min_ratior>   r?   rH   K   s     c                 S   s   g | ]\}}t ||ƒ‘qS r>   )rC   rL   r>   r>   r?   rH   M   s     c                 S   s   g | ]\}}t || ƒ‘qS r>   rD   )rE   rK   rG   r>   r>   r?   rH   N   s     )Úzip)ÚwidthsZbottle_ratiosÚgroupsrN   Zbottleneck_widthsr>   rM   r?   Úadjust_widths_groups_compE   s    rR   é   c              	      sÐ   | dkr$|dkr$|dkr$|| dks(t ‚t |¡|  | }t t || ¡t |¡ ¡}t t |t ||¡ |¡¡| }tt |¡ƒ| 	¡ d  }	}
t 
‡ fdd„t|	ƒD ƒ¡}| t¡ ¡ |	| t¡ ¡ fS )z2Generates per block widths from RegNet parameters.r   r   c                    s   g | ]}ˆ ‘qS r>   r>   ©rE   Ú_©r'   r>   r?   rH   \   s     z#generate_regnet.<locals>.<listcomp>)ÚAssertionErrorÚnpZaranger@   ÚlogÚdivideÚpowerÚlenÚuniqueÚmaxÚarrayÚrangeZastyper9   Útolist)Zwidth_slopeZwidth_initialZ
width_multr   r'   ZquantZwidths_contZ
width_expsrP   Ú
num_stagesZ	max_stagerQ   r>   rV   r?   Úgenerate_regnetR   s    ("rc   Fc              	   C   sb   |pt j}|dkr|dkrdn|}|dkr.|nd}|rHt| ||||d�S t| |||||dd�S d S )Nr   )ÚstrideÚdilationF)rd   re   r5   Ú	apply_act)ÚnnÚBatchNorm2dr   r   )Úin_chsÚout_chsÚkernel_sizerd   re   r5   r2   r>   r>   r?   Údownsample_conv`   s(    	
ûùrl   c                 C   s”   |pt j}|dkr|nd}t  ¡ }|dks2|dkr\|dkrF|dkrFtnt j}	|	d|ddd�}|rrt| |ddd�}
nt| |dd|dd�}
t j||
gŽ S )zd AvgPool Downsampling as in 'D' ResNet variants. This is not in RegNet space but I might experiment.r   é   TF)Z	ceil_modeZcount_include_pad©rd   )rd   r5   rf   )rg   rh   ÚIdentityr   Z	AvgPool2dr   r   Z
Sequential)ri   rj   rk   rd   re   r5   r2   Z
avg_strideÚpoolZavg_pool_fnÚconvr>   r>   r?   Údownsample_avg€   s    

rr   ©r   r   c           	      C   s‚   | dkst ‚||ks,|dks,|d |d krvt||d ||d�}| sHd S | dkr^t||f|ŽS t||fd|i|—ŽS nt ¡ S d S )N)Úavgr/   Ú Nr   r   )rd   re   r5   r2   rt   rk   )rW   Údictrr   rl   rg   ro   )	Zdownsample_typeri   rj   rk   rd   re   r5   r2   Zdargsr>   r>   r?   Úcreate_shortcut—   s    
 rw   c                       sL   e Zd ZdZdddddddejejddf‡ fd	d
„	Zdd„ Zdd„ Z	‡  Z
S )Ú
Bottleneckúó RegNet Bottleneck

    This is almost exactly the same as a ResNet Bottlneck. The main difference is the SE block is moved from
    after conv3 to after conv2. Otherwise, it's just redefining the arguments for groups/bottleneck channels.
    r   rs   ç      Ð?r/   FNr*   c              	      s
  t t| ƒ ¡  t|
ƒ}
tt|| ƒƒ}|| }t|
|d�}t||fddi|—Ž| _t||fd||d ||dœ|—Ž| _	|rœtt|| ƒƒ}t
|||
d�| _n
t ¡ | _t||fddd	œ|—Ž| _|	rÌt ¡ n|
ƒ | _t|||d|||d
�| _|dkrüt|ƒnt ¡ | _d S )N©r4   r5   rk   r   é   r   )rk   rd   re   rQ   Z
drop_layer©Zrd_channelsr4   F)rk   rf   )rk   rd   re   r5   )Úsuperrx   Ú__init__r   r9   r@   rv   r   Úconv1Úconv2r   Úserg   ro   Úconv3Úact3rw   r0   r   Ú	drop_path)Úselfri   rj   rd   re   r)   r'   r+   r0   r1   r4   r5   Ú
drop_blockÚdrop_path_rateÚbottleneck_chsrQ   ZcargsÚse_channels©Ú	__class__r>   r?   r   µ   sD    þùø

ù	zBottleneck.__init__c                 C   s   t j | jjj¡ d S ©N)rg   ÚinitÚzeros_rƒ   ZbnÚweight©r†   r>   r>   r?   Úzero_init_lastè   s    zBottleneck.zero_init_lastc                 C   sX   |}|   |¡}|  |¡}|  |¡}|  |¡}| jd k	rJ|  |¡|  |¡ }|  |¡}|S r�   )r€   r�   r‚   rƒ   r0   r…   r„   ©r†   ÚxZshortcutr>   r>   r?   Úforwardë   s    





zBottleneck.forward©r6   r7   r8   Ú__doc__rg   ZReLUrh   r   r’   r•   Ú__classcell__r>   r>   r‹   r?   rx   ®   s   
ò3rx   c                       sL   e Zd ZdZdddddddejejddf‡ fd	d
„	Zdd„ Zdd„ Z	‡  Z
S )ÚPreBottleneckry   r   rs   rz   r/   FNr*   c              	      sî   t t| ƒ ¡  t||
ƒ}tt|| ƒƒ}|| }||ƒ| _t||dd�| _||ƒ| _	t||d||d |d�| _
|r”tt|| ƒƒ}t|||
d�| _n
t ¡ | _||ƒ| _t||dd�| _t|||d||dd�| _|dkràt|ƒnt ¡ | _d S )	Nr   )rk   r|   r   )rk   rd   re   rQ   r}   T)rk   rd   re   r2   )r~   r™   r   r   r9   r@   Únorm1r   r€   Únorm2r�   r   r‚   rg   ro   Únorm3rƒ   rw   r0   r   r…   )r†   ri   rj   rd   re   r)   r'   r+   r0   r1   r4   r5   r‡   rˆ   Znorm_act_layerr‰   rQ   rŠ   r‹   r>   r?   r      s>    


ú

ù	zPreBottleneck.__init__c                 C   s   d S r�   r>   r‘   r>   r>   r?   r’   2  s    zPreBottleneck.zero_init_lastc                 C   sl   |   |¡}|}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rh|  |¡|  |¡ }|S r�   )	rš   r€   r›   r�   r‚   rœ   rƒ   r0   r…   r“   r>   r>   r?   r•   5  s    







zPreBottleneck.forwardr–   r>   r>   r‹   r?   r™   ù   s   
ò2r™   c                       s.   e Zd ZdZdef‡ fdd„	Zdd„ Z‡  ZS )ÚRegStagez4Stage (sequence of blocks w/ the same output shape).Nc              
      s¦   t t| ƒ ¡  d| _|dkr dnd}	t|ƒD ]t}
|
dkr<|nd}|
dkrL|n|}|	|f}|d k	rh||
 nd}d |
d ¡}|  ||||f|||dœ|—Ž¡ |}	q,d S )	NF)r   rm   r   rm   r   r*   zb{})rd   re   rˆ   )r~   r�   r   Úgrad_checkpointingr`   ÚformatÚ
add_module)r†   r   ri   rj   rd   re   Údrop_path_ratesÚblock_fnZblock_kwargsZfirst_dilationÚiZblock_strideZblock_in_chsZblock_dilationZdprÚnamer‹   r>   r?   r   H  s.    þûúþzRegStage.__init__c                 C   s:   | j r tj ¡ s t|  ¡ |ƒ}n|  ¡ D ]}||ƒ}q(|S r�   )rž   ÚtorchÚjitZis_scriptingr   Úchildren)r†   r”   Úblockr>   r>   r?   r•   j  s
    
zRegStage.forward)r6   r7   r8   r—   rx   r   r•   r˜   r>   r>   r‹   r?   r�   E  s
   	ø"r�   c                       s–   e Zd ZdZdedœ‡ fd	d
„Zdedœ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   z«RegNet-X, Y, and Z Models

    Paper: https://arxiv.org/abs/2003.13678
    Original Impl: https://github.com/facebookresearch/pycls/blob/master/pycls/models/regnet.py
    r|   éè  r-   rt   r*   T©Úcfgc	              	      s¶  t ƒ  ¡  || _|| _|dks"t‚t|f|	Ž}|j}
t|j|j	d�}|j
r^t||
ddd�| _nt||
dfddi|—Ž| _t|
ddd�g| _|
}d}| j|||d	�\}}t|ƒd
ks¶t‚|j
rÀtnt}t|ƒD ]b\}}d |d ¡}|  |tf ||dœ||—Ž¡ |d }||d 9 }|  jt|||d�g7  _qÌ|j�r\t||jfddi|—Ž| _|j| _n0|j�ph|j
}|�r|t|jƒƒ nt ¡ | _|| _t| j|||d�| _tt t!|d�| ƒ dS )a•  

        Args:
            cfg (RegNetCfg): Model architecture configuration
            in_chans (int): Number of input channels (default: 3)
            num_classes (int): Number of classifier classes (default: 1000)
            output_stride (int): Output stride of network, one of (8, 16, 32) (default: 32)
            global_pool (str): Global pooling type (default: 'avg')
            drop_rate (float): Dropout rate (default: 0.)
            drop_path_rate (float): Stochastic depth drop-path rate (default: 0.)
            zero_init_last (bool): Zero-init last weight of residual path
            kwargs (dict): Extra kwargs overlayed onto cfg
        )rS   é   r-   r{   r|   rm   rn   rd   Ústem)Znum_chsZ	reductionÚmodule)Úoutput_striderˆ   é   zs{}r   )ri   r¢   rj   rk   )Zin_featuresÚnum_classesÚ	pool_typeÚ	drop_rate)r’   N)"r~   r   r±   r³   rW   r   r.   rv   r4   r5   r2   r   r­   r   Zfeature_infoÚ_get_stage_argsr\   r™   rx   Ú	enumeraterŸ   r    r�   r3   Ú
final_convr1   r   rg   ro   r   Úheadr   r   Ú_init_weights)r†   r«   Zin_chansr±   r¯   Úglobal_poolr³   rˆ   r’   Úkwargsr.   Zna_argsZ
prev_widthZcurr_strideÚper_stage_argsÚcommon_argsr¢   r£   Z
stage_argsZ
stage_nameZ	final_actr‹   r>   r?   r   z  s`    
ý
þüþ	
üzRegNet.__init__rm   c              	      s2  t ˆjˆjˆjˆjˆjƒ\}}}tj|dd�\}}	‡fdd„t|ƒD ƒ}
g }g }d}d}t|ƒD ]:}||krz||9 }d}n|}||9 }| 	|¡ | 	|¡ q`t 
t d|t|	ƒ¡t |	d d… ¡¡}t||
|ˆjd	�\}}d
ddddddg‰ ‡ fdd„t||||	|
||ƒD ƒ}tˆjˆjˆjˆjˆjd�}||fS )NT)Zreturn_countsc                    s   g | ]
}ˆ j ‘qS r>   )r)   rT   rª   r>   r?   rH   Ò  s     z*RegNet._get_stage_args.<locals>.<listcomp>rm   r   r   éÿÿÿÿrM   rj   rd   re   r   r)   r'   r¡   c                    s   g | ]}t tˆ |ƒƒ‘qS r>   )rv   rO   )rE   Úparams)Ú	arg_namesr>   r?   rH   æ  s    )r0   r+   r1   r4   r5   )rc   r#   r!   r%   r   r'   rX   r]   r`   ÚappendÚsplitZlinspaceÚsumZcumsumrR   r,   rO   rv   r0   r+   r1   r4   r5   )r†   r«   Zdefault_strider¯   rˆ   rP   rb   Zstage_gsZstage_widthsZstage_depthsZstage_brZstage_stridesZstage_dilationsZ
net_stridere   rU   rd   Z	stage_dprr»   r¼   r>   )r¿   r«   r?   r´   Ì  sD     
(   ÿ

þûzRegNet._get_stage_argsFc                 C   s   t d|rdndd�S )Nz^stemz^s(\d+)z^s(\d+)\.b(\d+))r­   Úblocks)rv   )r†   Zcoarser>   r>   r?   Úgroup_matcheró  s    
þzRegNet.group_matcherc                 C   s$   t |  ¡ ƒdd… D ]
}||_qd S )Nr   r½   )Úlistr§   rž   )r†   ÚenableÚsr>   r>   r?   Úset_grad_checkpointingú  s    zRegNet.set_grad_checkpointingc                 C   s   | j jS r�   )r·   Úfcr‘   r>   r>   r?   Úget_classifierÿ  s    zRegNet.get_classifierc                 C   s   | j j||d� d S )N)r²   )r·   Úreset)r†   r±   r¹   r>   r>   r?   Úreset_classifier  s    zRegNet.reset_classifierc                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r�   )r­   Ús1Ús2Zs3Zs4r¶   ©r†   r”   r>   r>   r?   Úforward_features  s    





zRegNet.forward_features©Ú
pre_logitsc                 C   s   | j ||d�S )NrÑ   )r·   )r†   r”   rÒ   r>   r>   r?   Úforward_head  s    zRegNet.forward_headc                 C   s   |   |¡}|  |¡}|S r�   )rÐ   rÓ   rÏ   r>   r>   r?   r•     s    

zRegNet.forward)r|   r©   r-   rt   r*   r*   T)rm   r-   r*   )F)T)rt   )F)r6   r7   r8   r—   r   r   r´   r¥   r¦   ÚignorerÄ   rÈ   rÊ   rÌ   rÐ   r=   rÓ   r•   r˜   r>   r>   r‹   r?   r   s  s,   	       ÷þR'

	ru   c                 C   s¶   t | tjƒrb| jd | jd  | j }|| j }| jj dt	 
d| ¡¡ | jd k	r²| jj ¡  nPt | tjƒrœtjj| jddd� | jd k	r²tj | j¡ n|r²t| dƒr²|  ¡  d S )Nr   r   ç       @r*   g{®Gáz„?)ÚmeanÚstdr’   )Ú
isinstancerg   ZConv2drk   Zout_channelsrQ   r�   ÚdataZnormal_ÚmathÚsqrtZbiasZzero_ZLinearrŽ   r�   Úhasattrr’   )r®   r¤   r’   Zfan_outr>   r>   r?   r¸     s    


r¸   c                 C   sŽ  |   d| ¡} dddddddd	d
dddddg}d| k�rdd l}| d d d } i }| d  ¡ D ]b\}}| dd¡}| dd¡}| ddd„ |¡}| dd|¡}|D ]\}}| ||¡}q¢|||< q^| d  ¡ D ].\}}d|ksÎd|krèqÎ| d d!¡}|||< qÎ|S d"| k�rŠdd l}i }|  ¡ D ]d\}}| d#d¡}| d$d¡}| d%d&d„ |¡}|D ]\}}| ||¡}�qV| d'd(¡}|||< �q |S | S ))NÚmodel)zf.a.0z
conv1.conv)zf.a.1zconv1.bn)zf.b.0z
conv2.conv)zf.b.1zconv2.bn)z
f.final_bnúconv3.bn)zf.se.excitation.0zse.fc1)zf.se.excitation.2zse.fc2)zf.ser‚   )zf.c.0ú
conv3.conv)zf.c.1rÞ   )zf.crß   )zproj.0údownsample.conv)zproj.1zdownsample.bn)Zprojrà   Zclassy_state_dictr   Z
base_modelZtrunkz_feature_blocks.conv1.stem.0ú	stem.convz_feature_blocks.conv1.stem.1zstem.bnz&^_feature_blocks.res\d.block(\d)-(\d+)c                 S   s(   dt |  d¡ƒ› dt |  d¡ƒd › �S )NrÇ   r   ú.brm   ©r9   Úgroup©r”   r>   r>   r?   Ú<lambda>C  ó    z_filter_fn.<locals>.<lambda>zs(\d)\.b(\d+)\.bnzs\1.b\2.downsample.bnZheadsZprojection_headZ
prototypesz0.clf.0úhead.fczstem.0.weightzstem.0zstem.1z)trunk_output.block(\d)\.block(\d+)\-(\d+)c                 S   s(   dt |  d¡ƒ› dt |  d¡ƒd › �S )NrÇ   r   râ   r|   rã   rå   r>   r>   r?   ræ   W  rç   zfc.zhead.fc.)ÚgetÚreÚitemsr   Úsub)Z
state_dictZreplacesrê   ÚoutÚkÚvrÇ   Úrr>   r>   r?   Ú
_filter_fn'  sn    ò
 þ


 þrñ   r&   g¸…ëQ8B@gìQ¸…ë@é   )r!   r#   r%   r'   r   g{®Gáz8@gR¸…ëQ@r¬   é   gÍÌÌÌÌÌì?)r!   r#   r%   r'   r   r,   é0   g\�Âõ(|B@gìQ¸…ë@é8   g=
×£pÝA@g=
×£p=@r    gáz®GA@g      @é   éX   g�Âõ(\O:@é   é`   g33333SC@gq=
×£p@é(   é   é¸   g
×£p=jN@g�Âõ(\� @é   gHáz®ÇH@g
×£p=
@éx   é¨   g×£p=
WR@gö(\�Âõ@ép   é   éØ   gìQ¸…ËK@gÍÌÌÌÌÌ @é€   é@  g×£p=
wQ@rÕ   rz   )r!   r#   r%   r'   r   r+   g¤p=
×ã;@g¸…ëQ¸ @g…ëQ¸E@@g�Âõ(\�@é   gìQ¸…kC@g333333@é   )r!   r#   r%   r'   r   r+   r,   gö(\�Âµ4@g333333@é   r"   r$   r   g)\�Âõh?@é@   g\�Âõ(œ@@g)\�Âõ(@éH   éÀ   g®Gáz4S@g…ëQ¸…@éÈ   g…ëQ¸ŽZ@g×£p=
×@éè   g)\�Âõø\@g=
×£p=@é   i`  g�Âõ(\ob@iH  iÈ  gÃõ(\�d@g)\�Âõ(@i  i€  gÃõ(\�Úl@iu  ZsilurV   )r!   r#   r%   r'   r   r+   r4   r5   T)r   r!   r#   r%   r'   r+   r2   r4   rt   )	r   r!   r#   r%   r'   r+   r2   r4   r0   gffffff%@g®Gáz@r°   g      @i   )r   r!   r#   r%   r'   r)   r+   r0   r1   r3   r4   é   g      -@g+‡ÙÎ@i   )$Úregnetx_002Úregnetx_004Úregnetx_004_tvÚregnetx_006Úregnetx_008Úregnetx_016Úregnetx_032Úregnetx_040Úregnetx_064Úregnetx_080Úregnetx_120Úregnetx_160Úregnetx_320Úregnety_002Úregnety_004Úregnety_006Úregnety_008Úregnety_008_tvÚregnety_016Úregnety_032Úregnety_040Úregnety_064Úregnety_080Úregnety_080_tvÚregnety_120Úregnety_160Úregnety_320Úregnety_640Úregnety_1280Úregnety_2560Úregnety_040_sgnÚregnetv_040Úregnetv_064Úregnetz_005Úregnetz_040Úregnetz_040_hc                 K   s   t t| |ft|  tdœ|—ŽS )N)Z	model_cfgZpretrained_filter_fn)r   r   Ú
model_cfgsrñ   )ÚvariantÚ
pretrainedrº   r>   r>   r?   Ú_create_regnet¡  s      ÿýür6  c                 K   s"   | dddddddt tdd	d
œ|–S )Nr©   ©r|   éà   r8  ©é   r:  )r|   é   r;  gffffffî?r(   Úbicubicrá   rè   )Úurlr±   Ú
input_sizeÚ	pool_sizeÚtest_input_sizeÚcrop_pctZtest_crop_pctÚinterpolationrÖ   r×   Ú
first_convÚ
classifierr   ©r=  rº   r>   r>   r?   Ú_cfg©  s            üûrF  c                 K   s"   | dddddt tdddd	d
œ|–S )Nr©   r7  r9  g      ì?r<  rá   rè   Zmitz)https://github.com/facebookresearch/pycls©r=  r±   r>  r?  rA  rB  rÖ   r×   rC  rD  ÚlicenseÚ
origin_urlr   rE  r>   r>   r?   Ú_cfgpyc³  s           ûûrJ  c                 K   s"   | dddddt tdddd	d
œ|–S )Nr©   r7  r9  gáz®Gáî?r<  rá   rè   zbsd-3-clausez!https://github.com/pytorch/visionrG  r   rE  r>   r>   r?   Ú_cfgtv2½  s           ûûrK  ztimm/znhttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-weights/regnety_032_ra-7f2439f9.pth)Ú	hf_hub_idr=  zshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnety_040_ra3-670e1166.pthzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnety_064_ra3-aa26dc7d.pthzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnety_080_ra3-1fdc4344.pth)rL  i-.  )rL  r±   )r=  zshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetv_040_ra3-c248f51f.pthr­   )rL  r=  rC  zshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetv_064_ra3-530616c2.pthzshttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_040_ra3-9007edf5.pth)r|   é   rM  )rS   rS   r(   )r|   r  r  )rL  r=  r>  r?  rA  r@  zthttps://github.com/huggingface/pytorch-image-models/releases/download/v0.1-tpu-weights/regnetz_040h_ra3-f594343b.pthz<https://dl.fbaipublicfiles.com/deit/regnety_160-a5fe301d.pthz?https://download.pytorch.org/models/regnet_x_400mf-62229a5f.pthz?https://download.pytorch.org/models/regnet_x_800mf-94a99ebd.pthz?https://download.pytorch.org/models/regnet_x_1_6gf-a12f2b72.pthz?https://download.pytorch.org/models/regnet_x_3_2gf-7071aa85.pthz=https://download.pytorch.org/models/regnet_x_8gf-2b70d774.pthz>https://download.pytorch.org/models/regnet_x_16gf-ba3796d7.pthz>https://download.pytorch.org/models/regnet_x_32gf-6eb8fdc6.pthz?https://download.pytorch.org/models/regnet_y_400mf-e6988f5f.pthz?https://download.pytorch.org/models/regnet_y_800mf-58fc7688.pthz?https://download.pytorch.org/models/regnet_y_1_6gf-0d7bc02a.pthz?https://download.pytorch.org/models/regnet_y_3_2gf-9180c971.pthz=https://download.pytorch.org/models/regnet_y_8gf-dc2b1b54.pthz>https://download.pytorch.org/models/regnet_y_16gf-3e4a00f9.pthz>https://download.pytorch.org/models/regnet_y_32gf-8db6d4b5.pthzChttps://download.pytorch.org/models/regnet_y_16gf_swag-43afe44d.pthzcc-by-nc-4.0)r|   é€  rN  )é   rO  )rL  r=  rH  r>  r?  rA  zChttps://download.pytorch.org/models/regnet_y_32gf_swag-04fdfa75.pthzDhttps://download.pytorch.org/models/regnet_y_128gf_swag-c8ce3e52.pthzFhttps://download.pytorch.org/models/regnet_y_16gf_lc_swag-f3ec0043.pth)rL  r=  rH  zFhttps://download.pytorch.org/models/regnet_y_32gf_lc_swag-e1583746.pthzGhttps://download.pytorch.org/models/regnet_y_128gf_lc_swag-cbe8ce12.pthÚotherz)https://github.com/facebookresearch/visslzhttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet32_finetuned_in1k_model_final_checkpoint_phase78.torch)rL  rH  rI  r=  r>  r?  rA  zhttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet64_finetuned_in1k_model_final_checkpoint_phase78.torchz€https://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet128_finetuned_in1k_model_final_checkpoint_phase78.torchz€https://dl.fbaipublicfiles.com/vissl/model_zoo/seer_finetuned/seer_regnet256_finetuned_in1k_model_final_checkpoint_phase38.torchzihttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_regnet32d/seer_regnet32gf_model_iteration244000.torch)rL  r=  r±   rH  rI  zphttps://dl.fbaipublicfiles.com/vissl/model_zoo/seer_regnet64/seer_regnet64gf_model_final_checkpoint_phase0.torchz¢https://dl.fbaipublicfiles.com/vissl/model_zoo/swav_ig1b_regnet128Gf_cnstant_bs32_node16_sinkhorn10_proto16k_syncBN64_warmup8k/model_final_checkpoint_phase0.torch)Czregnety_032.ra_in1kzregnety_040.ra3_in1kzregnety_064.ra3_in1kzregnety_080.ra3_in1kzregnety_120.sw_in12k_ft_in1kzregnety_160.sw_in12k_ft_in1kzregnety_160.lion_in12k_ft_in1kzregnety_120.sw_in12kzregnety_160.sw_in12kzregnety_040_sgn.untrainedzregnetv_040.ra3_in1kzregnetv_064.ra3_in1kzregnetz_005.untrainedzregnetz_040.ra3_in1kzregnetz_040_h.ra3_in1kzregnety_160.deit_in1kzregnetx_004_tv.tv2_in1kzregnetx_008.tv2_in1kzregnetx_016.tv2_in1kzregnetx_032.tv2_in1kzregnetx_080.tv2_in1kzregnetx_160.tv2_in1kzregnetx_320.tv2_in1kzregnety_004.tv2_in1kzregnety_008_tv.tv2_in1kzregnety_016.tv2_in1kzregnety_032.tv2_in1kzregnety_080_tv.tv2_in1kzregnety_160.tv2_in1kzregnety_320.tv2_in1kzregnety_160.swag_ft_in1kzregnety_320.swag_ft_in1kzregnety_1280.swag_ft_in1kzregnety_160.swag_lc_in1kzregnety_320.swag_lc_in1kzregnety_1280.swag_lc_in1kzregnety_320.seer_ft_in1kzregnety_640.seer_ft_in1kzregnety_1280.seer_ft_in1kzregnety_2560.seer_ft_in1kzregnety_320.seerzregnety_640.seerzregnety_1280.seerzregnetx_002.pycls_in1kzregnetx_004.pycls_in1kzregnetx_006.pycls_in1kzregnetx_008.pycls_in1kzregnetx_016.pycls_in1kzregnetx_032.pycls_in1kzregnetx_040.pycls_in1kzregnetx_064.pycls_in1kzregnetx_080.pycls_in1kzregnetx_120.pycls_in1kzregnetx_160.pycls_in1kzregnetx_320.pycls_in1kzregnety_002.pycls_in1kzregnety_004.pycls_in1kzregnety_006.pycls_in1kzregnety_008.pycls_in1kzregnety_016.pycls_in1kzregnety_032.pycls_in1kzregnety_040.pycls_in1kzregnety_064.pycls_in1kzregnety_080.pycls_in1kzregnety_120.pycls_in1kzregnety_160.pycls_in1kzregnety_320.pycls_in1k)Úreturnc                 K   s   t d| f|ŽS )zRegNetX-200MFr  ©r6  ©r5  rº   r>   r>   r?   r    s    r  c                 K   s   t d| f|ŽS )zRegNetX-400MFr  rR  rS  r>   r>   r?   r  …  s    r  c                 K   s   t d| f|ŽS )z+RegNetX-400MF w/ torchvision group roundingr  rR  rS  r>   r>   r?   r  ‹  s    r  c                 K   s   t d| f|ŽS )zRegNetX-600MFr  rR  rS  r>   r>   r?   r  ‘  s    r  c                 K   s   t d| f|ŽS )zRegNetX-800MFr  rR  rS  r>   r>   r?   r  —  s    r  c                 K   s   t d| f|ŽS )zRegNetX-1.6GFr  rR  rS  r>   r>   r?   r  �  s    r  c                 K   s   t d| f|ŽS )zRegNetX-3.2GFr  rR  rS  r>   r>   r?   r  £  s    r  c                 K   s   t d| f|ŽS )zRegNetX-4.0GFr  rR  rS  r>   r>   r?   r  ©  s    r  c                 K   s   t d| f|ŽS )zRegNetX-6.4GFr  rR  rS  r>   r>   r?   r  ¯  s    r  c                 K   s   t d| f|ŽS )zRegNetX-8.0GFr  rR  rS  r>   r>   r?   r  µ  s    r  c                 K   s   t d| f|ŽS )zRegNetX-12GFr  rR  rS  r>   r>   r?   r  »  s    r  c                 K   s   t d| f|ŽS )zRegNetX-16GFr  rR  rS  r>   r>   r?   r  Á  s    r  c                 K   s   t d| f|ŽS )zRegNetX-32GFr  rR  rS  r>   r>   r?   r  Ç  s    r  c                 K   s   t d| f|ŽS )zRegNetY-200MFr  rR  rS  r>   r>   r?   r  Í  s    r  c                 K   s   t d| f|ŽS )zRegNetY-400MFr  rR  rS  r>   r>   r?   r  Ó  s    r  c                 K   s   t d| f|ŽS )zRegNetY-600MFr  rR  rS  r>   r>   r?   r  Ù  s    r  c                 K   s   t d| f|ŽS )zRegNetY-800MFr  rR  rS  r>   r>   r?   r  ß  s    r  c                 K   s   t d| f|ŽS )z+RegNetY-800MF w/ torchvision group roundingr   rR  rS  r>   r>   r?   r   å  s    r   c                 K   s   t d| f|ŽS )zRegNetY-1.6GFr!  rR  rS  r>   r>   r?   r!  ë  s    r!  c                 K   s   t d| f|ŽS )zRegNetY-3.2GFr"  rR  rS  r>   r>   r?   r"  ñ  s    r"  c                 K   s   t d| f|ŽS )zRegNetY-4.0GFr#  rR  rS  r>   r>   r?   r#  ÷  s    r#  c                 K   s   t d| f|ŽS )zRegNetY-6.4GFr$  rR  rS  r>   r>   r?   r$  ý  s    r$  c                 K   s   t d| f|ŽS )zRegNetY-8.0GFr%  rR  rS  r>   r>   r?   r%    s    r%  c                 K   s   t d| f|ŽS )z+RegNetY-8.0GF w/ torchvision group roundingr&  rR  rS  r>   r>   r?   r&  	  s    r&  c                 K   s   t d| f|ŽS )zRegNetY-12GFr'  rR  rS  r>   r>   r?   r'    s    r'  c                 K   s   t d| f|ŽS )zRegNetY-16GFr(  rR  rS  r>   r>   r?   r(    s    r(  c                 K   s   t d| f|ŽS )zRegNetY-32GFr)  rR  rS  r>   r>   r?   r)    s    r)  c                 K   s   t d| f|ŽS )zRegNetY-64GFr*  rR  rS  r>   r>   r?   r*  !  s    r*  c                 K   s   t d| f|ŽS )zRegNetY-128GFr+  rR  rS  r>   r>   r?   r+  '  s    r+  c                 K   s   t d| f|ŽS )zRegNetY-256GFr,  rR  rS  r>   r>   r?   r,  -  s    r,  c                 K   s   t d| f|ŽS )zRegNetY-4.0GF w/ GroupNorm r-  rR  rS  r>   r>   r?   r-  3  s    r-  c                 K   s   t d| f|ŽS )zRegNetV-4.0GF (pre-activation)r.  rR  rS  r>   r>   r?   r.  9  s    r.  c                 K   s   t d| f|ŽS )zRegNetV-6.4GF (pre-activation)r/  rR  rS  r>   r>   r?   r/  ?  s    r/  c                 K   s   t d| fddi|—ŽS )zÛRegNetZ-500MF
    NOTE: config found in https://github.com/facebookresearch/ClassyVision/blob/main/classy_vision/models/regnet.py
    but it's not clear it is equivalent to paper model as not detailed in the paper.
    r0  r’   FrR  rS  r>   r>   r?   r0  E  s    r0  c                 K   s   t d| fddi|—ŽS )úÛRegNetZ-4.0GF
    NOTE: config found in https://github.com/facebookresearch/ClassyVision/blob/main/classy_vision/models/regnet.py
    but it's not clear it is equivalent to paper model as not detailed in the paper.
    r1  r’   FrR  rS  r>   r>   r?   r1  N  s    r1  c                 K   s   t d| fddi|—ŽS )rT  r2  r’   FrR  rS  r>   r>   r?   r2  W  s    r2  Zregnetz_040h)r*   )rS   )r   r   r   NF)r   r   r   NF)rs   NF)ru   F)ru   )ru   )ru   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)br—   rÚ   Údataclassesr   r   Ú	functoolsr   Útypingr   r   r   ÚnumpyrX   r¥   Ztorch.nnrg   Z	timm.datar	   r
   Ztimm.layersr   r   r   r   r   r   r   r   r   r   Z_builderr   Z_manipulater   r   Ú	_registryr   r   r   Ú__all__r   rC   rR   rc   rl   rr   rw   ÚModulerx   r™   r�   r   r¸   rñ   rv   r3  r6  rF  rJ  rK  Zdefault_cfgsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r6   r>   r>   r>   r?   Ú<module>   sž       ù
#    ù
  ø
KL. &:      
þ       ÿ       þ         þ         þ         þÇ@


þþþþþþýý   ý   ý ÿþþþþþþþþþþþþþþ   ý   ý   ý þ þ þ   ü   ü   ü   ü  ý  ý  ý	€ Ì 9 ÿ