o
    پiMM                     @   s  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 dej!Z"G dd dej!Z#de$fddZ%G dd dej!Z&G dd dej'Z(G dd dej!Z)d6ddZ*dd Z+d7dd Z,d8d"d#Z-ee-d$d%e-d&d%e-d'd%e-d(d%e-d)d*dd+d,d-Z.ed7d.d/Z/ed7d0d1Z0ed7d2d3Z1ed7d4d5Z2dS )9z?
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dZdd Z  ZS )Blockc                    sZ   t    ttj|||dddd||tj||dddd| tj||d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__ E/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/rdnet.pyr$      s   

zBlock.__init__c                 C   
   |  |S Nr(   r*   xr2   r2   r3   forward#      
zBlock.forward__name__
__module____qualname__r$   r9   __classcell__r2   r2   r0   r3   r      s    
r   c                       r   )BlockESEc                    s`   t    ttj|||dddd||tj||dddd| tj||ddddt|| _d S r   )r#   r$   r%   r&   r'   r   r(   r)   r0   r2   r3   r$   (   s   

zBlockESE.__init__c                 C   r4   r5   r6   r7   r2   r2   r3   r9   3   r:   zBlockESE.forwardr;   r2   r2   r0   r3   r@   '   s    r@   blockc                 C   s4   |    } | dkrtS | dkrtS J d|  d)NrA   blockeseFzUnknown block type (z).)lowerstripr   r@   )rA   r2   r2   r3   _get_block_type7   s   rE   c                       s|   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dZdeej	 dej	fddZ
  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_valuer.   r/   c                    s   t    || _|| _|| _|| _|| _|	dkr"t|	t	
| nd | _t|}t|| d d }t|| _t|||||
|d| _d S )Nr      )r+   r,   r-   r.   r/   )r#   r$   rQ   rP   rR   rS   rN   r%   	Parametertorchonesgammaintr   	drop_pathrE   r(   )r*   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r.   r/   r,   r0   r2   r3   r$   B   s"   
"
zDenseBlock.__init__r8   returnc                 C   sF   t |d}| |}| jd ur|| jdddd}| |}|S )Nr   )rX   catr(   rZ   mulreshaper\   r7   r2   r2   r3   r9   e   s   


zDenseBlock.forward)rG   rG   rH   rI   rI   rI   r   r   rJ   rK   rL   )r<   r=   r>   r[   floatstrr$   r   rX   Tensorr9   r?   r2   r2   r0   r3   rF   A   sH    	
"#rF   c                       s2   e Zd Z fddZdejdejfddZ  ZS )
DenseStagec                    sX   t    t|D ]}td|||| |d|}||7 }| d| | q	|| _d S )N)rM   rN   rP   rS   dense_blockr2   )r#   r$   rangerF   
add_modulenum_out_features)r*   	num_blockrM   drop_path_ratesrN   kwargsilayerr0   r2   r3   r$   q   s   

zDenseStage.__init__init_featurer]   c                 C   s.   |g}| D ]}||}| | qt|dS )Nr   )appendrX   r_   )r*   ro   featuresmodulenew_featurer2   r2   r3   r9      s
   zDenseStage.forward)r<   r=   r>   r$   rX   rd   r9   r?   r2   r2   r0   r3   re   p   s    re   c                +       s  e Zd Z											
											dJd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*d+ZejjdKd,d-ZejjdLd.d/Zejjd0ejfd1d2ZdMdedee fd3d4Z				5	dNd6ejd7eeeee f  d8ed9ed:ed;ed0eeej eejeej f f fd<d=Z	>		dOd7eeee f d?ed@efdAdBZdCdD ZdKdEefdFdGZdHdI Z  ZS )Pr   r     avgrG   h      rx   rx   rx      r   r   r   r   r   r   r   r   r   r@   r@   r@   r@   r@   NTTFFFTrH         ?rJ   patch   rG         ?FTrL   rK   NrI   in_chansnum_classesglobal_poolgrowth_ratesnum_blocks_listrT   is_downsample_blockrO   transition_compression_ratiorU   	stem_type
patch_sizenum_init_featureshead_init_scalehead_norm_first	conv_biasr/   r.   norm_epsrQ   rP   c           "         s  t    t|t|  krt|ksJ  J t|}t|}|dur+t||d}|| _|| _|dv s7J |dkrOt	tj
|||||d||| _|}n*d|v rYt|d n|}t	tj
||ddd	|d
tj
||ddd	|d
||| _d}g | _t|| _|}|}dd td|t||D }g }t| jD ]}g }|dkrt||	 d d }d	 }} || r|d9 }d }} ||| |tj
|||| dd |}t|| ||| |||| |
|| ||d
}!||! ||| ||  7 }|d	 | jks|d	 | jkr$||d	  r$|  jt||d| || dg7  _|tj	|  qtj	| | _| | _| _|rN|| j| _t| j||| jd| _nt | _t| j||| j|d| _t tt!|d|  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                 S   s   g | ]}|  qS r2   )tolist).0r8   r2   r2   r3   
<listcomp>       z"RDNet.__init__.<locals>.<listcomp>r   rV   r"   )
rj   rM   rN   rO   rQ   rk   rU   rT   r.   r/   zdense_stages.)num_chs	reductionrr   rN   )	pool_typerQ   )r   rQ   r.   )r   )"r#   r$   lenr   r   r   r   rQ   r%   r&   r'   stemr   feature_info
num_stagesrX   linspacesumsplitrg   r[   rp   re   dictdense_stagesnum_featureshead_hidden_sizenorm_prer   headIdentityr   r   _init_weights)"r*   r   r   r   r   r   rT   r   rO   r   rU   r   r   r   r   r   r   r/   r.   r   rQ   rP   stem_stridemid_chscurr_strider   dp_ratesr   rm   dense_stage_layerscompressed_num_featuresk_sizer    stager0   r2   r3   r$      s   
/(
"
.

zRDNet.__init__c                 C   s   |rJ dt dddS )Nz,coarse grouping is not implemented for RDNetz^stemz^dense_stages\.(\d+))r   blocks)r   )r*   coarser2   r2   r3   group_matcher  s
   zRDNet.group_matcherc                 C   s   | j D ]}||_qd S r5   )r   grad_checkpointing)r*   enablesr2   r2   r3   set_grad_checkpointing$  s   
zRDNet.set_grad_checkpointingr]   c                 C   s   | j jS r5   )r   fc)r*   r2   r2   r3   get_classifier)  s   zRDNet.get_classifierc                 C   s   || _ | j|| d S r5   )r   r   reset)r*   r   r   r2   r2   r3   reset_classifier-  s   zRDNet.reset_classifierNCHWr8   indicesnorm
stop_early
output_fmtintermediates_onlyc                    s   |dv sJ dg }dd | j D  tt |\}}	 fdd|D } |	 }	| |}t| jd }
tj s;|s?| j}n	| jd|	d  }t|D ]\}}||}||v rk|rd||
krd| 	|}n|}|
| qL|rp|S ||
kry| 	|}||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.c                 S   "   g | ]}t |d  dd qS rr   .r^   r[   r   r   infor2   r2   r3   r   F     " z/RDNet.forward_intermediates.<locals>.<listcomp>c                    s   g | ]} | qS r2   r2   )r   rm   
stage_endsr2   r3   r   H  r   r   N)r   r   r   r   r   rX   jitis_scripting	enumerater   rp   )r*   r8   r   r   r   r   r   intermediatestake_indices	max_indexlast_idxr   feat_idxr   x_interr2   r   r3   forward_intermediates1  s0   


zRDNet.forward_intermediatesr   
prune_norm
prune_headc                 C   s`   dd | j D }tt||\}}|| }| jd|d  | _|r&t | _|r.| dd |S )z@ Prune layers not required for specified intermediates.
        c                 S   r   r   r   r   r2   r2   r3   r   l  r   z3RDNet.prune_intermediate_layers.<locals>.<listcomp>Nr   r    )r   r   r   r   r%   r   r   r   )r*   r   r   r   r   r   r   r2   r2   r3   prune_intermediate_layersd  s   
