a
    d7                  
   @   s  d 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
mZmZmZ ddlmZ ddl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d+ddZd,ddZeedddeddeddeddedddeddddZ ed-ed d!d"Z!ed.ed d#d$Z"ed/ed d%d&Z#ed0ed d'd(Z$ed1ed d)d*Z%dS )2a  Pytorch impl of Aligned Xception 41, 65, 71

This is a correct, from scratch impl of Aligned Xception (Deeplab) models compatible with TF weights at
https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md

Hacked together by / Copyright 2020 Ross Wightman
    )partialNIMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)ClassifierHeadConvNormActcreate_conv2dget_norm_act_layer)	to_3tuple   )build_model_with_cfg)checkpoint_seq)register_modelgenerate_default_cfgsXceptionAlignedc                       s6   e Zd Zddddejejf fdd	Zdd Z  ZS )SeparableConv2d   r    c	           	   	      s   t t|   || _|| _t||||||dd| _||| _|d urN|ddnt	 | _
t||dd| _||| _|d ur|ddnt	 | _d S )NTstridepaddingdilationZ	depthwiseZinplacer   kernel_size)superr   __init__r   r   r   conv_dwbn_dwnnIdentityact_dwconv_pwbn_pwact_pw)	selfin_chsout_chsr   r   r   r   	act_layer
norm_layer	__class__ e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/xception_aligned.pyr      s    

zSeparableConv2d.__init__c                 C   s@   |  |}| |}| |}| |}| |}| |}|S N)r   r   r!   r"   r#   r$   r%   xr,   r,   r-   forward3   s    





zSeparableConv2d.forward	__name__
__module____qualname__r   ReLUBatchNorm2dr   r1   __classcell__r,   r,   r*   r-   r      s   r   c                       s8   e Zd Zddddejejdf fdd	Zdd Z  ZS )	PreSeparableConv2dr   r   r   Tc
              	      sl   t t|   t||d}
|| _|| _|	r6|
|ddnt | _t	||||||dd| _
t	||dd| _d S )Nr(   Tr   r   r   r   )r   r9   r   r	   r   r   r   r    normr   r   r"   )r%   r&   r'   r   r   r   r   r(   r)   	first_actZnorm_act_layerr*   r,   r-   r   >   s    zPreSeparableConv2d.__init__c                 C   s"   |  |}| |}| |}|S r.   )r;   r   r"   r/   r,   r,   r-   r1   X   s    


zPreSeparableConv2d.forwardr2   r,   r,   r*   r-   r9   =   s   r9   c                       s6   e Zd Zdddddejdf fdd	Zdd	 Z  ZS )
XceptionModuler   r   TFNc
                    s   t t|   t|}|| _|d | _|| _|s^| j| jksD|dkr^t|| jd||	dd| _nd | _|rld n|}
t	
 | _tdD ]n}|r| jd|d  ||dkd | jd	|d  t||| d|d
kr|nd|||
|	d || }qd S )Nr   F)r   r)   Z	apply_actr   actr   r   conv   )r   r   r   r(   r)   )r   r=   r   r
   in_channelsout_channelsno_skipr   shortcutr   
Sequentialstackrange
add_moduler   )r%   r&   r'   r   r   pad_typestart_with_relurD   r(   r)   Zseparable_act_layerir*   r,   r-   r   `   s(    


"zXceptionModule.__init__c                 C   s4   |}|  |}| jd ur"| |}| js0|| }|S r.   )rG   rE   rD   r%   r0   skipr,   r,   r-   r1      s    


zXceptionModule.forwardr3   r4   r5   r   r6   r   r1   r8   r,   r,   r*   r-   r=   _   s   !r=   c                       s4   e Zd Zddddejdf fdd	Zdd Z  ZS )	PreXceptionModuler   r   FNc	           
         s   t t|   t|}|| _|d | _|| _|sZ| j| jksD|dkrZt|| jd|d| _n
t	
 | _t||d|dd| _t	 | _tdD ]N}	| jd|	d  t|||	 d|	d	kr|nd|||||	d
kd	 ||	 }qd S )Nr>   r   )r   r:   Tr   r   r@   rA   r   )r   r   r   r(   r)   r<   )r   rP   r   r
   rB   rC   rD   r   rE   r   r    r	   r;   rF   rG   rH   rI   r9   )
r%   r&   r'   r   r   rJ   rD   r(   r)   rL   r*   r,   r-   r      s.    


zPreXceptionModule.__init__c                 C   s0   |  |}|}| |}| js,|| | }|S r.   )r;   rG   rD   rE   rM   r,   r,   r-   r1      s    

zPreXceptionModule.forwardrO   r,   r,   r*   r-   rP      s   %rP   c                       s   e Zd ZdZddddejejddf 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   zModified Aligned Xception
      r       Fg        avgc
              	      s  t t|   |dv sJ || _|| _d| _t||d}
