
    kh                     >   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       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)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 )SeparableConv2dc           
          t         t        |           t        j                  |||||||d      | _        t        j                  ||dddddd      | _        y )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/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/xception.pyr   zSeparableConv2d.__init__$   sS    ot-/YYk67HU`gln
;aAq!RWX    c                 J    | j                  |      }| j                  |      }|S N)r   r   r   xs     r   forwardzSeparableConv2d.forward+   s"    JJqMNN1r   )r   r   r   r   __name__
__module____qualname__r   r$   __classcell__r   s   @r   r   r   #   s    Yr   r   c                   &     e Zd Zd fd	Zd Z xZS )Blockc           
         t         t        |           ||k7  s|dk7  r:t        j                  ||d|d      | _        t        j                  |      | _        nd | _        g }t        |      D ]  }|r|dk(  r|n|}	|}
n|}	||dz
  k  r|n|}
|j                  t        j                  d             |j                  t        |	|
ddd             |j                  t        j                  |
              |s|dd  }nt        j                  d      |d<   |dk7  r&|j                  t        j                  d|d             t        j                  | | _        y )	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..6DKDIt 		-A%&!Vk#!&'4!8n{,JJrwwt,-JJsD!AqIJJJr~~d+,		- ab'CWWU+CFa<JJr||Aw23==#&r   c                     | j                  |      }| j                  #| j                  |      }| j                  |      }n|}||z  }|S r!   )r9   r1   r3   )r   inpr#   r1   s       r   r$   zBlock.forwardP   sG    HHSM99 99S>D;;t$DD	T	r   )r   TTr%   r*   s   @r   r,   r,   1   s    '<
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
    c           	      J   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
                  |      \  | _        | _)        | 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
        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bn2rJ   r,   block1block2block3block4block5block6block7block8block9block10block11block12r   conv3bn3act3conv4bn4rQ   dictfeature_infor   fcmodules
isinstanceinitkaiming_normal_weightdatafill_r   zero_)r   rZ   in_chansrX   rY   mr   s         r   r   zXception.__init__c   s   
 	h&("&&488D1YYxQ15A
>>"%GGD)	YYr2qu5
>>"%GGD)	BQ5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
>>$'GGD)	$T4+<+<aAF
>>$"3"34GGD)	q8.A.A?CF;
 %6d6G6GIYIYep$q!$'  	$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)rr   )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!   )rt   )r   s    r   get_classifierzXception.get_classifier   s    wwr   rZ   rY   c                 p    || _         t        | j                  | j                   |      \  | _        | _        y )NrR   )rZ   r   r[   rY   rt   )r   rZ   rY   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   r]   r^   r_   r`   rJ   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rQ   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)rY   rX   Fdropoutr   rt   )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   )  r0   g        avgF)T)r   )r&   r'   r(   __doc__r   torchjitignorer   r   r   Moduler   intstrr   r   boolr   r$   r)   r*   s   @r   r	   r	   ]   s    
:$x 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	   rr   )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   r   r   rt   )
url
input_size	pool_sizecrop_pctinterpolationmeanstdrZ   
first_conv
classifierr   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   timm.layersr   _builderr   	_registryr   r   r   __all__r   r   r,   r	   r   default_cfgsr   r&   r   r   r   <module>r      s   .     ) * Y Y,bii )BII )X@ryy @F %w#" & " I8 I I H!' r   