
    kh3              	          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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y)"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                 &    t        t        | 
  |  y N)superr   __init__)selfargs	__class__s     P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/selecsls.pyr   zSequentialList.__init__   s    nd,d3    c                      y r    r   xs     r   forwardzSequentialList.forward        	r   c                      y 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	A	r   )__name__
__module____qualname__r   torchjit_overload_methodr   r   Tensor__classcell__r   s   @r   r   r      sY    4 YY   YY  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 )	SelectSeqc                 F    t         t        |           || _        || _        y r   )r   r,   r   modeindex)r   r.   r/   r   s      r   r   zSelectSeq.__init__/   s    i')	
r   c                      y r   r   r   s     r   r   zSelectSeq.forward4   r   r   c                      y r   r   r   s     r   r   zSelectSeq.forward9   r   r   r   c                 l    | j                   dk(  r|| j                     S t        j                  |d      S )Nr/   r   )dim)r.   r/   r%   catr   s     r   r   zSelectSeq.forward>   s-    99TZZ= 99QA&&r   )r/   r   )
r"   r#   r$   r   r%   r&   r'   r   r(   r)   r*   s   @r   r,   r,   .   sT    
 YY   YY  'ELL '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strider7   r8   s         r   conv_bnrD   E   se    QJ(a!e"44:==
		&'1fgW\]
w
 r   c                   d     e Zd Zd fd	Zdeej                     deej                     fdZ xZS )SelecSlsBlockc                 V   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      | _        y )Nr   r6      )r8   r   r6   r   )r   rF   r   rC   is_firstrD   conv1conv2conv3conv4conv5conv6)	r   r@   skip_chsmid_chsrA   rJ   rC   r8   r   s	           r   r   zSelecSlsBlock.__init__P   s    mT+-  VWa(K
Wgq1
WglA6
W\7A6
WglA6
Q[AxH'STU
r   r   r   c           	         t        |t              s|g}t        |      dv sJ | j                  |d         }| j	                  | j                  |            }| j                  | j                  |            }| j                  r,| j                  t        j                  |||gd            }||gS | j                  t        j                  ||||d   gd            |d   gS )NrH   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1vZZ!ZZ

2'ZZ

2'==**UYYB|Q78C:JJuyy"b"ad);Q?@!A$GGr   )r   )	r"   r#   r$   r   r   r%   r(   r   r)   r*   s   @r   rF   rF   O   s1    VHell+ HU\\0B Hr   rF   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'
    c                    || _         t        t        |           t	        |dd      | _        t        |d   D cg c]
  } |d   |  c} | _        t               | _	        t        j                  |d   D cg c]
  }t	        |  c} | _        |d   x| _        | _        |d   | _        t!        | j                  | j                   ||	      \  | _        | _        | _        | j)                         D ]L  \  }}	t+        |	t        j,                        s!t        j.                  j1                  |	j2                  d
d       N y c c}w c c}w )N    r6   )rC   featuresblockheadnum_featuresfeature_info)	pool_type	drop_ratefan_outrelu)r.   nonlinearity)num_classesr   r   r   rD   stemr   r^   r,   from_seqr;   r<   r`   ra   head_hidden_sizerb   r   global_pool	head_dropfcnamed_modulesrT   r=   initkaiming_normal_weight)r   cfgrh   in_chansrd   rl   
block_args	conv_argsnmr   s             r   r   zSelecSls.__init__}   s$   &h&(Hb3	&UXYcUd(ezWz)B(ef!MMV#UIGY$7#UV	474GGD1/4E!	5
1$.$' &&( 	WDAq!RYY'''yv'V	W )f#Us   E 7Ec                     t        ddd      S )Nz^stemz^features\.(\d+)z^head)ri   blocksblocks_head)dict)r   coarses     r   group_matcherzSelecSls.group_matcher   s    & 
 	
r   c                     |rJ d       y )Nz$gradient checkpointing not supportedr   )r   enables     r   set_grad_checkpointingzSelecSls.set_grad_checkpointing   s    AAAz6r   r   c                     | j                   S r   )rn   )r   s    r   get_classifierzSelecSls.get_classifier   s    wwr   rh   rl   c                 p    || _         t        | j                  | j                   |      \  | _        | _        y )N)rc   )rh   r   ra   rl   rn   )r   rh   rl   s      r   reset_classifierzSelecSls.reset_classifier   s/    &$5d6G6GIYIYep$q!$'r   c                     | j                  |      }| j                  |      }| j                  | j                  |            }|S r   )ri   r^   r`   rj   r   s     r   forward_featureszSelecSls.forward_features   s9    IIaLMM!IIdmmA&'r   
pre_logitsc                 p    | j                  |      }| j                  |      }|r|S | j                  |      S r   )rl   rm   rn   )r   r   r   s      r   forward_headzSelecSls.forward_head   s5    QNN1q.DGGAJ.r   c                 J    | j                  |      }| j                  |      }|S r   )r   r   r   s     r   r   zSelecSls.forward   s'    !!!$a r   )  rI   g        avg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   m   s    W, YY
 
 YYB B YY		  rC rc r/$ /
