
    Ng6<                        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,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                        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	           	         t          t          |                                            || _        || _        t          ||||||d          | _         ||          | _        | |d          nt          j	                    | _
        t          ||d          | _         ||          | _        | |d          nt          j	                    | _        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__s
            X/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/xception_aligned.pyr+   zSeparableConv2d.__init__   s     	ot$$--///&  %FKh$@ @ @  Z''
1:1Fii----BKMM %VW!DDDZ((
1:1Fii----BKMM    c                    |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|S N)r,   r-   r0   r1   r2   r3   r4   xs     r6   forwardzSeparableConv2d.forward4   sa    LLOOJJqMMKKNNLLOOJJqMMKKNN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 Z BIZ RYZ Z Z Z Z 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
           	      F   t          t          |                                            t          ||          }
|| _        || _        |	r |
|d          nt          j                    | _        t          ||||||d          | _
        t          ||d          | _        d S )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__?   s     	 $''00222+J)LLL& <EXNN6488882;==	$FKh$@ @ @
 %VW!DDDr7   c                     |                      |          }|                     |          }|                     |          }|S r9   )rK   r,   r1   r:   s     r6   r<   zPreSeparableConv2d.forwardY   s4    IIaLLLLOOLLOO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 E BIE RYE E E E E 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                    t          t          |                                            t          |          }|| _        |d         | _        || _        |s6| j        | j        k    s|dk    r t          || j        d||	d          | _        nd | _        |rd n|}t          j
                    | _        t          d          D ]}|r/| j                            d|dz     ||dk                         | j                            d	|dz    t          |||         d|d
k    r|nd||||	                     ||         }|
| _        d S )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-1AAAVq[[')1V
^ce e eDMM !DM&5Ddd9]__
q 	  	 A O
%%mAEmmYYq1u5M5M5MNNNJ!!.Q../
AQffAPXbj-*3F 3F 3F G G G QZFF"r7   c                     |}|                      |          }| j        |                     |          }| j        s!| j        |                     |          }||z   }|S r9   )r_   r]   rS   rT   r4   r;   skips      r6   r<   zXceptionModule.forward   s`    JJqMM=$==&&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"# "#"# "# 	"#
 "# "# ""# "# BI"# !bi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         | _        || _        |s4| j        | j        k    s|dk    rt          || j        d|          | _        nt          j
                    | _         t          ||          |d          | _        t          j                    | _        t          d          D ]S}
| j                            d|
dz    t#          |||
         d|
d	k    r|nd|||||
d
k    	  	                   ||
         }T|	| _        d S )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__   sZ    	&&//111G$$!#BK 	*D-1AAAVq[[)&$2CQvVVVDMMKMMDMG&zYGGGX\]]]	]__
q 	  	 AJ!!.Q..2D
!"avvQ! #%a%
3 
3 
3 
 
 
 QZFF"r7   c                     |                      |          }|}|                     |          }| j        s4| j        |                     |          }||                     |          z   }|S r9   )rK   r_   rS   rT   r]   re   s      r6   r<   zPreXceptionModule.forward   sc    IIaLLJJqMM| 	(~)NN1%%DMM$'''Ar7   rg   rE   s   @r6   ri   ri      s        
  "!)+48-1&# &#&# &# 	&#
 &# &# &# BI&# !bi1&#  	*&# &# &# &# &# &#P      r7   ri   c                   v    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k    rt%          |          nd |d<   ||d<   |d         d	k    rl|rd| dnd| d}| xj        t          t'          |d                   d         ||          gz  c_        ||d         z  }||k    r||d         z  }d	|d<   n|}| 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          j                    | _        | j        | _        t7          | j        ||
