o
    پi8                     @   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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'dkdEdFZ(dldHdIZ)ee)dJdKdLe)dJdMe)dJdKdLe)dJdMe)dJdNdOe)dJdMe)dJdMe)dJdMe)dJdMe)dJdMe)dJdMe)dJdMe)dJdNdPdQdRe)dJdNdPdQdRdSZ*edmdTe&fdUdVZ+edmdTe&fdWdXZ,edmdTe&fdYdZZ-edmdTe&fd[d\Z.edmdTe&fd]d^Z/edmdTe&fd_d`Z0edmdTe&fdadbZ1edmdTe&fdcddZ2edmdTe&fdedfZ3edmdTe&fdgdhZ4edmdTe&fdidjZ5dS )nz 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   )    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   )r1   r2      )r1   r2   r3   i@  ),   X   )r4   r5      )r4   r5   r6   i`  )0   `   )r7   r8      )r7   r8   r9   i  )r   r!   )r   r!   r0   )r   r!   r0   i   )	hrnet_w18_smallhrnet_w18_small_v2	hrnet_w18	hrnet_w30	hrnet_w32	hrnet_w40	hrnet_w44	hrnet_w48	hrnet_w64c                       sh   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de	e
j de	e
j fddZ  ZS )HighResolutionModuleTc                    sd   t t|   | ||||| || _|| _|| _|| _| ||||| _	| 
 | _td| _d S )NF)superrC   __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   rG   r   r   rH   	__class__ E/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/hrnet.pyrE   f  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 |}|r9t| 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)rP   r   rQ   r   rG   r   	error_msgrT   rT   rU   rF     s   
z$HighResolutionModule._check_branchesr   c           	   	   C   s   d }|dks| j | || |j kr2ttj| j | || |j d|ddtj|| |j td}|| j | || ||g}|| |j | j |< td|| D ]}||| j | ||  qPtj| S Nr   F)kernel_sizestridebiasmomentum)	rG   	expansionrM   
SequentialConv2dBatchNorm2d_BN_MOMENTUMrangeappend)	rP   branch_indexr   r   r   r_   
downsamplelayersirT   rT   rU   _make_one_branch  s    
z%HighResolutionModule._make_one_branchc              	   C   s2   g }t |D ]}|| |||| qt|S N)rh   ri   rn   rM   
ModuleList)rP   r   r   r   r   rJ   rm   rT   rT   rU   rI     s   
z#HighResolutionModule._make_branchesc           
      C   s  | j dkr	t S | j }| j}g }t| jr|ndD ]}g }t|D ]}||krP|ttj|| || dddddtj	|| t
