a
    PSic?                     @   s\  d dl mZ d dlmZmZmZmZ d dlZd dlm	Z	 d dl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 ddlmZmZmZmZ ddlmZmZmZ g dZG dd dej Z!G dd dej"Z#ee$ ee$ ee e%e%ee#dddZ&deddddZ'G dd deZ(G dd deZ)G d d! d!eZ*G d"d# d#eZ+ed$d%d& fd'dd(d)d*eee(ef  e%e%ee#d+d,d-Z,ed$d.d& fd'dd(d)d*eee)ef  e%e%ee#d+d/d0Z-dd(d)d*eee*ef  e%e%ee#d+d1d2Z.dd(d)d*eee+ef  e%e%ee#d+d3d4Z/dd5lm0Z0 dd6lm1Z1 e0e(j2j3e)j2j3d7Z4dS )8    )partial)AnyListOptionalUnionN)Tensor)shufflenetv2   )ImageClassification   )WeightsEnumWeights)_IMAGENET_CATEGORIES)handle_legacy_interface_ovewrite_named_param)ShuffleNet_V2_X0_5_WeightsShuffleNet_V2_X1_0_WeightsShuffleNet_V2_X1_5_WeightsShuffleNet_V2_X2_0_Weights   )_fuse_modules_replace_reluquantize_model)	QuantizableShuffleNetV2#ShuffleNet_V2_X0_5_QuantizedWeights#ShuffleNet_V2_X1_0_QuantizedWeights#ShuffleNet_V2_X1_5_QuantizedWeights#ShuffleNet_V2_X2_0_QuantizedWeightsshufflenet_v2_x0_5shufflenet_v2_x1_0shufflenet_v2_x1_5shufflenet_v2_x2_0c                       s6   e Zd Zeedd fddZeedddZ  ZS )QuantizableInvertedResidualNargskwargsreturnc                    s"   t  j|i | tj | _d S N)super__init__nn	quantizedFloatFunctionalcatselfr$   r%   	__class__ h/var/www/html/django/DPS/env/lib/python3.9/site-packages/torchvision/models/quantization/shufflenetv2.pyr)   $   s    z$QuantizableInvertedResidual.__init__xr&   c                 C   sh   | j dkr8|jddd\}}| jj|| |gdd}n | jj| || |gdd}t|d}|S )Nr   r   )dim)stridechunkr-   branch2branch1r   channel_shuffle)r/   r5   x1x2outr2   r2   r3   forward(   s    
 z#QuantizableInvertedResidual.forward)__name__
__module____qualname__r   r)   r   r?   __classcell__r2   r2   r0   r3   r"   #   s   r"   c                       sL   e Zd Zeedd fddZeedddZdee ddd	d
Z	  Z
S )r   Nr#   c                    s6   t  j|dti| tjj | _tjj | _	d S )Ninverted_residual)
r(   r)   r"   torchaoquantization	QuantStubquantDeQuantStubdequantr.   r0   r2   r3   r)   6   s    z QuantizableShuffleNetV2.__init__r4   c                 C   s"   |  |}| |}| |}|S r'   )rI   _forward_implrK   )r/   r5   r2   r2   r3   r?   ;   s    


zQuantizableShuffleNetV2.forward)is_qatr&   c                 C   s   | j  D ].\}}|dv r
|dur
t|g dg|dd q
|  D ]f}t|tu rBt|jj  dkrt|jddgg d	g|dd t|jg dd
dgg dg|dd qBdS )aB  Fuse conv/bn/relu modules in shufflenetv2 model

        Fuse conv+bn+relu/ conv+relu/conv+bn modules to prepare for quantization.
        Model is modified in place.

        .. note::
            Note that this operation does not change numerics
            and the model after modification is in floating point
        )conv1conv5N)012T)inplacer   rP   rQ   )rR   34rT   rU   )567)	_modulesitemsr   modulestyper"   lenr:   r9   )r/   rM   namemr2   r2   r3   
fuse_modelA   s    
z"QuantizableShuffleNetV2.fuse_model)N)r@   rA   rB   r   r)   r   r?   r   boolr`   rC   r2   r2   r0   r3   r   4   s   r   )stages_repeatsstages_out_channelsweightsprogressquantizer%   r&   c                K   s   |d ur:t |dt|jd  d|jv r:t |d|jd  |dd}t| |fi |}t| |rnt|| |d ur||j|d |S )Nnum_classes
categoriesbackendfbgemm)re   )	r   r]   metapopr   r   r   load_state_dictget_state_dict)rb   rc   rd   re   rf   r%   ri   modelr2   r2   r3   _shufflenetv2Z   s    	

rp   )r   r   rj   zdhttps://github.com/pytorch/vision/tree/main/references/classification#post-training-quantized-modelsz
        These weights were produced by doing Post Training Quantization (eager mode) on top of the unquantized
        weights listed below.
    )min_sizerh   ri   recipe_docsc                
   @   sB   e Zd Zedeeddi edejddddid	d
Z	e	Z
dS )r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x0.5_fbgemm-00845098.pth   	crop_sizei ImageNet-1Kg#~jL@gRS@zacc@1zacc@5
num_paramsunquantized_metricsurl
transformsrk   N)r@   rA   rB   r   r   r
   _COMMON_METAr   IMAGENET1K_V1IMAGENET1K_FBGEMM_V1DEFAULTr2   r2   r2   r3   r      s    
r   c                
   @   sB   e Zd Zedeeddi edejddddid	d
Z	e	Z
dS )r   zQhttps://download.pytorch.org/models/quantized/shufflenetv2_x1_fbgemm-db332c57.pthrt   ru   i" rw   gףp=
Q@gh|?U@rx   ry   r}   N)r@   rA   rB   r   r   r
   r   r   r   r   r   r2   r2   r2   r3   r      s    
