a
    d                     @   s\  d Z ddlZddl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 ddlmZmZ ddlmZ dd	lmZmZ dd
lmZmZ ddgZdZeeZeededddddddedddddddedddddddeddddddddededdddd ddeddddd!ddeddddd"ddeddddd#dddededddd$d ddedddd%d!ddedddd&d"ddedddd'd#dddededddd$d ddedddd%d(ddedddd&d)ddedddd'd*dddededddd$d ddedddd%d+ddedddd&d,ddedddd'd-dddededddd$d ddedddd%d.ddedddd&d/ddedddd'd0dddededddd$d ddedddd%d1ddedddd&d2ddedddd'd3dddededddd$d ddedddd%d4ddedddd&d5ddedddd'd6dddededddd$d ddedddd%d7ddedddd&d8ddedddd'd9dddd:	Z G d;d< d<ej!Z"G d=d> d>ej#Z$ej%j&G d?d@ d@ejj!Z'eedAZ(G dBd dej!Z)G dCd de)Z*didEdFZ+djdHdIZ,ee,dJdKe,dJdKe,dJdLdMe,dJdKe,dJdKe,dJdKe,dJdKe,dJdKe,dJdKe,dJdKe,dJdLdNdOdPe,dJdLdNdOdPdQZ-edke)dRdSdTZ.edle)dRdUdVZ/edme)dRdWdXZ0edne)dRdYdZZ1edoe)dRd[d\Z2edpe)dRd]d^Z3edqe)dRd_d`Z4edre)dRdadbZ5edse)dRdcddZ6edte)dRdedfZ7edue)dRdgdhZ8dS )vz HRNet

Copied from https://github.com/HRNet/HRNet-Image-Classification

Original header:
  Copyright (c) Microsoft
  Licensed under the MIT License.
  Written by Bin Xiao (Bin.Xiao@microsoft.com)
  Modified by Ke Sun (sunk@mail.ustc.edu.cn)
    N)ListIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)create_classifier   )build_model_with_cfgpretrained_cfg_for_features)FeatureInfo)register_modelgenerate_default_cfgs)
BasicBlock
BottleneckHighResolutionNetHighResolutionNetFeaturesg?@   
BOTTLENECK)r   )    ZSUM)num_modulesnum_branches
block_type
num_blocksnum_channelsfuse_method   BASIC)r   r   )   r      )r   r   r   )r   r   r      )r   r   r   r   )r   r   r      )
stem_widthstage1stage2stage3stage4)r   )r   )   $   )r%   r&   H   )r%   r&   r'      )r   )r   r   )r   r   r   )r   r   r   r   )   <   )r)   r*   x   )r)   r*   r+      )r   r   )r   r   r   r   r   r      )(   P   )r/   r0      )r/   r0   r1   i@  ),   X   )r2   r3      )r2   r3   r4   i`  )0   `   )r5   r6      )r5   r6   r7   i  )r   r   )r   r   r.   )r   r   r.   i   )	hrnet_w18_smallhrnet_w18_small_v2	hrnet_w18	hrnet_w30	hrnet_w32	hrnet_w40	hrnet_w44	hrnet_w48	hrnet_w64c                       sd   e Zd Zd fdd	Zdd ZdddZd	d
 Zdd Zdd Ze	e
j e	e
j dddZ  ZS )HighResolutionModuleTc                    sd   t t|   | ||||| || _|| _|| _|| _| ||||| _	| 
 | _td| _d S )NF)superrA   __init___check_branches
num_in_chsr   r   multi_scale_output_make_branchesbranches_make_fuse_layersfuse_layersnnReLUfuse_act)selfr   block_typesr   rE   r   r   rF   	__class__ Z/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/hrnet.pyrC   g  s(    

zHighResolutionModule.__init__c                 C   sv   d}|t |kr"d|t |}n:|t |kr@d|t |}n|t |kr\d|t |}|rrt| t|d S )N z"num_branches({}) <> num_blocks({})z$num_branches({}) <> num_channels({})z"num_branches({}) <> num_in_chs({}))lenformat_loggererror
ValueError)rN   r   rO   r   rE   r   	error_msgrR   rR   rS   rD     s    
z$HighResolutionModule._check_branchesr   c           	   	   C   s   d }|dks$| j | || |j krdttj| j | || |j d|ddtj|| |j td}|| j | || ||g}|| |j | j |< td|| D ]}||| j | ||  qtj| S Nr   F)kernel_sizestridebiasZmomentum)	rE   	expansionrK   
SequentialConv2dBatchNorm2d_BN_MOMENTUMrangeappend)	rN   Zbranch_indexr   r   r   r]   
downsamplelayersirR   rR   rS   _make_one_branch  s     z%HighResolutionModule._make_one_branchc              	   C   s2   g }t |D ]}|| |||| qt|S N)re   rf   rj   rK   
ModuleList)rN   r   r   r   r   rH   ri   rR   rR   rS   rG     s    z#HighResolutionModule._make_branchesc           
      C   s  | j dkrt S | j }| j}g }t| jr.|ndD ]N}g }t|D ]*}||kr|ttj|| || dddddtj	|| t
dtjd||  dd qF||kr|t  qFg }t|| D ]}||| d kr|| }	|ttj|| |	d	ddddtj	|	t
d q|| }	|ttj|| |	d	ddddtj	|	t
dtd q|tj|  qF|t| q4t|S )
Nr   r   Fr^   r_   r   Znearest)Zscale_factormoder   )r   rK   IdentityrE   re   rF   rf   ra   rb   rc   rd   ZUpsamplerL   rl   )
rN   r   rE   rJ   ri   Z
fuse_layerjconv3x3skZnum_out_chs_conv3x3rR   rR   rS   rI     sB    
z&HighResolutionModule._make_fuse_layersc                 C   s   | j S rk   )rE   rN   rR   rR   rS   get_num_in_chs  s    z#HighResolutionModule.get_num_in_chs)xreturnc           	      C   s   | j dkr| jd |d gS t| jD ]\}}||| ||< q(g }t| jD ]T\}}d }t|D ].\}}|d u r||| }qd||||  }qd|| | qP|S )Nr   r   )r   rH   	enumeraterJ   rf   rM   )	rN   ru   ri   branchZx_fuseZ
fuse_outeryrp   frR   rR   rS   forward  s    
zHighResolutionModule.forward)T)r   )__name__
__module____qualname__rC   rD   rj   rG   rI   rt   r   torchTensorr{   __classcell__rR   rR   rP   rS   rA   f  s   	 "
&rA   c                       sP   e Zd Z fddZejjdd Zejjdd Zeej	 dddZ  Z
S )SequentialListc                    s   t t| j|  d S rk   )rB   r   rC   )rN   argsrP   rR   rS   rC     s    zSequentialList.__init__c                 C   s   d S rk   rR   rN   ru   rR   rR   rS   r{     s    zSequentialList.forwardc                 C   s   d S rk   rR   r   rR   rR   rS   r{     s    rv   c                 C   s   | D ]}||}q|S rk   rR   )rN   ru   modulerR   rR   rS   r{     s    
)r|   r}   r~   rC   r   jitZ_overload_methodr{   r   r   r   rR   rR   rP   rS   r     s   

r   c                   @   s    e Zd ZejejdddZdS )ModuleInterface)inputrv   c                 C   s   d S rk   rR   )rN   r   rR   rR   rS   r{      s    zModuleInterface.forwardN)r|   r}   r~   r   r   r{   rR   rR   rR   rS   r     s   r   )r   r   c                       s   e Zd Zd( fdd	Zd)ddZdd Zd*ddZd+ddZej	j
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eej ddd Zd!d" Zd/ed#d$d%Zd&d' Z  ZS )0r   r     r   avg        classificationc              	      sT  t t|   || _|dks J |jf i | |d }	tj||	ddddd| _tj|	t	d| _
tjd	d
| _tj|	dddddd| _tjdt	d| _tjd	d
| _|d | _| jd d t| jd   | jd d }
|  d|
| _ j }|d | _| jd t| jd    fddttD | |g| _| | j\| _}|d | _| jd t| jd    fddttD | || _| | j\| _}|d | _| jd t| jd    fddttD | || _ | j| jd	d\| _!}|| _"d | _#|$dd	}|dkr~d| _%| j&||d\| _'| _(| _)t*| j%| j||d\| _+| _,| _-nR|dkrd| _%| j&|d	d\| _'}}nd | _%d | _'t. | _+t. | _,t. | _-d}t/d|d!d"g| _0t1| j#r| j#nD ]J\}}|d9 }| j#r|d# n|}|  j0t/||d$|d  d"g7  _0q| 2  d S )%Nr   r    r   r   r   F)r\   r]   paddingr^   r_   TZinplacer   r!   r   r   r   r   r"   c                    s   g | ]}|  j  qS rR   r`   .0ri   r   r   rR   rS   
<listcomp>.      z.HighResolutionNet.__init__.<locals>.<listcomp>r#   c                    s   g | ]}|  j  qS rR   r   r   r   rR   rS   r   5  r   r$   c                    s   g | ]}|  j  qS rR   r   r   r   rR   rS   r   <  r   )rF   head_conv_biasr   i   )	conv_bias)	pool_type	drop_rateincre)
incre_onlyr.   stem)Znum_chsZ	reductionr   r   Zstage)3rB   r   rC   num_classesupdaterK   rb   conv1rc   rd   bn1rL   act1conv2bn2act2Z
stage1_cfgblock_types_dict_make_layerlayer1r`   Z
stage2_cfgre   rU   _make_transition_layertransition1_make_stager"   Z
stage3_cfgtransition2r#   Z
stage4_cfgtransition3r$   headhead_channelspopnum_features
_make_headincre_modulesdownsamp_modulesfinal_layerr   global_pool	head_drop
classifierro   dictfeature_inforw   init_weights)rN   cfgin_chansr   output_strider   r   r   kwargsr    r   Zstage1_out_channelpre_stage_channelsr   _Zcurr_strideri   crP   r   rS   rC     s    












(zHighResolutionNet.__init__FTc                 C   s,  t }g d| _g }t|D ](\}}|| j||| j| ddd qt|}|r\|d d fS g }tt|d D ]d}| j| |j	 }	| j|d  |j	 }
t
tj|	|
ddd|dtj|
tdtjdd	}|| qpt|}t
tj| jd |j	 | jddd
|dtj| jtdtjdd	}|||fS )Nr-   r   )r]   r   r   )in_channelsout_channelsr\   r]   r   r^   r_   Tr   r   )r   r   rw   rf   r   rK   rl   re   rU   r`   ra   rb   rc   rd   rL   r   )rN   r   r   r   Zhead_block_typer   ri   Zchannelsr   r   r   Zdownsamp_moduler   rR   rR   rS   r   e  s>    
"




