o
    پid                     @   s  d 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	  mZ ddlmZmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ dgZG dd de	jZG dd de	jZ G dd de	jZ!G dd de	jZ"G dd de	jZ#G dd de	jZ$G dd de	jZ%G dd de	jZ&G dd de	jZ'G dd de	jZ(e)dg d g d!g d"g d#g d$d%dg d&g d'g d(g d)g d*d%dg d+g d,g d-g d.g d/d%d0d1d1gg d2g d3g d4g d5d%d0d6d7gg d8g d9g d:g d;d%d0d6d7gg d<g d=g d>g d?d%d0d6d7gg d@g dAg dBg dCd%d0d7dDgg dEg dFg dGg dHd%d0d7dIgg dJg dKg dLg dMd%d0dDdNgg dOg dPg dQg dRd%dS
Z*ddUdVZ+ddXdYZ,ei dZe,d[d\d]d^e,d[d\d]d_e,d[d\d]d`e,d[d\d]dae,d[d\d]dbe,d\dcdde,d\dcdee,d\dcdfe,d\dcdge,d\dcdhe,d\dcdie,d\dcdje,d\dcdke,d\dcdle,d\dcdme,d\dcdne,d\dce,d\dce,d\dcdoZ-eddpe(fdqdrZ.eddpe(fdsdtZ/eddpe(fdudvZ0eddpe(fdwdxZ1eddpe(fdydzZ2eddpe(fd{d|Z3eddpe(fd}d~Z4eddpe(fddZ5eddpe(fddZ6eddpe(fddZ7dS )a   PP-HGNet (V1 & V2)

Reference:
https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/zh_CN/models/ImageNet1k/PP-HGNetV2.md
The Paddle Implement of PP-HGNet (https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/docs/en/models/PP-HGNet_en.md)
PP-HGNet: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet.py
PP-HGNetv2: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet_v2.py
    )DictListOptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dDropPathcreate_conv2d   )build_model_with_cfg)feature_take_indices)register_modelgenerate_default_cfgs)checkpoint_seqHighPerfGpuNetc                       *   e Zd Z		d fdd	Zdd Z  ZS )LearnableAffineBlock      ?        c                    s>   t    tjt|gdd| _tjt|gdd| _d S )NT)requires_grad)super__init__nn	Parametertorchtensorscalebias)selfscale_value
bias_value	__class__ E/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/hgnet.pyr      s   
zLearnableAffineBlock.__init__c                 C   s   | j | | j S N)r   r    r!   xr&   r&   r'   forward#   s   zLearnableAffineBlock.forward)r   r   __name__
__module____qualname__r   r+   __classcell__r&   r&   r$   r'   r      s
    	r   c                       s0   e Zd Z					d	 fdd	Zdd Z  ZS )
	ConvBNActr    TFc	           	         sz   t    || _|| _t||||||d| _t|| _| jr%t	 | _
nt | _
| jr6| jr6t | _d S t | _d S )N)stridepaddinggroups)r   r   use_actuse_labr   convr   BatchNorm2dbnReLUactIdentityr   lab)	r!   in_chsout_chskernel_sizer3   r5   r4   r6   r7   r$   r&   r'   r   (   s$   

zConvBNAct.__init__c                 C   s,   |  |}| |}| |}| |}|S r(   )r8   r:   r<   r>   r)   r&   r&   r'   r+   H   s
   



zConvBNAct.forward)r   r   r2   TFr,   r&   r&   r$   r'   r1   '   s     r1   c                       r   )LightConvBNActr   Fc                    s8   t    t||dd|d| _t||||d|d| _d S )Nr   F)rA   r6   r7   T)rA   r5   r6   r7   )r   r   r1   conv1conv2)r!   r?   r@   rA   r5   r7   r$   r&   r'   r   Q   s    
zLightConvBNAct.__init__c                 C      |  |}| |}|S r(   )rC   rD   r)   r&   r&   r'   r+   j      

zLightConvBNAct.forward)r   Fr,   r&   r&   r$   r'   rB   P   s
    rB   c                       $   e Zd Z fddZdd Z  ZS )	EseModulec                    s.   t    tj||dddd| _t | _d S )Nr   r   rA   r3   r4   )r   r   r   Conv2dr8   Sigmoidsigmoid)r!   chsr$   r&   r'   r   q   s   
zEseModule.__init__c                 C   s2   |}|j ddd}| |}| |}t||S )N)      T)keepdim)meanr8   rL   r   mul)r!   r*   identityr&   r&   r'   r+   |   s
   

zEseModule.forwardr,   r&   r&   r$   r'   rH   p   s    rH   c                       rG   )StemV1c                    sF   t    tj fddtt d D  | _tjdddd| _d S )Nc                    s4   g | ]}t  |  |d   d|dkrdnd dqS )r   rO   r   rN   )rA   r3   )r1   ).0istem_chsr&   r'   
<listcomp>   s    
z#StemV1.__init__.<locals>.<listcomp>r   rO   rN   rI   )	r   r   r   
Sequentialrangelenstem	MaxPool2dpool)r!   rX   r$   rW   r'   r      s   


zStemV1.__init__c                 C   rE   r(   )r]   r_   r)   r&   r&   r'   r+      rF   zStemV1.forwardr,   r&   r&   r$   r'   rT      s    rT   c                       s&   e Zd Zd fdd	Zdd Z  ZS )StemV2Fc                    s   t    t||dd|d| _t||d dd|d| _t|d |dd|d| _t|d |dd|d| _t||dd|d| _tj	dddd| _
d S )NrO   rN   rA   r3   r7   r   T)rA   r3   	ceil_mode)r   r   r1   stem1stem2astem2bstem3stem4r   r^   r_   )r!   r?   mid_chsr@   r7   r$   r&   r'   r      sJ   
zStemV2.__init__c                 C   sj   |  |}t|d}| |}t|d}| |}| |}tj||gdd}| |}| 	|}|S )N)r   r   r   r   r   dim)
rc   Fpadrd   re   r_   r   catrf   rg   )r!   r*   x2x1r&   r&   r'   r+      s   





zStemV2.forwardFr,   r&   r&   r$   r'   r`      s    'r`   c                       s2   e Zd Z						d	 fdd	Zdd Z  ZS )
HighPerfGpuBlockrO   Feser   c              
      s  t    || _t | _t|D ]*}|r(| jt|dkr|n||||d q| jt	|dkr2|n|||d|d q|||  }|	dkrdt	||d dd|d}t	|d |dd|d}t
