
    kh]<                     |   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e
j>                        Z  G d de
j>                        Z! G d de
j>                        Z" G d de
j>                        Z# G d de
j>                        Z$d#dZ%d$dZ& e e&dd       e&d       e&d       e&d       e&dd       e&dd      d      Z'ed#de$fd       Z(ed#de$fd       Z)ed#de$fd        Z*ed#de$fd!       Z+ed#de$fd"       Z,y)%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                        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Z
d Z xZS )SeparableConv2d   r    in_chsout_chskernel_sizestridedilationpadding	act_layer
norm_layerc	           	      j   t         t        |           || _        || _        t        ||||||d      | _         ||      | _        |	 |d      nt        j                         | _
        t        ||d      | _         ||      | _        | |d      | _        y t        j                         | _        y )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__s
            X/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/xception_aligned.pyr+   zSeparableConv2d.__init__   s     	ot-/&  %FKh$@  '
1:1Fi-BKKM %VW!D(
1:1Fi-BKKM    c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S N)r,   r-   r0   r1   r2   r3   r4   xs     r6   forwardzSeparableConv2d.forward4   sU    LLOJJqMKKNLLOJJqMKKNr7   )__name__
__module____qualname__r.   ReLUBatchNorm2dintr   r   Moduler+   r<   __classcell__r5   s   @r6   r   r      s    
  !!)+*,..ZZ Z 	Z
 Z Z Z BIIZ RYYZ6r7   r   c                        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Zd Z xZS )PreSeparableConv2dr   r   r   Tr   r   r   r   r    r!   r"   r#   	first_actc
           	          t         t        |           t        ||      }
|| _        || _        |	r
 |
|d      nt        j                         | _        t        ||||||d      | _
        t        ||d      | _        y )Nr"   Tr'   r%   r   r)   )r*   rG   r+   r   r   r    r.   r/   normr   r,   r1   )r4   r   r   r   r   r    r!   r"   r#   rH   norm_act_layerr5   s              r6   r+   zPreSeparableConv2d.__init__?   su     	 $02+J)L& <EN6482;;=	$FKh$@
 %VW!Dr7   c                 l    | j                  |      }| j                  |      }| j                  |      }|S r9   )rK   r,   r1   r:   s     r6   r<   zPreSeparableConv2d.forwardY   s.    IIaLLLOLLOr7   )r=   r>   r?   r.   r@   rA   rB   r   r   rC   boolr+   r<   rD   rE   s   @r6   rG   rG   >   s    
  !!)+*,.."EE E 	E
 E E E BIIE RYYE E4r7   rG   c                        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Zd Z xZS )XceptionModuler   r   TFNr   r   r   r    pad_typestart_with_reluno_skipr"   r#   	drop_pathc                 L   t         t        |           t        |      }|| _        |d   | _        || _        |s?| j
                  | j                  k7  s|dk7  r!t        || j
                  d||	d      | _        nd | _        |rd n|}t        j                         | _        t        d      D ]r  }|r,| j                  j                  d|dz     ||dkD               | j                  j                  d	|dz    t        |||   d|d
k(  r|nd||||	             ||   }t |
| _        y )Nr   F)r   r#   	apply_actr   actr   r'   conv   )r   r    r!   r"   r#   )r*   rP   r+   r   in_channelsout_channelsrS   r   shortcutr.   
Sequentialstackrange
add_moduler   rT   )r4   r   r   r   r    rQ   rR   rS   r"   r#   rT   separable_act_layerir5   s                r6   r+   zXceptionModule.__init__a   s,    	nd,.G$!#BKD--1A1AAVq['))1V
^ceDM !DM&5d9]]_
q 	 A

%%AE7mYq1u5MNJJ!!DQ./
AQfAPXbj-*3F G QZF	  #r7   c                     |}| j                  |      }| j                  | j                  |      }| j                  s"| j                  | j                  |      }||z   }|S r9   )r_   r]   rS   rT   r4   r;   skips      r6   r<   zXceptionModule.forward   sY    JJqM==$==&D||~~)NN1%DAr7   r=   r>   r?   r.   r@   rB   r   rN   r   rC   r   r+   r<   rD   rE   s   @r6   rP   rP   `   s    
  "$(!)+48-1"#"# "# 	"#
 "# "# ""# "# BII"# !bii1"#  		*"#H	r7   rP   c                        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Zd Z xZS )PreXceptionModuler   r   FNr   r   r   r    rQ   rS   r"   r#   rT   c
                 @   t         t        |           t        |      }|| _        |d   | _        || _        |s=| j
                  | j                  k7  s|dk7  rt        || j
                  d|      | _        nt        j                         | _         t        ||      |d      | _        t        j                         | _        t        d      D ]H  }
