
    ڧg?                        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)j+        f)          dd*d+dee)         de$ded e!fd,                        Z, e             ed(e*j+        f)          dd*d+dee*         de$ded e!fd-                        Z-dS )/    )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                   Z    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	dS )InvertedResidualConfiginput_channelskernelexpanded_channelsout_channelsuse_se
activationstridedilation
width_multc
                     |                      ||	          | _        || _        |                      ||	          | _        |                      ||	          | _        || _        |dk    | _        || _        || _        d S )NHS)	adjust_channelsr   r    r!   r"   r#   use_hsr%   r&   )
selfr   r    r!   r"   r#   r$   r%   r&   r'   s
             Z/var/www/html/ai-engine/env/lib/python3.11/site-packages/torchvision/models/mobilenetv3.py__init__zInvertedResidualConfig.__init__   sy     #22>:NN!%!5!56G!T!T 00zJJ D(     channelsc                 (    t          | |z  d          S )N   )r   )r0   r'   s     r-   r*   z&InvertedResidualConfig.adjust_channels/   s    x*4a888r/   N)
__name__
__module____qualname__intboolstrfloatr.   staticmethodr*    r/   r-   r   r      s        !! ! 	!
 ! ! ! ! ! ! ! ! !* 9# 95 9 9 9 \9 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n t          d          |j        dk    o|j        |j        k    | _        g }|j        rt          j	        nt          j
        }|j        |j        k    r1|                    t          |j        |j        d||                     |j        dk    rdn|j        }|                    t          |j        |j        |j        ||j        |j        ||                     |j        r<t#          |j        dz  d          }|                     ||j        |                     |                    t          |j        |j        d|d                      t          j        | | _        |j        | _        |j        dk    | _        d S )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    	SZ$$$$1$$$$3444"zQY33EIY3Y"$+.:B2<<27  C$666MM$&) !)%5     lQ&&CJ %%J,%!1	 	 		
 	
 	
 : 	M.s/D/I1MMMM((3#8:JKKLLL 	 %s'7QS]pt  	
 	
 	
 ]F+
,j1nr/   inputreturnc                 H    |                      |          }| 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   s         .5WWr~-^-^-^	6% 6%#6% S")^,6% 3	>*	6% 6% 6% 6% 6% 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           
      z   t                                                       t          |            |st          d          t	          |t
                    rt          d |D                       st          d          |t          }|t          t          j        dd          }g }|d         j        }	|                    t          d	|	d	d
