U
    hA                  	   @   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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 dddddddddg	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(ed)d*d+ fd,dd-d.d/eee)ef  e&e&ee$d0d1dZ-ed2d(ed)d3d+ fd,dd-d.d/eee*ef  e&e&ee$d0d4dZ.ed5d(ed)d6d+ fd,dd-d.d/eee+ef  e&e&ee$d0d7dZ/ed8d(ed)d9d+ fd,dd-d.d/eee,ef  e&e&ee$d0d:dZ0dS );    )partial)AnyListOptionalUnionN)Tensor)shufflenetv2   )ImageClassification   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface)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|| tj | _d S N)super__init__nnZ	quantizedZFloatFunctionalcatselfr%   r&   	__class__ ^/var/www/html/venv/lib/python3.8/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)Zstridechunkr,   branch2branch1r   Zchannel_shuffle)r.   r4   x1Zx2outr1   r1   r2   forward(   s    
 z#QuantizableInvertedResidual.forward)__name__
__module____qualname__r   r*   r   r;   __classcell__r1   r1   r/   r2   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 )NZinverted_residual)
r)   r*   r#   torchZaoZquantizationZ	QuantStubquantZDeQuantStubdequantr-   r/   r1   r2   r*   6   s    z QuantizableShuffleNetV2.__init__r3   c                 C   s"   |  |}| |}| |}|S r(   )rA   Z_forward_implrB   )r.   r4   r1   r1   r2   r;   ;   s    


zQuantizableShuffleNetV2.forward)is_qatr'   c                 C   s   | j  D ]0\}}|dkr
|dk	r
t|dddgg|dd q
|  D ]l}t|tkrDt|jj  dkrt|jddgdd	d
gg|dd t|jdddgd	d
gdddgg|dd qDd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
        )Zconv1Zconv5N012T)Zinplacer   34567)	Z_modulesitemsr   modulestyper#   lenr8   r7   )r.   rC   namemr1   r1   r2   
fuse_modelA   s    
 z"QuantizableShuffleNetV2.fuse_model)N)r<   r=   r>   r   r*   r   r;   r   boolrR   r?   r1   r1   r/   r2   r   4   s   )stages_repeatsstages_out_channelsweightsprogressquantizer&   r'   c                K   s   |d k	r:t |dt|jd  d|jkr:t |d|jd  |dd}t| |f|}t| |rjt|| |d k	r||j|dd |S )NZnum_classes
categoriesbackendfbgemmT)rW   Z
check_hash)	r   rO   metapopr   r   r   Zload_state_dictZget_state_dict)rT   rU   rV   rW   rX   r&   rZ   modelr1   r1   r2   _shufflenetv2Z   s    	

r_   )r   r   r[   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.
    )Zmin_sizerY   rZ   recipeZ_docsc                
   @   sB   e Zd Zedeeddedejddddid	d
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@5g{Gz?gjt?
num_paramsunquantized_metrics_ops
_file_sizeurlZ
transformsr\   N)r<   r=   r>   r   r   r
   _COMMON_METAr   IMAGENET1K_V1IMAGENET1K_FBGEMM_V1DEFAULTr1   r1   r1   r2   r      s    
c                
   @   sB   e Zd Zedeeddedejddddid	d
ddZ	e	Z
dS )r   zQhttps://download.pytorch.org/models/quantized/shufflenetv2_x1_fbgemm-1e62bb32.pthra   rb   i" rd   gףp=
Q@gh|?U@re   g(\?gy&1@rf   rl   N)r<   r=   r>   r   r   r
   rn   r   ro   rp   rq   r1   r1   r1   r2   r      s    
c                   @   sF   e Zd Zedeedddeddejddd	d
iddddZ	e	Z
dS )r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x1_5_fbgemm-d7401f05.pthra      rc   Zresize_size+https://github.com/pytorch/vision/pull/5906iv5 rd   gSR@g̬V@re   gl?gK7A`@r`   rg   rh   ri   rj   rk   rl   N)r<   r=   r>   r   r   r
   rn   r   ro   rp   rq   r1   r1   r1   r2   r      s"   c                   @   sF   e Zd Zedeedddeddejddd	d
iddddZ	e	Z
dS )r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x2_0_fbgemm-5cac526c.pthra   rr   rs   rt   ip rd   g-R@gZd;W@re   g-?g|?5@ru   rl   N)r<   r=   r>   r   r   r
   rn   r   ro   rp   rq   r1   r1   r1   r2   r      s"   Zquantized_shufflenet_v2_x0_5)rP   Z
pretrainedc                 C   s   |  ddrtjS tjS NrX   F)getr   rp   r   ro   r&   r1   r1   r2   <lambda>   s    
ry   )rV   TFrV   rW   rX   )rV   rW   rX   r&   r'   c                 K   s<   |rt nt| } tdddgdddddg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:
             0   `         rz   )r   r   verifyr_   rV   rW   rX   r&   r1   r1   r2   r      s    0   Zquantized_shufflenet_v2_x1_0c                 C   s   |  ddrtjS tjS rv   )rw   r   rp   r   ro   rx   r1   r1   r2   ry     s    
c                 K   s<   |rt nt| } tdddgdddddg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|   r}   t   rr   i  r   rz   )r   r   r   r_   r   r1   r1   r2   r      s    0   Zquantized_shufflenet_v2_x1_5c                 C   s   |  ddrtjS tjS rv   )rw   r   rp   r   ro   rx   r1   r1   r2   ry   F  s    
c                 K   s<   |rt nt| } tdddgdddddg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|   r}      i`  i  r   rz   )r   r   r   r_   r   r1   r1   r2   r!   B  s    0   Zquantized_shufflenet_v2_x2_0c                 C   s   |  ddrtjS tjS rv   )rw   r   rp   r   ro   rx   r1   r1   r2   ry   |  s    
c                 K   s<   |rt nt| } tdddgdddddg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|   r}      i  i  i   rz   )r   r   r   r_   r   r1   r1   r2   r"   x  s    0   )1	functoolsr   typingr   r   r   r   r@   Ztorch.nnr+   r   Ztorchvision.modelsr   Ztransforms._presetsr
   Z_apir   r   r   _metar   Z_utilsr   r   r   r   r   r   utilsr   r   r   __all__ZInvertedResidualr#   ZShuffleNetV2r   intrS   r_   rn   r   r   r   r   r   r    r!   r"   r1   r1   r1   r2   <module>   s   '
-
-
-