||| _nt	||dd|d}t|}t
||| _|
rt|
| _d S t | _d S )Nr   )rA   r7   r   ra   serN   )r   r   residualr   
ModuleListlayersr[   appendrB   r1   rZ   aggregationrH   r   r=   	drop_path)r!   r?   rh   r@   	layer_numrA   rt   light_blockr7   aggry   rV   	total_chsaggregation_squeeze_convaggregation_excitation_convaggregation_convattr$   r&   r'   r      sn   

	 zHighPerfGpuBlock.__init__c                 C   sX   |}|g}| j D ]}||}|| qtj|dd}| |}| jr*| || }|S )Nr   ri   )rv   rw   r   rm   rx   rt   ry   )r!   r*   rS   outputlayerr&   r&   r'   r+     s   

zHighPerfGpuBlock.forward)rO   FFFrr   r   r,   r&   r&   r$   r'   rq      s    Krq   c                       s4   e Zd Z							d fdd	Zd	d
 Z  ZS )HighPerfGpuStageTrN   FrO   rr   r   c                    s   t    || _|rt||d||d|
d| _nt | _g }t|D ]*}|t|dkr-|n|||||dkr7dnd|	||
|t	|t
tfrG|| n|d
 q"tj| | _d| _d S )NrO   F)rA   r3   r5   r6   r7   r   T)rt   rA   r{   r7   r|   ry   )r   r   