|t          j                             |D ]!}
|                     ||
|                     "|d         j        }d|z  }|                    t          ||d|t          j                             t          j        | | _        t          j        d          | _        t          j        t          j        ||          t          j        d          t          j        |d          t          j        ||                    | _        |                                 D ]B}t	          |t          j                  rRt          j                            |j        d           |j        $t          j                            |j                   ot	          |t          j        t          j        f          rIt          j                             |j                   t          j                            |j                   t	          |t          j                  rJt          j        !                    |j        dd           t          j                            |j                   DdS )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 emptyc                 8    g | ]}t          |t                    S r;   )
isinstancer   ).0ss     r-   
<listcomp>z(MobileNetV3.__init__.<locals>.<listcomp>   s#    ^^^qZ#9::^^^r/   zDThe inverted_residual_setting should be List[InvertedResidualConfig]NgMbP?g{Gz?)epsmomentumr      r   )rD   r%   r@   rE      r   rC   T)inplace)prr   fan_out)mode)"rH   r.   r   rI   ri   r   all	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,   rb   rc   rd   rO   r@   re   rf   rQ   firstconv_output_channelsr?   lastconv_input_channelslastconv_output_channelsmrS   s                 r-   r.   zMobileNetV3.__init__v   s   * 	D!!!( 	dPQQQ0(;;	d^^D]^^^__	d bccc=$E UTJJJJ"$ %>a$@$O! )%!#  		
 		
 		
 - 	2 	2CMM%%Z001111 #<B"?"L#$'>#>  '(%!#  	
 	
 	
 v.+A..-I.==L&&&J$///IlK00	
 
  
	' 
	'A!RY'' 	'''y'AAA6%GNN16***A=>> 'ah'''qv&&&&Ary)) '!T222qv&&&
	' 
	'r/   xc                     |                      |          }|                     |          }t          j        |d          }|                     |          }|S )Nr   )ry   r{   torchflattenr~   r,   r   s     r-   _forward_implzMobileNetV3._forward_impl   sI    MM!LLOOM!QOOAr/   c                 ,    |                      |          S rW   )r   r   s     r-   rY   zMobileNetV3.forward   s    !!!$$$r/   )r`   NNra   )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' 	Y'
 bi01Y' Xc29n56Y' Y' Y' 
Y' Y' Y' Y' Y' Y'vv &    % %F % % % % % % % %r/   r         ?Farchr'   reduced_taildilatedrf   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            }
n| 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            }
nt          d#|            |	|
fS )$Nr   r   )r'   r      ro   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   rf   reduce_dividerr&   
bneck_confr*   rb   rc   s              r-   _mobilenet_v3_confr      s    '-QQAN"qqH/JGGGJ4DQ[\\\O###Jr1b"eT1a88Jr1b"eT1a88Jr1b"eT1a88Jr1b"dD!Q77Jr1c2tT1a88Jr1c2tT1a88Jr1c2udAq99Jr1c2udAq99Jr1c2udAq99Jr1c2udAq99Jr1c3dAq99JsAsCtQ::JsAsC>$94q(SSJsn,a1F~H]_ceiklnvwwJsn,a1F~H]_ceiklnvww%
!" 't~'=>>	%	%	%Jr1b"dD!Q77Jr1b"eT1a88Jr1b"eT1a88Jr1b"dD!Q77Jr1c2tT1a88Jr1c2tT1a88Jr1c2tT1a88Jr1c2tT1a88Jr1c2#7tQQQJr^+Q~0Er^G[]acgijltuuJr^+Q~0Er^G[]acgijltuu%
! 't~'=>>9499:::$l22r/   rb   rc   weightsprogressrU   c                     |)t          |dt          |j        d                              t          | |fi |}|*|                    |                    |d                     |S )Nrd   
categoriesT)r   
check_hash)r   lenmetar   load_state_dictget_state_dict)rb   rc   r   r   rf   models         r-   _mobilenet_v3r     sv     fmSl9S5T5TUUU1<JJ6JJEg44hSW4XXYY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	dS )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        GQ7.#>>>

!v##     e
 
 
  M$ GQ7.#3OOO

!`##     
 
 
  M, GGGr/   r   c                   d    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dS )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  s        GQ7.#>>>

!v##    
 
 
  M( GGGr/   r   
pretrained)r   T)r   r   c                 t    t                               |           } 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   )r   verifyr   r   r   r   rf   rb   rc   s        r-   r   r   l  O    2 )//88G.@.`.`Y_.`.`+|2L'8^^W]^^^r/   c                 t    t                               |           } 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   r   s        r-   r   r     r   r/   )r   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 I I I I I I I 5 5 5 5 5 5 ' ' ' ' ' ' 6 6 6 6 6 6 6 6 6 6 ' ' ' ' ' ' S S S S S S S S S S  9 9 9 9 9 9 9 98> > > > >ry > > >Bg% g% g% g% g%") g% g% g%V UZ.3 .3
.3 .36:.3MQ.3eh.3 .3 .3 .3b#$:; k" 	
     & & ) ) ) ) ) ) ) )X       0 ,0J0X!YZZZ7;d_ _ _34_GK_^a__ _ _ [Z _: ,0J0X!YZZZ7;d_ _ _34_GK_^a__ _ _ [Z _ _ _r/   