Ë
    þÍ:jè%  ã                   ó|  — d dl mZ d dlmZmZmZ d dlZd dlmZ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	dlmZ d	dlmZmZmZ g d¢Z G d„ dej4                  «      Z G d„ dej4                  «      ZddedœZ G d„ de«      Z e«        edej>                  f¬«      dddœdee   de dedefd„«       «       Z!y) é    )Úpartial)ÚAnyÚCallableÚOptionalN)ÚnnÚTensoré   )ÚConv2dNormActivation)ÚImageClassification)Ú_log_api_usage_onceé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_make_divisibleÚ_ovewrite_named_paramÚhandle_legacy_interface)ÚMobileNetV2ÚMobileNet_V2_WeightsÚmobilenet_v2c                   óp   ‡ — e Zd Z	 ddededededeedej                  f      ddfˆ fd	„Zd
e	de	fd„Z
ˆ xZS )ÚInvertedResidualNÚinpÚoupÚstrideÚexpand_ratioÚ
norm_layer.Úreturnc                 ó4  •— t         ‰| �  «        || _        |dvrt        d|› �«      ‚|€t        j
                  }t        t        ||z  «      «      }| j                  dk(  xr ||k(  | _        g }|dk7  r-|j                  t        ||d|t        j                  ¬«      «       |j                  t        |||||t        j                  ¬«      t	        j                  ||dddd¬«       ||«      g«       t	        j                  |Ž | _        || _        |dkD  | _        y )	N)r   r	   z#stride should be 1 or 2 instead of r   ©Úkernel_sizer   Úactivation_layer)r   Úgroupsr   r#   r   F)Úbias)ÚsuperÚ__init__r   Ú
ValueErrorr   ÚBatchNorm2dÚintÚroundÚuse_res_connectÚappendr
   ÚReLU6ÚextendÚConv2dÚ
SequentialÚconvÚout_channelsÚ_is_cn)	Úselfr   r   r   r   r   Ú
hidden_dimÚlayersÚ	__class__s	           €ús/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchvision/models/mobilenetv2.pyr'   zInvertedResidual.__init__   s  ø€ ô 	‰ÑÔØˆŒØ˜ÑÜÐBÀ6À(ÐKÓLÐLàÐÜŸ™ˆJäœ˜s \Ñ1Ó2Ó3ˆ
Ø#Ÿ{™{¨aÑ/Ò>°C¸3±JˆÔà"$ˆØ˜1Òà�M‰MÜ$ S¨*À!ÐPZÔmo×muÑmuÔvôð 	�‰ô %ØØØ!Ø%Ø)Ü%'§X¡Xôô —	‘	˜* c¨1¨a°¸Ô?Ù˜3“ðô	
ô  —M‘M 6Ð*ˆŒ	ØˆÔØ˜q‘jˆ�ó    Úxc                 ód   — | j                   r|| j                  |«      z   S | j                  |«      S ©N)r,   r2   ©r5   r;   s     r9   ÚforwardzInvertedResidual.forward<   s,   € Ø×ÒØ�t—y‘y “|Ñ#Ð#à—9‘9˜Q“<Ðr:   r=   )Ú__name__Ú
__module__Ú__qualname__r*   r   r   r   ÚModuler'   r   r?   Ú__classcell__©r8   s   @r9   r   r      sg   ø„ àswñ&!Øð&!Ø ð&!Ø*-ð&!Ø=@ð&!ØNVÐW_Ð`cÐeg×enÑenÐ`nÑWoÑNpð&!à	õ&!ðP ˜ð   F÷  r:   r   c                   óÊ   ‡ — e Zd Z	 	 	 	 	 	 	 ddededeeee         dedeedej                  f      deedej                  f      d	ed
dfˆ fd„Z
ded
efd„Zded
efd„Zˆ xZS )r   NÚnum_classesÚ
width_multÚinverted_residual_settingÚround_nearestÚblock.r   Údropoutr   c                 ór  •— t         ‰| �  «        t        | «       |€t        }|€t        j
                  }d}d}	|€g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g}t        |«      dk(  st        |d   «      dk7  rt        d|› �«      ‚t        ||z  |«      }t        |	t        d|«      z  |«      | _
        t        d|d|t        j                  ¬«      g}
