U
    ¯Ê¹j5  ã                   @   sæ  d Z ddlmZ ddlm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mZmZ ddlmZmZ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"d0dd„Z#d1dd„Z$ee$eed�e$dd�e$deedddd�e$dd�e$dd�e$dd�e$dd�e$dd�d œƒZ%ed2e"d!œd"d#„ƒZ&ed3e"d!œd$d%„ƒZ'ed4e"d!œd&d'„ƒZ(ed5e"d!œd(d)„ƒZ)ed6e"d!œd*d+„ƒZ*ed7e"d!œd,d-„ƒZ+ed8e"d!œd.d/„ƒZ,dS )9a^   PyTorch implementation of DualPathNetworks
Based on original MXNet implementation https://github.com/cypw/DPNs with
many ideas from another PyTorch implementation https://github.com/oyam/pytorch-DPNs.

This implementation is compatible with the pretrained weights from cypw's MXNet implementation.

Hacked together by / Copyright 2020 Ross Wightman
é    )ÚOrderedDict)Úpartial)ÚTupleN)ÚIMAGENET_DPN_MEANÚIMAGENET_DPN_STDÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚBatchNormAct2dÚConvNormActÚcreate_conv2dÚcreate_classifierÚget_norm_act_layeré   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgsÚDPNc                       sH   e Zd Zef‡ fdd„	Zejjdd„ ƒZejjdd„ ƒZdd„ Z‡  Z	S )ÚCatBnActc                    s    t t| ƒ ¡  ||dd�| _d S )Nçü©ñÒMbP?©Úeps)Úsuperr   Ú__init__Úbn)ÚselfÚin_chsÚ
norm_layer©Ú	__class__© úN/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/dpn.pyr      s    zCatBnAct.__init__c                 C   s   d S ©Nr   ©r   Úxr   r   r    Úforward   s    zCatBnAct.forwardc                 C   s   d S r!   r   r"   r   r   r    r$   #   s    c                 C   s"   t |tƒrtj|dd�}|  |¡S )Nr   ©Údim)Ú
isinstanceÚtupleÚtorchÚcatr   r"   r   r   r    r$   (   s    
)
Ú__name__Ú
__module__Ú__qualname__r	   r   r)   ÚjitÚ_overload_methodr$   Ú__classcell__r   r   r   r    r      s   

r   c                       s*   e Zd Zdef‡ fdd„	Zdd„ Z‡  ZS )ÚBnActConv2dr   c                    s4   t t| ƒ ¡  ||dd�| _t|||||d�| _d S )Nr   r   )ÚstrideÚgroups)r   r1   r   r   r   Úconv)r   r   Úout_chsÚkernel_sizer2   r3   r   r   r   r    r   /   s    zBnActConv2d.__init__c                 C   s   |   |  |¡¡S r!   )r4   r   r"   r   r   r    r$   4   s    zBnActConv2d.forward)r+   r,   r-   r	   r   r$   r0   r   r   r   r    r1   .   s   r1   c                       sX   e Zd Zd
‡ fdd„	Zejjdd„ ƒZejjdd„ ƒZeej	ej	f dœd	d„Z‡  Z
S )ÚDualPathBlockÚnormalFc	           	         s8  t t| ƒ ¡  || _|| _|| _|dkr6d| _d| _n.|dkrLd| _d| _n|dksXt‚d| _d| _d | _	d | _
| jr¶| jdkrœt||d|  ddd�| _
nt||d|  ddd�| _	t||ddd�| _t||d	| j|d
�| _|�rt|d�| _t||dd�| _t||dd�| _n"t||| ddd�| _d | _d | _d S )NÚprojr   TÚdowné   r8   F)r   r5   r6   r2   é   )r   r5   r6   r2   r3   )r   )r6   )r   r7   r   Ú	num_1x1_cÚincÚbZ
key_strideZhas_projÚAssertionErrorÚ	c1x1_w_s1Ú	c1x1_w_s2r1   Úc1x1_aÚc3x3_br   Úc1x1_cr   Úc1x1_c1Úc1x1_c2)	r   r   Z	num_1x1_aZ	num_3x3_br=   r>   r3   Z
block_typer?   r   r   r    r   9   sX    
 
  ÿ
 
  ÿ    ÿzDualPathBlock.__init__c                 C   s   d S r!   r   r"   r   r   r    r$   j   s    zDualPathBlock.forwardc                 C   s   d S r!   r   r"   r   r   r    r$   o   s    ©Úreturnc           
      C   sL  t |tƒrtj|dd�}n|}| jd krD| jd krD|d }|d }nd| jd k	rZ|  |¡}n