downsampler1   r   r=   r[   rw   rq   
isinstancelisttuplerZ   blocksgrad_checkpointing)r!   r?   rh   r@   	block_numrz   r   r3   r{   rA   r7   r|   ry   blocks_listrV   r$   r&   r'   r   (  s>   




zHighPerfGpuStage.__init__c                 C   s8   |  |}| jrtj st| j|}|S | |}|S r(   )r   r   r   jitis_scriptingr   r   r)   r&   r&   r'   r+   Y  s   

zHighPerfGpuStage.forward)TrN   FrO   Frr   r   r,   r&   r&   r$   r'   r   '  s    1r   c                       sl   e Zd Z				ddedededed	ee d
ef fddZddedee fddZ	ddefddZ
  ZS )ClassifierHeadavgr      Fin_featuresnum_classes	pool_type	drop_ratehidden_sizer7   c           
         s   t t|   || _|d ur|s|dksJ dt|d| _|d urJ|| _tj||ddddd}t }|rBt	 }	t
|||	| _nt
||| _nt | _t|| _|r\tdnt | _|dkrot| j|| _d S t | _d S )Nr   6Classifier head must be removed if pooling is disabledr   r   F)rA   r3   r4   r    )r   r   r   num_featuresr
   global_poolr   rJ   r;   r   rZ   	last_convr=   DropoutdropoutFlattenflattenLinearfc)
r!   r   r   r   r   r   r7   r   r<   r>   r$   r&   r'   r   c  s2   	
*zClassifierHead.__init__Nc                 C   sj   |d ur |s|dksJ dt |d| _|rtdnt | _|dkr.t| j|| _d S t | _d S )Nr   r   r   r   )	r
   r   r   r   r=   r   r   r   r   )r!   r   r   r&   r&   r'   reset  s   *zClassifierHead.reset
pre_logitsc                 C   s>   |  |}| |}| |}| |}|r|S | |}|S r(   )r   r   r   r   r   r!   r*   r   r&   r&   r'   r+     s   




zClassifierHead.forward)r   r   r   Fr(   rp   )r-   r.   r/   intstrfloatr   boolr   r   r+   r0   r&   r&   r$   r'   r   b  s(    '	r   c                       sR  e Zd Z							d1deded	ed
edee dededef fddZ	e
jjd2ddZe
jjd3ddZe
jjdejfddZd4d	ed
ee fddZ					d5d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#d$Z	%		d6deeee f d&ed'efd(d)Zd*d+ Zd2d,efd-d.Zd/d0 Z  ZS )7r   rO     r   r   r   Fcfgin_chansr   r   head_hidden_sizer   drop_path_rater7   c	                    s  t t|   |d }
|d }|d |d |d |d g}|| _|| _|| _|
dv s,J |
dkr>t||d	 |d
 |d| _nt|g| | _d}g }g | _	dd |D }dd t