zRDNet.prune_intermediate_layersc                 C   s"   |  |}| |}| |}|S r5   )r   r   r   r7   r2   r2   r3   forward_featuresv  s   


zRDNet.forward_features
pre_logitsc                 C   s   |r	| j |ddS |  |S )NT)r   )r   )r*   r8   r   r2   r2   r3   forward_head|  s   zRDNet.forward_headc                 C   s   |  |}| |}|S r5   )r   r   r7   r2   r2   r3   r9     s   

zRDNet.forward)r   rt   ru   rv   rz   r{   r|   rH   r}   rJ   r~   r   rG   r   FTrL   rK   NrI   rI   F)Tr5   )NFFr   F)r   FT)r<   r=   r>   r[   rc   r   r   r   boolrb   r   r   r$   rX   r   ignorer   r   r%   Moduler   r   rd   r   r   r   r   r9   r?   r2   r2   r0   r3   r      s    	

  
5
r   c                 C   s   t | tjrtj| j d S t | tjr'tj| jd tj| jd d S t | tj	rKtj| jd |rMd|v rO| 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_)rr   namer   r2   r2   r3   r     s   r   c                 C   sJ   d| v r| S d| v r| d } i }|   D ]\}}|dd}|||< q|S )z Remap NV checkpoints -> timm zstem.0.weightmodelz
stem.stem.zstem.)itemsreplace)
state_dictr   out_dictkvr2   r2   r3   checkpoint_filter_fn  s   
r   Fc                 K   s&   t t| |fttdddd|}|S )N)r   r   r   r   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   r   )variant
pretrainedrl   r   r2   r2   r3   _create_rdnet  s   
r   r   c                 K   s$   | dddddt tdddd	d
d|S )Nrt   )r   ry   ry   )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   rl   r2   r2   r3   _cfg  s   	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                 K   sn   d}ddgdg dgd  dg dg| dd	d
gd
g dgd  dg d}t dd| it|fi |}|S )Nr   rG   rw   rx   r   ry   r   r|   r}   r   r@   r   r   r   r   r   rT   
rdnet_tinyr   )r  r   r   r   rl   n_layer
model_argsr   r2   r2   r3   r    s   r  c              	   K   s~   d}ddgdg dg|d   dgd  dg| d	d
dgdg dg|d   dgd  d}t dd| it|fi |}|S )N   H   rG   rx   r      r   r   NTTFFFFFFTFr}   r   r@   r  rdnet_smallr   )r  r  r  r2   r2   r3   r       ""r  c              	   K   ~   d}ddgdg dg|d   dgd  d	g| d
ddgdg dg|d   dgd  d}t dd| it|fi |}|S )Nr  x   `   rx      r   iP  r   r   r  r}   r   r@   r  
rdnet_baser   )r  r  r  r2   r2   r3   r    r  r  c              	   K   r  )Nr     rx         r   ih  r   r   )NTTFFFFFFFTFr}   r   r@   r  rdnet_larger   )r   r  r  r2   r2   r3   r     r  r   )Nr   r   )r   )3__doc__	functoolsr   typingr   r   r   r   r   rX   torch.nnr%   	timm.datar	   r
   timm.layersr   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r   r   r@   rc   rE   rF   r&   re   r   r   r   r   r  default_cfgsr  r  r  r   r2   r2   r2   r3   <module>   sb    $
/ 


	