|D ]M  \  }}}}t        ||z  |«      }t        |«      D ])  }|dk(  r|nd}|
j                   ||||||¬«      «       |}Œ+ ŒO |
j                  t        || j                  d|t        j                  ¬«      «       t	        j                  |
Ž | _        t	        j                  t	        j"                  |¬«      t	        j$                  | j                  |«      «      | _        | j)                  «       D �]l  }t+        |t        j,                  «      rbt        j.                  j1                  |j2                  d¬«       |j4                  €ŒVt        j.                  j7                  |j4                  «       Œ€t+        |t        j
                  t        j8                  f«      rSt        j.                  j;                  |j2                  «       t        j.                  j7                  |j4                  «       Œýt+        |t        j$                  «      s�Œt        j.                  j=                  |j2                  dd«       t        j.                  j7                  |j4                  «       �Œo y)aw  
        MobileNet V2 main class

        Args:
            num_classes (int): Number of classes
            width_mult (float): Width multiplier - adjusts number of channels in each layer by this amount
            inverted_residual_setting: Network structure
            round_nearest (int): Round the number of channels in each layer to be a multiple of this number
            Set to 1 to turn off rounding
            block: Module specifying inverted residual building block for mobilenet
            norm_layer: Module specifying the normalization layer to use
            dropout (float): The droupout probability

        Né    i   )r   é   r   r   )é   é   r	   r	   )rP   rN   é   r	   )rP   é@   é   r	   )rP   é`   rR   r   )rP   é    rR   r	   )rP   i@  r   r   r   rT   zGinverted_residual_setting should be non-empty or a 4-element list, got ç      ð?rR   r	   )r   r   r#   r   )r   r   r!   )ÚpÚfan_out)Úmodeg{®Gáz„?)r&   r'   r   r   r   r)   Úlenr(   r   ÚmaxÚlast_channelr
   r.   Úranger-   r1   ÚfeaturesÚDropoutÚLinearÚ
classifierÚmodulesÚ
isinstancer0   ÚinitÚkaiming_normal_Úweightr%   Úzeros_Ú	GroupNormÚones_Únormal_)r5   rG   rH   rI   rJ   rK   r   rL   Úinput_channelr]   r_   ÚtÚcÚnÚsÚoutput_channelÚir   Úmr8   s                      €r9   r'   zMobileNetV2.__init__D   sœ  ø€ ô0 	‰ÑÔÜ˜DÔ!àˆ=Ü$ˆEàÐÜŸ™ˆJàˆØˆà$Ð,ò ÚÚÚÚÚÚð	)Ð%ô Ð(Ó)¨QÒ.´#Ð6OÐPQÑ6RÓ2SÐWXÒ2XÜØYÐZsÐYtÐuóð ô
 (¨¸
Ñ(BÀMÓRˆÜ+¨L¼3¸sÀJÓ;OÑ,OÐQ^Ó_ˆÔä   M¸!È
Ôeg×emÑemÔnð%
ˆð 4ò 	/‰JˆAˆq�!�QÜ,¨Q°©^¸]ÓKˆNÜ˜1“Xò /�Ø 1šf™¨!�Ø—‘¡ m°^ÀVÐZ[ÐhrÔ sÔtØ .‘ñ/ð	/ð 	�‰Ü Ø˜t×0Ñ0¸aÈJÔik×iqÑiqôô	
ô Ÿ™ xÐ0ˆŒô Ÿ-™-Ü�J‰J˜Ô!Ü�I‰I�d×'Ñ'¨Ó5ó
ˆŒð —‘“ó 
	'ˆAÜ˜!œRŸY™YÔ'Ü—‘×'Ñ'¨¯©°yÐ'ÔAØ—6‘6Ñ%Ü—G‘G—N‘N 1§6¡6Õ*Ü˜A¤§¡´·±Ð=Ô>Ü—‘—‘˜aŸh™hÔ'Ü—‘—‘˜qŸv™vÕ&Ü˜AœrŸy™yÖ)Ü—‘—‘ §¡¨!¨TÔ2Ü—‘—‘˜qŸv™vÖ&ñ
	'r:   r;   c                 ó¶   — | j                  |«      }t        j                  j                  |d«      }t	        j
                  |d«      }| j                  |«      }|S )N©r   r   r   )r_   r   Ú
functionalÚadaptive_avg_pool2dÚtorchÚflattenrb   r>   s     r9   Ú_forward_implzMobileNetV2._forward_impl£   sK   € ð �M‰M˜!Óˆä�M‰M×-Ñ-¨a°Ó8ˆÜ�M‰M˜!˜QÓˆØ�O‰O˜AÓˆØˆr:   c                 ó$   — | j                  |«      S r=   )rz   r>   s     r9   r?   zMobileNetV2.forward­   s   € Ø×!Ñ! !Ó$Ð$r:   )iè  rW   Né   NNgš™™™™™É?)r@   rA   rB   r*   Úfloatr   Úlistr   r   rC   r'   r   rz   r?   rD   rE   s   @r9   r   r   C   sÎ   ø„ ð  ØØ?CØØ48Ø9=Øñ]'àð]'ð ð]'ð $,¨D°°c±©OÑ#<ð	]'ð
 ð]'ð ˜  b§i¡i Ñ0Ñ1ð]'ð ˜X c¨2¯9©9 nÑ5Ñ6ð]'ð ð]'ð 
õ]'ð~˜vð ¨&ó ð%˜ð % F÷ %r:   r   ièz5 ru   )Ú
num_paramsÚmin_sizeÚ
categoriesc                   óš   — e Zd Z ed eed¬«      i e¥dddddœid	d
ddœ¥¬«      Z ed eedd¬«      i e¥dddddœid	dddœ¥¬«      ZeZ	y)r   z=https://download.pytorch.org/models/mobilenet_v2-b0353104.pthéà   )Ú	crop_sizezQhttps://github.com/pytorch/vision/tree/main/references/classification#mobilenetv2zImageNet-1KgÕxé&1øQ@gü©ñÒM’V@)zacc@1zacc@5gÝ$�•CÓ?g\�Âõ(+@zXThese weights reproduce closely the results of the paper using a simple training recipe.)ÚrecipeÚ_metricsÚ_opsÚ
_file_sizeÚ_docs)ÚurlÚ
transformsÚmetaz=https://download.pytorch.org/models/mobilenet_v2-7ebf99e0.pthéè   )r„   Úresize_sizezHhttps://github.com/pytorch/vision/issues/3995#new-recipe-with-reg-tuningg`åÐ"Û	R@gøSã¥›´V@gV-2+@a$  
                These weights improve upon the results of the original paper by using a modified version of TorchVision's
                `new training recipe
                <https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/>`_.
            N)
