U
    ¯Ê¹jÆ3  ã                   @   sx  d Z ddlmZ ddlZddlmZ ddlm  mZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZmZ d	gZG d
d„ dejƒZG dd„ dejƒZd*dd„ZG dd„ dejƒZG dd	„ d	ejƒZdd„ Zd+dd„Zeedd�eddd�eddd�eddd�edd�dœƒZed,edœd d!„ƒZed-edœd"d#„ƒZed.edœd$d%„ƒZ ed/edœd&d'„ƒZ!ed0edœd(d)„ƒZ"dS )1a  PyTorch SelecSLS Net example for ImageNet Classification
License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/legalcode)
Author: Dushyant Mehta (@mehtadushy)

SelecSLS (core) Network Architecture as proposed in "XNect: Real-time Multi-person 3D
Human Pose Estimation with a Single RGB Camera, Mehta et al."
https://arxiv.org/abs/1907.00837

Based on ResNet implementation in https://github.com/rwightman/pytorch-image-models
and SelecSLS Net implementation in https://github.com/mehtadushy/SelecSLS-Pytorch
é    )ÚListN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Úcreate_classifieré   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚSelecSlsc                       sP   e Zd Z‡ fdd„Zejjdd„ ƒZejjdd„ ƒZeej	 dœdd„Z‡  Z
S )ÚSequentialListc                    s   t t| ƒj|Ž  d S ©N)Úsuperr   Ú__init__)ÚselfÚargs©Ú	__class__© úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/selecsls.pyr      s    zSequentialList.__init__c                 C   s   d S r   r   ©r   Úxr   r   r   Úforward   s    zSequentialList.forwardc                 C   s   d S r   r   r   r   r   r   r   $   s    ©Úreturnc                 C   s   | D ]}||ƒ}q|S r   r   )r   r   Úmoduler   r   r   r   )   s    
)Ú__name__Ú
__module__Ú__qualname__r   ÚtorchÚjitÚ_overload_methodr   r   ÚTensorÚ__classcell__r   r   r   r   r      s   

r   c                       sN   e Zd Zd
‡ fdd„	Zejjdd„ ƒZejjdd„ ƒZejdœd	d„Z‡  Z	S )Ú	SelectSeqÚindexr   c                    s   t t| ƒ ¡  || _|| _d S r   )r   r$   r   Úmoder%   )r   r&   r%   r   r   r   r   0   s    zSelectSeq.__init__c                 C   s   d S r   r   r   r   r   r   r   5   s    zSelectSeq.forwardc                 C   s   d S r   r   r   r   r   r   r   :   s    r   c                 C   s&   | j dkr|| j S tj|dd�S d S )Nr%   r   )Údim)r&   r%   r   Úcatr   r   r   r   r   ?   s    

)r%   r   )
r   r   r   r   r   r    r!   r   r"   r#   r   r   r   r   r$   /   s   

r$   é   c                 C   sP   |d kr |d ||d   d }t  t j| |||||dd�t  |¡t jdd�¡S )Nr   é   F)ÚpaddingÚdilationZbiasT)Zinplace)ÚnnÚ
SequentialÚConv2dZBatchNorm2dZReLU)Úin_chsÚout_chsÚkÚstrider+   r,   r   r   r   Úconv_bnF   s    
ýr4   c                       s:   e Zd Zd‡ fdd„	Zeej eej dœdd„Z‡  ZS )ÚSelecSlsBlockr   c                    s    t t| ƒ ¡  || _|| _|dks&t‚t||d||d�| _t||dƒ| _t||d dƒ| _	t|d |dƒ| _
t||d dƒ| _td| |rŽdn| |dƒ| _d S )N©r   r*   r)   )r,   r   r*   r   )r   r5   r   r3   Úis_firstÚAssertionErrorr4   Úconv1Úconv2Úconv3Úconv4Úconv5Úconv6)r   r0   Zskip_chsZmid_chsr1   r7   r3   r,   r   r   r   r   Q   s    zSelecSlsBlock.__init__)r   r   c              	   C   sž   t |tƒs|g}t|ƒdks t‚|  |d ¡}|  |  |¡¡}|  |  |¡¡}| j	rt|  
t |||gd¡¡}||gS |  
t ||||d gd¡¡|d gS d S )Nr6   r   r   )Ú
isinstanceÚlistÚlenr8   r9   r;   r:   r=   r<   r7   r>   r   r(   )r   r   Zd1Zd2Zd3Úoutr   r   r   r   _   s    
zSelecSlsBlock.forward)r   )	r   r   r   r   r   r   r"   r   r#   r   r   r   r   r5   P   s   r5   c                       s€   e Zd 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   aû  SelecSls42 / SelecSls60 / SelecSls84

    Parameters
    ----------
    cfg : network config dictionary specifying block type, feature, and head args
    num_classes : int, default 1000
        Number of classification classes.
    in_chans : int, default 3
        Number of input (color) channels.
    drop_rate : float, default 0.
        Dropout probability before classifier, for training
    global_pool : str, default 'avg'
        Global pooling type. One of 'avg', 'max', 'avgmax', 'catavgmax'
    éè  r)   ç        Úavgc                    sÌ   || _ tt| ƒ ¡  t|ddd�| _t‡ fdd„ˆ d D ƒŽ | _tƒ | _	t
