U
    ¯Ê¹jF[  ã                   @   s  d 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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dddgddddd d d!d"gdd#d$dd%d d!d"gd$d&d'd(d%d d!d"gd'd)d*dd%d d!d"gd+œdd,d,d#gd#d#d-dd d d!d.gd-d&d'dd%d d!d.gd'd)d*d(d%d d!d.gd*dd/dd%d d!d.gd+œdddd&gd&d)d0dd d d!d1gd0dd2d(d%d d!d1gd2d-d3d!d%d d!d1gd3d4d5d(d%d d!d1gd+œd6d7d7gd7d7d,dd d d!d!gd,d8d-dd%d d!d!gd-d,d'd(d%d%d"d!gd'd#d/dd%d%d"d!gd+œd6d9d8gd8d8d,dd d d!d!gd,dd-dd%d d!d!gd-dd'd(d%d%d"d!gd'd)d/dd%d%d"d!gd+œd6d9d8gd8d8ddd d d!d:gdd,d;dd%d d!d:gd;d#d*d!d%d%d"d:gd*d-d<dd%d%d"d:gd+œd6d9d8gd8d8d#dd d d!d"gd#d,d'dd%d d!d"gd'd#d/d!d%d%d"d"gd/d-d=dd%d%d"d"gd+œd6d8dgddd#dd d d!d.gd#dd'dd%d d!d.gd'd)d/d!d%d%d"d.gd/d;d=dd%d%d"d.gd+œd6d8d,gd,d,d#dd d d!d.gd#d#d'd(d%d d!d.gd'd-d/d"d%d%d"d.gd/d'd=d(d%d%d"d.gd+œd6ddgddd)d(d d d!d.gd)d)d'd!d%d d!d.gd'd;d/d.d%d%d"d.gd/d*d=d!d%d%d"d.gd+œd>�
Z d^d?d@„Z!d_dBdC„Z"ee"dDdEdF�e"dDdEdF�e"dDdEdF�e"dDdEdF�e"dDdEdF�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�e"dEdG�dHœƒZ#ed`edIœdJdK„ƒZ$edaedIœdLdM„ƒZ%edbedIœdNdO„ƒZ&edcedIœdPdQ„ƒZ'eddedIœdRdS„ƒZ(edeedIœdTdU„ƒZ)edfedIœdVdW„ƒZ*edgedIœdXdY„ƒZ+edhedIœdZd[„ƒZ,ediedIœd\d]„ƒZ-dS )jaù   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
é    N©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚSelectAdaptivePool2dÚDropPathÚcreate_conv2dé   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚHighPerfGpuNetc                       s&   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)Zrequires_grad)ÚsuperÚ__init__ÚnnÚ	ParameterÚtorchZtensorÚscaleÚbias)ÚselfZscale_valueZ
bias_value©Ú	__class__© úP/var/www/html/bwave/python/venv/lib/python3.8/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                       s&   e Zd Zd	‡ fdd„	Zdd„ Z‡  ZS )
Ú	ConvBNActr   Ú TFc	           	         sx   t ƒ  ¡  || _|| _t||||||d�| _t |¡| _| jrJt 	¡ | _
n
t ¡ | _
| jrj| jrjtƒ | _n
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_sizer'   r)   r(   r*   r+   r   r   r   r   %   s$    
ú

zConvBNAct.__init__c                 C   s,   |   |¡}|  |¡}|  |¡}|  |¡}|S r   )r,   r.   r0   r2   r   r   r   r   r   E   s
    



zConvBNAct.forward)r   r   r&   TFr    r   r   r   r   r%   $   s        ÷ r%   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚLightConvBNActr   Fc                    s8   t ƒ  ¡  t||dd|d�| _t||||d|d�| _d S )Nr   F)r5   r*   r+   T)r5   r)   r*   r+   )r   r   r%   Úconv1Úconv2)r   r3   r4   r5   r)   r+   r   r   r   r   N   s     
ûúzLightConvBNAct.__init__c                 C   s   |   |¡}|  |¡}|S r   )r7   r8   r   r   r   r   r   g   s    

zLightConvBNAct.forward)r   Fr    r   r   r   r   r6   M   s     úr6   c                       s$   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   ©r5   r'   r(   )r   r   r   ÚConv2dr,   ZSigmoidÚsigmoid)r   Zchsr   r   r   r   n   s    
ûzEseModule.__init__c                 C   s2   |}|j ddd�}|  |¡}|  |¡}t ||¡S )N)é   é   T)Zkeepdim)Úmeanr,   r<   r   Úmul)r   r   Úidentityr   r   r   r   y   s
    

