
    NgK                        d Z ddlmZ ddlmZmZmZ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mZmZmZmZmZmZ ddl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e$fdZ% G d dej!                  Z& G d dej'                  Z( G d dej!                  Z)d-dZ*d Z+d.dZ,d/dZ- e e-d            e-d!            e-d"            e-d#            e-d$d%dd&'          d(          Z.ed.d)            Z/ed.d*            Z0ed.d+            Z1ed.d,            Z2dS )0z?
RDNet
Copyright (c) 2024-present NAVER Cloud Corp.
Apache-2.0
    )partial)ListOptionalTupleUnionCallableNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathNormMlpClassifierHeadClassifierHeadEffectiveSEModulemake_divisibleget_act_layerget_norm_layer   )build_model_with_cfg)feature_take_indices)named_apply)register_modelgenerate_default_cfgsRDNetc                   $     e Zd Z fdZd Z xZS )Blockc                 0   t                                                       t          j        t          j        |||ddd           ||          t          j        ||ddd           |            t          j        ||ddd                    | _        d S N   r      )groupskernel_sizestridepaddingr   r!   r"   r#   )super__init__nn
SequentialConv2dlayersselfin_chs	inter_chsout_chs
norm_layer	act_layer	__class__s         M/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/rdnet.pyr&   zBlock.__init__   s    mIffV1VWXXXJvIfiQq!LLLIKKIia1MMM
 
    c                 ,    |                      |          S Nr*   r,   xs     r3   forwardzBlock.forward#       {{1~~r4   __name__
__module____qualname__r&   r:   __classcell__r2   s   @r3   r   r      sG        
 
 
 
 
      r4   r   c                   $     e Zd Z fdZd Z xZS )BlockESEc                 L   t                                                       t          j        t          j        |||ddd           ||          t          j        ||ddd           |            t          j        ||ddd          t          |                    | _        d S r   )r%   r&   r'   r(   r)   r   r*   r+   s         r3   r&   zBlockESE.__init__(   s    mIffV1VWXXXJvIfiQq!LLLIKKIia1MMMg&&
 
r4   c                 ,    |                      |          S r6   r7   r8   s     r3   r:   zBlockESE.forward3   r;   r4   r<   rA   s   @r3   rC   rC   '   sG        	
 	
 	
 	
 	
      r4   rC   blockc                     |                                                                  } | dk    rt          S | dk    rt          S J d|  d            )NrF   blockeseFzUnknown block type (z).)lowerstripr   rC   )rF   s    r3   _get_block_typerK   7   sU    KKMM!!E	*		66U666666r4   c                        e Zd Z	 	 	 	 	 	 	 	 	 	 	 dd	ed
edededededededededef fdZdeej	                 dej	        fdZ
 xZS )
DenseBlock@         @        r   r   ư>layernorm2dgelunum_input_featuresgrowth_ratebottleneck_width_ratiodrop_path_rate	drop_raterand_gather_step_prob	block_idx
block_typels_init_valuer0   r1   c                    t                                                       || _        || _        || _        || _        || _        |	dk    r)t          j        |	t          j
        |          z            nd | _        t          |          }t          ||z  dz            dz  }t          |          | _         t          |          ||||
|          | _        d S )Nr      )r-   r.   r/   r0   r1   )r%   r&   rX   rW   rY   rZ   rU   r'   	Parametertorchonesgammaintr   	drop_pathrK   r*   )r,   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r0   r1   r.   r2   s                r3   r&   zDenseBlock.__init__B   s     	",%:""&N[^_N_N_R\-%*[2I2I"IJJJei
+&&*-CCaGHH1L	!.111oj11%!
 
 
r4   r9   returnc                     t          j        |d          }|                     |          }| j        0|                    | j                            dddd                    }|                     |          }|S )Nr   )r`   catr*   rb   mulreshaperd   r8   s     r3   r:   zDenseBlock.forwarde   se    IaOOKKNN:!dj((B15566ANN1r4   )rN   rN   rO   rP   rP   rP   r   r   rQ   rR   rS   )r=   r>   r?   rc   floatstrr&   r   r`   Tensorr:   r@   rA   s   @r3   rM   rM   A   s         ')!,/$'"+.%#'+#!
 !
 #!
 !
 %*	!

 "!
 !
 $)!
 !
 !
 !!
 !
 !
 !
 !
 !
 !
 !
