
    ^j#                     L   d Z ddlZddlmZ ddlmc mZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ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ddZ edddddddddddddi      Zeddefd       Z eeddi       y) 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                   L     e Zd Z	 	 	 	 	 	 d	dedededededef fdZd Z xZS )
SeparableConv2din_channelsout_channelskernel_sizestridepaddingdilationc	           	          ||d}	t         
|           t        j                  ||||||f|dd|	| _        t        j                  ||dddddfddi|	| _        y )NdevicedtypeF)groupsbiasr   r   r   )super__init__nnConv2dconv1	pointwise)selfr   r   r   r   r   r   r   r   dd	__class__s             _/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/xception.pyr   zSeparableConv2d.__init__%   s}     /YY

 

 


 ;aAq!^RW^[]^    c                 J    | j                  |      }| j                  |      }|S N)r   r   r   xs     r"   forwardzSeparableConv2d.forward@   s"    JJqMNN1r#   )r   r   r   r   NN)__name__
__module____qualname__intr   r(   __classcell__r!   s   @r"   r   r   $   sb    
  !__ _ 	_
 _ _ _6r#   r   c                   J     e Zd Z	 	 	 	 	 d	dedededededef fdZd Z xZS )
Blockr   r   repsstridesstart_with_relu
grow_firstc	           	         ||d}	t         |           ||k7  s|dk7  r<t        j                  ||df|dd|	| _        t        j
                  |fi |	| _        nd | _        g }
t        |      D ]  }|r|dk(  r|n|}|}n|}||dz
  k  r|n|}|
j                  t        j                  d             |
j                  t        ||dfddd	|	       |
j                  t        j
                  |fi |	        |s|
dd  }
nt        j                  d      |
d<   |dk7  r&|
j                  t        j                  d|d             t        j                  |
 | _        y )
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   r1   r2   r3   r4   r   r   r    rA   iincoutcr!   s                 r"   r   zBlock.__init__G   sK    /;&'Q,		+|QawUZa^`aDI..<<DKDIt 		3A%&!Vk#!&'4!8n{,JJrwwt,-JJsD!OAqOBOPJJr~~d1b12		3 ab'CWWU+CFa<JJr||Aw23==#&r#   c                     | j                  |      }| j                  #| j                  |      }| j                  |      }n|}||z  }|S r%   )rA   r9   r;   )r   inpr'   r9   s       r"   r(   zBlock.forwardp   sG    HHSM99 99S>D;;t$DD	T	r#   )r   TTNN)r)   r*   r+   r,   boolr   r(   r-   r.   s   @r"   r0   r0   F   sY     $(#'''' '' 	''
 '' "'' ''R
r#   r0   c            	       4    e Zd ZdZ	 	 	 	 	 	 dde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fdZd ZddefdZd Z xZS )r
   zo
    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         	|           ||d}|| _        || _        || _        || _        dx| _        | _        t        j                  |ddddfddi|| _
        t        j                  d(i || _        t        j                  d	
      | _        t        j                  dddi|| _        t        j                  d)i || _        t        j                  d	
      | _        t%        dddi|| _        t%        di || _        t%        di || _        t%        di || _        t%        di || _        t%        di || _        t%        di || _        t%        di || _        t%        di || _        t%        di || _        t%        di || _        t%        dddi|| _        t?        di || _         t        j                  d*i || _!        t        j                  d	
      | _"        t?        d| j                  dddfi || _#        t        j                  | j                  fi || _$        t        j                  d	
      | _%        tM        ddd      tM        ddd      tM        ddd      tM        dd d!      tM        ddd"      g| _'        tQ        | j                  | j                  fd#|i|\  | _        | _)        | jU                         D ]  }tW        |t        j                        r-t        jX                  j[                  |j\                  d$d%&       JtW        |t        j                        se|j\                  j^                  ja                  d       |jb                  j^                  je                           y')+zN Constructor
        Args:
            num_classes: number of classes
        r   i       r8      r   r   FTr6   )rN   @   r8   rP   )rP      rO   rO   r3   )rQ      rO   rO   )rR     rO   rO   )rS   rS   r8   r   )rS      rO   rO   r4   )rT      r8   r   r   rU   r   act2)num_chs	reductionmodulerQ      zblock2.rep.0rR      zblock3.rep.0rS      zblock12.rep.0act4	pool_typefan_outrelu)modenonlinearityN)rN   )rP   )rU   )3r   r   rK   rL   rI   rJ   num_featureshead_hidden_sizer   r   r   r:   bn1r>   act1conv2bn2rV   r0   block1block2block3block4block5block6block7block8block9block10block11block12r   conv3bn3act3conv4bn4r]   dictfeature_infor   fcmodules
isinstanceinitkaiming_normal_weightdatafill_r   zero_)
r   rI   rJ   rK   rL   r   r   r    mr!   s
            r"   r   z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                      t        dddg      S )Nz^conv[12]|bn[12])z^block(\d+)N)z^conv[34]|bn[34])c   )stemblocks)rz   )r   coarses     r"   group_matcherzXception.group_matcher   s    $&,
 	
r#   c                     |rJ d       y )Nz$gradient checkpointing not supported )r   enables     r"   set_grad_checkpointingzXception.set_grad_checkpointing   s    AAAz6r#   returnc                     | j                   S r%   )r|   )r   s    r"   get_classifierzXception.get_classifier   s    wwr#   c                 p    || _         t        | j                  | j                   |      \  | _        | _        y )N)r^   )rI   r   rc   rL   r|   )r   rI   rL   s      r"   reset_classifierzXception.reset_classifier   s/    &$5d6G6GIYIYep$q!$'r#   c                 6   | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j!                  |      }| j#                  |      }| j%                  |      }| j'                  |      }| j)                  |      }| j+                  |      }| j-                  |      }| j/                  |      }|S r%   )r   re   rf   rg   rh   rV   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   r]   r&   s     r"   forward_featuresz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                     | j                  |      }| j                  r,t        j                  || j                  | j                         |r|S | j                  |      S )N)training)rL   rK   Fdropoutr   r|   )r   r'   r   s      r"   forward_headzXception.forward_head   sF    Q>>IIa$--@q.DGGAJ.r#   c                 J    | j                  |      }| j                  |      }|S r%   )r   r   r&   s     r"   r(   zXception.forward  s'    !!!$a r#   )  r8   g        avgNNF)T)r   )r)   r*   r+   __doc__r,   floatstrr   torchjitignorer   r   r   Moduler   r   r   rG   r   r(   r-   r.   s   @r"   r
   r
   }   s      $!$D$D$ D$ 	D$
 D$L YY
 
 YYB B YY		  rC rc r>/$ /r#   c                 >    t        t        | |fdt        d      i|S )Nfeature_cfghook)feature_cls)r   r
   rz   )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)r8   +  r   )
   r   gQ?bicubic)      ?r   r   r   r   r|   z
apache-2.0)url
input_size	pool_sizecrop_pctinterpolationmeanstdrI   
first_conv
classifierlicenser   c                     t        dd| i|S )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   r0   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#   