
    Ng3              	       J   d Z ddlmZ ddlZddlmZ ddlmc 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ej                  Z G d dej                  Zd"dZ G d dej                  Z G d d	ej                  Zd Zd#dZ e ed           edd           edd           edd           ed          d          Zed$defd            Zed$defd            Zed$defd            Z ed$defd             Z!ed$def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                        e Zd Z fdZej        j        d             Zej        j        d             Zdeej	                 fdZ xZ
S )SequentialListc                 B     t          t          |           j        |  d S N)superr   __init__)selfargs	__class__s     P/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/selecsls.pyr   zSequentialList.__init__   s#    ,nd##,d3333    c                     d S r    r   xs     r   forwardzSequentialList.forward   	     	r   c                     d S r   r   r   s     r   r   zSequentialList.forward$   r   r   returnc                 &    | D ]} ||          }|S r   r   )r   r   modules      r   r   zSequentialList.forward)   s%     	 	Fq		AAr   )__name__
__module____qualname__r   torchjit_overload_methodr   r   Tensor__classcell__r   s   @r   r   r      s        4 4 4 4 4 Y    Y   D.        r   r   c                        e Zd Zd fd	Zej        j        d             Zej        j        d             Zdej        fdZ xZ	S )		SelectSeqindexr   c                 r    t          t          |                                            || _        || _        d S r   )r   r,   r   moder-   )r   r/   r-   r   s      r   r   zSelectSeq.__init__0   s1    i'')))	


r   c                     d S r   r   r   s     r   r   zSelectSeq.forward5   r   r   c                     d S r   r   r   s     r   r   zSelectSeq.forward:   r   r   r   c                 ^    | j         dk    r|| j                 S t          j        |d          S )Nr-   r   )dim)r/   r-   r%   catr   s     r   r   zSelectSeq.forward?   s0    9TZ= 9QA&&&&r   )r-   r   )
r"   r#   r$   r   r%   r&   r'   r   r(   r)   r*   s   @r   r,   r,   /   s             
 Y    Y   'EL ' ' ' ' ' ' ' 'r   r,      c                     ||dz
  ||dz
  z  z   dz  }t          j        t          j        | |||||d          t          j        |          t          j        d                    S )Nr      F)paddingdilationbiasT)inplace)nn
SequentialConv2dBatchNorm2dReLU)in_chsout_chskstrider8   r9   s         r   conv_bnrE   F   sq    QJ(a!e"44:=
	&'1fgW\]]]
w
  r   c                   \     e Zd Zd fd	Zdeej                 deej                 fdZ xZS )SelecSlsBlockr   c                    t          t          |                                            || _        || _        |dv sJ t          ||d||          | _        t          ||d          | _        t          ||dz  d          | _        t          |dz  |d          | _	        t          ||dz  d          | _
        t          d|z  |rdn|z   |d          | _        d S )Nr   r7   r5   )r9   r   r7   r   )r   rG   r   rD   is_firstrE   conv1conv2conv3conv4conv5conv6)	r   rA   skip_chsmid_chsrB   rJ   rD   r9   r   s	           r   r   zSelecSlsBlock.__init__Q   s    mT""++---  VWa(KKK
Wgq11
WglA66
W\7A66
WglA66
Q[,GAAxH'STUU


r   r   r   c           	         t          |t                    s|g}t          |          dv sJ |                     |d                   }|                     |                     |                    }|                     |                     |                    }| j        r/| 	                    t          j        |||gd                    }||gS | 	                    t          j        ||||d         gd                    |d         gS )NrI   r   r   )
isinstancelistlenrK   rM   rL   rO   rN   rJ   rP   r%   r4   )r   r   d1d2d3outs         r   r   zSelecSlsBlock.forward_   s    !T"" 	A1vvZZ!ZZ

2''ZZ

2''= 	H**UYB|Q7788C:JJuy"b"ad);Q??@@!A$GGr   )r   )	r"   r#   r$   r   r   r%   r(   r   r)   r*   s   @r   rG   rG   P   s}        V V V V V VHel+ HU\0B H H H H H H H Hr   rG   c                        e Zd ZdZd fd	Zej        j        dd            Zej        j        dd
            Z	ej        j        de
