
    khMM                     ^   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jB                        Z" G d dejB                        Z#de$fdZ% G d dejB                        Z& G d dejN                        Z( G d dejB                        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*       Z2y).z?
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                    t         |           t        j                  t        j                  |||ddd       ||      t        j                  ||ddd       |       t        j                  ||ddd            | _        y 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/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/rdnet.pyr&   zBlock.__init__   sj    mmIIffV1VWXvIIfiQq!LKIIia1M
    c                 $    | j                  |      S Nr*   r,   xs     r3   forwardzBlock.forward#       {{1~r4   __name__
__module____qualname__r&   r:   __classcell__r2   s   @r3   r   r      s    
r4   r   c                   $     e Zd Z fdZd Z xZS )BlockESEc                    t         |           t        j                  t        j                  |||ddd       ||      t        j                  ||ddd       |       t        j                  ||ddd      t        |            | _        y r   )r%   r&   r'   r(   r)   r   r*   r+   s         r3   r&   zBlockESE.__init__(   sr    mmIIffV1VWXvIIfiQq!LKIIia1Mg&
r4   c                 $    | j                  |      S r6   r7   r8   s     r3   r:   zBlockESE.forward3   r;   r4   r<   rA   s   @r3   rC   rC   '   s    	
r4   rC   blockc                     | j                         j                         } | dk(  rt        S | dk(  rt        S J d|  d       )NrF   blockesezUnknown block type (z).)lowerstripr   rC   )rF   s    r3   _get_block_typerK   7   sD    KKM!E	*	6,UG266ur4   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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                 j   t         |           || _        || _        || _        || _        || _        |	dkD  r+t        j                  |	t        j                  |      z        nd | _        t        |      }t        ||z  dz        dz  }t        |      | _         t        |      ||||
|      | _        y )Nr      )r-   r.   r/   r0   r1   )r%   r&   rR   rQ   rS   rT   rO   r'   	Parametertorchonesgammaintr   	drop_pathrK   r*   )r,   rN   rO   rP   rQ   rR   rS   rT   rU   rV   r0   r1   r.   r2   s                r3   r&   zDenseBlock.__init__B   s     	",%:""&N[^_N_R\\-%**[2I"IJei
+&*-CCaGH1L	!.11oj1%!
r4   r9   returnc                     t        j                  |d      }| j                  |      }| j                  -|j	                  | j                  j                  dddd            }| j                  |      }|S )Nr   )rZ   catr*   r\   mulreshaper^   r8   s     r3   r:   zDenseBlock.forwarde   s^    IIaOKKN::!djj((B156ANN1r4   )@   re         @        rg   rg   r   r   ư>layernorm2dgelu)r=   r>   r?   r]   floatstrr&   r   rZ   Tensorr:   r@   rA   s   @r3   rM   rM   A   s     ')!,/$'"+.%#'+#!
 #!
 !
 %*	!

 "!
 !
 $)!
 !
 !
 !!
 !
 !
Fell+  r4   rM   c                   V     e Zd Z fdZdej
                  dej
                  fdZ xZS )
DenseStagec           	          t         |           t        |      D ]/  }t        d||||   |d|}||z  }| j	                  d| |       1 || _        y )N)rN   rO   rQ   rT   dense_block )r%   r&   rangerM   
add_modulenum_out_features)	r,   	num_blockrN   drop_path_ratesrO   kwargsilayerr2   s	           r3   r&   zDenseStage.__init__q   sx    y! 		6A #5'.q1	
 E +-OOk!-u5		6 !3r4   init_featurer_   c                 t    |g}| D ]  } ||      }|j                  |        t        j                  |d      S )Nr   )appendrZ   rb   )r,   r{   featuresmodulenew_features        r3   r:   zDenseStage.forward   sA     > 	)F *KOOK(	) yy1%%r4   )r=   r>   r?   r&   rZ   rm   r:   r@   rA   s   @r3   ro   ro   p   s#    3&ELL &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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e   fdZ	 	 	 	 	 d.dej,                  deeeee   f      deded ed!edeeej,                     eej,                  eej,                     f   f   fd"Z	 	 	 d/deeee   f   d#ed$efd%Zd& Zd+d'efd(Zd) Z xZS )0r   in_chansnum_classesglobal_poolgrowth_ratesnum_blocks_listrU   is_downsample_blockrP   transition_compression_ratiorV   	stem_type