Fel+         r4   rM   c                   B     e Zd Z fdZdej        dej        fdZ xZS )
DenseStagec           	          t                                                       t          |          D ]7}t          d||||         |d|}||z  }|                     d| |           8|| _        d S )N)rT   rU   rW   rZ   dense_block )r%   r&   rangerM   
add_modulenum_out_features)	r,   	num_blockrT   drop_path_ratesrU   kwargsilayerr2   s	           r3   r&   zDenseStage.__init__q   s    y!! 		6 		6A #5'.q1	 
  E +-OO-!--u5555 2r4   init_featurere   c                 |    |g}| D ]"} ||          }|                     |           #t          j        |d          S )Nr   )appendr`   rh   )r,   r{   featuresmodulenew_features        r3   r:   zDenseStage.forward   sN     > 	) 	)F &**KOOK((((y1%%%r4   )r=   r>   r?   r&   r`   rm   r:   r@   rA   s   @r3   ro   ro   p   s^        3 3 3 3 3&EL &U\ & & & & & & & &r4   ro   c            +           e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d@dedededeee         ee         f         deee         ee         f         deee         ee         f         deee         ee         f         de	de	de	ded ed!ed"e	d#ed$ed%eee
f         d&ed'ee	         d(e	d)e	f* fd*Z	 	 	 	 	 dAd,ej        d-eeeee         f                  d.ed/ed0ed1ed2eeej                 eej        eej                 f         f         fd3Z	 	 	 dBd-eeee         f         d5ed6efd7Zej        j        d2ej        fd8            ZdCdedee         fd9Zd: ZdDd;efd<Zd= Zej        j        dDd>            Zej        j        dEd?            Z xZS )Fr   r     avgrN   h      r   r   r      r   r   r   r   r   r   r   r   r   rC   rC   rC   rC   rC   NTTFFFTrO         ?rQ   patch   rN         ?FTrS   rR   NrP   in_chansnum_classesglobal_poolgrowth_ratesnum_blocks_listr[   is_downsample_blockrV   transition_compression_ratior\   	stem_type
patch_sizenum_init_featureshead_init_scalehead_norm_first	conv_biasr1   r0   norm_epsrX   rW   c                    t                                                       t          |          t          |          cxk    rt          |          k    sn J t          |          }t	          |          }|t          ||          }|| _        || _        |dv sJ |dk    r=t          j	        t          j
        |||||           ||                    | _        |}nnd|v rt          |dz            n|}t          j	        t          j
        ||ddd	|
          t          j
        ||ddd	|
           ||                    | _        d}g | _        t          |          | _        |}|}d t          j        d|t#          |                                        |          D             }g }t'          | j                  D ]Q}g }|dk    ryt)          ||	z  dz            dz  }d	x}} ||         r	|dz  }dx}} |                     ||                     |                    t          j
        |||| d                     |}t-          ||         |||         ||||         |