j        fd            ZddedefdZd ZddefdZd Z x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'
      r5           avgc                    || _         t          t          |                                            t	          |dd          | _        t          fdd         D              | _        t                      | _	        t          j        d d         D              | _        d         x| _        | _        d	         | _        t!          | j        | j         ||
          \  | _        | _        | _        |                                 D ]F\  }}t+          |t          j                  r't          j                            |j        dd           Gd S )N    r7   )rD   c                 &    g | ]} d          | S )blockr   ).0
block_argscfgs     r   
<listcomp>z%SelecSls.__init__.<locals>.<listcomp>   s$    (e(e(ezWz)B(e(e(er   featuresc                      g | ]}t          | S r   )rE   )rc   	conv_argss     r   rf   z%SelecSls.__init__.<locals>.<listcomp>   s    #U#U#UIGY$7#U#U#Ur   headnum_featuresfeature_info)	pool_type	drop_ratefan_outrelu)r/   nonlinearity)num_classesr   r   r   rE   stemr   rg   r,   from_seqr<   r=   rj   rk   head_hidden_sizerl   r   global_pool	head_dropfcnamed_modulesrT   r>   initkaiming_normal_weight)	r   re   rr   in_chansrn   rv   nmr   s	    `      r   r   zSelecSls.__init__~   sL   &h&&(((Hb333	&(e(e(e(eUXYcUd(e(e(ef!M#U#UV#U#U#UV	474GGD1/4E!	5
 5
 5
1$.$' &&(( 	W 	WDAq!RY'' W''yv'VVV	W 	Wr   Fc                 &    t          ddd          S )Nz^stemz^features\.(\d+)z^head)rs   blocksblocks_head)dict)r   coarses     r   group_matcherzSelecSls.group_matcher   s"    & 
 
 
 	