d	|t||D }t|D ]B\}}|\}}}}}}}}|t||||||||||
dkrdnd|| dg7 }|| _|r|d9 }|  j	t| j|d| dg7  _	qitj| | _t| j|||||d| _| jj| _|  D ]7\}}t|tjrtjj|jddd qt|tjrtj|j tj |j! qt|tj"rtj |j! qd S )N	stem_typerX   stage1stage2stage3stage4)v1v2r   r   r   )r?   rh   r@   r7      c                 S   s   g | ]}|d  qS )rO   r&   )rU   cr&   r&   r'   rY         z+HighPerfGpuNet.__init__.<locals>.<listcomp>c                 S   s   g | ]}|  qS r&   )tolist)rU   r*   r&   r&   r'   rY     r   r   rr   rs   )r?   rh   r@   r   rz   r   r{   rA   r7   r|   ry   rN   zstages.)num_chs	reductionmodule)r   r   r   r   r7   fan_outrelu)modenonlinearity)#r   r   r   r   r   r7   r`   r]   rT   feature_infor   linspacesumsplit	enumerater   r   dictr   rZ   stagesr   headr   named_modulesr   rJ   initkaiming_normal_weightr9   ones_zeros_r    r   )r!   r   r   r   r   r   r   r   r7   kwargsr   rX   
stages_cfgcurrent_strider   block_depthsdprrV   stage_configr?   rh   r@   r   r   r{   rA   rz   nmr$   r&   r'   r     sx   
"
$
zHighPerfGpuNet.__init__c                 C   s   t d|rddS ddS )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))r]   r   )r   )r!   coarser&   r&   r'   group_matcher  s   zHighPerfGpuNet.group_matcherTc                 C   s   | j D ]}||_qd S r(   )r   r   )r!   enablesr&   r&   r'   set_grad_checkpointing  s   
z%HighPerfGpuNet.set_grad_checkpointingreturnc                 C   s   | j jS r(   )r   r   )r!   r&   r&   r'   get_classifier  s   zHighPerfGpuNet.get_classifierNc                 C   s   || _ | j|| d S r(   )r   r   r   )r!   r   r   r&   r&   r'   reset_classifier  s   zHighPerfGpuNet.reset_classifierNCHWr*   indicesnorm
stop_early
output_fmtintermediates_onlyc                 C   s   |dv sJ dg }t t| j|\}}	| |}tj s |s$| j}
n	| jd|	d  }
t|
D ]\}}||}||v rB|| q1|rG|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
        Returns:

        )r   zOutput shape must be NCHW.Nr   )	r   r\   r   r]   r   r   r   r   rw   )r!   r*   r   r   r   r   r   intermediatestake_indices	max_indexr   feat_idxstager&   r&   r'   forward_intermediates   s   

z$HighPerfGpuNet.forward_intermediatesr   
prune_norm
prune_headc                 C   s<   t t| j|\}}| jd|d  | _|r| dd |S )z@ Prune layers not required for specified intermediates.
        Nr   r   r   )r   r\   r   r   )r!   r   r   r   r   r   r&   r&   r'   prune_intermediate_layers*  s
   z(HighPerfGpuNet.prune_intermediate_layersc                 C   s   |  |}| |S r(   )r]   r   r)   r&   r&   r'   forward_features8  s   