||         ||
  
        }!|                    |!           |||         ||         z  z  }|d	z   | j        k    s|d	z   | j        k    r6||d	z            r+| xj        t/          ||d| ||                   gz  c_        |                    t          j	        |            St          j	        | | _        |x| _        | _        |r8 || j                  | _        t9          | j        ||| j                  | _        n;t          j                    | _        t?          | j        ||| j        |          | _        tA          t          tB          |          |            dS )a	  
        Args:
            in_chans: Number of input image channels.
            num_classes: Number of classes for classification head.
            global_pool: Global pooling type.
            growth_rates: Growth rate at each stage.
            num_blocks_list: Number of blocks at each stage.
            is_downsample_block: Whether to downsample at each stage.
            bottleneck_width_ratio: Bottleneck width ratio (similar to mlp expansion ratio).
            transition_compression_ratio: Channel compression ratio of transition layers.
            ls_init_value: Init value for Layer Scale, disabled if None.
            stem_type: Type of stem.
            patch_size: Stem patch size for patch stem.
            num_init_features: Number of features of stem.
            head_init_scale: Init scaling value for classifier weights and biases.
            head_norm_first: Apply normalization before global pool + head.
            conv_bias: Use bias layers w/ all convolutions.
            act_layer: Activation layer type.
            norm_layer: Normalization layer type.
            norm_eps: Small value to avoid division by zero in normalization.
            drop_rate: Head pre-classifier dropout rate.
            drop_path_rate: Stochastic depth drop rate.
        N)eps)r   overlapoverlap_tieredr   )r!   r"   biastiered   r   r   )r!   r"   r#   r   r   c                 6    g | ]}|                                 S rr   )tolist).0r9   s     r3   
<listcomp>z"RDNet.__init__.<locals>.<listcomp>   s     www1AHHJJwwwr4   r   r^   r$   )
rv   rT   rU   rV   rX   rw   r\   r[   r0   r1   zdense_stages.)num_chs	reductionr   rU   )	pool_typerX   )r   rX   r0   )r   )"r%   r&   lenr   r   r   r   rX   r'   r(   r)   stemr   feature_info
num_stagesr`   linspacesumsplitrs   rc   r}   ro   dictdense_stagesnum_featureshead_hidden_sizenorm_prer   headIdentityr   r   _init_weights)#r,   r   r   r   r   r   r[   r   rV   r   r\   r   r   r   r   r   r   r1   r0   r   rX   rW   stem_stridemid_chscurr_strider   dp_ratesr   ry   dense_stage_layerscompressed_num_featuresk_sizer"   stager2   s#                                     r3   r&   zRDNet.__init__   s|   ^ 	<  C$8$8TTTTC@S<T<TTTTTTT!),,	#J//
 :::J&" BBBBB	($5:V`gpqqq
,-- DI %KK@HI@U@Un%6!%;<<<[lG	(G1aV_```	'#4!AWX_hiii
,-- DI
 K l++!(wwq.#oJ^J^(_(_(e(efu(v(vwwwt'' '	D '	DA!#Avv*-l=Y.Y\].]*^*^ab*b'"##&q) (1$K&''FV"))**\*B*BCCC"))Il,CQW`fpqrrr    7)!,#/(O'=# (+%a=%#  E %%e,,,OA.a@@L1u''AET_,D,DI\]^ab]bIc,D!! ,"-2q22$0O	  & !! /A BCCCCM<84@@D1  	&Jt'899DM&!%.	  DII KMMDM-!%.%  DI 	GM?KKKTRRRRRr4   NCHWr9   indicesnorm
stop_early
output_fmtintermediates_onlyre   c                    |dv s
J d            g }t          t          | j                  dz   |          \  }}	d}
|                     |          }|
|v r|                    |           t
          j                                        s|s| j        }n| j        d|	         }|D ]+}|
dz  }
 ||          }|