dtjd||  dd q"||kr\|t  q"g }t|| D ]I}||| d kr|| }	|ttj|| |	d	ddddtj	|	t
d qd|| }	|ttj|| |	d	ddddtj	|	t
dtd qd|tj|  q"|t| qt|S )
Nr   r   Fr`   ra   r   nearest)scale_factormoder   )r   rM   IdentityrG   rh   rH   ri   rd   re   rf   rg   UpsamplerN   rp   )
rP   r   rG   rL   rm   
fuse_layerjconv3x3sknum_out_chs_conv3x3rT   rT   rU   rK     sB   

z&HighResolutionModule._make_fuse_layersc                 C      | j S ro   )rG   rP   rT   rT   rU   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 ]*\}}d }t|D ]\}}|d u rA||| }q2||||  }q2|| | q(|S )Nr   r   )r   rJ   	enumeraterL   ri   rO   )	rP   r   rm   branchx_fuse
fuse_outeryrx   frT   rT   rU   forward  s   
zHighResolutionModule.forwardTr   )__name__
__module____qualname__rE   rF   rn   rI   rK   r~   r   torchTensorr   __classcell__rT   rT   rR   rU   rC   e  s    	"
&&rC   c                       sP   e Zd Z fddZejjdd Zejjdd Zdeej	 fddZ  Z
S )SequentialListc                    s   t t| j|  d S ro   )rD   r   rE   )rP   argsrR   rT   rU   rE     s   zSequentialList.__init__c                 C      d S ro   rT   rP   r   rT   rT   rU   r        zSequentialList.forwardc                 C   r   ro   rT   r   rT   rT   rU   r     r   r   c                 C   s   | D ]}||}q|S ro   rT   )rP   r   modulerT   rT   rU   r     s   
)r   r   r   rE   r   jit_overload_methodr   r   r   r   rT   rT   rR   rU   r     s    

r   c                   @   s"   e Zd ZdejdejfddZdS )ModuleInterfaceinputr   c                 C   r   ro   rT   )rP   r   rT   rT   rU   r     s   zModuleInterface.forwardN)r   r   r   r   r   r   rT   rT   rT   rU   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ejfddZd/dedefdd Zdeej fd!d"Zd#d$ Zd.d%efd&d'Zd(d) Z  ZS )0r   r     r   avg        classificationc              	      sf  t t|   || _|dksJ |jd%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rBd | _%| _&| j'||d\| _(| _)| _*t+| j%| j||d\| _,| _-| _.n/|dkrYd | _%| _&| j'|d	d\| _(}}n	d  | _%| _&d | _(t/ | _,t/ | _-t/ | _.d}t0d|d!d"g| _1t2| j#r| j#nD ]%\}}|d9 }| j#r|d# n|}|  j1t0||d$|d  d"g7  _1q| 3  d S )&Nr   r"   r   r   r   F)r^   r_   paddingr`   ra   Tinplacer   r#   r   r   r   r   r$   c                       g | ]	}|  j  qS rT   rc   .0rm   r   r   rT   rU   
<listcomp>-      z.HighResolutionNet.__init__.<locals>.<listcomp>r%   c                    r   rT   r   r   r   rT   rU   r   4  r   r&   c                    r   rT   r   r   r   rT   rU   r   ;  r   )rH   head_conv_biasr   i   )	conv_bias)	pool_type	drop_rateincre)
incre_onlyr0   stem)num_chs	reductionr   r    stagerT   )4rD   r   rE   num_classesupdaterM   re   conv1rf   rg   bn1rN   act1conv2bn2act2
stage1_cfgblock_types_dict_make_layerlayer1rc   
stage2_cfgrh   rW   _make_transition_layertransition1_make_stager$   
stage3_cfgtransition2r%   
stage4_cfgtransition3r&   headhead_channelspopnum_featureshead_hidden_size
_make_headincre_modulesdownsamp_modulesfinal_layerr   global_pool	head_drop
classifierru   dictfeature_infor   init_weights)rP   cfgin_chansr   output_strider   r   r   kwargsr"   r   stage1_out_channelpre_stage_channelsr   _curr_striderm   crR   r   rU   rE     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 ]2}| j| |j	 }	| j|d  |j	 }
t
tj|	|
ddd|dtj|
tdtjdd	}|| q8t|}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`   ra   Tr   r   )r   r   r   ri   r   rM   rp   rh   rW   rc   rd   re   rf   rg   rN   r   )rP   r   r   r   head_block_typer   rm   channelsr   r   r   downsamp_moduler   rT   rT   rU   r   d  s>   
"





zHighResolutionNet._make_headc                 C   s  t |}t |}g }t|D ]z}||k rG|| || kr?|ttj|| || dddddtj|| tdtjdd q|t	  qg }t|d | D ].}|d }	||| kra|| n|	}
|ttj|	|
dd	dddtj|
tdtjdd qQ|tj|  qt
|S )
Nr   r   Frq   ra   Tr   r   )rW   rh   ri   rM   rd   re   rf   rg   rN   ru   rp   )rP   num_channels_pre_layernum_channels_cur_layernum_branches_curnum_branches_pretransition_layersrm   ry   rx   _in_chs_out_chsrT   rT   rU   r     s.   


z(HighResolutionNet._make_transition_layerr   c           	   	   C   s   d }|dks|||j  kr&ttj|||j  d|ddtj||j  td}|||||g}||j  }td|D ]
}|||| q8tj| S r]   )rc   rM   rd   re   rf   rg   rh   ri   )	rP   r   inplanesplanesrQ   r_   rk   rl   rm   rT   rT   rU   r     s   

zHighResolutionNet._make_layerc                 C   s   |d }|d }|d }|d }t |d  }|d }	g }
t|D ]}|p)||d k }|
t||||||	| |
d  }q t|
 |fS )	Nr   r   r   r   r   r   r   r   )r   rh   ri   rC   r~   r   )rP   layer_configrG   rH   r   r   r   r   r   r   modulesrm   reset_multi_scale_outputrT   rT   rU   r     s   zHighResolutionNet._make_stagec                 C   s`   |   D ])}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 )Nfan_outrelu)rt   nonlinearityr   r   )
