a
    d                     @   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 ed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                       s&   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_channelsZkernel_sizestridepaddingZdilation	__class__ ]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/xception.pyr   $   s
    zSeparableConv2d.__init__c                 C   s   |  |}| |}|S N)r   r   r   xr   r   r   forward+   s    

zSeparableConv2d.forward)r   r   r   r   __name__
__module____qualname__r   r   __classcell__r   r   r   r   r	   #   s   r	   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Blockr   Tc              
      s  t t|   ||ks|dkrBtj||d|dd| _t|| _nd | _g }t|D ]p}|rr|dkrh|n|}	|}
n|}	||d k r|n|}
|	tj
dd |	t|	|
dddd |	t|
 qT|s|dd  }ntj
dd|d< |dkr|	td|d tj| | _d S )	Nr   F)r   r   r   TZinplace   )r   r   )r   r%   r   r   r   skipBatchNorm2dskipbnrangeappendReLUr	   Z	MaxPool2dZ
Sequentialrep)r   r   r   Zrepsstridesstart_with_relu
grow_firstr.   iincZoutcr   r   r   r   2   s*    
zBlock.__init__c                 C   s:   |  |}| jd ur*| |}| |}n|}||7 }|S r   )r.   r(   r*   )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d Z
dddZdd Zded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              	      sf  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 ]R}t*|tjr6tj+j,|j-ddd n(t*|tj
r|j-j./d |j0j.1  qd S )!zN Constructor
        Args:
            num_classes: number of classes
        i       r'      r   Fr   Tr&   @      )r0      i  r   i   )r1   i   act2)Znum_chsZ	reductionmodule   zblock2.rep.0   zblock3.rep.0   zblock12.rep.0act4Z	pool_typeZfan_outZrelu)modeZnonlinearityN)2r   r   r   	drop_rateglobal_poolnum_classesnum_featuresr   r   r   r)   bn1r-   act1conv2bn2r=   r%   block1block2block3block4block5block6block7block8block9block10block11block12r	   conv3bn3act3conv4bn4rB   dictZfeature_infor   fcmodules
isinstanceinitZkaiming_normal_ZweightdataZfill_r   Zzero_)r   rG   Zin_chansrE   rF   mr   r   r   r   c   sT    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)r^   )r   Z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_checkpointingc                 C   s   | j S r   )r_   )r   r   r   r   get_classifier   s    zXception.get_classifierc                 C   s$   || _ t| j| j |d\| _| _d S )NrC   )rG   r   rH   rF   r_   )r   rG   rF   r   r   r   reset_classifier   s    zXception.reset_classifierc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}|S r   )r   rI   rJ   rK   rL   r=   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   rB   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)rF   rE   FZdropoutro   r_   )r   r   rn   r   r   r   forward_head   s    
zXception.forward_headc                 C   s   |  |}| |}|S r   )rm   rq   r   r   r   r   r      s    

zXception.forward)r5   r'   r6   r7   )F)T)r7   )F)r!   r"   r#   __doc__r   torchZjitignorerh   rj   rk   rl   rm   boolrq   r   r$   r   r   r   r   r   ]   s   <	

Fc                 K   s   t t| |fdtddi|S )NZfeature_cfghook)Zfeature_cls)r   r   r^   )variant
pretrainedkwargsr   r   r   	_xception   s    rz   zlegacy_xception.tf_in1kzfhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-cadene/xception-43020ad28.pth)r'   +  r{   )
   r|   gQ?Zbicubic)      ?r}   r}   r5   r   r_   )
urlZ
input_sizeZ	pool_sizeZcrop_pctinterpolationmeanZstdrG   Z
first_conv
classifier)returnc                 K   s   t dd| i|S )Nlegacy_xceptionrx   )r   )rz   )rx   ry   r   r   r   r      s    r   Zxception)F)F)rr   Z	torch.jitrs   Ztorch.nnr   Ztorch.nn.functionalZ
functionalrp   Ztimm.layersr   Z_builderr   	_registryr   r   r   __all__Moduler	   r%   r   rz   Zdefault_cfgsr   r!   r   r   r   r   <module>   s>   , 