|v r|                    |           ,|r|S |                     |          }||fS )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        )r   zOutput shape must be NCHW.r   r   N)	r   r   r   r   r}   r`   jitis_scriptingr   )r,   r9   r   r   r   r   r   intermediatestake_indices	max_indexfeat_idxr   r   s                r3   forward_intermediateszRDNet.forward_intermediates  s%   & Y&&&(D&&&"6s4;L7M7MPQ7QSZ"["[i IIaLL|##  ###9!!## 	9: 	9,LL,ZiZ8L! 	( 	(EMHaA<''$$Q''' 	!  MM!-r4   r   
prune_norm
prune_headc                     t          t          | j                  dz   |          \  }}| j        d|         | _        |rt          j                    | _        |r|                     dd           |S )z@ Prune layers not required for specified intermediates.
        r   Nr    )r   r   r   r'   r   r   reset_classifier)r,   r   r   r   r   r   s         r3   prune_intermediate_layerszRDNet.prune_intermediate_layersK  sw     #7s4;L7M7MPQ7QSZ"["[i -jyj9 	*KMMDM 	)!!!R(((r4   c                     | j         j        S r6   )r   fc)r,   s    r3   get_classifierzRDNet.get_classifier[  s    y|r4   c                 <    | j                             ||           d S r6   )r   reset)r,   r   r   s      r3   r   zRDNet.reset_classifier_  s    	[11111r4   c                 Z    |                      |          }|                     |          }|S r6   )r   r   r8   s     r3   forward_featureszRDNet.forward_featuresb  s)    IIaLLa  r4   
pre_logitsc                 ^    |r|                      |d          n|                      |          S )NT)r   )r   )r,   r9   r   s      r3   forward_headzRDNet.forward_headg  s,    0:Ltyyty,,,		!Lr4   c                 Z    |                      |          }|                     |          }|S r6   )r   r   r8   s     r3   r:   zRDNet.forwardj  s)    !!!$$IIaLLr4   c                 <    |r
J d            t          dd          S )Nz,coarse grouping is not implemented for RDNetz^stemz^dense_stages\.(\d+))r   blocks)r   )r,   coarses     r3   group_matcherzRDNet.group_matchero  s4    IIIIII*
 
 
 	
r4   c                 (    | j         D ]	}||_        
d S r6   )r   grad_checkpointing)r,   enabless      r3   set_grad_checkpointingzRDNet.set_grad_checkpointingw  s)    " 	* 	*A#)A  	* 	*r4   )r   r   r   r   r   r   r   rO   r   rQ   r   r   rN   r   FTrS   rR   NrP   rP   )NFFr   F)r   FTr6   F)T)r=   r>   r?   rc   rl   r   r   r   boolrk   r   r   r&   r`   rm   r   r   r   ignorer'   Moduler   r   r   r   r:   r   r   r@   rA   s   @r3   r   r      s        #$9[<Q7YBo,/25#'$%'%'$)".4+(,"$'-RS RSRS RS 	RS
  S	5: 56RS #49eCj#89RS d3is34RS "'tDz5;'>!?RS %*RS +0RS !RS RS RS  #RS #RS  "!RS" #RS$ S(]+%RS& 'RS( uo)RS* +RS, "-RS RS RS RS RS RSn 8<$$',-  - |-  eCcN34-  	- 
 -  -  !%-  
tEL!5tEL7I)I#JJ	K-  -  -  - b ./$#	 3S	>*  	     Y	    2 2C 2hsm 2 2 2 2  
M M$ M M M M  
 Y
 
 
 
 Y* * * * * * * *r4   r   c                 d   t          | t          j                  r&t          j                            | j                   d S t          | t          j                  rLt          j                            | j        d           t          j                            | j        d           d S t          | t          j	                  rkt          j                            | j        d           |rFd|v rD| j        j
                            |           | j        j
                            |           d S d S d S d S )Nr   r   zhead.)
isinstancer'   r)   initkaiming_normal_weightBatchNorm2d	constant_r   Lineardatamul_)r   namer   s      r3   r   r   }  s   &")$$ 	3
.....	FBN	+	+ 3
&-+++
&+q)))))	FBI	&	& 3
&+q))) 	3GtOOM##O444K!!/22222	3 3	3 	3OOr4   c                     d| v r| S d| v r| d         } i }|                                  D ] \  }}|                    dd          }|||<   !|S )z Remap NV checkpoints -> timm zstem.0.weightmodelz
stem.stem.zstem.)itemsreplace)
state_dictr   out_dictkvs        r3   checkpoint_filter_fnr    so    *$$*(
H  ""  1IIlG,,Or4   Fc                 \    t          t          | |ft          t          dd          d|}|S )N)r   r   r   r   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r  r   )variant
pretrainedrx   r   s       r3   _create_rdnetr	    sF     w
1\dKKK  	 E
 Lr4   r   c                 :    | dddddt           t          dddd	d
