a
    d55                     @   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 )NMbP?eps)superr   __init__bn)selfin_chs
norm_layer	__class__ X/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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   Z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   r0   r   r   r   conv)r   r   out_chskernel_sizer1   r2   r   r   r   r    r   /   s    zBnActConv2d.__init__c                 C   s   |  | |S r!   )r3   r   r"   r   r   r    r$   4   s    zBnActConv2d.forward)r*   r+   r,   r	   r   r$   r/   r   r   r   r    r0   .   s   r0   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sXJ d| _d| _d | _d | _	| jr| jdkrt
||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   r7   F)r   r4   r5   r1      )r   r4   r5   r1   r2   )r   )r5   )r   r6   r   	num_1x1_cincbZ
key_strideZhas_proj	c1x1_w_s1	c1x1_w_s2r0   c1x1_ac3x3_br   c1x1_cr   c1x1_c1c1x1_c2)	r   r   Z	num_1x1_aZ	num_3x3_br<   r=   r2   Z
block_typer>   r   r   r    r   9   sD    

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 u rD| jd u rD|d }|d }nd| jd urZ| |}n
| |}|d d d | jd d d d f }|d d | jd d d d d f }| |}| |}| 	|}| j
d u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)   r?   r@   r<   rA   rB   rC   rD   rE   )
r   r#   Zx_inZx_s1Zx_s2Zx_sZout1Zout2ZresidZdenser   r   r    r$   t   s,    



""




"")r7   F)r*   r+   r,   r   r(   r-   r.   r$   r   ZTensorr/   r   r   r   r    r6   8   s   	  1

r6   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;                `   rM     r;   avgF@           batchnorm2drelueluc              
      s  t t|   || _|| _|| _|dks,J 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+\| _| _|rt
dnt
 | _d S ),NrM   )	act_layerr   r   F)r   Zinplacer   rI   r;      r:   )r5   r1   r   Zconv1_1)r5   r1   paddingZ
conv1_poolzfeatures.conv1_1)Znum_chsZ	reductionmodulerS   r   r8   Zconv2_1r7   Zconv2_zfeatures.conv2_rO   r9   Zconv3_1Zconv3_   zfeatures.conv3_   Zconv4_1Zconv4_rL   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
   nnZ	MaxPool2ddictZfeature_infor6   rangestrr   num_featuresZ
Sequentialfeaturesr   global_pool
classifierFlattenIdentityflatten)r   k_secinc_seck_rr2   r_   Zin_chansZoutput_striderg   smallnum_init_featuresr>   r`   r   rX   Zfc_act_layerZfc_norm_layerZ	bw_factorblocksZbwr=   rr   ir   r   r    r      sr    
"$"$"$"$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 )stemrq   )rb   )r   ZcoarseZmatcherr   r   r    group_matcher   s    zDPN.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr   )r   enabler   r   r    set_grad_checkpointing   s    zDPN.set_grad_checkpointingc                 C   s   | j S r!   )rh   )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   )	r_   r   re   rg   rh   ra   ri   rj   rk   )r   r_   rg   r   r   r    reset_classifier  s
    zDPN.reset_classifierc                 C   s
   |  |S r!   )rf   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 )NrT   )ptraining)rg   r`   FZdropoutr}   rk   rh   )r   r#   r{   r   r   r    forward_head  s    



zDPN.forward_headc                 C   s   |  |}| |}|S r!   )rz   r   r"   r   r   r    r$     s    

zDPN.forward)rH   rK   rP   rM   rQ   r;   rM   rR   FrS   FrT   rU   rV   rW   )F)T)rR   )F)r*   r+   r,   r   r(   r-   ignoreru   rw   rx   ry   rz   boolr   r$   r/   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   rb   )variant
pretrainedkwargsr   r   r    _create_dpn  s    
r    c                 K   s   | dddddt tddd
|S )	NrQ   )r;      r   )rY   rY   g      ?Zbicubiczfeatures.conv1_1.convrh   )
urlr_   Z
input_sizeZ	pool_sizecrop_pctinterpolationmeanstdZ
first_convrh   )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_in1krF   c              
   K   s6   t ddddddddd}tdd
| it |fi |S )NT
   rO   rM   )r;   rI      r;   rL   rM   rM   rS   Zsilu)ro   rp   rn   r2   r>   rl   rm   rX   dpn48br   )r   rb   r   r   r   Zmodel_kwargsr   r   r    r   >  s
    r   c                 K   s2   t ddddddd}td
d	| it |fi |S )NTr   rO   rM   r;   rI      r;   r   )ro   rp   rn   r2   rl   rm   dpn68r   )r   r   r   r   r   r    r   F  s
    r   c              	   K   s4   t dddddddd}td
d	| it |fi |S )NTr   rO   rM   r   r   )ro   rp   rn   r2   r>   rl   rm   dpn68br   )r   r   r   r   r   r    r   N  s
    r   c                 K   s0   t dddddd}td	d| it |fi |S )
NrS   rP   rM   rH   rK   rp   rn   r2   rl   rm   dpn92r   )r   r   r   r   r   r    r   V  s
    r   c                 K   s0   t dddddd}td	d| it |fi |S )
NrP      (   )r;   r   rJ   r;   rL   rM   rM   rO   r   dpn98r   )r   r   r   r   r   r    r   ^  s
    r   c                 K   s0   t dddddd}td	d| it |fi |S )
NrO   r   r   )rI   r\      r;   r   r   dpn131r   )r   r   r   r   r   r    r   f  s
    r   c                 K   s0   t dddddd}td	d| it |fi |S )
NrO      2   )rI   r\   rJ   r;   )rJ   rS   rS   rO   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.nnra   Ztorch.nn.functionalZ
functionalr~   Z	timm.datar   r   r   r   Ztimm.layersr	   r
   r   r   r   Z_builderr   	_registryr   r   __all__Moduler   r0   r6   r   r   r   Zdefault_cfgsr   r   r   r   r   r   r   r   r   r   r    <module>   s\   
^ 