|  |¡}|d d …d | j…d d …d d …f }|d d …| jd …d d …d d …f }|  |¡}|  |¡}|  	|¡}| j
d k	ræ|  
|¡}|  |¡}nD|d d …d | j…d d …d d …f }|d d …| jd …d d …d d …f }|| }tj||gdd�}	||	fS )Nr   r%   r   )r'   r(   r)   r*   rA   rB   r=   rC   rD   rE   rF   rG   )
r   r#   Zx_inZx_s1Zx_s2Zx_sZout1Zout2ZresidZdenser   r   r    r$   t   s,    



""




"")r8   F)r+   r,   r-   r   r)   r.   r/   r$   r   ZTensorr0   r   r   r   r    r7   8   s   	  ÷1

r7   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<   é   é   r<   ©é   é    é   é€   é`   rO   éè  r<   ÚavgFé@   ç        Úbatchnorm2dÚreluÚeluc              
      sÀ  t t| ƒ ¡  || _|| _|| _|dks,t‚tt||d�dd�}tt||d�ddd�}|	r^dnd}t	ƒ }t
||
|	rvd	nd
d|d�|d< tjd	ddd�|d< t|
ddd�g| _d| }|d }|| d|  }t|
|||||d|ƒ|d< |d	|  }td|d d ƒD ]0}t||||||d|ƒ|dt|ƒ < ||7 }�q|  jt|dd|d › �d�g7  _d| }|d }|| d|  }t||||||d|ƒ|d< |d	|  }td|d d ƒD ]0}t||||||d|ƒ|dt|ƒ < ||7 }�q²|  jt|dd|d › �d�g7  _d| }|d }|| d|  }t||||||d|ƒ|d < |d	|  }td|d d ƒD ]0}t||||||d|ƒ|d!t|ƒ < ||7 }�q`|  jt|d"d#|d › �d�g7  _d$| }|d	 }|| d|  }t||||||d|ƒ|d%< |d	|  }td|d	 d ƒD ]0}t||||||d|ƒ|d&t|ƒ < ||7 }�q|  jt|dd'|d	 › �d�g7  _t||d(�|d)< || _t |¡| _t| j| j|d*d+�\| _| _|�r²t d¡nt ¡ | _d S ),NrO   )Ú	act_layerr   r   F)r   Zinplacer   rK   r<   é   r;   )r6   r2   r   Zconv1_1)r6   r2   ÚpaddingZ
conv1_poolzfeatures.conv1_1)Znum_chsZ	reductionÚmodulerU   r   r9   Zconv2_1r8   Zconv2_zfeatures.conv2_rQ   r:   Zconv3_1Zconv3_é   zfeatures.conv3_é   Zconv4_1Zconv4_rN   zfeatures.conv4_i   Zconv5_1Zconv5_zfeatures.conv5_)r   Zconv5_bn_acT©Z	pool_typeZuse_conv)r   r   r   Únum_classesÚ	drop_rater?   r@   r   r   r   r
   ÚnnZ	MaxPool2dÚdictZfeature_infor7   ÚrangeÚstrr   Únum_featuresZ
SequentialÚfeaturesr   Úglobal_poolÚ
classifierÚFlattenÚIdentityÚflatten)r   Úk_secÚinc_secÚk_rr3   ra   Zin_chansZoutput_strideri   ÚsmallÚnum_init_featuresr?   rb   r   rZ   Zfc_act_layerZfc_norm_layerZ	bw_factorÚblocksÚbwr>   Úrr   Úir   r   r    r   —   s€      
  ÿ
