
    ^j9R                     f   d Z ddlmZ ddlmZ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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jF                        Z$ G d dejF                        Z%de&fdZ' G d dejF                        Z( G d dejR                        Z* G d dejF                        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&      Z0e d,d'       Z1e d,d(       Z2e d,d)       Z3e d,d*       Z4y).z?
RDNet
Copyright (c) 2024-present NAVER Cloud Corp.
Apache-2.0
    )partial)ListOptionalTupleUnionCallableTypeNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathcalculate_drop_path_rates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                   t     e Zd Z	 	 ddedededeej                     deej                     f
 fdZd Z xZ	S )	Blockin_chs	inter_chsout_chs
norm_layer	act_layerc                    ||d}t         	|           t        j                  t        j                  ||f|dddd| ||fi |t        j                  ||fdddd| |       t        j                  ||fdddd|      | _        y Ndevicedtype   r      )groupskernel_sizestridepaddingr   r+   r,   r-   )super__init__nn
SequentialConv2dlayers
selfr   r   r    r!   r"   r&   r'   dd	__class__s
            \/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/rdnet.pyr0   zBlock.__init__   s     /mmIIff^V1VW^[]^v$$IIfiRQq!RrRKIIiSa1SPRS
    c                 $    | j                  |      S Nr4   r6   xs     r9   forwardzBlock.forward-       {{1~r:   NN
__name__
__module____qualname__intr	   r1   Moduler0   r@   __classcell__r8   s   @r9   r   r      sU     

 
 	

 RYY
 BII
(r:   r   c                   t     e Zd Z	 	 ddedededeej                     deej                     f
 fdZd Z xZ	S )	BlockESEr   r   r    r!   r"   c                 .   ||d}t         	|           t        j                  t        j                  ||f|dddd| ||fi |t        j                  ||fdddd| |       t        j                  ||fdddd|t        |fi |      | _        y r$   )r/   r0   r1   r2   r3   r   r4   r5   s
            r9   r0   zBlockESE.__init__2   s     /mmIIff^V1VW^[]^v$$IIfiRQq!RrRKIIiSa1SPRSg,,
r:   c                 $    | j                  |      S r<   r=   r>   s     r9   r@   zBlockESE.forwardG   rA   r:   rB   rC   rJ   s   @r9   rL   rL   1   sU     

 
 	

 RYY
 BII
*r:   rL   blockc                     | j                         j                         } | dk(  rt        S | dk(  rt        S J d|  d       )NrO   blockesezUnknown block type (z).)lowerstripr   rL   )rO   s    r9   _get_block_typerT   K   sD    KKM!E	*	6,UG266ur:   c                       e Zd Zdddddddddej                  ej
                  ddfded	ed
ededededededede	ej                     de	ej                     f fdZdeej                     dej                  fdZ xZS )
DenseBlock@         @        r   r   ư>Nnum_input_featuresgrowth_ratebottleneck_width_ratiodrop_path_rate	drop_raterand_gather_step_prob	block_idx
block_typels_init_valuer!   r"   c           	      x   ||d}t         |           || _        || _        || _        || _        || _        |	dkD  r,t        j                  |	t        j                  |fi |z        nd | _        t        |      }t        ||z  dz        dz  }t        |      | _         t        |      d||||
|d|| _        y )Nr%   r      )r   r   r    r!   r"    )r/   r0   r_   r^   r`   ra   r\   r1   	ParametertorchonesgammarG   r   	drop_pathrT   r4   )r6   r[   r\   r]   r^   r_   r`   ra   rb   rc   r!   r"   r&   r'   r7   r   r8   s                   r9   r0   zDenseBlock.__init__V   s      /",%:""&TadeTeR\\-%**[2OB2O"OPko
+&*-CCaGH1L	!.11oj1 
%!
 
r:   r?   returnc                     t        j                  |d      }| j                  |      }| j                  -|j	                  | j                  j                  dddd            }| j                  |      }|S )Nr   )rh   catr4   rj   mulreshaperk   r>   s     r9   r@   zDenseBlock.forward}   s^    IIaOKKN::!djj((B156ANN1r:   )rD   rE   rF   r1   	LayerNormGELUrG   floatstrr	   rH   r0   r   rh   Tensorr@   rI   rJ   s   @r9   rV   rV   U   s     ')!,/$'"+.%#'*,,,)+%
 #%
 %
 %*	%

 "%
 %
 $)%
 %
 %
 !%
 RYY%
 BII%
Nell+  r:   rV   c            	       t     e Zd Z	 	 d	dededee   def fdZdej                  dej                  fdZ	 xZ
S )