r   Tc                     |r
J d            d S )Nz$gradient checkpointing not supportedr   )r   enables     r   set_grad_checkpointingzSelecSls.set_grad_checkpointing   s    AAAAAAAAr   r   c                     | j         S r   )rx   )r   s    r   get_classifierzSelecSls.get_classifier   s	    wr   rr   rv   c                 f    || _         t          | j        | j         |          \  | _        | _        d S )N)rm   )rr   r   rk   rv   rx   )r   rr   rv   s      r   reset_classifierzSelecSls.reset_classifier   s3    &$5d6GIYep$q$q$q!$'''r   c                     |                      |          }|                     |          }|                     |                     |                    }|S r   )rs   rg   rj   rt   r   s     r   forward_featureszSelecSls.forward_features   sD    IIaLLMM!IIdmmA&&''r   
pre_logitsc                     |                      |          }|                     |          }|r|n|                     |          S r   )rv   rw   rx   )r   r   r   s      r   forward_headzSelecSls.forward_head   s?    QNN1.qqDGGAJJ.r   c                 Z    |                      |          }|                     |          }|S r   )r   r   r   s     r   r   zSelecSls.forward   s-    !!!$$a  r   )r\   r5   r]   r^   F)T)r^   )r"   r#   r$   __doc__r   r%   r&   ignorer   r   r<   Moduler   intstrr   r   boolr   r   r)   r*   s   @r   r   r   n   s8        W W W W W W, Y
 
 
 
 YB B B B Y	    r rC rc r r r r  / /$ / / / /
      r   c           	         i }t          ddd          g}|                     d          rt          |d<   g d|d<   |                    t          d	d
d          t          ddd          t          ddd          g           |                    t          ddd                     | dk    r3g d|d<   |                    t          ddd                     d|d<   ng d|d<   |                    t          ddd                     d|d<   n|                     d          rt          |d<   g d|d<   |                    t          d	d
d          t          ddd          t          ddd           g           |                    t          ddd                     | d!k    r2g d"|d<   |                    t          ddd                     d|d<   ng d#|d<   |                    t          ddd                     d|d<   n| d$k    rt          |d<   g d%|d<   |                    t          d&d
d          t          d'dd(          t          d)dd*          g           g d+|d<   d|d<   |                    t          ddd          t          ddd          g           nt          d,| z   d-z             ||d.<   t          t          | |f|t          d/d01          d2|S )3Nr`   r7   zstem.2)num_chs	reductionr!   
selecsls42rb   )r`   r   @   r   Tr7   r   r   r      Fr   )r   r      r   Tr7   )r   r   r      Fr   )r   r   0  r   Tr7   )r   r   r     Fr   rg   r      z
features.1r      z
features.3r      z
features.5   zhead.1selecsls42b)r     r5   r7   r   r   r5   r   r      r5   r7   r   r   r   r   rj   r   zhead.3rk   )r   r   r   r   r5   r7   r   r   r   r   r   
selecsls60)	r   r   )r   r   r   r   Tr7   )r   r   r   r   Fr   )r   r   r   r   Fr   )r   r   r   r   Tr7   r   r   r   r   Fr   r   )r   r   r     Fr   z
features.4r   z
features.8selecsls60b)r     r5   r7   r   r   r5   r   r   r   )r   r   r   r   
selecsls84)r   )r   r   r   r   Fr   )r   r   r   r   Tr7   r   r   r   r   Fr   r   r   )r   r   r   r   Fr   )r   r   r   r   Tr7   r   r   r   r   Fr   r   r   r   )r   r   r      Fr   r   r   z
features.6r   zfeatures.12))r   r   r5   r7   r   r   )r   r   r5   r   zInvalid net configuration z !!!rl   )r   r   r7   r5   r   T)out_indicesflatten_sequential)	model_cfgfeature_cfg)r   
startswithrG   extendappend
ValueErrorr	   r   )variant
pretrainedkwargsre   rl   s        r   _create_selecslsr      s    
CqBBBCL,'' tJ$G
 
 
J 	,???,???<@@@
 	 	 	 	DHMMMNNNm##  CK TR Q Q QRRR"&C  CK TR Q Q QRRR"&C			L	)	) NJ$G
 
 
J 	,???,???<@@@
 	 	 	 	DHMMMNNNm##  CK TR Q Q QRRR"&C  CK TR Q Q QRRR"&C	L	 	 $G
 
 
J  	,???,???=AAA
 	 	 	
 
 
F #NH===H===
 	 	 	 	
 5?&HIII&C   _NNN    r    c                 4    | dddddt           t          ddd
|S )	Nr\   )r5      r   )r   r   g      ?bilinearzstem.0rx   )
urlrr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   s     r   _cfgr   >  s5    =vJ%.Bd   r   bicubic)r   ztimm/)	hf_hub_idr   )zselecsls42.untrainedzselecsls42b.in1kzselecsls60.in1kzselecsls60b.in1kzselecsls84.untrainedFr   c                     t          d| fi |S )z#Constructs a SelecSls42 model.
    r   r   r   r   s     r   r   r   Z       L*?????r   c                     t          d| fi |S )z%Constructs a SelecSls42_B model.
    r   r   r   s     r   r   r   a       M:@@@@@r   c                     t          d| fi |S )z#Constructs a SelecSls60 model.
    r   r   r   s     r   r   r   h  r   r   c                     t          d| fi |S )z%Constructs a SelecSls60_B model.
    r   r   r   s     r   r   r   o  r   r   c                     t          d| fi |S )z#Constructs a SelecSls84 model.
    r   r   r   s     r   r   r   v  r   r   )r5   r   Nr   )r   r   )#r   typingr   r%   torch.nnr<   torch.nn.functional
functionalF	timm.datar   r   timm.layersr   _builderr	   	_registryr
   r   __all__r=   r   r   r,   rE   rG   r   r   r   default_cfgsr   r   r   r   r   r   r   r   <module>r      sV  
 
                       A A A A A A A A ) ) ) ) ) ) * * * * * * < < < < < < < <,    R]   *' ' ' ' '	 ' ' '.   H H H H HBI H H H<H H H H Hry H H HVB B BJ    %$ D! ! !! ! ! t! ! ! ! ! ! !D! ! !& &  " @ @h @ @ @ @ A Ax A A A A @ @h @ @ @ @ A Ax A A A A @ @h @ @ @ @ @ @r   