zHighResolutionNet._make_headc                 C   s  t |}t |}g }t|D ]}||k r|| || kr~|ttj|| || dddddtj|| tdtjdd n|t	  qg }t|d | D ]\}|d }	||| kr|| n|	}
|ttj|	|
dd	dddtj|
tdtjdd q|tj|  qt
|S )
Nr   r   Frm   r_   Tr   r   )rU   re   rf   rK   ra   rb   rc   rd   rL   ro   rl   )rN   Znum_channels_pre_layerZnum_channels_cur_layerZnum_branches_curZnum_branches_preZtransition_layersri   rq   rp   Z_in_chsZ_out_chsrR   rR   rS   r     s.    

z(HighResolutionNet._make_transition_layerr   c           	   	   C   s   d }|dks|||j  krLttj|||j  d|ddtj||j  td}|||||g}||j  }td|D ]}|||| qptj| S r[   )r`   rK   ra   rb   rc   rd   re   rf   )	rN   r   ZinplanesZplanesrO   r]   rg   rh   ri   rR   rR   rS   r     s    
zHighResolutionNet._make_layerc                 C   s   |d }|d }|d }|d }t |d  }|d }	g }
t|D ]:}|pR||d k }|
t||||||	| |
d  }q@t|
 |fS )	Nr   r   r   r   r   r   r   r   )r   re   rf   rA   rt   r   )rN   Zlayer_configrE   rF   r   r   r   r   r   r   modulesri   Zreset_multi_scale_outputrR   rR   rS   r     s    zHighResolutionNet._make_stagec                 C   s`   |   D ]R}t|tjr.tjj|jddd qt|tjrtj|jd tj|j	d qd S )NZfan_outZrelu)rn   Znonlinearityr   r   )
