
    RЦi#                     R   S r SSKrSSKJr  SSKJs  Jr  SSKJ	r	  SSK
Jr  SSKJr  SSKJrJrJr  S/r " S	 S
\R&                  5      r " S S\R&                  5      r " S S\R&                  5      rSS jr\" SSSSSSSSSSSSS.05      r\SS\4S jj5       r\" \SS05        g) a  
Ported to pytorch thanks to [tstandley](https://github.com/tstandley/Xception-PyTorch)

@author: tstandley
Adapted by cadene

Creates an Xception Model as defined in:

Francois Chollet
Xception: Deep Learning with Depthwise Separable Convolutions
https://arxiv.org/pdf/1610.02357.pdf

This weights ported from the Keras implementation. Achieves the following performance on the validation set:

Loss:0.9173 Prec@1:78.892 Prec@5:94.292

REMEMBER to set your image size to 3x299x299 for both test and validation

normalize = transforms.Normalize(mean=[0.5, 0.5, 0.5],
                                  std=[0.5, 0.5, 0.5])

The resize parameter of the validation transform should be 333, and make sure to center crop at 299x299
    N)Optional)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsregister_model_deprecationsXceptionc                   Z   ^  \ rS rSr      SS\S\S\S\S\S\4U 4S jjjrS	 rS
rU =r$ )SeparableConv2d$   in_channelsout_channelskernel_sizestridepaddingdilationc	           	         > XxS.n	[         T
U ]  5         [        R                  " UUUUUU4USS.U	D6U l        [        R                  " XSSSSS4SS0U	D6U l        g )NdevicedtypeF)groupsbiasr   r   r   )super__init__nnConv2dconv1	pointwise)selfr   r   r   r   r   r   r   r   dd	__class__s             S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/xception.pyr   SeparableConv2d.__init__%   sy     /YY

 

 


 ;aAq!^RW^[]^    c                 J    U R                  U5      nU R                  U5      nU$ Nr   r   r    xs     r#   forwardSeparableConv2d.forward@   s"    JJqMNN1r%   r(   )r   r   r   r   NN)	__name__
__module____qualname____firstlineno__intr   r+   __static_attributes____classcell__r"   s   @r#   r   r   $   sm    
  !__ _ 	_
 _ _ _ _6 r%   r   c                   X   ^  \ rS rSr     SS\S\S\S\S\S\4U 4S jjjrS	 rS
