a
    PSic.B                     @   s  d dl Z 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 d	dlmZ d	dlmZmZmZ g dZG dd deZG dd dZG dd de
jZ G dd de
jZ!d/e"e#e$e$edddZ%ee e&ee e$ee!dddZ'dedZ(G d d! d!eZ)G d"d# d#eZ*ed$e)j+fd%dd&d'ee) e$ee!d(d)d*Z,ed$e*j+fd%dd&d'ee* e$ee!d(d+d,Z-d	d-lm.Z. e.e)j+j/e*j+j/d.Z0dS )0    N)partial)AnyCallableListOptionalSequence)nnTensor   )Conv2dNormActivationSqueezeExcitation)ImageClassification)_log_api_usage_once   )WeightsEnumWeights)_IMAGENET_CATEGORIES)handle_legacy_interface_ovewrite_named_param_make_divisible)MobileNetV3MobileNet_V3_Large_WeightsMobileNet_V3_Small_Weightsmobilenet_v3_largemobilenet_v3_smallc                       s*   e Zd ZdZdeed fddZ  ZS )r   Z
DEPRECATED   )input_channelssqueeze_factorc                    sD   t || d}t j||tjd | j| _t| d t	dt
 d S )N   scale_activation
activationzThis SqueezeExcitation class is deprecated since 0.12 and will be removed in 0.14. Use torchvision.ops.SqueezeExcitation instead.)r   super__init__r   Hardsigmoidr!   reludelattrwarningswarnFutureWarning)selfr   r   squeeze_channels	__class__ Z/var/www/html/django/DPS/env/lib/python3.9/site-packages/torchvision/models/mobilenetv3.pyr#      s    
zSqueezeExcitation.__init__)r   )__name__
__module____qualname____doc__intr#   __classcell__r.   r.   r,   r/   r      s   r   c                
   @   s>   e Zd Zeeeeeeeeed	ddZeeedddZ	dS )InvertedResidualConfig)	r   kernelexpanded_channelsout_channelsuse_ser!   stridedilation
width_multc
           
      C   sP   |  ||	| _|| _|  ||	| _|  ||	| _|| _|dk| _|| _|| _d S )NHS)	adjust_channelsr   r7   r8   r9   r:   use_hsr;   r<   )
r*   r   r7   r8   r9   r:   r!   r;   r<   r=   r.   r.   r/   r#   *   s    
zInvertedResidualConfig.__init__channelsr=   c                 C   s   t | | dS )Nr   )r   rA   r.   r.   r/   r?   ?   s    z&InvertedResidualConfig.adjust_channelsN)
r0   r1   r2   r4   boolstrfloatr#   staticmethodr?   r.   r.   r.   r/   r6   (   s   r6   c                       sX   e Zd Zeeejdfeedej	f edej	f d fddZ
eedddZ  ZS )	InvertedResidualr   .)cnf
norm_layerse_layerc                    s$  t    d|j  kr dks*n td|jdko>|j|jk| _g }|jrRtj	ntj
}|j|jkr|t|j|jd||d |jdkrdn|j}|t|j|j|j||j|j||d |jrt|jd d}|||j| |t|j|jd|d d tj| | _|j| _|jdk| _d S )Nr   r
   zillegal stride valuekernel_sizerI   activation_layer)rL   r;   r<   groupsrI   rM   r   r   )r"   r#   r;   
ValueErrorr   r9   use_res_connectr@   r   	HardswishReLUr8   appendr   r<   r7   r:   r   
Sequentialblock_is_cn)r*   rH   rI   rJ   layersrM   r;   r+   r,   r.   r/   r#   F   sP    
zInvertedResidual.__init__)inputreturnc                 C   s   |  |}| jr||7 }|S N)rU   rP   )r*   rX   resultr.   r.   r/   forward~   s    
zInvertedResidual.forward)r0   r1   r2   r   SElayerr   r$   r6   r   Moduler#   r	   r\   r5   r.   r.   r,   r/   rG   D   s   8rG   c                
       sr   e Zd Zdee eeeedej	f  eedej	f  e
edd fddZeedd	d
ZeedddZ  ZS )r     N皙?.)inverted_residual_settinglast_channelnum_classesrU   rI   dropoutkwargsrY   c              
      s  t    t|  |s tdn$t|tr<tdd |D sDtd|du rPt}|du rht	t