d|S )Nr   )r   r   r   )r   r   g?bicubiczstem.0zhead.fczarXiv:2403.19588z:DenseNets Reloaded: Paradigm Shift Beyond ResNets and ViTsz!https://github.com/naver-ai/rdnet)urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifier	paper_ids
paper_name
origin_urlr	   )r  rx   s     r3   _cfgr    s>    =v)%.Bi'R9
 
 
 
r4   znaver-ai/rdnet_tiny.nv_in1k)	hf_hub_idznaver-ai/rdnet_small.nv_in1kznaver-ai/rdnet_base.nv_in1kznaver-ai/rdnet_large.nv_in1kz(naver-ai/rdnet_large.nv_in1k_ft_in1k_384)r     r  )   r  )r  r  r  r  )zrdnet_tiny.nv_in1kzrdnet_small.nv_in1kzrdnet_base.nv_in1kzrdnet_large.nv_in1kzrdnet_large.nv_in1k_ft_in1k_384c           	          d}ddgdgz   dgdz  z   dgz   dg|z  dd	d
gd
gz   dgdz  z   dgz   d}t          dd| it          |fi |}|S )Nr   rN   r   r   r   r   r   r   r   r   rC   r   r   r   r   r   r[   
rdnet_tinyr  )r  r	  r   r  rx   n_layer
model_argsr   s        r3   r  r    s    Guuqy0C583=L(+i7)+zlQ.>>*M J \\:\jA[A[TZA[A[\\ELr4   c           	          d}ddgdgz   dg|dz
  z  z   dgdz  z   dg|z  d	d
dgdgz   dg|dz
  z  z   dgdz  z   d}t          dd| it          |fi |}|S )N   H   rN   r   r      r   r   NTTFFFFFFTFr   r   rC   r  rdnet_smallr  )r(  r  r   s        r3   r(  r(    s    Guu!'<<uqyH3=h(+i7)+zlgk.JJj\\]M]] J ]]J]$zB\B\U[B\B\]]ELr4   c           	          d}ddgdgz   dg|dz
  z  z   dgdz  z   d	g|z  d
ddgdgz   dg|dz
  z  z   dgdz  z   d}t          dd| it          |fi |}|S )Nr$  x   `   r      r   iP  r   r   r'  r   r   rC   r  
rdnet_baser  )r-  r  r   s        r3   r-  r-    s    G uu!'<<uqyH3=h(+i7)+zlgk.JJj\\]M]] J \\:\jA[A[TZA[A[\\ELr4   c           	          d}ddgdgz   dg|dz
  z  z   dgdz  z   d	g|z  d
ddgdgz   dg|dz
  z  z   dgdz  z   d}t          dd| it          |fi |}|S )Nr     r         r   ih  r   r   )NTTFFFFFFFTFr   r   rC   r  rdnet_larger  )r2  r  r   s        r3   r2  r2    s    G 1(==	I3=o(+i7)+zlgk.JJj\\]M]] J ]]J]$zB\B\U[B\B\]]ELr4   )Nr   r   )r   )3__doc__	functoolsr   typingr   r   r   r   r   r`   torch.nnr'   	timm.datar
   r   timm.layersr   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r   r   rC   rl   rK   rM   r(   ro   r   r   r  r	  r  default_cfgsr  r(  r-  r2  rr   r4   r3   <module>r?     s          9 9 9 9 9 9 9 9 9 9 9 9 9 9        A A A A A A A A2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 * * * * * * + + + + + + $ $ $ $ $ $ < < < < < < < <)    BI       ry    73 7 7 7 7, , , , , , , ,^& & & & & & & &.s* s* s* s* s*BI s* s* s*l
3 
3 
3 
3          %$$/1 1 1402 2 2$/1 1 1402 2 2'+t< 3((D (D (D& &                    r4   