r@   rA   rB   r   r   r   Ú_COMMON_METAÚIMAGENET1K_V1ÚIMAGENET1K_V2ÚDEFAULT© r:   r9   r   r   ¸   s¥   „ ÙØKÙÐ.¸#Ô>ð
Øð
àiàØ#Ø#ñ ðð Ø Øsò
ô€Mñ" ØKÙÐ.¸#È3ÔOð
Øð
à`àØ#Ø#ñ ðð Ø ðò
ô€Mð* �Gr:   r   Ú
pretrained)ÚweightsT)r•   Úprogressr•   r–   Úkwargsr   c                 óØ   — t         j                  | «      } | �#t        |dt        | j                  d   «      «       t        di |¤Ž}| �"|j                  | j                  |d¬«      «       |S )a±  MobileNetV2 architecture from the `MobileNetV2: Inverted Residuals and Linear
    Bottlenecks <https://arxiv.org/abs/1801.04381>`_ paper.

    Args:
        weights (:class:`~torchvision.models.MobileNet_V2_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.MobileNet_V2_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.mobilenetv2.MobileNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/mobilenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.MobileNet_V2_Weights
        :members:
    rG   r�   T)r–   Ú
check_hashr“   )r   Úverifyr   r[   rŒ   r   Úload_state_dictÚget_state_dict)r•   r–   r—   Úmodels       r9   r   r   â   sk   € ô0 #×)Ñ)¨'Ó2€GàÐÜ˜f m´S¸¿¹ÀlÑ9SÓ5TÔUäÑ!˜&Ñ!€EàÐØ×Ñ˜g×4Ñ4¸hÐSWÐ4ÓXÔYà€Lr:   )"Ú	functoolsr   Útypingr   r   r   rx   r   r   Úops.miscr
   Útransforms._presetsr   Úutilsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   r   Ú__all__rC   r   r   r�   r   r�   Úboolr   r“   r:   r9   ú<module>r¨      sÓ   ðÝ ß *Ñ *ã ß å +Ý 5Ý 'ß 6Ñ 6Ý 'ß SÑ Sò B€ô- �r—y‘yô - ô`k%�"—)‘)ô k%ð^ ØØ&ñ€ô'˜;ô 'ñT ÓÙ ,Ð0D×0RÑ0RÐ!SÔTà15Èò ØÐ-Ñ.ð ØAEð ØX[ð àò ó Uó ñ r:   