patch_sizenum_init_featureshead_init_scalehead_norm_first	conv_biasr1   r0   norm_epsrR   rQ   c                 "   t         #|           t        |      t        |      cxk(  rt        |      k(  sJ  J t        |      }t	        |      }|t        ||      }|| _        || _        |dv sJ |dk(  r<t        j                  t        j                  |||||       ||            | _        |}njd|v rt        |dz        n|}t        j                  t        j                  ||ddd	|
      t        j                  ||ddd	|
       ||            | _        d}g | _        t        |      | _        |}|}t        j                   d|t#        |            j%                  |      D cg c]  }|j'                          }}g }t)        | j                        D ](  }g }|dk7  rht+        ||	z  dz        dz  }d	x} }!||   r	|dz  }dx} }!|j-                   ||             |j-                  t        j                  ||| |!d             |}t/        ||   |||   ||||   |
||   ||
      }"|j-                  |"       |||   ||   z  z  }|d	z   | j                  k(  s|d	z   | j                  k7  r1||d	z      r)| xj                  t1        ||d| ||         gz  c_        |j-                  t        j                  |        + t        j                  | | _        |x| _        | _        |r@ || j4                        | _        t;        | j4                  ||| j                        | _        nBt        j>                         | _        tA        | j4                  ||| j                  |      | _        tC        t        tD        |      |        yc c}w )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)patchoverlapoverlap_tieredr   )r!   r"   biastiered   r   r   )r!   r"   r#   r      r   rX   r$   )
rv   rN   rO   rP   rR   rw   rV   rU   r0   r1   zdense_stages.)num_chs	reductionr   rO   )	pool_typerR   )r   rR   r0   )r   )#r%   r&   lenr   r   r   r   rR   r'   r(   r)   stemr   feature_info
num_stagesrZ   linspacesumsplittolistrs   r]   r}   ro   dictdense_stagesnum_featureshead_hidden_sizenorm_prer   headIdentityr   r   _init_weights)$r,   r   r   r   r   r   rU   r   rP   r   rV   r   r   r   r   r   r   r1   r0   r   rR   rQ   stem_stridemid_chscurr_strider   r9   dp_ratesr   ry   dense_stage_layerscompressed_num_featuresk_sizer"   stager2   s$                                      r3   r&   zRDNet.__init__   s   ^ 	< C$8TC@S<TTTTTT!),	#J/
 :J&" BBBB		($5:V`gpq,-DI %K@HI@Un%6!%;<[lG		(G1aV_`		'#4!AWX_hi,-DI
 K l+!((-q.#oJ^(_(e(efu(vw1AHHJwwt' '	DA!#Av*-l=Y.Y\].]*^ab*b'"##&q)1$K&''FV"))*\*BC"))IIl,CQW`fpqr  7)!,#/(O'=# (+%a=%#E %%e,OA.a@@L1u'AET__,DI\]^ab]bIc!! ,"-!.qc2$0O	& ! /A BCO'	DP MM<84@@D1 &t'8'89DM&!!%..	DI KKMDM-!!%..%DI 	GM?KTRE xs   +N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_matcher  s#    IIIz*
 	
r4   c                 4    | j                   D ]	  }||_         y r6   )r   grad_checkpointing)r,   enabless      r3   set_grad_checkpointingzRDNet.set_grad_checkpointing$  s    "" 	*A#)A 	*r4   r_   c                 .    | j                   j                  S r6   )r   fc)r,   s    r3   get_classifierzRDNet.get_classifier)  s    yy||r4   c                 J    || _         | j                  j                  ||       y r6   )r   r   reset)r,   r   r   s      r3   reset_classifierzRDNet.reset_classifier-  s    &		[1r4   r9   indicesnorm
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }| j                   D cg c]"  }t        |d   j                  d      d         $ }	}t        t	        |	      |      \  }
}|
D cg c]  }|	|   	 }
}|	|   }| j                  |      }t	        | j                        dz
  }t        j                  j                         s|s| j                  }n| j                  d|dz    }t        |      D ]>  \  }} ||      }||
