o
    پi]<                  
   @   s  d Z ddlmZ ddlmZmZmZ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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,d!e$fd"d#Z(ed,d!e$fd$d%Z)ed,d!e$fd&d'Z*ed,d!e$fd(d)Z+ed,d!e$fd*d+Z,dS ).a  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
    )partial)ListDictTypeOptionalNIMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)ClassifierHeadConvNormActDropPathPadTypecreate_conv2dget_norm_act_layer)	to_3tuple   )build_model_with_cfg)checkpoint_seq)register_modelgenerate_default_cfgsXceptionAlignedc                       sd   e Zd Zddddejejfdededededed	ed
eej	 deej	 f fddZ
dd Z  ZS )SeparableConv2d   r    in_chsout_chskernel_sizestridedilationpadding	act_layer
norm_layerc	           	   	      s   t t|   || _|| _t||||||dd| _||| _|d ur'|ddnt	 | _
t||dd| _||| _|d urE|dd| _d S t	 | _d S )NTr   r   r   	depthwiseinplacer   r   )superr   __init__r   r   r   conv_dwbn_dwnnIdentityact_dwconv_pwbn_pwact_pw)	selfr   r   r   r   r   r   r    r!   	__class__ P/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/xception_aligned.pyr(      s   

&zSeparableConv2d.__init__c                 C   s@   |  |}| |}| |}| |}| |}| |}|S N)r)   r*   r-   r.   r/   r0   r1   xr4   r4   r5   forward4   s   





zSeparableConv2d.forward)__name__
__module____qualname__r+   ReLUBatchNorm2dintr   r   Moduler(   r9   __classcell__r4   r4   r2   r5   r      s2    	r   c                       sj   e Zd Zddddejejdfdedededed	ed
edeej	 deej	 de
f fddZdd Z  ZS )PreSeparableConv2dr   r   r   Tr   r   r   r   r   r   r    r!   	first_actc
              	      sl   t t|   t||d}
|| _|| _|	r|
|ddnt | _t	||||||dd| _
t	||dd| _d S )Nr    Tr$   r"   r   r&   )r'   rB   r(   r   r   r   r+   r,   normr   r)   r.   )r1   r   r   r   r   r   r   r    r!   rC   norm_act_layerr2   r4   r5   r(   ?   s   zPreSeparableConv2d.__init__c                 C   s"   |  |}| |}| |}|S r6   )rE   r)   r.   r7   r4   r4   r5   r9   Y   s   


zPreSeparableConv2d.forward)r:   r;   r<   r+   r=   r>   r?   r   r   r@   boolr(   r9   rA   r4   r4   r2   r5   rB   >   s8    	
rB   c                       sx   e Zd Zdddddejddfdededed	ed
edededeej	 de
eej	  de
ej	 f fddZdd Z  ZS )XceptionModuler   r   TFNr   r   r   r   pad_typestart_with_reluno_skipr    r!   	drop_pathc                    s   t t|   t|}|| _|d | _|| _|s/| j| jks"|dkr/t|| jd||	dd| _nd | _|r6d n|}t	
 | _tdD ]7}|rV| jd|d  ||dkd | jd	|d  t||| d|d
krk|nd||||	d || }qA|
| _d S )Nr   F)r   r!   	apply_actr   actr   r$   conv   )r   r   r   r    r!   )r'   rH   r(   r   in_channelsout_channelsrK   r   shortcutr+   
Sequentialstackrange
add_moduler   rL   )r1   r   r   r   r   rI   rJ   rK   r    r!   rL   separable_act_layerir2   r4   r5   r(   a   s*   


"

zXceptionModule.__init__c                 C   sH   |}|  |}| jd ur| |}| js"| jd ur| |}|| }|S r6   )rV   rT   rK   rL   r1   r8   skipr4   r4   r5   r9      s   




zXceptionModule.forwardr:   r;   r<   r+   r=   r?   r   rG   r   r@   r   r(   r9   rA   r4   r4   r2   r5   rH   `   s>    	
$rH   c                       sr   e Zd Zddddejddfdedededed	ed
edeej	 de
eej	  de
ej	 f fddZdd Z  ZS )PreXceptionModuler   r   FNr   r   r   r   rI   rK   r    r!   rL   c
                    s   t t|   t|}|| _|d | _|| _|s-| j| jks"|dkr-t|| jd|d| _nt	
 | _t||d|dd| _t	 | _tdD ]'}
| jd|
d  t|||
 d|
d	kr]|nd|||||
d
kd	 ||
 }qF|	| _d S )NrM   r   )r   rD   Tr$   r   rP   rQ   r   )r   r   r   r    r!   rC   )r'   r^   r(   r   rR   rS   rK   r   rT   r+   r,   r   rE   rU   rV   rW   rX   rB   rL   )r1   r   r   r   r   rI   rK   r    r!   rL   rZ   r2   r4   r5   r(      s0   




zPreXceptionModule.__init__c                 C   sD   |  |}|}| |}| js | jd ur| |}|| | }|S r6   )rE   rV   rK   rL   rT   r[   r4   r4   r5   r9      s   



zPreXceptionModule.forwardr]   r4   r4   r2   r5   r^      s8    	
(r^   c                       s   e Zd ZdZddddejejdddf	dee d	e	d
e	de	de
deej deej dededef f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e fddZdd  Zd&d!e
fd"d#Zd$d% Z  ZS ))r   zModified Aligned Xception
      r       F        avg	block_cfgnum_classesin_chansoutput_stridepreactr    r!   	drop_ratedrop_path_rateglobal_poolc              	      s
  t t|   |dv sJ || _|| _d| _t||d}tjt	|dfddd||r3t
dddd	dn	t	ddd	d|g | _d	}d}g | _t | _|rPtnt}t|}d
}t|D ]u\}}|	| |d	  }|dkrpt|nd |d< ||d< |d d	kr|rd| dnd| d}|  jtt|d d ||dg7  _||d  }||kr||d 9 }d	|d< n|}| jt||di || | jd j| _|d	7 }q\|  jt| j|dtt| jd	  dg7  _|r|ddnt | _| j| _t| j||
|d| _d S )N)      r`   F)r    r!   r`   r   rQ   )r   r   @   r   r   ra   rL   r   r   zblocks.z.stack.conv2z.stack.act3r   )num_chs	reductionmodulerM   Tr$   )in_featuresrd   	pool_typerh   )r`   rm   r4   )r'   r   r(   rd   rh   grad_checkpointingdictr+   rU   r   r   stemfeature_infoblocksr^   rH   len	enumerater   r   rX   strrS   num_featuresr,   rO   head_hidden_sizer
   head)r1   rc   rd   re   rf   rg   r    r!   rh   ri   rj   