jdd„ ˆ d D ƒŽ | _ˆ d	 | _ˆ d
 | _t| j| j ||d�\| _| _| _|  ¡ D ](\}}t|t
jƒržt
jj|jddd� qžd S )Né    r*   )r3   c                    s   g | ]}ˆ d  |Ž ‘qS )Úblockr   )Ú.0Z
block_args©Úcfgr   r   Ú
<listcomp>ƒ   s     z%SelecSls.__init__.<locals>.<listcomp>Úfeaturesc                 S   s   g | ]}t |Ž ‘qS r   )r4   )rH   Z	conv_argsr   r   r   rK   …   s     ÚheadÚnum_featuresÚfeature_info)Ú	pool_typeÚ	drop_rateZfan_outZrelu)r&   Znonlinearity)Únum_classesr   r   r   r4   Ústemr   rL   r$   Úfrom_seqr-   r.   rM   rN   rO   r   Úglobal_poolÚ	head_dropÚfcZnamed_modulesr?   r/   ÚinitZkaiming_normal_Úweight)r   rJ   rR   Zin_chansrQ   rU   ÚnÚmr   rI   r   r   ~   s"    

üzSelecSls.__init__Fc                 C   s   t dddd�S )Nz^stemz^features\.(\d+)z^head)rS   ÚblocksZblocks_head)Údict)r   Zcoarser   r   r   Úgroup_matcher”   s
    ýzSelecSls.group_matcherTc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)r8   )r   Úenabler   r   r   Úset_grad_checkpointingœ   s    zSelecSls.set_grad_checkpointingc                 C   s   | j S r   )rW   )r   r   r   r   Úget_classifier    s    zSelecSls.get_classifierc                 C   s$   || _ t| j| j |d�\| _| _d S )N)rP   )rR   r   rN   rU   rW   )r   rR   rU   r   r   r   Úreset_classifier¤   s    zSelecSls.reset_classifierc                 C   s(   |   |¡}|  |¡}|  |  |¡¡}|S r   )rS   rL   rM   rT   r   r   r   r   Úforward_features¨   s    

zSelecSls.forward_features)Ú
pre_logitsc                 C   s&   |   |¡}|  |¡}|r|S |  |¡S r   )rU   rV   rW   )r   r   rd   r   r   r   Úforward_head®   s    

zSelecSls.forward_headc                 C   s   |   |¡}|  |¡}|S r   )rc   re   r   r   r   r   r   ³   s    