| j                  j!                  d|
dz    t#        |||
   d|
d	k(  r|nd|||||
d
kD  	             ||
   }J |	| _        y )NrV   r   )r   rJ   Tr'   r   rY   rZ   r   )r   r    r!   r"   r#   rH   )r*   ri   r+   r   r[   r\   rS   r   r]   r.   r/   r   rK   r^   r_   r`   ra   rG   rT   )r4   r   r   r   r    rQ   rS   r"   r#   rT   rc   r5   s              r6   r+   zPreXceptionModule.__init__   s    	/1G$!#BKD--1A1AAVq[)&$2C2CQvVDMKKMDMG&zYGX\]	]]_
q 	 AJJ!!DQ.2D
!"avQ! #%a%
3 
 QZF	  #r7   c                     | j                  |      }|}| j                  |      }| j                  s1| j                  | j                  |      }|| j	                  |      z   }|S r9   )rK   r_   rS   rT   r]   re   s      r6   r<   zPreXceptionModule.forward   sX    IIaLJJqM||~~)NN1%DMM$''Ar7   rg   rE   s   @r6   ri   ri      s    
  "!)+48-1&#&# &# 	&#
 &# &# &# BII&# !bii1&#  		*&#Pr7   ri   c                       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Zej"                  j$                  dd       Zej"                  j$                  dd       Zej"                  j$                  dej                  fd       Zdd	e	dee   fdZd Zdde
fdZd Z x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                    t         t        |           |dv sJ || _        || _        d| _        t        ||      }t        j                  t        |dfddd||rt        dddd	      nt        ddd	d|g | _        d	}d}g | _        t        j                         | _        |rt        nt        }t!        |      }d
}t#        |      D ]  \  }}|	|z  |d	z
  z  }|dkD  rt%        |      nd |d<   ||d<   |d   d	kD  r\|rd| dnd| d}| xj                  t        t'        |d         d   ||      gz  c_        ||d   z  }||kD  r||d   z  }d	|d<   n|}| j                  j)                  t+        |       |di ||       | j                  d   j,                  | _        |d	z  } | xj                  t        | j.                  |dt+        t!        | j                        d	z
        z         gz  c_        |r	 |d      nt        j0                         | _        | j.                  | _        t7        | j.                  ||
|      | _        y )N)      rn   F)r"   r#   rn   r   rZ   )r   r   @   r   r   ro   rT   r    r   zblocks.z.stack.conv2z.stack.act3r   )num_chs	reductionmodulerV   Tr'   )in_featuresrr   	pool_typerv   )rn   r|    )r*   r   r+   rr   rv   grad_checkpointingdictr.   r^   r   r   stemfeature_infoblocksri   rP   len	enumerater   r   ra   strr\   num_featuresr/   rX   head_hidden_sizer   head)r4   rq   rr   rs   rt   ru   r"   r#   rv   rw   rx   
layer_argscurr_dilationcurr_stride	module_fnnet_num_blocksnet_block_idxrc   b	block_dprnamenext_strider5   s                         r6   r+   zXceptionAligned.__init__   sm    	ot-/+++&""'I*E
MM"L!ALL>DM"ba:FAaF:F$
 	 mmo)/%^	Yi( 	DAq&6.1:LMI4=NXi0AkN)AjM{Q4:<0'!K@X!!d9Qy\3J23NZenr&s%tt!)AhK7.!Qx[0M"#AhK"-KKK""3q69+Gq+GJ+GH $B < <DQM	" 	d%%YQTUXY]YdYdUehiUiQjEjl m 	m.49T*"++- $ 1 1"))#!	
	r7   c                     t        dd      S )Nz^stemz^blocks\.(\d+))r   r   )r   )r4   coarses     r6   group_matcherzXceptionAligned.group_matcher  s    $
 	
r7   c                     || _         y r9   )r   )r4   enables     r6   set_grad_checkpointingz&XceptionAligned.set_grad_checkpointing  s
    "(r7   returnc                 .    | j                   j                  S r9   )r   fc)r4   s    r6   get_classifierzXceptionAligned.get_classifier  s    yy||r7   c                 L    || _         | j                  j                  ||       y )N)r   )rr   r   reset)r4   rr   rx   s      r6   reset_classifierz XceptionAligned.reset_classifier  s    &		{;r7   c                     | j                  |      }| j                  r5t        j                  j	                         st        | j                  |      }n| j                  |      }| j                  |      }|S r9   )r   r   torchjitis_scriptingr   r   rX   r:   s     r6   forward_featuresz XceptionAligned.forward_features  sV    IIaL""599+A+A+Ct{{A.AAAHHQKr7   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )N)r   )r   )r4   r;   r   s      r6   forward_headzXceptionAligned.forward_head"  s%    6@tyyzy2RdiiPQlRr7   c                 J    | j                  |      }| j                  |      }|S r9   )r   r   r:   s     r6   r<   zXceptionAligned.forward%  s'    !!!$a r7   F)Tr9   )r=   r>   r?   __doc__r.   r@   rA   r   r   rB   rN   r   rC   floatr   r+   r   r   ignorer   r   r   r   r   r   r   r<   rD   rE   s   @r6   r   r      s=     $!# )+*,..!$&$;