r   
isinstancerK   rb   initZkaiming_normal_Zweightrc   Z	constant_r^   )rN   mrR   rR   rS   r     s    zHighResolutionNet.init_weightsc                 C   s   t d|rdng dd}|S )Nz^conv[12]|bn[12]z ^(?:layer|stage|transition)(\d+)))z^layer(\d+)\.(\d+)N)z^stage(\d+)\.(\d+)N)z^transition(\d+))i )r   rO   )r   )rN   ZcoarseZmatcherrR   rR   rS   group_matcher  s
    zHighResolutionNet.group_matcherc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedrR   )rN   enablerR   rR   rS   set_grad_checkpointing  s    z(HighResolutionNet.set_grad_checkpointingc                 C   s   | j S rk   )r   rs   rR   rR   rS   get_classifier  s    z HighResolutionNet.get_classifierc                 C   s$   || _ t| j| j |d\| _| _d S )N)r   )r   r   r   r   r   )rN   r   r   rR   rR   rS   reset_classifier  s    
z"HighResolutionNet.reset_classifierr   c                    st   |     fddt| jD }| |fddt| jD }| |fddt| jD }| |S )Nc                    s   g | ]\}}| qS rR   rR   r   ri   t)ru   rR   rS   r     r   z,HighResolutionNet.stages.<locals>.<listcomp>c                    s0   g | ](\}}t |tjs$| d  n | qS r   r   rK   ro   r   ylrR   rS   r     r   c                    s0   g | ](\}}t |tjs$| d  n | qS r   r   r   r   rR   rS   r     r   )r   rw   r   r"   r   r#   r   r$   )rN   ru   ZxlrR   )ru   r   rS   stages  s    



