o
    ÓÙ¾i×3  ã                   @   sf  d 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
 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,defd d!„ƒZed,defd"d#„ƒZed,defd$d%„ƒZed,defd&d'„ƒZed,defd(d)„ƒZdS )-a  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deej	 fdd„Z‡  Z
S )ÚSequentialListc                    s   t t| ƒj|Ž  d S ©N)Úsuperr   Ú__init__)ÚselfÚargs©Ú	__class__© úH/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/selecsls.pyr      s   zSequentialList.__init__c                 C   ó   d S r   r   ©r   Úxr   r   r   Úforward   ó   zSequentialList.forwardc                 C   r   r   r   r   r   r   r   r   #   r   Ú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dejf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   /   s   
zSelectSeq.__init__c                 C   r   r   r   r   r   r   r   r   4   r   zSelectSeq.forwardc                 C   r   r   r   r   r   r   r   r   9   r   r   c                 C   s"   | j dkr
|| j S tj|d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 u r|d ||d   d }t  t j| |||||ddt  |¡t jdd¡S )Nr   é   F)ÚpaddingÚdilationÚbiasT)Úinplace)ÚnnÚ
SequentialÚConv2dÚBatchNorm2dÚReLU)Úin_chsÚout_chsÚkÚstrider,   r-   r   r   r   Úconv_bnE   s   
ýr9   c                       s<   e Zd Zd‡ fdd„	Zdeej deej fdd„Z‡  ZS )	ÚSelecSlsBlockr   c                    s    t t| ƒ ¡  || _|| _|dv sJ ‚t||d||d| _t||dƒ| _t||d dƒ| _t|d |dƒ| _	t||d dƒ| _
td| |rGdn| |dƒ| _d S )N©r   r+   r*   )r-   r   r+   r   )r   r:   r   r8   Úis_firstr9   Úconv1Úconv2Úconv3Úconv4Úconv5Úconv6)r   r5   Úskip_chsÚmid_chsr6   r<   r8   r-   r   r   r   r   P   s   "zSelecSlsBlock.__init__r   r   c              	   C   sš   t |tƒs|g}t|ƒdv sJ ‚|  |d ¡}|  |  |¡¡}|  |  |¡¡}| jr:|  	t
 |||gd¡¡}||gS |  	t
 ||||d gd¡¡|d gS )Nr;   r   r   )Ú
