
    Ng                     F   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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
i          Zeddefd            Z eeddi           dS )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)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsregister_model_deprecationsXceptionc                   &     e Zd Zd fd	Zd Z xZS )SeparableConv2dr   r   c           
          t          t          |                                            t          j        |||||||d          | _        t          j        ||dddddd          | _        d S )NF)groupsbiasr   r   r   )superr   __init__nnConv2dconv1	pointwise)selfin_channelsout_channelskernel_sizestridepaddingdilation	__class__s          P/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/xception.pyr   zSeparableConv2d.__init__$   st    ot$$--///Yk67HU`gln n n
;aAq!RWXXX    c                 Z    |                      |          }|                     |          }|S N)r   r   r   xs     r   forwardzSeparableConv2d.forward+   s'    JJqMMNN1r   )r   r   r   r   __name__
__module____qualname__r   r$   __classcell__r   s   @r   r   r   #   sR        Y Y Y Y Y Y      r   r   c                   &     e Zd Zd fd	Zd Z xZS )Blockr   Tc           
      
   t          t          |                                            ||k    s|dk    r8t          j        ||d|d          | _        t          j        |          | _        nd | _        g }t          |          D ]}|r|dk    r|n|}	|}
n|}	||dz
  k     r|n|}
|	                    t          j
        d                     |	                    t          |	|
ddd                     |	                    t          j        |
                     |s|dd          }nt          j
        d          |d<   |dk    r)|	                    t          j        d|d                     t          j        | | _        d S )	Nr   F)r   r   r   Tinplace   )r   r   )r   r,   r   r   r   skipBatchNorm2dskipbnrangeappendReLUr   	MaxPool2d
Sequentialrep)r   r   r   repsstridesstart_with_relu
grow_firstr9   iincoutcr   s              r   r   zBlock.__init__2   s   eT##%%%;&&'Q,,	+|QwUZ[[[DI.66DKKDIt 		- 		-A G%&!VVkk#!&'4!8nn{{,JJrwt,,,---JJsD!AqIIIJJJJJr~d++,,,, 	,abb'CCWU+++CFa<<JJr|Aw22333=#&r   c                     |                      |          }| j        +|                     |          }|                     |          }n|}||z  }|S r!   )r9   r1   r3   )r   inpr#   r1   s       r   r$   zBlock.forwardP   sN    HHSMM9 99S>>D;;t$$DDD	T	r   )r   TTr%   r*   s   @r   r,   r,   1   sL        ' ' ' ' ' '<
 
 
 
 
 
 
r   r,   c                        e Zd ZdZd 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
      r0           avgc           	         t          t          |                                            || _        || _        || _        dx| _        | _        t          j	        |ddddd          | _
        t          j        d          | _        t          j        d	          | _        t          j	        dd
dd          | _        t          j        d
          | _        t          j        d	          | _        t%          d
dddd          | _        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          | _        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          | _        t%          ddddd          | _        t?          ddddd          | _         t          j        d          | _!        t          j        d	          | _"        t?          d| j        ddd          | _#        t          j        | j                  | _$        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        |          \  | _        | _)        | *                                D ]}tW          |t          j	                  r(t          j,        -                    |j.        dd           DtW          |t          j                  r=|j.        j/        0                    d           |j1        j/        2                                 d S )!zN Constructor
        Args:
            num_classes: number of classes
        i       r0      r   Fr   Tr.   @      )r<      i  r   i   )r=   i   act2)num_chs	reductionmodule   zblock2.rep.0   zblock3.rep.0   zblock12.rep.0act4	pool_typefan_outrelu)modenonlinearityN)3r   r	   r   	drop_rateglobal_poolnum_classesnum_featureshead_hidden_sizer   r   r   r2   bn1r6   act1conv2bn2rM   r,   block1block2block3block4block5block6block7block8block9block10block11block12r   conv3bn3act3conv4bn4rT   dictfeature_infor   fcmodules
isinstanceinitkaiming_normal_weightdatafill_r   zero_)r   r]   in_chansr[   r\   mr   s         r   r   zXception.__init__c   su   
 	h&&((("&&488D1YxQ15AAA
>"%%GD)))	Yr2qu555
>"%%GD)))	BQ5AAACa++Ca++Ca++Ca++Ca++Ca++Ca++Ca++S#q!,,S#q!,,S$1???$T4Aq99
>$''GD)))	$T4+<aAFF
>$"344GD)))	q888.AAA.AAA?CCCF;;;
 %6d6GIYep$q$q$q!$'  	$ 	$A!RY'' $''yv'VVVVAr~.. $##A&&&!!###	$ 	$r   Fc                 (    t          dddg          S )Nz^conv[12]|bn[12])z^block(\d+)N)z^conv[34]|bn[34])c   )stemblocks)ru   )r   coarses     r   group_matcherzXception.group_matcher   s'    $&,
 
 
 	
r   Tc                     |r
J d            d S )Nz$gradient checkpointing not supported )r   enables     r   set_grad_checkpointingzXception.set_grad_checkpointing   s    AAAAAAAAr   returnc                     | j         S r!   )rw   )r   s    r   get_classifierzXception.get_classifier   s	    wr   r]   r\   c                 f    || _         t          | j        | j         |          \  | _        | _        d S )NrU   )r]   r   r^   r\   rw   )r   r]   r\   s      r   reset_classifierzXception.reset_classifier   s3    &$5d6GIYep$q$q$q!$'''r   c                    |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }| 	                    |          }| 
                    |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|S r!   )r   r`   ra   rb   rc   rM   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   rT   r"   s     r   forward_featureszXception.forward_features   so   JJqMMHHQKKIIaLLJJqMMHHQKKIIaLLKKNNKKNNKKNNKKNNKKNNKKNNKKNNKKNNKKNNLLOOLLOOLLOOJJqMMHHQKKIIaLLJJqMMHHQKKIIaLLr   
pre_logitsc                     |                      |          }| j        r!t          j        || j        | j                   |r|n|                     |          S )N)training)r\   r[   Fdropoutr   rw   )r   r#   r   s      r   forward_headzXception.forward_head   sT    Q> 	AIa$-@@@@.qqDGGAJJ.r   c                 Z    |                      |          }|                     |          }|S r!   )r   r   r"   s     r   r$   zXception.forward   s-    !!!$$a  r   )rD   r0   rE   rF   F)T)rF   )r&   r'   r(   __doc__r   torchjitignorer   r   r   Moduler   intstrr   r   boolr   r$   r)   r*   s   @r   r	   r	   ]   s3        
:$ :$ :$ :$ :$ :$x Y
 
 
 
 YB B B B Y	    r rC rc r r r r  >/ /$ / / / /      r   Fc                 J    t          t          | |fdt          d          i|S )Nfeature_cfghook)feature_cls)r   r	   ru   )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)r0   +  r   )
   r   gQ?bicubic)      ?r   r   rD   r   rw   )
url
input_size	pool_sizecrop_pctinterpolationmeanstdr]   
first_conv
classifierr   c                     t          dd| i|S )Nlegacy_xceptionr   )r   )r   )r   r   s     r   r   r      s    HH:HHHHr   xceptionr   r   )r   	torch.jitr   torch.nnr   torch.nn.functional
functionalr   timm.layersr   _builderr   	_registryr   r   r   __all__r   r   r,   r	   r   default_cfgsr   r&   r   r   r   <module>r      s   .                    ) ) ) ) ) ) * * * * * * Y Y Y Y Y Y Y Y Y Y,    bi   ) ) ) ) )BI ) ) )X@ @ @ @ @ry @ @ @F    %$w#"   &  " I I8 I I I I  H!'     r   