
    kh?                     f   d dl mZ d dlmZmZmZmZmZ d dlZd dlm	Z	m
Z
 ddlmZ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      Z G d de	j>                        Z  G d de	j>                        Z!	 d,de"de#de$de$def
dZ%dee   de&dee   de$dede!fdZ'd ed!Z( G d" d#e      Z) G d$ d%e      Z* e        ed&e)jV                  f'      dd(d)dee)   de$dede!fd*              Z, e        ed&e*jV                  f'      dd(d)dee*   de$dede!fd+              Z-y)-    )partial)AnyCallableListOptionalSequenceN)nnTensor   )Conv2dNormActivationSqueezeExcitation)ImageClassification)_log_api_usage_once   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_make_divisible_ovewrite_named_paramhandle_legacy_interface)MobileNetV3MobileNet_V3_Large_WeightsMobileNet_V3_Small_Weightsmobilenet_v3_largemobilenet_v3_smallc                   R    e Zd Zdedededededededed	efd
Zeded	efd       Z	y)InvertedResidualConfiginput_channelskernelexpanded_channelsout_channelsuse_se
activationstridedilation
width_multc
                     | j                  ||	      | _        || _        | j                  ||	      | _        | j                  ||	      | _        || _        |dk(  | _        || _        || _        y )NHS)	adjust_channelsr   r    r!   r"   r#   use_hsr%   r&   )
selfr   r    r!   r"   r#   r$   r%   r&   r'   s
             Z/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/models/mobilenetv3.py__init__zInvertedResidualConfig.__init__   sl     #22>:N!%!5!56G!T 00zJ D(     channelsc                      t        | |z  d      S )N   )r   )r0   r'   s     r-   r*   z&InvertedResidualConfig.adjust_channels/   s    x*4a88r/   N)
__name__
__module____qualname__intboolstrfloatr.   staticmethodr*    r/   r-   r   r      s    !! ! 	!
 ! ! ! ! ! !* 9# 95 9 9r/   r   c            	            e Zd Z eeej                        fdededej                  f   dedej                  f   f fdZ
dedefd	Z xZS )
InvertedResidual)scale_activationcnf
norm_layer.se_layerc                    t         |           d|j                  cxk  rdk  st        d       t        d      |j                  dk(  xr |j                  |j
                  k(  | _        g }|j                  rt        j                  nt        j                  }|j                  |j                  k7  r3|j                  t        |j                  |j                  d||             |j                  dkD  rdn|j                  }|j                  t        |j                  |j                  |j                  ||j                  |j                  ||             |j                   r;t#        |j                  dz  d      }|j                   ||j                  |             |j                  t        |j                  |j
                  d|d              t        j$                  | | _        |j
                  | _        |j                  dkD  | _        y )Nr   r   zillegal stride valuekernel_sizer@   activation_layer)rD   r%   r&   groupsr@   rE      r2   )superr.   r%   
ValueErrorr   r"   use_res_connectr+   r	   	HardswishReLUr!   appendr   r&   r    r#   r   
Sequentialblock_is_cn)	r,   r?   r@   rA   layersrE   r%   squeeze_channels	__class__s	           r-   r.   zInvertedResidual.__init__6   s    	SZZ$1$344 %344"zzQY33E3EIYIY3Y"$+.::2<<277   C$6$66MM$&&)) !)%5 llQ&CJJ %%%%JJ,,%!1		
 ::.s/D/D/I1MMM(3#8#8:JKL 	 %%s'7'7QS]pt	
 ]]F+
,,jj1nr/   inputreturnc                 J    | j                  |      }| j                  r||z  }|S N)rO   rJ   )r,   rT   results      r-   forwardzInvertedResidual.forwardn   s'    E"eOFr/   )r3   r4   r5   r   SElayerr	   Hardsigmoidr   r   Moduler.   r
   rY   __classcell__rS   s   @r-   r=   r=   4   sb     .5Wr~~-^	6%#6% S"))^,6% 3		>*	6%pV  r/   r=   c                        e Zd Z	 	 	 	 ddee   dededeedej                  f      deedej                  f      de
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inverted_residual_settinglast_channelnum_classesrO   .r@   dropoutkwargsrU   c           
         t         |           t        |        |st        d      t	        |t
              r't        |D cg c]  }t	        |t               c}      st        d      |t        }|t        t        j                  dd      }g }	|d   j                  }