zHighResolutionNet.stagesc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| jd u sZ| jd u r^|S d }t	| jD ]B\}}|d u r||| }ql| j|d  }||| |
| }ql| |}|S )Nr   )r   r   r   r   r   r   r   r   r   rw   r{   r   )rN   ru   r   ry   ri   r   ZdownrR   rR   rS   forward_features  s"    







z"HighResolutionNet.forward_features)
pre_logitsc                 C   s&   |  |}| |}|r|S | |S rk   )r   r   r   )rN   ru   r   rR   rR   rS   forward_head  s    

zHighResolutionNet.forward_headc                 C   s   |  |}| |}|S rk   )r   r   )rN   ru   ry   rR   rR   rS   r{     s    

zHighResolutionNet.forward)r   r   r   r   r   r   )FT)r   )T)F)T)r   )F)r|   r}   r~   rC   r   r   r   r   r   r   ignorer   r   r   r   r   r   r   r   r   boolr   r{   r   rR   rR   rP   rS   r   
  s0         Y
&


	

c                       s>   e Zd ZdZd fd	d
	Zdd Zeej dddZ	  Z
S )r   a  HighResolutionNet feature extraction

    The design of HRNet makes it easy to grab feature maps, this class provides a simple wrapper to do so.
    It would be more complicated to use the FeatureNet helpers.

    The `feature_location=incre` allows grabbing increased channel count features using part of the
    classification head. If `feature_location=''` the default HRNet features are returned. First stem
    conv is used for stride 2 features.
    r   r   r   r   r   r   r   r   r   r   r   c	           
   	      sT   |dv sJ t t| j|f||||||d|	 t| j|| _dd |D | _d S )N)r   rT   )r   r   r   r   r   r   c                 S   s   h | ]}|qS rR   rR   r   rR   rR   rS   	<setcomp>@  r   z5HighResolutionNetFeatures.__init__.<locals>.<setcomp>)rB   r   rC   r
   r   _out_idx)