zEseModule.forwardr    r   r   r   r   r9   m   s   r9   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú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   r>   r   r=   )r5   r'   )r%   )Ú.0Úi©Ústem_chsr   r   Ú
<listcomp>…   s   ü
üz#StemV1.__init__.<locals>.<listcomp>r   r>   r=   r:   )	r   r   r   Ú
SequentialÚrangeÚlenÚstemÚ	MaxPool2dÚpool)r   rF   r   rE   r   r   ƒ   s    

ÿû
zStemV1.__init__c                 C   s   |   |¡}|  |¡}|S r   )rK   rM   r   r   r   r   r   �   s    

zStemV1.forwardr    r   r   r   r   rB   �   s   rB   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 )Nr>   r=   ©r5   r'   r+   r   T)r5   r'   Z	ceil_mode)r   r   r%   Ústem1Ústem2aÚstem2bÚstem3Ústem4r   rL   rM   )r   r3   Úmid_chsr4   r+   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)
rP   ÚFÚpadrQ   rR   rM   r   ÚcatrS   rT   )r   r   Zx2Úx1r   r   r   r   ¾   s    





zStemV2.forward)Fr    r   r   r   r   rN   •   s   'rN   c                       s&   e Zd Zd	‡ fdd„	Zdd„ Z‡  ZS )
ÚHighPerfGpuBlockr>   FÚeser   c              
      s
  t ƒ  ¡  || _t ¡ | _t|ƒD ]T}|rP| j t|dkr>|n||||d�¡ q"| j t	|dkrd|n|||d|d�¡ q"|||  }|	dkrÈt	||d dd|d�}t	|d |dd|d�}t 
||¡| _n(t	||dd|d�}t|ƒ}t 
||¡| _|
rüt|
ƒnt ¡ | _d S )Nr   )r5   r+   r   rO   Úser=   )r   r   Úresidualr   Z
ModuleListÚlayersrI   Úappendr6   r%   rH   Úaggregationr9   r   r1   Ú	drop_path)r   r3   rU   r4   Ú	layer_numr5   r_   Úlight_blockr+   Úaggrc   rD   Z	total_chsZaggregation_squeeze_convZaggregation_excitation_convZaggregation_convZattr   r   r   r   Ì   sn    

