
    ^j4              	          d Z ddlmZ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
    )ListTypeNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsSelecSlsc                   D     e Zd Z fdZdeej                     fdZ xZS )SequentialListc                     t        |   |  y N)super__init__)selfargs	__class__s     _/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/selecsls.pyr   zSequentialList.__init__   s    $    returnc                 $    | D ]
  } ||      } |S r    )r   xmodules      r   forwardzSequentialList.forward   s     	Fq	A	r   )	__name__
__module____qualname__r   r   torchTensorr   __classcell__r   s   @r   r   r      s     D. r   r   c                   @     e Zd Zd fd	Zdej
                  fdZ xZS )	SelectSeqc                 >    t         |           || _        || _        y r   )r   r   modeindex)r   r)   r*   r   s      r   r   zSelectSeq.__init__%   s    	
r   r   c                 l    | j                   dk(  r|| j                     S t        j                  |d      S )Nr*   r	   )dim)r)   r*   r"   catr   r   s     r   r   zSelectSeq.forward*   s-    99TZZ= 99QA&&r   )r*   r   )r   r    r!   r   r"   r#   r   r$   r%   s   @r   r'   r'   $   s    
'ELL 'r   r'   c           	          ||d}||dz
  ||dz
  z  z   dz  }t        j                  t        j                  | |||f||dd|t        j                  |fi |t        j                  d            S )Ndevicedtyper	      F)paddingdilationbiasT)inplace)nn
SequentialConv2dBatchNorm2dReLU)	in_chsout_chskstrider4   r5   r1   r2   dds	            r   conv_bnrB   1   s}    U	+BQJ(a!e"44:==
		&'1fcgW\c`bc
w%"%
 r   c                        e Zd Z	 	 	 ddededededededef fdZd	eej                     d
eej                     fdZ	 xZ
S )SelecSlsBlockr=   skip_chsmid_chsr>   is_firstr@   r5   c
                 d   ||	d}
t         |           || _        || _        |dv sJ t	        ||d|fd|i|
| _        t	        ||dfi |
| _        t	        ||dz  dfi |
| _        t	        |dz  |dfi |
| _        t	        ||dz  dfi |
| _	        t	        d|z  |rdn|z   |dfi |
| _
        y )Nr0   r	   r3      r5   r	   r3   r   )r   r   r@   rG   rB   conv1conv2conv3conv4conv5conv6)r   r=   rE   rF   r>   rG   r@   r5   r1   r2   rA   r   s              r   r   zSelecSlsBlock.__init__=   s     /  VWaQ(QbQ
Wgq7B7
WglA<<
W\7A<<
WglA<<
Q[AxH'ST[XZ[
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 )NrI   r   r	   )
isinstancelistlenrK   rM   rL   rO   rN   rG   rP   r"   r-   )r   r   d1d2d3outs         r   r   zSelecSlsBlock.forwardW   s    !T"A1vZZ!ZZ

2'ZZ

2'==**UYYB|Q78C:JJuyy"b"ad);Q?@!A$GGr   )r	   NN)r   r    r!   intboolr   r   r"   r#   r   r$   r%   s   @r   rD   rD   <   s     \\ \ 	\
 \ \ \ \4Hell+ HU\\0B Hr   rD   c            	       4    e Zd ZdZ	 	 	 	 	 	 ddedededef 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'
    num_classesin_chans	drop_rateglobal_poolc           
         || _         || _        t        |           ||d}t	        |dfddi|| _        t        |d   D 	cg c]  }	 |d   |	i | c}	 | _        t               | _	        t        j                  |d   D 
cg c]  }
t	        |
i | c}
 | _        |d   x| _        | _        |d	   | _        t!        | j                  | j                   f||d
|\  | _        | _        | _        | j)                         D ]L  \  }}t+        |t        j,                        s!t        j.                  j1                  |j2                  dd       N y c c}	w c c}
w )Nr0       r@   r3   featuresblockheadnum_featuresfeature_info)	pool_typer^   fan_outrelu)r)   nonlinearity)r\   r]   r   r   rB   stemr   rb   r'   from_seqr8   r9   rd   re   head_hidden_sizerf   r   r_   	head_dropfcnamed_modulesrR   r:   initkaiming_normal_weight)r   cfgr\   r]   r^   r_   r1   r2   rA   
block_args	conv_argsnmr   s                r   r   zSelecSls.__init__v   sY    ' /Hb99b9	&[^_i[j(kZWz)HR)H(kl!MMsSY{#[)GY$="$=#[\	474GGD1/4E5
 "	5

 5