zHighPerfGpuNet.forward_featuresr   c                 C   s   |r	| j ||dS |  |S )N)r   )r   r   r&   r&   r'   forward_head<  s   zHighPerfGpuNet.forward_headc                 C   rE   r(   )r   r   r)   r&   r&   r'   r+   ?  rF   zHighPerfGpuNet.forward)rO   r   r   r   r   r   Frp   )Tr(   )NFFr   F)r   FT)r-   r.   r/   r   r   r   r   r   r   r   r   r   ignorer   r   r   Moduler   r   Tensorr   r   r   r   r   r   r   r+   r0   r&   r&   r$   r'   r     s    	L 
,
r   )0   r   `   )r   r      r   FFrO      )r        r   TFrO   r   )r         rN   TFrO   r   )r         r   TFrO   r   )r   rX   r   r   r   r   )@   r   r   )r   r      r   FFrO      )r   r   r   r   TFrO   r   )r   r   r   rN   TFrO   r   )r   r      r   TFrO   r   )r   r   r   )r   r   @  r   FFrO      )r   r     rN   TFrO   r  )r  r     rO   TFrO   r  )r     i   rN   TFrO   r  r      )r  r  r   r   FFrO   rO   )r       r   r   TFrO   rO   )r   r   r   rN   TTr   rO   )r   r   r   r   TTr   rO      r  )r  r  r   r   FFrO   rO   )r   r   r   r   TFrO   rO   )r   r   r   rN   TTr   rO   )r   r   r   r   TTr   rO   )r  r  r   r   FFrO   r   )r   r     r   TFrO   r   )r  r   r   rO   TTr   r   )r   r   i   r   TTr   r   )r  r  r   r   FFrO   r   )r   r   r   r   TFrO   r   )r   r   r   rO   TTr   r   )r   r   r   r   TTr   r   r   )r   r   r   r   FFrO   r   )r   r   r   r   TFrO   r   )r   r   r   rO   TTr   r   )r   r  r   r   TTr   r   r   )r   r   r   r   FFrO   r   )r   r   r   rN   TFrO   r   )r   r   r   r   TTr   r   )r   r   r   rN   TTr   r   r   )r   r   r   rN   FFrO   r   )r   r   r   rO   TFrO   r   )r   r  r   r   TTr   r   )r   r   r   rO   TTr   r   )

hgnet_tinyhgnet_small
hgnet_base
hgnetv2_b0
hgnetv2_b1
hgnetv2_b2
hgnetv2_b3
hgnetv2_b4
hgnetv2_b5
hgnetv2_b6Fc                 K   s2   | dd}tt| |ft|  td|dd|S )Nout_indices)r   r   rN   rO   T)flatten_sequentialr  )	model_cfgfeature_cfg)popr   r   
model_cfgsr   )variant
pretrainedr   r  r&   r&   r'   _create_hgnet  s   
r  r2   c                 K   s"   | dddddt tdddd	d
|S )Nr   )rO   r   r   )r  r  gzG?bicubiczhead.fczstem.stem1.convr   )rO   r  r  )urlr   
input_size	pool_sizecrop_pctinterpolationrQ   std
classifier
first_convtest_crop_pcttest_input_sizer   )r  r   r&   r&   r'   _cfg  s   r'  zhgnet_tiny.paddle_in1kzstem.stem.0.convztimm/)r$  	hf_hub_idzhgnet_tiny.ssld_in1kzhgnet_small.paddle_in1kzhgnet_small.ssld_in1kzhgnet_base.ssld_in1kzhgnetv2_b0.ssld_stage2_ft_in1k)r(  z!hgnetv2_b0.ssld_stage1_in22k_in1kzhgnetv2_b1.ssld_stage2_ft_in1kz!hgnetv2_b1.ssld_stage1_in22k_in1kzhgnetv2_b2.ssld_stage2_ft_in1kz!hgnetv2_b2.ssld_stage1_in22k_in1kzhgnetv2_b3.ssld_stage2_ft_in1kz!hgnetv2_b3.ssld_stage1_in22k_in1kzhgnetv2_b4.ssld_stage2_ft_in1kz!hgnetv2_b4.ssld_stage1_in22k_in1kzhgnetv2_b5.ssld_stage2_ft_in1kz!hgnetv2_b5.ssld_stage1_in22k_in1k)zhgnetv2_b6.ssld_stage2_ft_in1kz!hgnetv2_b6.ssld_stage1_in22k_in1kr   c                 K      t dd| i|S )Nr	  r  )r	  r  r  r   r&   r&   r'   r	       r	  c                 K   r)  )Nr
  r  )r
  r*  r+  r&   r&   r'   r
    r,  r
  c                 K   r)  )Nr  r  )r  r*  r+  r&   r&   r'   r    r,  r  c                 K      t d| dd|S )Nr  Tr  r7   )r  r*  r+  r&   r&   r'   r       r  c                 K   r-  )Nr  Tr.  )r  r*  r+  r&   r&   r'   r     r/  r  c                 K   r-  )Nr  Tr.  )r  r*  r+  r&   r&   r'   r    r/  r  c                 K   r-  )Nr  Tr.  )r  r*  r+  r&   r&   r'   r  
  r/  r  c                 K   r)  )Nr  r  )r  r*  r+  r&   r&   r'   r    r,  r  c                 K   r)  )Nr  r  )r  r*  r+  r&   r&   r'   r    r,  r  c                 K   r)  )Nr  r  )r  r*  r+  r&   r&   r'   r    r,  r  rp   )r2   )8__doc__typingr   r   r   r   r   r   torch.nnr   torch.nn.functional
functionalrk   	timm.datar   r	   timm.layersr
   r   r   _builderr   	_featuresr   	_registryr   r   _manipulater   __all__r   r   r1   rB   rH   rT   r`   rq   r   r   r   r   r  r  r'  default_cfgsr	  r
  r  r  r  r  r  r  r  r  r&   r&   r&   r'   <module>   s   ) 6Y;< (








`

 "$&(
/