DenseStage	num_blockr[   drop_path_ratesr\   c           	          ||d}t         |           t        |      D ]1  }	t        d||||	   |	d||}
||z  }| j	                  d|	 |
       3 || _        y )Nr%   )r[   r\   r^   ra   dense_blockrf   )r/   r0   rangerV   
add_modulenum_out_features)r6   ry   r[   rz   r\   r&   r'   kwargsr7   ilayerr8   s              r9   r0   zDenseStage.__init__   s     /y! 
	6A #5'.q1	
  E +-OOk!-u5
	6 !3r:   init_featurerl   c                 t    |g}| D ]  } ||      }|j                  |        t        j                  |d      S )Nr   )appendrh   ro   )r6   r   featuresmodulenew_features        r9   r@   zDenseStage.forward   sA     > 	)F *KOOK(	) yy1%%r:   rB   )rD   rE   rF   rG   r   rt   r0   rh   rv   r@   rI   rJ   s   @r9   rx   rx      sU     33 !$3 "%[	3
 32&ELL &U\\ &r:   rx   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_listrb   is_downsample_blockr]   transition_compression_ratiorc   	stem_type
patch_sizenum_init_featureshead_init_scalehead_norm_first	conv_biasr"   r!   norm_epsr_   r^   c                    t         %|           ||d}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                  ||f|||d| ||fi |      | _        |}nmd|v rt        |dz        n|}t        j                  t        j                  ||fd	dd
|d|t        j                  ||fd	dd
|d| ||fi |      | _        d}g | _        t        |      | _        |}|}t!        ||d      }g }t#        | j                        D ]+  }g } |dk7  rjt%        ||	z  dz        dz  }!d
x}"}#||   r	|dz  }dx}"}#| j'                   ||fi |       | j'                  t        j                  ||!f|"|#dd|       |!}t)        d||   |||   ||||   |
||   ||d
|}$| j'                  |$       |||   ||   z  z  }|d
z   | j                  k(  s|d
z   | j                  k7  r1||d
z      r)| xj                  t+        ||d| ||         gz  c_        |j'                  t        j                  |         . t        j                  | | _        |x| _        | _        |rB || j.                  fi || _        t5        | j.                  |f|| j                  d|| _        nCt        j8                         | _        t;        | j.                  |f|| j                  |d|| _        t=        t        t>        |      |        y)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.
        r%   N)eps)patchoverlapoverlap_tieredr   )r+   r,   biastiered   r)   r   )r+   r,   r-   r      T)	stagewiser   re   r.   )
ry   r[   r\   r]   r_   rz   rc   rb   r!   r"   zdense_stages.)num_chs	reductionr   r\   )	pool_typer_   )r   r_   r!   )r   rf   ) r/   r0   lenr   r   r   r   r   r_   r1   r2   r3   stemr   feature_info
num_stagesr   r}   rG   r   rx   dictdense_stagesnum_featureshead_hidden_sizenorm_prer   headIdentityr   r   _init_weights)&r6   r   r   r   r   r   rb   r   r]   r   rc   r   r   r   r   r   r   r"   r!   r   r_   r^   r&   r'   r7   stem_stridemid_chscurr_strider   dp_ratesr   r   dense_stage_layerscompressed_num_featuresk_sizer,   stager8   s&                                        r9   r0   zRDNet.__init__   s   b 	/< C$8TC@S<TTTTTT!),	#J/
 :J& " BBBB		($5w:V`gpwtvw,33DI %K@HI@Un%6!%;<[lG		(Gf1aV_fcef		'#4o!AWX_holno,33DI
 K l+!(,^_X\]t' -	DA!#Av*-l=Y.Y\].]*^ab*b'"##&q)1$K&''FV"))*\*HR*HI"))")) ++ !'!+ +   7 )!,#/(O'=# (+%a=%# E %%e,OA.a@@L1u'AET__,DI\]^ab]bIc!! ,"-!.qc2$0O	& ! /A BC[-	D\ MM<84@@D1 &t'8'8?B?DM&!! &..	
 DI KKMDM-!! &..% DI 	GM?KTRr:   c                 .    |rJ d       t        dd      S )Nz,coarse grouping is not implemented for RDNetz^stemz^dense_stages\.(\d+))r   blocks)r   )r6   coarses     r9   group_matcherzRDNet.group_matcherK  s#    IIIz*
 	