"$"$"$"$   ÿzDPN.__init__c                 C   s    t d|rdndd fdgd�}|S )Nz^features\.conv1z^features\.conv(\d+)z^features\.conv(\d+)_(\d+))z^features\.conv5_bn_ac)iŸ† )Ústemrs   )rd   )r   ZcoarseZmatcherr   r   r    Úgroup_matcherð   s    þþzDPN.group_matcherTc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)r@   )r   Úenabler   r   r    Úset_grad_checkpointingû   s    zDPN.set_grad_checkpointingc                 C   s   | j S r!   )rj   )r   r   r   r    Úget_classifierÿ   s    zDPN.get_classifierc                 C   s>   || _ t| j| j |dd�\| _| _|r0t d¡nt ¡ | _d S )NTr`   r   )	ra   r   rg   ri   rj   rc   rk   rl   rm   )r   ra   ri   r   r   r    Úreset_classifier  s       ÿzDPN.reset_classifierc                 C   s
   |   |¡S r!   )rh   r"   r   r   r    Úforward_features	  s    zDPN.forward_features)Ú
pre_logitsc                 C   sJ   |   |¡}| jdkr(tj|| j| jd�}|r6|  |¡S |  |¡}|  |¡S )NrV   )ÚpÚtraining)ri   rb   ÚFZdropoutr€   rm   rj   )r   r#   r~   r   r   r    Úforward_head  s    



zDPN.forward_headc                 C   s   |   |¡}|  |¡}|S r!   )r}   r‚   r"   r   r   r    r$     s    

zDPN.forward)rJ   rM   rR   rO   rS   r<   rO   rT   FrU   FrV   rW   rX   rY   )F)T)rT   )F)r+   r,   r-   r   r)   r.   Úignorerx   rz   r{   r|   r}   Úboolr‚   r$   r0   r   r   r   r    r   –   s4                  ðY


	Fc                 K   s    t t| |fdtddd�i|—ŽS )NZfeature_cfgT)Zfeature_concatZflatten_sequential)r   r   rd   )ÚvariantÚ
pretrainedÚkwargsr   r   r    Ú_create_dpn  s    ý
üûrˆ   Ú c                 K   s   | dddddt tdddœ
|–S )	NrS   )r<   éà   rŠ   )r[   r[   g      ì?Zbicubiczfeatures.conv1_1.convrj   )
Úurlra   Z
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚstdZ
first_convrj   )r   r   )r‹   r‡   r   r   r    Ú_cfg%  s          üûr�   )rŽ   r�   ztimm/)Ú	hf_hub_idgffffffî?)r<   é   r’   g      ð?)r‘   rŽ   r�   rŒ   Ztest_input_sizeZtest_crop_pct)zdpn48b.untrainedzdpn68.mx_in1kzdpn68b.ra_in1kzdpn68b.mx_in1kzdpn92.mx_in1kzdpn98.mx_in1kzdpn131.mx_in1kzdpn107.mx_in1krH   c              
   K   s2   t ddddddddd�}tdd
| it |f|Ž—ŽS )NTé
   rQ   rO   )r<   rK   é   r<   ©rN   rO   rO   rU   Zsilu)rq   rr   rp   r3   r?   rn   ro   rZ   Údpn48br†   )r–   ©rd   rˆ   ©r†   r‡   Z
model_argsr   r   r    r–   >  s          þr–   c                 K   s.   t ddddddd�}td
d	| it |f|Ž—ŽS )NTr“   rQ   rO   ©r<   rK   é   r<   r•   )rq   rr   rp   r3   rn   ro   Údpn68r†   )r›   r—   r˜   r   r   r    r›   F  s        þr›   c              	   K   s0   t dddddddd�}td
d	| it |f|Ž—ŽS )NTr“   rQ   rO   r™   r•   )rq   rr   rp   r3   r?   rn   ro   Údpn68br†   )rœ   r—   r˜   r   r   r    rœ   N  s         þrœ   c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
NrU   rR   rO   rJ   rM   ©rr   rp   r3   rn   ro   Údpn92r†   )rž   r—   r˜   r   r   r    rž   V  s       þrž   c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
NrR   é    é(   )r<   r”   rL   r<   ©rN   rO   rO   rQ   r�   Údpn98r†   )r¢   r—   r˜   r   r   r    r¢   ^  s       þr¢   c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
NrQ   rŸ   r    )rK   r^   é   r<   r¡   r�   Údpn131r†   )r¤   r—   r˜   r   r   r    r¤   f  s       þr¤   c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
NrQ   éÈ   é2   )rK   r^   rL   r<   )rL   rU   rU   rQ   r�   Údpn107r†   )r§   r—   r˜   r   r   r    r§   n  s       þr§   )F)r‰   )F)F)F)F)F)F)F)-Ú__doc__Úcollectionsr   Ú	functoolsr   Útypingr   r)   Ztorch.nnrc   Ztorch.nn.functionalZ
functionalr�   Z	timm.datar   r   r   r   Ztimm.layersr	   r
   r   r   r   Z_builderr   Ú	_registryr   r   Ú__all__ÚModuler   r1   r7   r   rˆ   r�   Zdefault_cfgsr–   r›   rœ   rž   r¢   r¤   r§   r   r   r   r    Ú<module>   sb   
^ 




   ýõ