|	j                  t        d|
dd	|t        j                   
             |D ]  }|	j                   |||              |d   j"                  }d|z  }|	j                  t        ||d|t        j                                t        j$                  |	 | _        t        j(                  d      | _        t        j$                  t        j,                  ||      t        j                   d      t        j.                  |d      t        j,                  ||            | _        | j3                         D ]l  }t	        |t        j4                        rbt        j6                  j9                  |j:                  d       |j<                  Vt        j6                  j?                  |j<                         t	        |t        j                  t        j@                  f      rSt        j6                  jC                  |j:                         t        j6                  j?                  |j<                         t	        |t        j,                        st        j6                  jE                  |j:                  dd       t        j6                  j?                  |j<                         o yc c}w )a.  
        MobileNet V3 main class

        Args:
            inverted_residual_setting (List[InvertedResidualConfig]): Network structure
            last_channel (int): The number of channels on the penultimate layer
            num_classes (int): Number of classes
            block (Optional[Callable[..., nn.Module]]): Module specifying inverted residual building block for mobilenet
            norm_layer (Optional[Callable[..., nn.Module]]): Module specifying the normalization layer to use
            dropout (float): The droupout probability
        z1The inverted_residual_setting should not be emptyzDThe inverted_residual_setting should be List[InvertedResidualConfig]NgMbP?g{Gz?)epsmomentumr      r   )rD   r%   r@   rE      r   rC   T)inplace)prk   fan_out)mode)#rH   r.   r   rI   
isinstancer   allr   	TypeErrorr=   r   r	   BatchNorm2dr   rM   r   rK   r"   rN   featuresAdaptiveAvgPool2davgpoolLinearDropout
classifiermodulesConv2dinitkaiming_normal_weightbiaszeros_	GroupNormones_normal_)r,   r`   ra   rb   rO   r@   rc   rd   srQ   firstconv_output_channelsr?   lastconv_input_channelslastconv_output_channelsmrS   s                  r-   r.   zMobileNetV3.__init__v   sq   * 	D!(PQQ0(;D]^qZ#9:^_bcc=$E UTJJ"$ %>a$@$O$O! )%!#		
 - 	2CMM%Z01	2 #<B"?"L"L#$'>#>  '(%!#	
 v.++A.--II.=LL&JJ$/IIlK0	
  
	'A!RYY'''y'A66%GGNN166*A=>ahh'qvv&Aryy)!T2qvv&
	'g _s   Mxc                     | j                  |      }| j                  |      }t        j                  |d      }| j	                  |      }|S )Nr   )rs   ru   torchflattenrx   r,   r   s     r-   _forward_implzMobileNetV3._forward_impl   s@    MM!LLOMM!QOOAr/   c                 $    | j                  |      S rW   )r   r   s     r-   rY   zMobileNetV3.forward   s    !!!$$r/   )i  NNg?)r3   r4   r5   r   r   r6   r   r   r	   r\   r9   r   r.   r
   r   rY   r]   r^   s   @r-   r   r   u   s    
  489=Y'#'(>#?Y' Y' 	Y'
 bii01Y' Xc299n56Y' Y' Y' 
Y'vv & % %F %r/   r   archr'   reduced_taildilatedrd   c                    |rdnd}|rdnd}t        t        |      }t        t        j                  |      }| dk(  r |dddddddd       |ddd	d
dddd       |d
ddd
dddd       |d
ddddddd       |dddddddd       |dddddddd       |dddddddd       |dddddddd       |dddddddd       |dddddddd       |dddddddd       |dddddddd       |dddd|z  ddd|       |d|z  dd|z  d|z  ddd|       |d|z  dd|z  d|z  ddd|      g}	 |d|z        }
|	|
fS | dk(  r |dddddddd       |dddd
dddd       |d
ddd
dddd       |d
ddddddd       |dddddddd       |dddddddd       |dddddddd       |dddddddd       |ddd d|z  ddd|       |d|z  dd!|z  d|z  ddd|       |d|z  dd!|z  d|z  ddd|      g}	 |d"|z        }
|	|
fS t        d#|        )$Nr   r   )r'   r      rh   FRE@      H      (   Tx      P   r)         i  p   i     i  i   r   X   `   0      i   i@  i   zUnsupported model type )r   r   r*   rI   )r   r'   r   r   rd   reduce_dividerr&   
bneck_confr*   r`   ra   s              r-   _mobilenet_v3_confr      s>    'QANqH/JGJ4DDQ[\O##r1b"eT1a8r1b"eT1a8r1b"eT1a8r1b"dD!Q7r1c2tT1a8r1c2tT1a8r1c2udAq9r1c2udAq9r1c2udAq9r1c2udAq9r1c3dAq9sAsCtQ:sAsC>$94q(Ssn,a1F~H]_ceiklnvwsn,a1F~H]_ceiklnvw%
!" 't~'=>& %l22% 
%	%r1b"dD!Q7r1b"eT1a8r1b"eT1a8r1b"dD!Q7r1c2tT1a8r1c2tT1a8r1c2tT1a8r1c2tT1a8r1c2#7tQQr^+Q~0Er^G[]acgijltur^+Q~0Er^G[]acgijltu%
! 't~'=> %l22 24&9::r/   r`   ra   weightsprogressrU   c                     |#t        |dt        |j                  d                t        | |fi |}|"|j	                  |j                  |d             |S )Nrb   
categoriesT)r   
check_hash)r   lenmetar   load_state_dictget_state_dict)r`   ra   r   r   rd   models         r-   _mobilenet_v3r     s`     fmSl9S5TU1<J6JEg44hSW4XYLr/   )r   r   )min_sizer   c                       e Zd Z ed eed      i edddddd	id
ddd      Z ed eedd      i edddddd	id
ddd      ZeZ	y)r   zChttps://download.pytorch.org/models/mobilenet_v3_large-8738ca79.pth   	crop_sizeiS ^https://github.com/pytorch/vision/tree/main/references/classification#mobilenetv3-large--smallImageNet-1Kg R@g(\V@zacc@1zacc@5g-?gw/5@zJThese weights were trained from scratch by using a simple training recipe.
num_paramsrecipe_metrics_ops
_file_size_docsurl
transformsr   zChttps://download.pytorch.org/models/mobilenet_v3_large-5c1a4163.pth   )r   resize_sizezHhttps://github.com/pytorch/vision/issues/3995#new-recipe-with-reg-tuninggK7R@gNbX9$W@gZd5@a/  
                These weights improve marginally 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)