layer_argscurr_dilationcurr_stride	module_fnnet_num_blocksnet_block_idxrZ   b	block_dprnamenext_strider2   r4   r5   r(      sX   
&
 
zXceptionAligned.__init__c                 C   s   t dddS )Nz^stemz^blocks\.(\d+))rv   rx   )ru   )r1   coarser4   r4   r5   group_matcher  s   zXceptionAligned.group_matcherTc                 C   s
   || _ d S r6   )rt   )r1   enabler4   r4   r5   set_grad_checkpointing  s   
z&XceptionAligned.set_grad_checkpointingreturnc                 C   s   | j jS r6   )r~   fc)r1   r4   r4   r5   get_classifier  s   zXceptionAligned.get_classifierNc                 C   s   || _ | jj||d d S )N)rs   )rd   r~   reset)r1   rd   rj   r4   r4   r5   reset_classifier  s   z XceptionAligned.reset_classifierc                 C   s@   |  |}| jrtj st| j|}n| |}| |}|S r6   )rv   rt   torchjitis_scriptingr   rx   rO   r7   r4   r4   r5   forward_features  s   


z XceptionAligned.forward_features
pre_logitsc                 C   s   |r	| j ||dS |  |S )N)r   )r~   )r1   r8   r   r4   r4   r5   forward_head"  s   zXceptionAligned.forward_headc                 C   s   |  |}| |}|S r6   )r   r   r7   r4   r4   r5   r9   %  s   

zXceptionAligned.forwardF)Tr6   )r:   r;   r<   __doc__r+   r=   r>   r   r   r?   rG   r   r@   floatr{   r(   r   r   ignorer   r   r   r   r   r   r   r9   rA   r4   r4   r2   r5   r      sT    	
=	Fc                 K   s    t t| |fdtdddi|S )Nfeature_cfgThook)flatten_sequentialfeature_cls)r   r   ru   )variant
pretrainedkwargsr4   r4   r5   	_xception+  s   
r   r   c                 K   s   | dddddt tddd
|S )	Nr_   )r   +  r   )
   r   gL7A`?bicubiczstem.0.convzhead.fc)
urlrd   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   r4   r4   r5   _cfg5  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_in1kr   c                 K      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 |ttjdddd}tdd| it |fi |S )z" Modified Aligned Xception-41
    rm      rQ   r   r   r        r   rk   r      r   r      r   i   TFr   r   r   rK   rJ   MbP?皙?epsmomentumrc   r!   
xception41r   N)r   ru   r   r+   r>   r   r   r   rc   
model_argsr4   r4   r5   r   U     	r   c                 K   r   )z" Modified Aligned Xception-65
    rm   r   rQ   r   r   r   r   rl   r   r   r   TFr   r   r   r   r   
xception65r   N)r   r   r   r4   r4   r5   r   h  r   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 |ttjdddd}tdd| it |fi |S )z" Modified Aligned Xception-71
    rm   r   rQ   r   r   r   r   rl   r   r   r   TFr   r   r   r   r   
xception71r   N)r   r   r   r4   r4   r5   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 |dtjd}tdd| it |fi |S )z- Modified Aligned Xception-41 w/ Pre-Act
    rm   r   rQ   r   r   r   r   rk   r   r   r   T)r   r   rK   r   rc   rg   r!   xception41pr   N)r   )ru   r+   r>   r   r   r4   r4   r5   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 |dttjdddd}tdd| it |fi |S )z- Modified Aligned Xception-65 w/ Pre-Act
    rm   r   rQ   r   r   r   r   rl   r   r   r   T)r   r   r   rK   r   r   r   r   xception65pr   N)r   r   r   r4   r4   r5   r     s   	r   r   )r   )-r   	functoolsr   typingr   r   r   r   r   torch.nnr+   	timm.datar   r	   timm.layersr
   r   r   r   r   r   timm.layers.helpersr   _builderr   _manipulater   	_registryr   r   __all__r@   r   rB   rH   r^   r   r   r   default_cfgsr   r   r   r   r   r4   r4   r4   r5   <module>   s\     &"14
f

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