Dz;
 ;
 	;

 ;
 ;
 BII;
 RYY;
 ;
 ";
 ;
z YY
 
 YY) ) YY		  <C <hsm <S$ Sr7   c                 @    t        t        | |fdt        dd      i|S )Nfeature_cfgThook)flatten_sequentialfeature_cls)r   r   r   )variant
pretrainedkwargss      r6   	_xceptionr   +  s3     DfE	
  r7   c                 0    | dddddt         t        ddd
|S )	Nrm   )r   +  r   )
   r   gL7A`?bicubiczstem.0.convzhead.fc)
urlrr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   s     r6   _cfgr   5  s0    =xI'0F#9  r7   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           	      0   t        ddd      t        ddd      t        ddd      gt        ddd      gdz  t        dd	d      t        d
dddd      }t        |t        t        j                  dd            }t	        dd| it        |fi |S )z" Modified Aligned Xception-41
    r|      rZ   r   r   r        r   rz   r      r   r      r   i   TFr   r   r   rS   rR   MbP?皙?epsmomentumrq   r#   r   )
xception41r   r   r.   rA   r   r   r   rq   
model_argss       r6   r   r   U  s     	BA.CQ/CQ/	
 sC2
3a
7
 	C!21=
 	D"4Q^cd
I 	gbnnRVac6deJWjWD<Vv<VWWr7   c           	      0   t        ddd      t        ddd      t        ddd      gt        ddd      gdz  t        dd	d      t        d
dddd      }t        |t        t        j                  dd            }t	        dd| it        |fi |S )z" Modified Aligned Xception-65
    r|   r   rZ   r   r   r   r   r{   r   r   r   TFr   r   r   r   r   r   )
xception65r   r   s       r6   r   r   h  s     	BA.CQ/CQ/	
 sC2
3b
8
 	C!21=
 	D"4Q^cd
I 	gbnnRVac6deJWjWD<Vv<VWWr7   c           	      d   t        ddd      t        ddd      t        ddd      t        ddd      t        ddd      gt        ddd      gdz  t        dd	d      t        d
dddd      }t        |t        t        j                  dd            }t	        dd| it        |fi |S )z" Modified Aligned Xception-71
    r|   r   rZ   r   r   r   r   r{   r   r   r   TFr   r   r   r   r   r   )
xception71r   r   s       r6   r   r   {  s     	BA.CQ/CQ/CQ/CQ/ sC2
3b
8 	C!21= 	D"4Q^cdI 	gbnnRVac6deJWjWD<Vv<VWWr7   c           	         t        ddd      t        ddd      t        ddd      gt        ddd      gdz  t        dd	d      t        d
ddd      }t        |dt        j                        }t        dd| it        |fi |S )z- Modified Aligned Xception-41 w/ Pre-Act
    r|   r   rZ   r   r   r   r   rz   r   r   r   T)r   r   rS   r   rq   ru   r#   r   )xception41p)r   r.   rA   r   r   s       r6   r   r     s     	BA.CQ/CQ/	
 sC2
3a
7
 	C!21=
 	D"4d1M
I 	$2>>RJXzXT*=WPV=WXXr7   c           	      0   t        ddd      t        ddd      t        ddd      gt        ddd      gdz  t        dd	d      t        d
ddd      }t        |dt        t        j                  dd            }t	        dd| it        |fi |S )z- Modified Aligned Xception-65 w/ Pre-Act
    r|   r   rZ   r   r   r   r   r{   r   r   r   T)r   r   r   rS   r   r   r   r   r   )xception65pr   r   s       r6   r   r     s     	BA.CQ/CQ/	
 sC2
3b
8
 	C!21=
 	D"4QM
I DWR^^QU`b5ceJXzXT*=WPV=WXXr7   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__rC   r   rG   rP   ri   r   r   r   default_cfgsr   r   r   r   r   r   r7   r6   <module>r      s    - -   E i i ) * ' <
#bii #L D.RYY .b1		 1hcbii cL %
 111  !& * Xo X X$ Xo X X$ Xo X X( Y Y Y$ Y Y Yr7   