rN   r   r   r   r   r   r   Zfeature_locationZout_indicesr   rP   rR   rS   rC   (  s    

z"HighResolutionNetFeatures.__init__c                 C   s   dsJ dd S )NFzNot supportedrR   r   rR   rR   rS   r   B  s    z*HighResolutionNetFeatures.forward_featuresr   c                 C   s   g }|  |}| |}| |}d| jv r6|| | |}| |}| |}| |}| j	d ur~dd t
|| j	D }t|D ] \}}|d | jv r|| q|S )Nr   c                 S   s   g | ]\}}||qS rR   rR   )r   rz   r   rR   rR   rS   r   Q  r   z5HighResolutionNetFeatures.forward.<locals>.<listcomp>r   )r   r   r   r   rf   r   r   r   r   r   ziprw   )rN   ru   outri   rz   rR   rR   rS   r{   E  s     









z!HighResolutionNetFeatures.forward)r   r   r   r   r   r   r   )r|   r}   r~   __doc__rC   r   r   r   Ztensorr{   r   rR   rR   rP   rS   r     s          Fc                 K   sj   t }d}d }|ddr$t}d}d}|p*| }t|| |ft| | |d|}|rft|j|_|j|_|S )NFfeatures_only)r   r   T)Z	model_cfgZpretrained_strictkwargs_filter)r   r   r   r   cfg_clsr	   Zdefault_cfgZpretrained_cfg)variant
pretrainedcfg_variantZmodel_kwargsZ	model_clsr   r   modelrR   rR   rS   _create_hrnetX  s.    	r   rT   c                 K   s   | dddddt tddd
|S )	Nr   )r      r   )   r   g      ?Zbilinearr   r   )
urlr   Z
input_sizeZ	pool_sizecrop_pctinterpolationmeanZstdZ
first_convr   r   )r   r   rR   rR   rS   _cfgp  s    r   ztimm/)	hf_hub_idgffffff?)r   r   g      ?)r      r   )r   r   Ztest_crop_pctZtest_input_size)zhrnet_w18_small.ms_in1kzhrnet_w18_small_v2.ms_in1kzhrnet_w18.ms_aug_in1kzhrnet_w18.ms_in1kzhrnet_w30.ms_in1kzhrnet_w32.ms_in1kzhrnet_w40.ms_in1kzhrnet_w44.ms_in1kzhrnet_w48.ms_in1kzhrnet_w64.ms_in1kzhrnet_w18_ssld.paddle_in1kzhrnet_w48_ssld.paddle_in1kr   c                 K   s   t d| fi |S )Nr8   r   r   r   rR   rR   rS   r8     s    r8   c                 K   s   t d| fi |S )Nr9   r   r   rR   rR   rS   r9     s    r9   c                 K   s   t d| fi |S )Nr:   r   r   rR   rR   rS   r:     s    r:   c                 K   s   t d| fi |S )Nr;   r   r   rR   rR   rS   r;     s    r;   c                 K   s   t d| fi |S )Nr<   r   r   rR   rR   rS   r<     s    r<   c                 K   s   t d| fi |S )Nr=   r   r   rR   rR   rS   r=     s    r=   c                 K   s   t d| fi |S )Nr>   r   r   rR   rR   rS   r>     s    r>   c                 K   s   t d| fi |S )Nr?   r   r   rR   rR   rS   r?     s    r?   c                 K   s   t d| fi |S )Nr@   r   r   rR   rR   rS   r@     s    r@   c                 K   s    | dd tdd| d|S )Nr   Fhrnet_w18_ssldr:   r   r   )r   
setdefaultr   r   rR   rR   rS   r     s    r   c                 K   s    | dd tdd| d|S )Nr   Fhrnet_w48_ssldr?   r   )r   r   r   rR   rR   rS   r     s    r   )FN)rT   )F)F)F)F)F)F)F)F)F)F)F)9r   loggingtypingr   r   Ztorch.nnrK   Ztorch.nn.functionalZ
functionalFZ	timm.datar   r   Ztimm.layersr   Z_builderr   r	   Z	_featuresr
   	_registryr   r   Zresnetr   r   __all__rd   	getLoggerr|   rW   r   r   ModulerA   ra   r   r   Z	interfacer   r   r   r   r   r   Zdefault_cfgsr8   r9   r:   r;   r<   r=   r>   r?   r@   r   r   rR   rR   rR   rS   <module>   s  

$$$$$$$$    I   ;