1$.$' &&( 	WDAq!RYY'''yv'V	W )l#[s   EEc                     t        ddd      S )Nz^stemz^features\.(\d+)z^head)rk   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   )ro   )r   s    r   get_classifierzSelecSls.get_classifier   s    wwr   c           
      L   || _         t        | j                  | j                   |t        | j                  d      r | j                  j
                  j                  nd t        | j                  d      r | j                  j
                  j                  nd       \  | _        | _        y )Nrs   )rg   r1   r2   )	r\   r   re   hasattrro   rs   r1   r2   r_   )r   r\   r_   s      r   reset_classifierzSelecSls.reset_classifier   ss    &$5!,3DGGX,F477>>((D*1$''8*D$''..&&$%
!$'r   c                     | j                  |      }| j                  |      }| j                  | j                  |            }|S r   )rk   rb   rd   rl   r.   s     r   forward_featureszSelecSls.forward_features   s9    IIaLMM!IIdmmA&'r   
pre_logitsc                 p    | j                  |      }| j                  |      }|r|S | j                  |      S r   )r_   rn   ro   )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   )  rJ   g        avgNNF)T)r   )r   r    r!   __doc__rY   floatstrr   r"   jitignorer~   r   r8   Moduler   r   r   rZ   r   r   r$   r%   s   @r   r   r   f   s    $  $"$ W  W 	 W
  W  WD YY
 
 YYB B YY		  
C 
c 
/$ /
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 )3Nra   r3   zstem.2)num_chs	reductionr   
selecsls42rc   )ra   r   @   r   Tr3   r   r   r      Fr	   )r   r      r   Tr3   )r   r   r      Fr	   )r   r   0  r   Tr3   )r   r   r     Fr	   rb   r      z
features.1r      z
features.3r      z
features.5   zhead.1selecsls42b)r     rJ   r3   r   r   rJ   r	   r      rJ   r3   r   r   r	   r	   rd   r   zhead.3re   )r   r   r   r   rJ   r3   r   r   r	   r	   r   
selecsls60)	r   r   )r   r   r   r   Tr3   )r   r   r   r   Fr	   )r   r   r   r   Fr	   )r   r   r   r   Tr3   r   r   r   r   Fr	   r   )r   r   r     Fr	   z
features.4r   z
features.8selecsls60b)r     rJ   r3   r   r   rJ   r	   r   r   )r   r   r   r   
selecsls84)r   )r   r   r   r   Fr	   )r   r   r   r   Tr3   r   r   r   r   Fr	   r   r   )r   r   r   r   Fr	   )r   r   r   r   Tr3   r   r   r   r   Fr	   r   r   r   )r   r   r      Fr	   r   r   z
features.6r   zfeatures.12))r   r   rJ   r3   r   r   )r   r   rJ   r	   zInvalid net configuration z !!!rf   )r   r	   r3   rJ   r   T)out_indicesflatten_sequential)	model_cfgfeature_cfg)r|   
startswithrD   extendappend
ValueErrorr
   r   )variant
pretrainedkwargsrt   rf   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                 2    | dddddt         t        dddd	|S )
Nr   )rJ      r   )r   r   g      ?bilinearzstem.0ro   z	cc-by-4.0)urlr\   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierlicenser   )r   r   s     r   _cfgr   H  s3    =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   e       L*???r   c                     t        d| fi |S )z%Constructs a SelecSls42_B model.
    r   r   r   s     r   r   r   l       M:@@@r   c                     t        d| fi |S )z#Constructs a SelecSls60 model.
    r   r   r   s     r   r   r   s  r   r   c                     t        d| fi |S )z%Constructs a SelecSls60_B model.
    r   r   r   s     r   r   r   z  r   r   c                     t        d| fi |S )z#Constructs a SelecSls84 model.
    r   r   r   s     r   r   r     r   r   )rJ   r	   Nr	   NN) r   )!r   typingr   r   r"   torch.nnr8   	timm.datar   r   timm.layersr   _builderr
   	_registryr   r   __all__r9   r   r   r'   rB   rD   r   r   r   default_cfgsr   r   r   r   r   r   r   r   <module>r      sl  
    A ) * <,R]] 
'		 
''HBII 'HTZryy ZzBJ	 % !! ! ! !!& " @h @ @ Ax A A @h @ @ Ax A A @h @ @r   