rU =r	$ )BlockF   r   r   repsstridesstart_with_relu
grow_firstc	           	        > XxS.n	[         TU ]  5         X!:w  d  US:w  a=  [        R                  " XS4USS.U	D6U l        [        R
                  " U40 U	D6U l        OS U l        / n
[        U5       H  nU(       a  US:X  a  UOUnUnOUnXS-
  :  a  UOUnU
R                  [        R                  " SS95        U
R                  [        XS4SSS	.U	D65        U
R                  [        R
                  " U40 U	D65        M     U(       d  U
SS  n
O[        R                  " SS9U
S'   US:w  a'  U
R                  [        R                  " SUS5      5        [        R                  " U
6 U l        g )
Nr   r   F)r   r   r   Tinplace   )r   r   )r   r   r   r   skipBatchNorm2dskipbnrangeappendReLUr   	MaxPool2d
Sequentialrep)r    r   r   r8   r9   r:   r;   r   r   r!   rH   iincoutcr"   s                 r#   r   Block.__init__G   s<    /&'Q,		+QawUZa^`aDI..<<DKDItA%&!Vk#!&'!8n{,JJrwwt,-JJs!OAqOBOPJJr~~d1b12  ab'CWWU+CFa<JJr||Aw23==#&r%   c                     U R                  U5      nU R                  b#  U R                  U5      nU R                  U5      nOUnX#-  nU$ r'   rH   r@   rB   )r    inpr*   r@   s       r#   r+   Block.forwardp   sE    HHSM99 99S>D;;t$DD		r%   rN   )r   TTNN)
r-   r.   r/   r0   r1   boolr   r+   r2   r3   r4   s   @r#   r6   r6   F   sc     $(#'''' '' 	''
 '' "'' '' ''R
 
r%   r6   c            	       P  ^  \ rS rSrSr      SS\S\S\S\4U 4S jjjr\	R                  R                  SS j5       r\	R                  R                  SS	 j5       r\	R                  R                  S
\R                  4S j5       rSS\S\4S jjrS rSS\4S jjrS rSrU =r$ )r
   }   zc
Xception optimized for the ImageNet dataset, as specified in
https://arxiv.org/pdf/1610.02357.pdf
num_classesin_chans	drop_rateglobal_poolc           
        > [         T	U ]  5         XVS.nX0l        X@l        Xl        X l        S=U l        U l        [        R                  " USSSS4SS0UD6U l
        [        R                  " S(0 UD6U l        [        R                  " S	S
9U l        [        R                  " SSS0UD6U l        [        R                  " S)0 UD6U l        [        R                  " S	S
9U l        [%        SSS0UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        S0 UD6U l        [%        SSS0UD6U l        [?        S0 UD6U l         [        R                  " S*0 UD6U l!        [        R                  " S	S
9U l"        [?        SU R                  SSS40 UD6U l#        [        R                  " U R                  40 UD6U l$        [        R                  " S	S
9U l%        [M        SSSS9[M        SSSS9[M        SSSS9[M        SS S!S9[M        SSS"S9/U l'        [Q        U R                  U R                  4S#U0UD6u  U l        U l)        U RU                  5        H  n[W        U[        R                  5      (       a+  [        RX                  R[                  UR\                  S$S%S&9  MM  [W        U[        R                  5      (       d  Mn  UR\                  R^                  Ra                  S5        URb                  R^                  Re                  5         M     g')+z5Constructor
Args:
    num_classes: number of classes
r   i       r?      r   r   FTr=   )rY   @   r?   r[   )r[      rZ   rZ   r:   )r\      rZ   rZ   )r]     rZ   rZ   )r^   r^   r?   r   )r^      rZ   rZ   r;   )r_      r?   r   r   r`   r   act2)num_chs	reductionmoduler\      zblock2.rep.0r]      zblock3.rep.0r^      zblock12.rep.0act4	pool_typefan_outrelu)modenonlinearityN)rY   )r[   )r`   )3r   r   rV   rW   rT   rU   num_featureshead_hidden_sizer   r   r   rA   bn1rE   act1conv2bn2ra   r6   block1block2block3block4block5block6block7block8block9block10block11block12r   conv3bn3act3conv4bn4rh   dictfeature_infor   fcmodules
isinstanceinitkaiming_normal_weightdatafill_r   zero_)
r    rT   rU   rV   rW   r   r   r!   mr"   s
            r#   r   Xception.__init__   s    	/"&& 488D1YYxQ1G5GBG
>>++GGD)	YY;u;;
>>++GGD)	G5GBG1b11b11b11b11b11b11b11b12r22r2EE"E$?B?
>>-"-GGD)	$T4+<+<aALL
>>$"3"3:r:GGD)	q8.A.A?CF;
 %6d6G6GIYIY$wep$wtv$w!$' A!RYY''''yv'VAr~~..##A&!!#  r%   c                     [        SSS/S9$ )Nz^conv[12]|bn[12])z^block(\d+)N)z^conv[34]|bn[34])c   )stemblocks)r   )r    coarses     r#   group_matcherXception.group_matcher   s    $&,
 	
r%   c                      U(       a   S5       eg )Nz$gradient checkpointing not supported )r    enables     r#   set_grad_checkpointingXception.set_grad_checkpointing   s    AAAz6r%   returnc                     U R                   $ r'   )r   )r    s    r#   get_classifierXception.get_classifier   s    wwr%   c                 h    Xl         [        U R                  U R                   US9u  U l        U l        g )N)ri   )rT   r   rn   rW   r   )r    rT   rW   s      r#   reset_classifierXception.reset_classifier   s-    &$5d6G6GIYIYep$q!$'r%   c                 6   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R!                  U5      nU R#                  U5      nU R%                  U5      nU R'                  U5      nU R)                  U5      nU R+                  U5      nU R-                  U5      nU R/                  U5      nU$ r'   )r   rp   rq   rr   rs   ra   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   rh   r)   s     r#   forward_featuresXception.forward_features   s?   JJqMHHQKIIaLJJqMHHQKIIaLKKNKKNKKNKKNKKNKKNKKNKKNKKNLLOLLOLLOJJqMHHQKIIaLJJqMHHQKIIaLr%   
pre_logitsc                     U R                  U5      nU R                  (       a)  [        R                  " XR                  U R                  S9  U(       a  U$ U R                  U5      $ )N)training)rW   rV   Fdropoutr   r   )r    r*   r   s      r#   forward_headXception.forward_head   sD    Q>>IIa$--@q.DGGAJ.r%   c                 J    U R                  U5      nU R                  U5      nU$ r'   )r   r   r)   s     r#   r+   Xception.forward  s'    !!!$a r%   ) rq   ra   r   rh   rt   r}   r~   r   ru   rv   rw   rx   ry   rz   r{   r|   rp   rs   r   r   r   rr   r   r   rV   r   r   rW   ro   rU   rT   rn   )  r?   g        avgNNF)T)r   )r-   r.   r/   r0   __doc__r1   floatstrr   torchjitignorer   r   r   Moduler   r   r   rQ   r   r+   r2   r3   r4   s   @r#   r
   r
   }   s      $!$D$D$ D$ 	D$
 D$ D$L YY
 
 YYB B YY		  rC rc r>/$ / r%   c                 6    [        [        X4S[        SS90UD6$ )Nfeature_cfghook)feature_cls)r   r
   r   )variant
pretrainedkwargss      r#   	_xceptionr   
  s+    'V,  r%   zlegacy_xception.tf_in1kzfhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/xception-43020ad28.pth)r?   +  r   )
   r   gQ?bicubic)      ?r   r   r   r   r   z
apache-2.0)url
input_size	pool_sizecrop_pctinterpolationmeanstdrT   
first_conv
classifierlicenser   c                     [        SSU 0UD6$ )Nr   )legacy_xception)r   )r   r   s     r#   r   r   #  s    H:HHHr%   xceptionr   r   )r   	torch.jitr   torch.nnr   torch.nn.functional
functionalr   typingr   timm.layersr   _builderr   	_registryr   r   r	   __all__r   r   r6   r
   r   default_cfgsr   r-   r   r%   r#   <module>r      s   .      ) * Y Y,bii D4BII 4nJryy JZ %w#" & $ I8 I I H!' r%   