r:   c                 4    | j                   D ]	  }||_         y r<   )r   grad_checkpointing)r6   enabless      r9   set_grad_checkpointingzRDNet.set_grad_checkpointingS  s    "" 	*A#)A 	*r:   rl   c                 .    | j                   j                  S r<   )r   fc)r6   s    r9   get_classifierzRDNet.get_classifierX  s    yy||r:   c                 J    || _         | j                  j                  ||       y r<   )r   r   reset)r6   r   r   s      r9   reset_classifierzRDNet.reset_classifier\  s    &		[1r:   r?   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   .rn   r   N)r   rG   splitr   r   r   r   rh   jitis_scripting	enumerater   r   )r6   r?   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexr   last_idxr   feat_idxr   x_inters                     r9   forward_intermediateszRDNet.forward_intermediates`  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   rn   Nr   r    )
r   rG   r   r   r   r   r1   r   r   r   )r6   r   r   r   r   r   r   r   s           r9   prune_intermediate_layerszRDNet.prune_intermediate_layers  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 r<   )r   r   r   r>   s     r9   forward_featureszRDNet.forward_features  s2    IIaLa MM!r:   
pre_logitsc                 N    |r| j                  |d      S | j                  |      S )NT)r   )r   )r6   r?   r   s      r9   forward_headzRDNet.forward_head  s$    0:tyyty,L		!Lr:   c                 J    | j                  |      }| j                  |      }|S r<   )r   r   r>   s     r9   r@   zRDNet.forward  s'    !!!$a r:   )r)     avg)rW   h      r   r   r      )r)   r)   r)   r)   r)   r)   r)   )r   r   rL   rL   rL   rL   rL   NTTFFFTrX         ?rZ   r   r   rW         ?FTgelulayernorm2dNrY   rY   NNF)Tr<   )NFFr   F)r   FT)rD   rE   rF   rG   ru   r   r   r   boolrt   r   r   r0   rh   r   ignorer   r   r1   rH   r   r   rv   r   r   r   r   r@   rI   rJ   s   @r9   r   r      s	    #$9[<Q7YBo,/25#'$%'%'$)".4+(,"$'1^S^S ^S 	^S
  S	5: 56^S #49eCj#89^S d3is34^S "'tDz5;'>!?^S %*^S +0^S !^S ^S ^S  #^S #^S  "!^S" #^S$ S(]+%^S& '^S( uo)^S* +^S, "-^S@ 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r:   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.)
isinstancer1   r3   initkaiming_normal_weightBatchNorm2d	constant_r   Lineardatamul_)r   namer   s      r9   r   r     s    &"))$
.	FBNN	+
&--+
&++q)	FBII	&
&++q)GtOMM##O4KK!!/2 $4 
'r:   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        r9   checkpoint_filter_fnr    sc    *$*(
H  " 1IIlG, Or:   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
pretrainedr   r  s       r9   _create_rdnetr    s6     w
1\dK 	E
 Lr:   c                 8    | dddddt         t        d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/rdnetz
apache-2.0)urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifier	paper_ids
paper_name
origin_urllicenser
   )r  r   s     r9   _cfgr     s<    =v)%.Bi'R9  r:   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(   rW   r   r   r   r   r)   r   r   r   rL   r   r   r   r   r   rb   r  )
rdnet_tinyr  r   r  r   n_layer
model_argsr  s        r9   r&  r&    s    Guuqy0C583=L(+i7)+zlQ.>>*MJ \:\jA[TZA[\ELr:   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   rW   r   r      r   r)   NTTFFFFFFTFr   r   rL   r%  r  )rdnet_smallr'  r(  s        r9   r0  r0    s    Guu!'<<uqyH3=h(+i7)+zlgk.JJj\\]M]]J ]J]$zB\U[B\]ELr:   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   rL   r%  r  )
rdnet_baser'  r(  s        r9   r5  r5    s    G uu!'<<uqyH3=h(+i7)+zlgk.JJj\\]M]]J \:\jA[TZA[\ELr:   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   rL   r%  r  )rdnet_larger'  r(  s        r9   r:  r:  %  s    G 1(==	I3=o(+i7)+zlgk.JJj\\]M]]J ]J]$zB\U[B\]ELr:   )Nr   r   )r   )5__doc__	functoolsr   typingr   r   r   r   r   r	   rh   torch.nnr1   	timm.datar   r   timm.layersr   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rH   r   rL   ru   rT   rV   r2   rx   r   r   r  r  r   default_cfgsr&  r0  r5  r:  rf   r:   r9   <module>rG     sU    ? ?   A2 2 2 * + $ <)BII 2ryy 473 70 0f& &DGBII GT
3  %/102/102'+< 3((D&         r:   