|          | _        d S )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__   s    	ot$$--///++++&""'I*EEE
M"L!ALLLL>D GM"ba::::FAaFF:FF$
 	 moo)/C%%^	Yi(( 	 	DAq&6.1:LMI4=NNXi000AkN)AjM{Q4:X00000@X!@X@X@X!!d9Qy\3J3J23NZenr&s&s&s%tt!!)AhK7..!Qx[0M"#AhKK"-KK""3q6699+G+Gq+GJ+G+GHHH $B <DQMMd%YQTUXY]YdUeUehiUiQjQjEjl l l m 	m.4G99T****"+-- $ 1")#!	
 
 
			r7   c                 $    t          dd          S )Nz^stemz^blocks\.(\d+))r   r   )r   )r4   coarses     r6   group_matcherzXceptionAligned.group_matcher  s    $
 
 
 	
r7   Tc                     || _         d S 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    y|r7   Nc                 >    | j                             ||           d S )N)r   )r   reset)r4   rr   rx   s      r6   reset_classifierz XceptionAligned.reset_classifier  s     	{;;;;;r7   c                     |                      |          }| j        r4t          j                                        st          | j        |          }n|                     |          }|                     |          }|S r9   )r   r   torchjitis_scriptingr   r   rX   r:   s     r6   forward_featuresz XceptionAligned.forward_features  sg    IIaLL" 	59+A+A+C+C 	t{A..AAAAHHQKKr7   
pre_logitsc                 ^    |r|                      ||          n|                      |          S )N)r   )r   )r4   r;   r   s      r6   forward_headzXceptionAligned.forward_head!  s-    6@Rtyyzy222diiPQllRr7   c                 Z    |                      |          }|                     |          }|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;
 ;
 	;

 ;
 ;
 BI;
 RY;
 ;
 ";
 ;
 ;
 ;
 ;
 ;
 ;
z Y
 
 
 
 Y) ) ) ) Y	    < <C <hsm < < < <  S S$ S S S S      r7   Fc                 L    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   *  sC      DfEEE	
   r7   r   c                 4    | 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   4  s5    =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           	      l   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#   
xception41r   )r   r   r   r.   rA   r   r   r   rq   
model_argss       r6   r   r   T  s     	BA...CQ///CQ///	
 sC222
3a
7
 	C!21===
 	D"4Q^cddd
I 	gbnRVac6d6d6deeeJWWjWD<V<Vv<V<VWWWr7   c           	      l   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   
xception65r   )r   r   r   s       r6   r   r   g  s     	BA...CQ///CQ///	
 sC222
3b
8
 	C!21===
 	D"4Q^cddd
I 	gbnRVac6d6d6deeeJWWjWD<V<Vv<V<VWWWr7   c           	         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   
xception71r   )r   r   r   s       r6   r   r   z  s    	BA...CQ///CQ///CQ///CQ/// sC222
3b
8 	C!21=== 	D"4Q^cdddI 	gbnRVac6d6d6deeeJWWjWD<V<Vv<V<VWWWr7   c           	      L   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#   xception41pr   )r   )r   r.   rA   r   r   s       r6   r   r     s     	BA...CQ///CQ///	
 sC222
3a
7
 	C!21===
 	D"4d1MMM
I 	$2>RRRJXXzXT*=W=WPV=W=WXXXr7   c           	      l   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   xception65pr   )r   r   r   s       r6   r   r     s     	BA...CQ///CQ///	
 sC222
3b
8
 	C!21===
 	D"4QMMM
I DWR^QU`b5c5c5ce e eJXXzXT*=W=WPV=W=WX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 E E E E E E E i i i i i i i i i i i i i i i i ) ) ) ) ) ) * * * * * * ' ' ' ' ' ' < < < < < < < <
# # # # #bi # # #L       D. . . . .RY . . .b1 1 1 1 1	 1 1 1hb b b b bbi b b bJ       %$4  
 $111$111$111 D   !D  & &  * X Xo X X X X$ X Xo X X X X$ X Xo X X X X( Y Y Y Y Y Y$ Y Y Y Y Y Y Y Yr7   