zSelecSls.forward)rC   r)   rD   rE   )F)T)rE   )F)r   r   r   Ú__doc__r   r   r    Úignorer^   r`   ra   rb   rc   Úboolre   r   r#   r   r   r   r   r   n   s   

c                 K   s�  i }t dddd�g}|  d¡rât|d< ddd	d
ddg|d< | t dddd�t dddd�t dddd�g¡ | t dddd�¡ | dkr²ddddg|d< | t ddd d�¡ d|d!< n,ddd"d#g|d< | t d$dd d�¡ d$|d!< �n„|  d%¡�r¸t|d< ddd&d'd(d)d*d*d+g	|d< | t dddd�t ddd,d�t d-dd.d�g¡ | t dddd�¡ | d/k�rŠd0d1ddg|d< | t ddd d�¡ d|d!< n,d0d1d"d#g|d< | t d$dd d�¡ d$|d!< n®| d2k�rVt|d< dd3d4d5d5d5d6d7d8d8d8d8d9g|d< | t d:ddd�t d;dd<d�t d=dd>d�g¡ d?dd"d@g|d< d$|d!< | t dddd�t d$dd d�g¡ ntdA|  dB ƒ‚||dC< tt| |f|t dDdEdF�dGœ|—ŽS )HNrF   r*   zstem.2)Znum_chsZ	reductionr   Ú
selecsls42rG   )rF   r   é@   rj   Tr*   )rj   rj   rj   é€   Fr   )rk   r   é�   rl   Tr*   )rl   rl   rl   é   Fr   )rm   r   é0  rn   Tr*   )rn   rn   rn   éà  Fr   rL   rk   é   z
features.1rm   é   z
features.3ro   é   z
features.5é   zhead.1Úselecsls42b)ro   éÀ  r)   r*   )ru   rs   r)   r   )rs   é   r)   r*   )rv   rs   r   r   rM   rj   zhead.3rN   )rs   rs   r)   r*   )rs   rv   r   r   rv   Ú
selecsls60)rk   r   rk   rk   Tr*   )rk   rk   rk   rk   Fr   )rk   rk   rk   rm   Fr   )rm   r   rm   rm   Tr*   )rm   rm   rm   rm   Fr   )rm   rm   rm   é   Fr   z
features.4rx   z
features.8Úselecsls60b)rx   éô  r)   r*   )rz   rs   r)   r   Ú
selecsls84)rj   rj   rj   rl   Fr   )rl   r   rl   rl   Tr*   )rl   rl   rl   rl   Fr   )rl   rl   rl   rn   Fr   )rn   r   rn   rn   Tr*   )rn   rn   rn   rn   Fr   )rn   rn   rn   é   Fr   rl   rn   z
features.6r|   zfeatures.12)r|   ru   r)   r*   )rs   rv   r)   r   zInvalid net configuration z !!!rO   )r   r   r*   r)   rp   T)Zout_indicesZflatten_sequential)Z	model_cfgZfeature_cfg)r]   Ú
startswithr5   ÚextendÚappendÚ
ValueErrorr   r   )ÚvariantÚ
pretrainedÚkwargsrJ   rO   r   r   r   Ú_create_selecsls¹   sØ    
ù	ýü
üöý
ü
ü

òýüþý
ûúr„   Ú c                 K   s   | dddddt tdddœ
|–S )	NrC   )r)   éà   r†   )rp   rp   g      ì?Zbilinearzstem.0rW   )
ÚurlrR   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierr   )r‡   rƒ   r   r   r   Ú_cfg>  s         ûúrŠ   Zbicubic)rˆ   ztimm/)Z	hf_hub_idrˆ   )zselecsls42.untrainedzselecsls42b.in1kzselecsls60.in1kzselecsls60b.in1kzselecsls84.untrainedFr   c                 K   s   t d| f|ŽS )z#Constructs a SelecSls42 model.
    ri   ©r„   ©r‚   rƒ   r   r   r   ri   Z  s    ri   c                 K   s   t d| f|ŽS )z%Constructs a SelecSls42_B model.
    rt   r‹   rŒ   r   r   r   rt   a  s    rt   c                 K   s   t d| f|ŽS )z#Constructs a SelecSls60 model.
    rw   r‹   rŒ   r   r   r   rw   h  s    rw   c                 K   s   t d| f|ŽS )z%Constructs a SelecSls60_B model.
    ry   r‹   rŒ   r   r   r   ry   o  s    ry   c                 K   s   t d| f|ŽS )z#Constructs a SelecSls84 model.
    r{   r‹   rŒ   r   r   r   r{   v  s    r{   )r)   r   Nr   )r…   )F)F)F)F)F)#rf   Útypingr   r   Ztorch.nnr-   Ztorch.nn.functionalZ
functionalÚFZ	timm.datar   r   Ztimm.layersr   Z_builderr   Ú	_registryr	   r
   Ú__all__r.   r   ÚModuler$   r4   r5   r   r„   rŠ   Zdefault_cfgsri   rt   rw   ry   r{   r   r   r   r   Ú<module>   s^   

K 
ÿþþþÿô