r   
isinstancerM   re   initkaiming_normal_weightrf   	constant_r`   )rP   mrT   rT   rU   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   rQ   )r   )rP   coarsematcherrT   rT   rU   group_matcher  s
   zHighResolutionNet.group_matcherc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedrT   )rP   enablerT   rT   rU   set_grad_checkpointing  s   z(HighResolutionNet.set_grad_checkpointingr   c                 C   r|   ro   )r   r}   rT   rT   rU   get_classifier  s   z HighResolutionNet.get_classifierr   r   c                 C   s$   || _ t| j| j |d\| _| _d S )N)r   )r   r   r   r   r   )rP   r   r   rT   rT   rU   reset_classifier  s   
z"HighResolutionNet.reset_classifierc                    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 rT   rT   r   rm   t)r   rT   rU   r         z,HighResolutionNet.stages.<locals>.<listcomp>c                    0   g | ]\}}t |tjs| d  n | qS r   r   rM   ru   r   ylrT   rU   r        0 c                    r  r  r  r   r  rT   rU   r     r  )r   r   r   r$   r   r%   r   r&   )rP   r   xlrT   )r   r  rU   stages  s   



zHighResolutionNet.stagesc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| jd u s-| jd u r/|S d }t	| jD ]!\}}|d u rE||| }q6| j|d  }||| |
| }q6| |}|S )Nr   )r   r   r   r   r   r   r	  r   r   r   r   r   )rP   r   r  r   rm   r   downrT   rT   rU   forward_features  s"   







z"HighResolutionNet.forward_features
pre_logitsc                 C   s&   |  |}| |}|r|S | |S ro   )r   r   r   )rP   r   r  rT   rT   rU   forward_head  s   

zHighResolutionNet.forward_headc                 C   s   |  |}| |}|S ro   )r  r  )rP   r   r   rT   rT   rU   r     s   

zHighResolutionNet.forward)r   r   r   r   r   r   )FTr   r   F)r   )r   r   r   rE   r   r   r   r   r   r   ignorer   r   r   rM   Moduler   intstrr   r   r   r	  r  boolr  r   r   rT   rT   rR   rU   r   	  s2    
Y&


	c                       sL   e Zd ZdZ							d fd	d
	Zdd Zdeej f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	           
   	      sZ   |dv sJ t t| j|f||||||d|	 t| j|| _dd | j D | _d S )N)r   rV   )r   r   r   r   r   r   c                 S   s   h | ]}|d  qS )indexrT   )r   r   rT   rT   rU   	<setcomp>?  s    z5HighResolutionNetFeatures.__init__.<locals>.<setcomp>)rD   r   rE   r
   r   	get_dicts_out_idx)
rP   r   r   r   r   r   r   feature_locationout_indicesr   rR   rT   rU   rE   '  s   

z"HighResolutionNetFeatures.__init__c                 C   s   J d)NFzNot supportedrT   r   rT   rT   rU   r  A  s   z*HighResolutionNetFeatures.forward_featuresr   c                 C   s   g }|  |}| |}| |}d| jv r|| | |}| |}| |}| |}| j	d ur?dd t
|| j	D }t|D ]\}}|d | jv rS|| qC|S )Nr   c                 S   s   g | ]\}}||qS rT   rT   )r   r   r   rT   rT   rU   r   P  r  z5HighResolutionNetFeatures.forward.<locals>.<listcomp>r   )r   r   r   r  ri   r   r   r   r	  r   zipr   )rP   r   outrm   r   rT   rT   rU   r   D  s"   










z!HighResolutionNetFeatures.forward)r   r   r   r   r   r   r  )r   r   r   __doc__rE   r  r   r   r   r   r   rT   rT   rR   rU   r     s    Fc           	      K   s   t }d}d }|ddrt}d}d}|p| }|d| o#|dddk}t|| |ft| ||d|}|rAt|j|_|j|_|S )	NFfeatures_only)r   r   Tpretrained_strictr   r   )	model_cfgr  kwargs_filter)	r   r   r   getr   cfg_clsr	   default_cfgpretrained_cfg)	variant
pretrainedcfg_variantmodel_kwargs	model_clsr  r!  r  modelrT   rT   rU   _create_hrnetW  s6   	r,  rV   c                 K   s   | dddddt tddd
|S )	Nr   )r      r-  )   r.  g      ?bilinearr   r   )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   r   )r0  r   rT   rT   rU   _cfgt  s   r8  ztimm/bicubic)	hf_hub_idr4  )r:  gffffff?)r:  r3  g      ?)r      r;  )r:  r3  test_crop_pcttest_input_size)zhrnet_w18_small.gluon_in1kzhrnet_w18_small.ms_in1kzhrnet_w18_small_v2.gluon_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      t d| fi |S )Nr:   r,  r'  r   rT   rT   rU   r:        r:   c                 K   r>  )Nr;   r?  r@  rT   rT   rU   r;     rA  r;   c                 K   r>  )Nr<   r?  r@  rT   rT   rU   r<     rA  r<   c                 K   r>  )Nr=   r?  r@  rT   rT   rU   r=     rA  r=   c                 K   r>  )Nr>   r?  r@  rT   rT   rU   r>     rA  r>   c                 K   r>  )Nr?   r?  r@  rT   rT   rU   r?     rA  r?   c                 K   r>  )Nr@   r?  r@  rT   rT   rU   r@     rA  r@   c                 K   r>  )NrA   r?  r@  rT   rT   rU   rA     rA  rA   c                 K   r>  )NrB   r?  r@  rT   rT   rU   rB     rA  rB   c                 K       | dd tdd| d|S )Nr   Fhrnet_w18_ssldr<   r(  r'  )rC  
setdefaultr,  r@  rT   rT   rU   rC       rC  c                 K   rB  )Nr   Fhrnet_w48_ssldrA   rD  )rH  rE  r@  rT   rT   rU   rH    rG  rH  )FN)rV   r  )6r  loggingtypingr   r   torch.nnrM   	timm.datar   r   timm.layersr   _builderr   r	   	_featuresr
   	_registryr   r   resnetr   r   __all__rg   	getLoggerr   rY   r   r#  r  rC   rd   r   r   	interfacer   r   r   r   r,  r8  default_cfgsr:   r;   r<   r=   r>   r?   r@   rA   rB   rC  rH  rT   rT   rT   rU   <module>   s   

$$$$$$$$    I   
;