v s|r||k(  r| j                  |      }n|}|j                  |       @ |r|S |k(  r| j                  |      }||fS c c}w c c}w )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
        )NCHWzOutput shape must be NCHW.r   .ra   r   N)r   r]   r   r   r   r   r   rZ   jitis_scripting	enumerater   r}   )r,   r9   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexry   last_idxr   feat_idxr   x_inters                     r3   forward_intermediateszRDNet.forward_intermediates1  se   & Y&D(DD&EIEVEVWTc$x...s3B78W
W"6s:"Pi/;<!
1<<y)	 IIaLt(()A-99!!#:,,L,,^i!m<L(6 	.OHeaA<'H0"mmA.GG$$W-	.   xa A-9 X<s   'E!E
prune_norm
prune_headc                 D   | j                   D cg c]"  }t        |d   j                  d      d         $ }}t        t	        |      |      \  }}||   }| j
                  d|dz    | _        |rt        j                         | _        |r| j                  dd       |S c c}w )z@ Prune layers not required for specified intermediates.
        r   r   ra   Nr   r    )
r   r]   r   r   r   r   r'   r   r   r   )r,   r   r   r   r   r   r   r   s           r3   prune_intermediate_layerszRDNet.prune_intermediate_layersd  s     FJEVEVWTc$x...s3B78W
W"6s:"Piy)	 --ny1}=KKMDM!!!R( Xs   'Bc                 l    | j                  |      }| j                  |      }| j                  |      }|S r6   )r   r   r   r8   s     r3   forward_featureszRDNet.forward_featuresv  s2    IIaLa MM!r4   
pre_logitsc                 N    |r| j                  |d      S | j                  |      S )NT)r   )r   )r,   r9   r   s      r3   forward_headzRDNet.forward_head|  s$    0:tyyty,L		!Lr4   c                 J    | j                  |      }| j                  |      }|S r6   )r   r   r8   s     r3   r:   zRDNet.forward  s'    !!!$a r4   )r     avg)re   h      r   r   r      )r   r   r   r   r   r   r   )r   r   rC   rC   rC   rC   rC   NTTFFFTrf         ?rh   r   r   re         ?FTrj   ri   Nrg   rg   F)Tr6   )NFFr   F)r   FT)r=   r>   r?   r]   rl   r   r   r   boolrk   r   r   r&   rZ   r   ignorer   r   r'   Moduler   r   rm   r   r   r   r   r:   r@   rA   s   @r3   r   r      s    #$9[<Q7YBo,/25#'$%'%'$)".4+(,"$'-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h YY
 
 YY* * YY		  2C 2hsm 2 8<$$',1 ||1  eCcN341  	1 
 1  1  !%1  
tELL!5tELL7I)I#JJ	K1 j ./$#	3S	>*  	$M$ Mr4   r   c                    t        | t        j                        r*t        j                  j	                  | j
                         y t        | t        j                        rUt        j                  j                  | j
                  d       t        j                  j                  | j                  d       y t        | t        j                        r}t        j                  j                  | j                  d       |rPd|v rK| j
                  j                  j                  |       | j                  j                  j                  |       y y y y )Nr   r   zhead.)
isinstancer'   r)   initkaiming_normal_weightBatchNorm2d	constant_r   Lineardatamul_)r   namer   s      r3   r   r     s    &"))$
.	FBNN	+
&--+
&++q)	FBII	&
&++q)GtOMM##O4KK!!/2 $4 
'r4   c                     d| v r| S d| v r| d   } i }| j                         D ]  \  }}|j                  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    sc    *$*(
H  " 1IIlG, Or4   c                 N    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	    s6     w
1\dK 	E
 Lr4   c                 6    | 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    s9    =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   re   r   r   r   r   r   r   r   r   rC   r   r   r   r   r   rU   r  )
rdnet_tiny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[TZA[\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   re   r   r      r   r   NTTFFFFFFTFr   r   rC   r  r  )rdnet_smallr  r   s        r3   r(  r(    s    Guu!'<<uqyH3=h(+i7)+zlgk.JJj\\]M]]J ]J]$zB\U[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  r  )
rdnet_baser  r   s        r3   r-  r-    s    G uu!'<<uqyH3=h(+i7)+zlgk.JJj\\]M]]J \:\jA[TZA[\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  r  )rdnet_larger  r   s        r3   r2  r2    s    G 1(==	I3=o(+i7)+zlgk.JJj\\]M]]J ]J]$zB\U[B\]ELr4   )Nr   r   )r   )3__doc__	functoolsr   typingr   r   r   r   r   rZ   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?     sT    9 9   A2 2 2 * + $ <)BII ryy  73 7, ,^& &.{BII {|
3  %/102/102'+< 3((D&         r4   