r3   r4   r5   r   r   r   _COMMON_METAIMAGENET1K_V1IMAGENET1K_V2DEFAULTr;   r/   r-   r   r   (  s    Q.#>

!v##   e
M$ Q.#3O

!`##   
M, Gr/   r   c                   V    e Zd Z ed eed      i edddddd	id
ddd      ZeZy)r   zChttps://download.pytorch.org/models/mobilenet_v3_small-047dcff4.pthr   r   i& r   r   gnP@g}?5^U@r   gv/?g r#@z}
                These weights improve upon the results of the original paper by using a simple training recipe.
            r   r   N)	r3   r4   r5   r   r   r   r   r   r   r;   r/   r-   r   r   T  sY    Q.#>

!v##  
M( Gr/   r   
pretrained)r   T)r   r   c                 f    t         j                  |       } t        di |\  }}t        ||| |fi |S )a  
    Constructs a large MobileNetV3 architecture from
    `Searching for MobileNetV3 <https://arxiv.org/abs/1905.02244>`__.

    Args:
        weights (:class:`~torchvision.models.MobileNet_V3_Large_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.MobileNet_V3_Large_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.mobilenet.MobileNetV3``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/mobilenetv3.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.MobileNet_V3_Large_Weights
        :members:
    )r   )r   verifyr   r   r   r   rd   r`   ra   s        r-   r   r   l  @    2 )//8G.@.`Y_.`+|2L'8^W]^^r/   c                 f    t         j                  |       } t        di |\  }}t        ||| |fi |S )a  
    Constructs a small MobileNetV3 architecture from
    `Searching for MobileNetV3 <https://arxiv.org/abs/1905.02244>`__.

    Args:
        weights (:class:`~torchvision.models.MobileNet_V3_Small_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.MobileNet_V3_Small_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.mobilenet.MobileNetV3``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/mobilenetv3.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.MobileNet_V3_Small_Weights
        :members:
    )r   )r   r   r   r   r   s        r-   r   r     r   r/   )g      ?FF).	functoolsr   typingr   r   r   r   r   r   r	   r
   ops.miscr   r   rZ   transforms._presetsr   utilsr   _apir   r   r   _metar   _utilsr   r   r   __all__r   r\   r=   r   r8   r9   r7   r   r6   r   r   r   r   r   r   r   r;   r/   r-   <module>r      s    : :   I 5 ' 6 6 ' S S9 98>ryy >Bg%")) g%V UZ.3
.3 .36:.3MQ.3eh.3b#$:; k" 	
  & &) )X 0 ,0J0X0X!YZ7;d_34_GK_^a__ [ _: ,0J0X0X!YZ7;d_34_GK_^a__ [ _r/   