jddd}g }|d	 j}	|td
|	d
d|t
jd |D ]}
|||
| q|d j}d| }|t||d|t
jd t
j| | _t
d| _t
t
||t
jddt
j|ddt
||| _|  D ]}t|t
jrlt
jj|jdd |jdurt
j|j n`t|t
jt
jfrt
j |j t
j|j n.t|t
jr,t
j!|jd	d t
j|j q,d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                 S   s   g | ]}t |tqS r.   )
isinstancer6   ).0sr.   r.   r/   
<listcomp>       z(MobileNetV3.__init__.<locals>.<listcomp>zDThe inverted_residual_setting should be List[InvertedResidualConfig]NgMbP?g{Gz?)epsmomentumr      r
   )rL   r;   rI   rM      r   rK   T)inplace)prp   fan_out)mode)"r"   r#   r   rO   rf   r   all	TypeErrorrG   r   r   BatchNorm2dr   rS   r   rQ   r9   rT   featuresAdaptiveAvgPool2davgpoolLinearDropout
classifiermodulesConv2dinitkaiming_normal_weightbiaszeros_	GroupNormones_normal_)r*   ra   rb   rc   rU   rI   rd   re   rW   firstconv_output_channelsrH   lastconv_input_channelslastconv_output_channelsmr,   r.   r/   r#      sr    







zMobileNetV3.__init__)xrY   c                 C   s.   |  |}| |}t|d}| |}|S )Nr   )rw   ry   torchflattenr|   r*   r   r.   r.   r/   _forward_impl   s
    


zMobileNetV3._forward_implc                 C   s
   |  |S rZ   )r   r   r.   r.   r/   r\      s    zMobileNetV3.forward)r_   NNr`   )r0   r1   r2   r   r6   r4   r   r   r   r^   rE   r   r#   r	   r   r\   r5   r.   r.   r,   r/   r      s        [
r         ?F)archr=   reduced_taildilatedre   c                 K   s  |rdnd}|rdnd}t t|d}t tj|d}| 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| ddd||d| dd| d| ddd||d| dd| d| ddd|g}	|d| }
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| ddd||d| dd!| d| ddd||d| dd!| d| ddd|g}	|d"| }
ntd#|  |	|
fS )$Nr
   r   )r=   r      rm   FRE@      H      (   Tx      P   r>         i  p   i     i  i   r   X   `   0      i   i@  i   zUnsupported model type )r   r6   r?   rO   )r   r=   r   r   re   Zreduce_dividerr<   
bneck_confr?   ra   rb   r.   r.   r/   _mobilenet_v3_conf   sL    
  
  r   )ra   rb   weightsprogressre   rY   c                 K   sN   |d urt |dt|jd  t| |fi |}|d urJ||j|d |S )Nrc   
categories)r   )r   lenmetar   load_state_dictget_state_dict)ra   rb   r   r   re   modelr.   r.   r/   _mobilenet_v3   s    r   )r   r   )min_sizer   c                
   @   sv   e Zd Zedeeddi edddddd	id
ddZedeedddi edddddd	i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@5zJThese weights were trained from scratch by using a simple training recipe.
num_paramsrecipe_metrics_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@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)
r0   r1   r2   r   r   r   _COMMON_METAIMAGENET1K_V1IMAGENET1K_V2DEFAULTr.   r.   r.   r/   r   8  sB   
r   c                
   @   sB   e Zd Zedeeddi edddddd	i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   z}
                These weights improve upon the results of the original paper by using a simple training recipe.
            r   r   N)	r0   r1   r2   r   r   r   r   r   r   r.   r.   r.   r/   r   `  s"   
r   
pretrained)r   T)r   r   )r   r   re   rY   c                 K   s2   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.resnet.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   re   ra   rb   r.   r.   r/   r   v  s    
r   c                 K   s2   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.resnet.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   r.   r.   r/   r     s    
r   )
_ModelURLs)r   r   )r   FF)1r'   	functoolsr   typingr   r   r   r   r   r   r   r	   Zops.miscr   r   r]   Ztransforms._presetsr   utilsr   _apir   r   _metar   _utilsr   r   r   __all__r6   r^   rG   r   rD   rE   rC   r   r4   r   r   r   r   r   r   r   r   r   
model_urlsr.   r.   r.   r/   <module>   sb   	Ak 
2(