tjt	|dfddd|
|rft
dddd	dnt	ddd	d|
g | _d	}d}g | _t | _|rtnt}t|D ]\}}||d
< |d d	kr<|rd| dn
d| d}|  jtt|d d ||dg7  _||d  }||kr8||d 9 }d	|d< n|}| jt||f i ||
 | jd j| _q|  jt| j|dtt| jd	  dg7  _|r|ddnt | _t| j||	|d| _d S )N)      rR   F)r(   r)   rR   r   rA   )r   r   @   r   r   r   zblocks.z.stack.conv2z.stack.act3r'   )Znum_chsZ	reductionmoduler>   Tr   )Zin_featuresnum_classes	pool_type	drop_rate)rR   rV   )r   r   r   rY   r[   grad_checkpointingdictr   rF   r   r   stemZfeature_infoblocksrP   r=   	enumerater
   rI   strrC   Znum_featureslenr    r?   r   head)r%   	block_cfgrY   Zin_chansZoutput_stridepreactr(   r)   r[   global_poolZ
layer_argsZcurr_dilationZcurr_strideZ	module_fnrL   bnameZnext_strider*   r,   r-   r      sL    
&

 zXceptionAligned.__init__c                 C   s   t dddS )Nz^stemz^blocks\.(\d+))r^   r_   )r]   )r%   Zcoarser,   r,   r-   group_matcher   s    zXceptionAligned.group_matcherTc                 C   s
   || _ d S r.   )r\   )r%   enabler,   r,   r-   set_grad_checkpointing   s    z&XceptionAligned.set_grad_checkpointingc                 C   s   | j jS r.   )rc   Zfc)r%   r,   r,   r-   get_classifier   s    zXceptionAligned.get_classifierc                 C   s   | j j||d d S )N)rZ   )rc   reset)r%   rY   rf   r,   r,   r-   reset_classifier  s    z XceptionAligned.reset_classifierc                 C   s@   |  |}| jr(tj s(t| j|}n
| |}| |}|S r.   )r^   r\   torchjitZis_scriptingr   r_   r?   r/   r,   r,   r-   forward_features  s    


z XceptionAligned.forward_features
pre_logitsc                 C   s   | j ||dS )Nrr   )rc   )r%   r0   rs   r,   r,   r-   forward_head  s    zXceptionAligned.forward_headc                 C   s   |  |}| |}|S r.   )rq   rt   r/   r,   r,   r-   r1     s    

zXceptionAligned.forward)F)T)rS   )F)r3   r4   r5   __doc__r   r6   r7   r   ro   rp   ignoreri   rk   rl   rn   rq   boolrt   r1   r8   r,   r,   r*   r-   r      s(   6

	Fc                 K   s    t t| |fdtdddi|S )NZfeature_cfgThook)Zflatten_sequentialZfeature_cls)r   r   r]   )variant
pretrainedkwargsr,   r,   r-   	_xception  s    
r|   r   c                 K   s   | dddddt tddd
|S )	NrQ   )r   +  r}   )
   r~   gL7A`?Zbicubiczstem.0.convzhead.fc)
urlrY   Z
input_sizeZ	pool_sizecrop_pctinterpolationmeanZstdZ
first_conv
classifierr   )r   r{   r,   r,   r-   _cfg"  s    r   ztimm/gGz?)	hf_hub_idr   )r   )zxception65.ra3_in1kzxception41.tf_in1kzxception65.tf_in1kzxception71.tf_in1kzxception41p.ra3_in1kzxception65p.ra3_in1k)returnc                 K   s   t ddddt ddddt ddddgt ddddgd t dd	ddt d
ddddd}t f |ttjdddd|}tdd| i|S )z" Modified Aligned Xception-41
    rV      rA   r&   r'   r        r   rT   r      r   r      r   i   TFr&   r'   r   rD   rK   MbP?皙?ZepsZmomentumrd   r)   
xception41rz   )r   r]   r   r   r7   r|   rz   r{   rd   Z
model_argsr,   r,   r-   r   B  s    	 r   c                 K   s   t ddddt ddddt ddddgt ddddgd t dd	ddt d
ddddd}t f |ttjdddd|}tdd| i|S )z" Modified Aligned Xception-65
    rV   r   rA   r   r   r   r   rU   r   r   r   TFr   r   r   r   r   
xception65rz   )r   r   r   r,   r,   r-   r   U  s    	 r   c              	   K   s   t ddddt ddddt ddddt ddddt ddddgt ddddgd t dd	ddt d
ddddd}t f |ttjdddd|}tdd| i|S )z" Modified Aligned Xception-71
    rV   r   rA   r   r   r   r   rU   r   r   r   TFr   r   r   r   r   
xception71rz   )r   r   r   r,   r,   r-   r   h  s    
 r   c                 K   s   t ddddt ddddt ddddgt ddddgd t dd	ddt d
dddd}t f |dtjd|}tdd| i|S )z- Modified Aligned Xception-41 w/ Pre-Act
    rV   r   rA   r   r   r   r   rT   r   r   r   T)r&   r'   rD   r   rd   re   r)   xception41prz   )r   )r]   r   r7   r|   r   r,   r,   r-   r   }  s    	r   c              	   K   s   t ddddt ddddt ddddgt ddddgd t dd	ddt d
dddd}t f |dttjdddd|}tdd| i|S )z- Modified Aligned Xception-65 w/ Pre-Act
    rV   r   rA   r   r   r   r   rU   r   r   r   T)r&   r'   r   rD   r   r   r   r   xception65prz   )r   r   r   r,   r,   r-   r     s     	r   )F)r   )F)F)F)F)F)&ru   	functoolsr   ro   Ztorch.nnr   Z	timm.datar   r   Ztimm.layersr   r   r   r	   Ztimm.layers.helpersr
   Z_builderr   Z_manipulater   	_registryr   r   __all__Moduler   r9   r=   rP   r   r|   r   Zdefault_cfgsr   r   r   r   r   r,   r,   r,   r-   <module>   sX   &",/^