isinstanceÚlistÚlenr=   r?   r>   rA   r@   r<   rB   r    r)   )r   r   Úd1Úd2Úd3Úoutr   r   r   r   ^   s   
&zSelecSlsBlock.forward)r   )	r   r   r   r   r   r    r#   r   r$   r   r   r   r   r:   O   s    &r:   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e
jfdd„ƒZddedefdd„Zdd„ Zddef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ƒrft
jj|jddd qRd S )Né    r+   )r8   c                    s   g | ]}ˆ d  |Ž ‘qS )Úblockr   )Ú.0Ú
block_args©Úcfgr   r   Ú
<listcomp>‚   s    z%SelecSls.__init__.<locals>.<listcomp>Úfeaturesc                 S   s   g | ]}t |Ž ‘qS r   )r9   )rQ   Ú	conv_argsr   r   r   rU   „   s    ÚheadÚnum_featuresÚfeature_info)Ú	pool_typeÚ	drop_rateÚfan_outÚrelu)r'   Únonlinearity)Únum_classesr   r   r   r9   Ústemr   rV   r%   Úfrom_seqr0   r1   rX   rY   Úhead_hidden_sizerZ   r   Úglobal_poolÚ	head_dropÚfcÚnamed_modulesrE   r2   ÚinitÚkaiming_normal_Úweight)r   rT   r`   Úin_chansr\   rd   ÚnÚmr   rS   r   r   }   s&   
ü€þzSelecSls.__init__Fc                 C   s   t ddddS )Nz^stemz^features\.(\d+)z^head)ra   ÚblocksÚblocks_head)Údict)r   Úcoarser   r   r   Úgroup_matcher“   s
   ýzSelecSls.group_matcherTc                 C   s   |rJ dƒ‚d S )Nz$gradient checkpointing not supportedr   )r   Úenabler   r   r   Úset_grad_checkpointing›   s   zSelecSls.set_grad_checkpointingr   c                 C   s   | j S r   )rf   )r   r   r   r   Úget_classifierŸ   s   zSelecSls.get_classifierr`   rd   c                 C   s$   || _ t| j| j |d\| _| _d S )N)r[   )r`   r   rY   rd   rf   )r   r`   rd   r   r   r   Úreset_classifier£   s   zSelecSls.reset_classifierc                 C   s(   |   |¡}|  |¡}|  |  |¡¡}|S r   )ra   rV   rX   rb   r   r   r   r   Úforward_features§   s   

zSelecSls.forward_featuresÚ
pre_logitsc                 C   s&   |   |¡}|  |¡}|r|S |  |¡S r   )rd   re   rf   )r   r   rx   r   r   r   Úforward_head­   s   

zSelecSls.forward_headc                 C   s   |   |¡}|  |¡}|S r   )rw   ry   r   r   r   r   r   ²   s   

zSelecSls.forward)rL   r*   rM   rN   ©F)T)rN   )r   r   r   Ú__doc__r   r    r!   Úignorerr   rt   r0   ÚModuleru   ÚintÚstrrv   rw   Úboolry   r   r$   r   r   r   r   r   m   s    c              	   K   sJ  i }t ddddg}|  d¡rht|d< g d¢|d< | t d	d
ddt ddddt ddddg¡ | t dddd¡ | dkrSg d¢|d< | t dddd¡ d|d< n½g d¢|d< | t dddd¡ d|d< n¨|  d¡rÆt|d< g d¢|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±g d"¢|d< | t dddd¡ d|d< n_g d#¢|d< | t dddd¡ d|d< nJ| d$krt|d< g d%¢|d< | t d&d
ddt d'dd(dt d)dd*dg¡ g d+¢|d< d|d< | t ddddt ddddg¡ ntd,|  d- ƒ‚||d.< tt| |f|t d/d0d1d2œ|¤ŽS )3NrO   r+   zstem.2)Únum_chsÚ	reductionr   Ú
selecsls42rP   )©rO   r   é@   r…   Tr+   ©r…   r…   r…   é€   Fr   )r‡   r   é   rˆ   Tr+   )rˆ   rˆ   rˆ   é   Fr   )r‰   r   é0  rŠ   Tr+   )rŠ   rŠ   rŠ   éà  Fr   rV   r‡   é   z
features.1r‰   é   z
features.3r‹   é   z
features.5é   zhead.1Úselecsls42b)©r‹   éÀ  r*   r+   ©r’   r   r*   r   ©r   é   r*   r+   ©r•   r   r   r   rX   r…   zhead.3rY   )r‘   r“   ©r   r   r*   r+   ©r   r•   r   r   r•   Ú
selecsls60)	r„   r†   )r‡   r   r‡   r‡   Tr+   )r‡   r‡   r‡   r‡   Fr   )r‡   r‡   r‡   r‰   Fr   )r‰   r   r‰   r‰   Tr+   ©r‰   r‰   r‰   r‰   Fr   rš   )r‰   r‰   r‰   é   Fr   z
features.4r›   z
features.8Úselecsls60b)©r›   éô  r*   r+   ©rž   r   r*   r   r”   r–   )r   rŸ   r—   r˜   Ú
selecsls84)r„   )r…   r…   r…   rˆ   Fr   )rˆ   r   rˆ   rˆ   Tr+   ©rˆ   rˆ   rˆ   rˆ   Fr   r¡   r¡   )rˆ   rˆ   rˆ   rŠ   Fr   )rŠ   r   rŠ   rŠ   Tr+   ©rŠ   rŠ   rŠ   rŠ   Fr   r¢   r¢   r¢   )rŠ   rŠ   rŠ   é   Fr   rˆ   rŠ   z
features.6r£   zfeatures.12))r£   r’   r*   r+   r“   r—   )r   r•   r*   r   zInvalid net configuration z !!!rZ   )r   r   r+   r*   rŒ   T)Úout_indicesÚflatten_sequential)Ú	model_cfgÚfeature_cfg)rp   Ú
startswithr:   ÚextendÚappendÚ
ValueErrorr   r   )ÚvariantÚ
pretrainedÚkwargsrT   rZ   r   r   r   Ú_create_selecsls¸   sx   
	ý


ý


ýþý
ûúr¯   Ú c                 K   s   | dddddt tdddœ
|¥S )	NrL   )r*   éà   r±   )rŒ   rŒ   g      ì?Úbilinearzstem.0rf   )
Úurlr`   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚstdÚ
first_convÚ
classifierr   )r³   r®   r   r   r   Ú_cfg=  s   ûúr¼   Úbicubic)r·   ztimm/)Ú	hf_hub_idr·   )zselecsls42.untrainedzselecsls42b.in1kzselecsls60.in1kzselecsls60b.in1kzselecsls84.untrainedFr   c                 K   ó   t d| fi |¤ŽS )z#Constructs a SelecSls42 model.
    rƒ   ©r¯   ©r­   r®   r   r   r   rƒ   Y  ó   rƒ   c                 K   r¿   )z%Constructs a SelecSls42_B model.
    r   rÀ   rÁ   r   r   r   r   `  rÂ   r   c                 K   r¿   )z#Constructs a SelecSls60 model.
    r™   rÀ   rÁ   r   r   r   r™   g  rÂ   r™   c                 K   r¿   )z%Constructs a SelecSls60_B model.
    rœ   rÀ   rÁ   r   r   r   rœ   n  rÂ   rœ   c                 K   r¿   )z#Constructs a SelecSls84 model.
    r    rÀ   rÁ   r   r   r   r    u  rÂ   r    )r*   r   Nr   )r°   rz   ) r{   Útypingr   r    Útorch.nnr0   Ú	timm.datar   r   Útimm.layersr   Ú_builderr   Ú	_registryr	   r
   Ú__all__r1   r   r}   r%   r9   r:   r   r¯   r¼   Údefault_cfgsrƒ   r   r™   rœ   r    r   r   r   r   Ú<module>   s^    

K 
ÿþþþÿô