r   c                   @   sF   e Zd Zedeedddi eddejddd	d
iddZ	e	Z
dS )r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x1_5_fbgemm-d7401f05.pthrt      rv   resize_size+https://github.com/pytorch/vision/pull/5906iv5 rw   gSR@g̬V@rx   rr   rz   r{   r|   r}   N)r@   rA   rB   r   r   r
   r   r   r   r   r   r2   r2   r2   r3   r      s"   r   c                   @   sF   e Zd Zedeedddi eddejddd	d
iddZ	e	Z
dS )r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x2_0_fbgemm-5cac526c.pthrt   r   r   r   ip rw   g-R@gZd;W@rx   r   r}   N)r@   rA   rB   r   r   r
   r   r   r   r   r   r2   r2   r2   r3   r      s"   r   
pretrainedc                 C   s   |  ddrtjS tjS Nrf   F)getr   r   r   r   r%   r2   r2   r3   <lambda>   s    
r   )rd   TFrd   re   rf   )rd   re   rf   r%   r&   c                 K   s4   |rt nt| } tg dg df| ||d|S )aQ  
    Constructs a ShuffleNetV2 with 0.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    .. note::
        Note that ``quantize = True`` returns a quantized model with 8 bit
        weights. Quantized models only support inference and run on CPUs.
        GPU inference is not yet supported.

    Args:
        weights (:class:`~torchvision.models.quantization.ShuffleNet_V2_X0_5_QuantizedWeights` or :class:`~torchvision.models.ShuffleNet_V2_X0_5_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ShuffleNet_V2_X0_5_QuantizedWeights` 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.
        quantize (bool, optional): If True, return a quantized version of the model.
            Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.ShuffleNet_V2_X0_5_QuantizedWeights``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X0_5_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X0_5_Weights
        :members:
        :noindex:
          r   )   0   `         r   )r   r   verifyrp   rd   re   rf   r%   r2   r2   r3   r      s    /r   c                 C   s   |  ddrtjS tjS r   )r   r   r   r   r   r   r2   r2   r3   r     s    
c                 K   s4   |rt nt| } tg dg df| ||d|S )aQ  
    Constructs a ShuffleNetV2 with 1.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    .. note::
        Note that ``quantize = True`` returns a quantized model with 8 bit
        weights. Quantized models only support inference and run on CPUs.
        GPU inference is not yet supported.

    Args:
        weights (:class:`~torchvision.models.quantization.ShuffleNet_V2_X1_0_QuantizedWeights` or :class:`~torchvision.models.ShuffleNet_V2_X1_0_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ShuffleNet_V2_X1_0_QuantizedWeights` 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.
        quantize (bool, optional): If True, return a quantized version of the model.
            Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.ShuffleNet_V2_X1_0_QuantizedWeights``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X1_0_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_0_Weights
        :members:
        :noindex:
    r   )r   t   r   i  r   r   )r   r   r   rp   r   r2   r2   r3   r     s    /r   c                 K   s4   |rt nt| } tg dg df| ||d|S )aQ  
    Constructs a ShuffleNetV2 with 1.5x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    .. note::
        Note that ``quantize = True`` returns a quantized model with 8 bit
        weights. Quantized models only support inference and run on CPUs.
        GPU inference is not yet supported.

    Args:
        weights (:class:`~torchvision.models.quantization.ShuffleNet_V2_X1_5_QuantizedWeights` or :class:`~torchvision.models.ShuffleNet_V2_X1_5_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ShuffleNet_V2_X1_5_QuantizedWeights` 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.
        quantize (bool, optional): If True, return a quantized version of the model.
            Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.ShuffleNet_V2_X1_5_QuantizedWeights``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X1_5_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X1_5_Weights
        :members:
        :noindex:
    r   )r      i`  i  r   r   )r   r   r   rp   r   r2   r2   r3   r    8  s    'r    c                 K   s4   |rt nt| } tg dg df| ||d|S )aQ  
    Constructs a ShuffleNetV2 with 2.0x output channels, as described in
    `ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
    <https://arxiv.org/abs/1807.11164>`__.

    .. note::
        Note that ``quantize = True`` returns a quantized model with 8 bit
        weights. Quantized models only support inference and run on CPUs.
        GPU inference is not yet supported.

    Args:
        weights (:class:`~torchvision.models.quantization.ShuffleNet_V2_X2_0_QuantizedWeights` or :class:`~torchvision.models.ShuffleNet_V2_X2_0_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.ShuffleNet_V2_X2_0_QuantizedWeights` 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.
        quantize (bool, optional): If True, return a quantized version of the model.
            Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.ShuffleNet_V2_X2_0_QuantizedWeights``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/shufflenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.ShuffleNet_V2_X2_0_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ShuffleNet_V2_X2_0_Weights
        :members:
        :noindex:
    r   )r      i  i  i   r   )r   r   r   rp   r   r2   r2   r3   r!   e  s    'r!   )
_ModelURLs)
model_urls)zshufflenetv2_x0.5_fbgemmzshufflenetv2_x1.0_fbgemm)5	functoolsr   typingr   r   r   r   rE   torch.nnr*   r   Ztorchvision.modelsr   Ztransforms._presetsr
   _apir   r   _metar   _utilsr   r   r   r   r   r   utilsr   r   r   __all__InvertedResidualr"   ShuffleNetV2r   intra   rp   r   r   r   r   r   r   r   r    r!   r   r   r   r~   quant_model_urlsr2   r2   r2   r3   <module>   s   '
-
//.