r   c           	         i }t        ddd      g}| j                  d      rt        |d<   g d|d<   |j                  t        d	d
d      t        ddd      t        ddd      g       |j	                  t        ddd             | dk(  r+g d|d<   |j	                  t        ddd             d|d<   ng d|d<   |j	                  t        ddd             d|d<   ne| j                  d      rt        |d<   g d|d<   |j                  t        d	d
d      t        ddd      t        ddd       g       |j	                  t        ddd             | d!k(  r*g d"|d<   |j	                  t        ddd             d|d<   ng d#|d<   |j	                  t        ddd             d|d<   n| d$k(  rt        |d<   g d%|d<   |j                  t        d&d
d      t        d'dd(      t        d)dd*      g       g d+|d<   d|d<   |j                  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]   r6   zstem.2)num_chs	reductionr!   
selecsls42r_   )r]   r   @   r   Tr6   r   r   r      Fr   )r   r      r   Tr6   )r   r   r      Fr   )r   r   0  r   Tr6   )r   r   r     Fr   r^   r      z
features.1r      z
features.3r      z
features.5   zhead.1selecsls42b)r     rI   r6   r   r   rI   r   r      rI   r6   r   r   r   r   r`   r   zhead.3ra   )r   r   r   r   rI   r6   r   r   r   r   r   
selecsls60)	r   r   )r   r   r   r   Tr6   )r   r   r   r   Fr   )r   r   r   r   Fr   )r   r   r   r   Tr6   r   r   r   r   Fr   r   )r   r   r     Fr   z
features.4r   z
features.8selecsls60b)r     rI   r6   r   r   rI   r   r   r   )r   r   r   r   
selecsls84)r   )r   r   r   r   Fr   )r   r   r   r   Tr6   r   r   r   r   Fr   r   r   )r   r   r   r   Fr   )r   r   r   r   Tr6   r   r   r   r   Fr   r   r   r   )r   r   r      Fr   r   r   z
features.6r   zfeatures.12))r   r   rI   r6   r   r   )r   r   rI   r   zInvalid net configuration z !!!rb   )r   r   r6   rI   r   T)out_indicesflatten_sequential)	model_cfgfeature_cfg)r|   
startswithrF   extendappend
ValueErrorr	   r   )variant
pretrainedkwargsrs   rb   s        r   _create_selecslsr      s   
CqBCL,'$G
J 	,?,?<@
 	 	DHMNm#CK TR QR"&CCK TR QR"&C			L	)$G
J 	,?,?<@
 	 	DHMNm#CK TR QR"&CCK TR QR"&C	L	 $G
J  	,?,?=A
 	
F #NH=H=
 	
 5?&HII&C   _N  r   c                 0    | dddddt         t        ddd
|S )	Nr   )rI      r   )r   r   g      ?bilinearzstem.0rn   )
urlrh   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   s     r   _cfgr   =  s0    =vJ%.Bd  r   bicubic)r   ztimm/)	hf_hub_idr   )zselecsls42.untrainedzselecsls42b.in1kzselecsls60.in1kzselecsls60b.in1kzselecsls84.untrainedr   c                     t        d| fi |S )z#Constructs a SelecSls42 model.
    r   r   r   r   s     r   r   r   Y       L*???r   c                     t        d| fi |S )z%Constructs a SelecSls42_B model.
    r   r   r   s     r   r   r   `       M:@@@r   c                     t        d| fi |S )z#Constructs a SelecSls60 model.
    r   r   r   s     r   r   r   g  r   r   c                     t        d| fi |S )z%Constructs a SelecSls60_B model.
    r   r   r   s     r   r   r   n  r   r   c                     t        d| fi |S )z#Constructs a SelecSls84 model.
    r   r   r   s     r   r   r   u  r   r   )rI   r   Nr   ) r   ) r   typingr   r%   torch.nnr;   	timm.datar   r   timm.layersr   _builderr	   	_registryr
   r   __all__r<   r   r   r,   rD   rF   r   r   r   default_cfgsr   r   r   r   r   r   r   r   <module>r      sk  
    A ) * <,R]] *'		 '.HBII H<Hryy HVBJ % !! ! ! !!& " @h @ @ Ax A A @h @ @ Ax A A @h @ @r   