o
    پi                     @   s   d Z ddlZddlmZ ddlm  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	 d	ejZG d
d dejZG dd dejZdddZedddddddddddd
iZeddefd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d	Zdd Z  ZS )SeparableConv2dr   r   c              
      sJ   t t|   tj|||||||dd| _tj||d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__ H/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/xception.pyr   $   s
    zSeparableConv2d.__init__c                 C      |  |}| |}|S N)r   r   r   xr   r   r   forward+      

zSeparableConv2d.forward)r   r   r   r   __name__
__module____qualname__r   r#   __classcell__r   r   r   r   r
   #   s    r
   c                       r	   )Blockr   Tc              
      s  t t|   ||ks|dkr!tj||d|dd| _t|| _nd | _g }t|D ]8}|r9|dkr4|n|}	|}
n|}	||d k rC|n|}
|	tj
dd |	t|	|
dddd |	t|
 q*|sl|dd  }ntj
dd|d< |dkr|	t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_firstr6   iincoutcr   r   r   r   2   s*   zBlock.__init__c                 C   s:   |  |}| jd ur| |}| |}n|}||7 }|S r    )r6   r.   r0   )r   inpr"   r.   r   r   r   r#   P   s   


zBlock.forward)r   TTr%   r   r   r   r   r*   1   s    r*   c                       s   e Zd ZdZd fdd	Zejjdd	d
ZejjdddZ	ejjde
jfddZddedefddZdd ZddefddZdd Z  ZS ) r   zo
    Xception optimized for the ImageNet dataset, as specified in
    https://arxiv.org/pdf/1610.02357.pdf
      r-           avgc              	      sn  t t|   || _|| _|| _d | _| _tj	|dddddd| _
td| _tjdd	| _tj	dd
ddd| _td
| _tjdd	| _td
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d| _tddddd| _ td| _!tjdd	| _"td| jddd| _#t| j| _$tj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g| _'t(| j| j|d\| _| _)| * D ]*}t+|tj	rtj,j-|j.ddd q
t+|tjr3|j.j/0d |j1j/2  q
d S )!zN Constructor
        Args:
            num_classes: number of classes
        i       r-      r   Fr   Tr+   @      )r9      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   r/   bn1r3   act1conv2bn2rG   r*   block1block2block3block4block5block6block7block8block9block10block11block12r
   conv3bn3act3conv4bn4rN   dictfeature_infor   fcmodules
isinstanceinitkaiming_normal_weightdatafill_r   zero_)r   rW   in_chansrU   rV   mr   r   r   r   c   sX   zXception.__init__Fc                 C   s   t dddgdS )Nz^conv[12]|bn[12])z^block(\d+)N)z^conv[34]|bn[34])c   )stemblocks)ro   )r   coarser   r   r   group_matcher   s   zXception.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr   )r   enabler   r   r   set_grad_checkpointing   s   zXception.set_grad_checkpointingreturnc                 C   s   | j S r    )rq   )r   r   r   r   get_classifier   s   zXception.get_classifierrW   rV   c                 C   s$   || _ t| j| j |d\| _| _d S )NrO   )rW   r   rX   rV   rq   )r   rW   rV   r   r   r   reset_classifier   s   zXception.reset_classifierc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}|S r    )r   rZ   r[   r\   r]   rG   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   rN   r!   r   r   r   forward_features   s2   























zXception.forward_features
pre_logitsc                 C   s6   |  |}| jrtj|| j| jd |r|S | |S )N)training)rV   rU   Fdropoutr   rq   )r   r"   r   r   r   r   forward_head   s   
zXception.forward_headc                 C   r   r    )r   r   r!   r   r   r   r#      r$   zXception.forward)r?   r-   r@   rA   F)T)rA   )r&   r'   r(   __doc__r   torchjitignorer   r   r   Moduler   intstrr   r   boolr   r#   r)   r   r   r   r   r   ]   s    <	Fc                 K   s   t t| |fdtddi|S )Nfeature_cfghook)feature_cls)r   r   ro   )variant
pretrainedkwargsr   r   r   	_xception   s   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   rq   )
url
input_size	pool_sizecrop_pctinterpolationmeanstdrW   
first_conv
classifierr   c                 K   s   t dd| i|S )Nlegacy_xceptionr   )r   )r   )r   r   r   r   r   r      s   r   xceptionr   )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   r   <module>   s@    , 