üÿ	ûÿûûþûþzHighPerfGpuBlock.__init__c                 C   sX   |}|g}| j D ]}||ƒ}| |¡ qtj|dd�}|  |¡}| jrT|  |¡| }|S )Nr   rV   )r`   ra   r   rZ   rb   r_   rc   )r   r   rA   ÚoutputÚlayerr   r   r   r     s    

zHighPerfGpuBlock.forward)r>   FFFr]   r   r    r   r   r   r   r\   Ë   s         õKr\   c                       s&   e Zd Zd‡ fdd„	Zd	d
„ Z‡  ZS )ÚHighPerfGpuStageTr=   Fr>   r]   r   c                    sª   t ƒ  ¡  || _|r.t||d||d|
d�| _n
t ¡ | _g }t|ƒD ]T}| t|dkrZ|n|||||dkrndnd|	||
|t	|t
tfƒrŽ|| n|d�
¡ qDtj|Ž | _d S )Nr>   F)r5   r'   r)   r*   r+   r   T)r_   r5   re   r+   rf   rc   )r   r   Ú
downsampler%   r   r1   rI   ra   r\   Ú
isinstanceÚlistÚtuplerH   Úblocks)r   r3   rU   r4   Ú	block_numrd   rj   r'   re   r5   r+   rf   rc   Zblocks_listrD   r   r   r   r   %  s<    
ù


öÿzHighPerfGpuStage.__init__c                 C   s   |   |¡}|  |¡}|S r   )rj   rn   r   r   r   r   r   U  s    

zHighPerfGpuStage.forward)Tr=   Fr>   Fr]   r   r    r   r   r   r   ri   $  s          ó0ri   c                       s.   e Zd Zd‡ fdd„	Zdedœd	d
„Z‡  ZS )ÚClassifierHeadÚavgr   Té   Fc                    sº   t t| ƒ ¡  t|ddd�| _|rltj||ddddd�}t ¡ }	|r\tƒ }
t 	||	|
¡| _
qvt 	||	¡| _
n
t ¡ | _
|dkrŒt |¡| _n
t ¡ | _t ¡ | _t |r¬|n||¡| _d S )NFZNCHW)Ú	pool_typeÚflattenZ	input_fmtr   r   )r5   r'   r(   r   )r   rp   r   r   Úglobal_poolr   r;   r/   r   rH   Ú	last_convZ	IndentityZDropoutÚdropoutr1   ZFlattenrt   ÚLinearÚfc)r   Únum_featuresÚnum_classesrs   Ú	drop_rateÚuse_last_convÚclass_expandr+   rv   r0   r2   r   r   r   r   \  s,    
ú


zClassifierHead.__init__©Ú
pre_logitsc                 C   s>   |   |¡}|  |¡}|  |¡}|  |¡}|r0|S |  |¡}|S r   )ru   rv   rw   rt   ry   ©r   r   r€   r   r   r   r   ‚  s    




zClassifierHead.forward)rq   r   Trr   F)F)r!   r"   r#   r   Úboolr   r$   r   r   r   r   rp   [  s        ø&rp   c                       s|   e Zd Zd‡ fdd	„	Zejjdd
d„ƒZejjddd„ƒZejjdd„ ƒZ	ddd„Z
dd„ Zdedœdd„Zdd„ Z‡  ZS )r   r>   éè  rq   Trr   r   Fc
                    sB  t t| ƒ ¡  |d }|d }|d |d |d |d g}|| _|| _|| _|| _|	| _|dksdt‚|dkrˆt	||d	 |d
 |	d�| _
nt|g| ƒ| _
d}g }g | _dd„ |D ƒ}dd„ t d	|t|ƒ¡ |¡D ƒ}t|ƒD ]ˆ\}}|\}}}}}}}}|t|||||||||	|dk�rdnd|| d�g7 }|| _|�rD|d9 }|  jt| j|d|› �d�g7  _qÞtj|Ž | _|d	k�ršt| j||||||	d�| _n$|dk�r´t|dd�| _n
t ¡ | _|  ¡ D ]v\}}t|tjƒ�ròtjj |j!ddd� nHt|tj"ƒ�rtj #|j!¡ tj $|j%¡ nt|tj&ƒ�rÆtj $|j%¡ �qÆd S )NÚ	stem_typerF   Ústage1Ústage2Ústage3Ústage4)Úv1Úv2rŠ   r   r   )r3   rU   r4   r+   é   c                 S   s   g | ]}|d  ‘qS )r>   r   )rC   Úcr   r   r   rG   ´  s     z+HighPerfGpuNet.__init__.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r   )Útolist)rC   r   r   r   r   rG   µ  s     r‰   r]   r^   )r3   rU   r4   ro   rd   rj   re   r5   r+   rf   rc   r=   zstages.)Znum_chsZ	reductionÚmodule©r{   rs   r|   r}   r~   r+   rq   T©rs   rt   Zfan_outZrelu)ÚmodeZnonlinearity)'r   r   r   r{   r|   r}   r~   r+   ÚAssertionErrorrN   rK   rB   Zfeature_infor   ZlinspaceÚsumÚsplitÚ	enumerateri   rz   Údictr   rH   Ústagesrp   Úheadr   r1   Znamed_modulesrk   r;   ÚinitZkaiming_normal_Úweightr-   Zones_Zzeros_r   rx   )r   ÚcfgZin_chansr{   ru   r}   r~   r|   Zdrop_path_rater+   Úkwargsr„   rF   Z
stages_cfgZcurrent_strider—   Zblock_depthsZdprrD   Zstage_configr3   rU   r4   ro   rj   re   r5   rd   ÚnÚmr   r   r   r   �  s€    ü
"õ
$
ù



zHighPerfGpuNet.__init__c                 C   s   t d|rdndd�S )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))rK   rn   )r–   )r   Zcoarser   r   r   Úgroup_matcherä  s    
þzHighPerfGpuNet.group_matcherc                 C   s   | j D ]
}||_qd S r   )r—   Zgrad_checkpointing)r   ÚenableÚsr   r   r   Úset_grad_checkpointingë  s    
z%HighPerfGpuNet.set_grad_checkpointingc                 C   s   | j jS r   )r˜   ry   )r   r   r   r   Úget_classifierð  s    zHighPerfGpuNet.get_classifierc              	   C   sT   || _ |dkr2t| j||| j| j| j| jd�| _n|rFt|dd�| _n
t	 
¡ | _d S )Nr   r�   Tr�   )r{   rp   rz   r|   r}   r~   r+   r˜   r   r   r1   )r   r{   ru   r   r   r   Úreset_classifierô  s    ù
	zHighPerfGpuNet.reset_classifierc                 C   s   |   |¡}|  |¡S r   )rK   r—   r   r   r   r   Úforward_features  s    
zHighPerfGpuNet.forward_featuresr   c                 C   s   |r| j ||d�S |   |¡S )Nr   )r˜   r�   r   r   r   Úforward_head	  s    zHighPerfGpuNet.forward_headc                 C   s   |   |¡}|  |¡}|S r   )r¥   r¦   r   r   r   r   r     s    

zHighPerfGpuNet.forward)r>   rƒ   rq   Trr   r   r   F)F)T)rq   )F)r!   r"   r#   r   r   ZjitÚignorerŸ   r¢   r£   r¤   r¥   r‚   r¦   r   r$   r   r   r   r   r   �  s&           öU

r‰   é0   é`   éà   Fr>   é   é€   iÀ  Té    i   r=   éÀ   i   )r„   rF   r…   r†   r‡   rˆ   é@   é   é   i   i@  é   i€  iÀ  é   i   rŠ   é   é    é   r‹   i€  i   rr   )
Ú
hgnet_tinyÚhgnet_smallÚ
hgnet_baseÚ
hgnetv2_b0Ú
hgnetv2_b1Ú
hgnetv2_b2Ú
hgnetv2_b3Ú
hgnetv2_b4Ú
hgnetv2_b5Ú
hgnetv2_b6c                 K   s2   |  dd¡}tt| |ft|  td|d�dœ|—ŽS )NÚout_indices)r   r   r=   r>   T)Zflatten_sequentialrÁ   )Z	model_cfgZfeature_cfg)Úpopr	   r   Ú
model_cfgsr–   )ÚvariantÚ
pretrainedrœ   rÁ   r   r   r   Ú_create_hgnetr  s    ý
ûúrÆ   r&   c                 K   s"   | dddddt tdddd	d
œ|–S )Nrƒ   )r>   rª   rª   )r²   r²   gáz®Gáî?Zbicubiczhead.fczstem.stem1.convr   )r>   r³   r³   )Úurlr{   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationr?   ZstdÚ
classifierÚ
first_convZtest_crop_pctZtest_input_sizer   )rÇ   rœ   r   r   r   Ú_cfg~  s          úùrË   zstem.stem.0.convztimm/)rÊ   Ú	hf_hub_id)rÌ   )zhgnet_tiny.paddle_in1kzhgnet_tiny.ssld_in1kzhgnet_small.paddle_in1kzhgnet_small.ssld_in1kzhgnet_base.ssld_in1kzhgnetv2_b0.ssld_stage2_ft_in1kz!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_in1kzhgnetv2_b6.ssld_stage2_ft_in1kz!hgnetv2_b6.ssld_stage1_in22k_in1k)Úreturnc                 K   s   t dd| i|—ŽS )Nr·   rÅ   )r·   ©rÆ   ©rÅ   rœ   r   r   r   r·   ¹  s    r·   c                 K   s   t dd| i|—ŽS )Nr¸   rÅ   )r¸   rÎ   rÏ   r   r   r   r¸   ¾  s    r¸   c                 K   s   t dd| i|—ŽS )Nr¹   rÅ   )r¹   rÎ   rÏ   r   r   r   r¹   Ã  s    r¹   c                 K   s   t d| ddœ|—ŽS )Nrº   T©rÅ   r+   )rº   rÎ   rÏ   r   r   r   rº   È  s    rº   c                 K   s   t d| ddœ|—ŽS )Nr»   TrÐ   )r»   rÎ   rÏ   r   r   r   r»   Í  s    r»   c                 K   s   t d| ddœ|—ŽS )Nr¼   TrÐ   )r¼   rÎ   rÏ   r   r   r   r¼   Ò  s    r¼   c                 K   s   t d| ddœ|—ŽS )Nr½   TrÐ   )r½   rÎ   rÏ   r   r   r   r½   ×  s    r½   c                 K   s   t dd| i|—ŽS )Nr¾   rÅ   )r¾   rÎ   rÏ   r   r   r   r¾   Ü  s    r¾   c                 K   s   t dd| i|—ŽS )Nr¿   rÅ   )r¿   rÎ   rÏ   r   r   r   r¿   á  s    r¿   c                 K   s   t dd| i|—ŽS )NrÀ   rÅ   )rÀ   rÎ   rÏ   r   r   r   rÀ   æ  s    rÀ   )F)r&   )F)F)F)F)F)F)F)F)F)F).Ú__doc__r   Ztorch.nnr   Ztorch.nn.functionalZ
functionalrX   Z	timm.datar   r   Ztimm.layersr   r   r   Z_builderr	   Ú	_registryr
   r   Ú__all__ÚModuler   r%   r6   r9   rB   rN   r\   ri   rp   r   r–   rÃ   rÆ   rË   Zdefault_cfgsr·   r¸   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   r   r   r   r   Ú<module>   sb  	) 6Y72 ù
ù
ùù
ù
ù
ù
ù
ù
ù¬`

þþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖ/