Ë
    éÓ^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}   ø€ ð ¨Ñ/ˆÜ‰ÑÔä—Y‘YØØØØØØð

ð Øñ

ð ñ

ˆŒ
ô Ÿ™ ;°¸aÀÀAÀqÈ!Ñ^ÐRWÐ^Ð[]Ñ^ˆ�ó    c                 óJ   — | j                  |«      }| j                  |«      }|S ©N)r   r   ©r   Úxs     r"   ÚforwardzSeparableConv2d.forward@   s"   € Ø�J‰J�q‹MˆØ�N‰N˜1ÓˆØˆ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ÐaÀwÐUZÑaÐ^`ÑaˆDŒIÜŸ.™.¨Ñ<¸Ñ<ˆD�KàˆDŒIàˆÜ�t“ò 		3ˆAÙØ%&¨!¢V‘k°�Ø#‘à!�Ø&'¨4°!©8¢n‘{¸,�Ø�J‰J”r—w‘w tÔ,Ô-Ø�J‰J” s¨D°!ÐO¸AÀqÑOÈBÑOÔPØ�J‰J”r—~‘~ dÑ1¨bÑ1Õ2ð		3ñ Ø�a�b�'‰Cä—W‘W UÔ+ˆC�‰Fà�aŠ<Ø�J‰J”r—|‘| A w°Ó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   € Ø�H‰H�S‹Mˆà�9‰9Ð Ø—9‘9˜S“>ˆ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ä—Y‘Y˜x¨¨Q°°1ÑG¸5ÐGÀBÑGˆŒ
Ü—>‘>Ñ+¨Ñ+ˆŒÜ—G‘G DÔ)ˆŒ	ä—Y‘YÑ;¨uÐ;¸Ñ;ˆŒ
Ü—>‘>Ñ+¨Ñ+ˆŒÜ—G‘G DÔ)ˆŒ	äÑG¸5ÐGÀBÑGˆŒÜÑ1¨bÑ1ˆŒÜÑ1¨bÑ1ˆŒäÑ1¨bÑ1ˆŒÜÑ1¨bÑ1ˆŒÜÑ1¨bÑ1ˆŒÜÑ1¨bÑ1ˆŒäÑ1¨bÑ1ˆŒÜÑ1¨bÑ1ˆŒÜÑ2¨rÑ2ˆŒÜÑ2¨rÑ2ˆŒäÑE¸ÐEÀ"ÑEˆŒä$Ñ?¸BÑ?ˆŒ
Ü—>‘>Ñ-¨"Ñ-ˆŒÜ—G‘G DÔ)ˆŒ	ä$ T¨4×+<Ñ+<¸aÀÀAÑLÈÑLˆŒ
Ü—>‘> $×"3Ñ"3Ñ:°rÑ:ˆŒÜ—G‘G DÔ)ˆŒ	ä˜ q°Ô8Ü˜¨°.ÔAÜ˜¨°.ÔAÜ˜¨°?ÔCÜ˜¨°FÔ;ð
ˆÔô %6°d×6GÑ6GÈ×IYÑIYÑ$wÐepÐ$wÐtvÑ$wÑ!ˆÔ˜$œ'ð —‘“ò 	$ˆAÜ˜!œRŸY™YÔ'Ü—‘×'Ñ'¨¯©°yÈvÐ'ÕVÜ˜AœrŸ~™~Õ.Ø—‘—‘×#Ñ# 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ÓAˆz�6r#   Úreturnc                 ó   — | j                   S r%   )r|   )r   s    r"   Úget_classifierzXception.get_classifier×   s   € à�w‰wˆ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/   € Ø&ˆÔÜ$5°d×6GÑ6GÈ×IYÑIYÐepÔ$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?  € Ø�J‰J�q‹MˆØ�H‰H�Q‹KˆØ�I‰I�a‹Lˆà�J‰J�q‹MˆØ�H‰H�Q‹KˆØ�I‰I�a‹Lˆà�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�K‰K˜‹NˆØ�L‰L˜‹OˆØ�L‰L˜‹OˆØ�L‰L˜‹Oˆà�J‰J�q‹MˆØ�H‰H�Q‹KˆØ�I‰I�a‹Lˆà�J‰J�q‹MˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØˆ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ÓˆØ�>Š>Ü�I‰I�a˜Ÿ™°$·-±-Õ@ÙˆqÐ. D§G¡G¨A£JÐ.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 ‡Y�Y×Ñò
ó ð
ð ‡Y�Y×ÑòBó ðBð ‡Y�Y×Ñð §	¡	ò ó ðñ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àˆ,€ô�b—i‘iô ôD4ˆB�I‰Iô 4ônJˆr�y‰yô JóZñ %ØØwØ#ØØØ"ØØØØØØñ ð&ó €ð$ ñI°8ò Ió ðIñ ˜HØÐ!ð'õ r#   