
    khA                     f   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 g dZ  G d dejB                        Z" G d dejF                        Z$dee%   dee%   dee   de&de&dede$fdZ'dedddd Z( G d! d"e      Z) G d# d$e      Z* G d% d&e      Z+ G d' d(e      Z, ed)*       ed+d, f-      dd.d/d0deee)ef      de&de&dede$f
d1              Z- ed2*       ed+d3 f-      dd.d/d0deee*ef      de&de&dede$f
d4              Z. ed5*       ed+d6 f-      dd.d/d0deee+ef      de&de&dede$f
d7              Z/ ed8*       ed+d9 f-      dd.d/d0deee,ef      de&de&dede$f
d:              Z0y);    )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                   <     e Zd Zdededdf fdZdedefdZ xZS )QuantizableInvertedResidualargskwargsreturnNc                 j    t        |   |i | t        j                  j	                         | _        y N)super__init__nn	quantizedFloatFunctionalcatselfr&   r'   	__class__s      h/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/models/quantization/shufflenetv2.pyr,   z$QuantizableInvertedResidual.__init__$   s)    $)&)<<//1    xc                 T   | j                   dk(  rE|j                  dd      \  }}| j                  j                  || j                  |      gd      }n=| j                  j                  | j	                  |      | j                  |      gd      }t        j                  |d      }|S )Nr   r   )dim)stridechunkr0   branch2branch1r	   channel_shuffle)r2   r6   x1x2outs        r4   forwardz#QuantizableInvertedResidual.forward(   s    ;;!WWQAW&FB((,,DLL$451,=C((,,QaAq,IC**32
r5   )__name__
__module____qualname__r   r,   r   rA   __classcell__r3   s   @r4   r%   r%   #   s0    2c 2S 2T 2	 	F 	r5   r%   c                   T     e Zd Zdededdf fdZdedefdZd
dee   ddfd	Z	 xZ
S )r   r&   r'   r(   Nc                     t        |   |dt        i| t        j                  j
                  j                         | _        t        j                  j
                  j                         | _	        y )Ninverted_residual)
r+   r,   r%   torchaoquantization	QuantStubquantDeQuantStubdequantr1   s      r4   r,   z QuantizableShuffleNetV2.__init__6   sP    $X2MXQWXXX**446
xx,,88:r5   r6   c                 l    | j                  |      }| j                  |      }| j                  |      }|S r*   )rN   _forward_implrP   )r2   r6   s     r4   rA   zQuantizableShuffleNetV2.forward;   s1    JJqMq!LLOr5   is_qatc                    | j                   j                         D ]  \  }}|dv s|t        |g dg|d       ! | j                         D ]  }t	        |      t
        u st        |j                  j                   j                               dkD  rt        |j                  ddgg d	g|d       t        |j                  g dd
dgg dg|d        y)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   rW   rX   )rY   34r[   r\   )567)	_modulesitemsr   modulestyper%   lenr<   r;   )r2   rS   namems       r4   
fuse_modelz"QuantizableShuffleNetV2.fuse_modelA   s     }}**, 	JGD!))ama/!2FDI	J  		AAw55qyy))//12Q6!!))sCj/-JF\`aII$sCj/B 				r5   r*   )rB   rC   rD   r   r,   r   rA   r   boolrg   rE   rF   s   @r4   r   r   4   sG    ;c ;S ;T ;
 F $ 4 r5   r   stages_repeatsstages_out_channelsweightsprogressquantizer'   r(   c                X   |Kt        |dt        |j                  d                d|j                  v rt        |d|j                  d          |j                  dd      }t	        | |fi |}t        |       |rt        ||       |"|j                  |j                  |d             |S )Nnum_classes
categoriesbackendfbgemmT)rl   
check_hash)	r   rd   metapopr   r   r   load_state_dictget_state_dict)ri   rj   rk   rl   rm   r'   rq   models           r4   _shufflenetv2ry   Z   s     fmSl9S5TU$!&)W\\)5LMjjH-G#N4GR6RE%ug&g44hSW4XYLr5   )r   r   rr   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_sizerp   rq   recipe_docsc                   h    e Zd Z ed eed      i edej                  ddddid	d
d      Z	e	Z
y)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url
transformsrt   N)rB   rC   rD   r   r   r   _COMMON_METAr   IMAGENET1K_V1IMAGENET1K_FBGEMM_V1DEFAULT r5   r4   r   r      s[    "a.#>

!5CC##  
" #Gr5   r   c                   h    e Zd Z ed eed      i edej                  ddddid	d
d      Z	e	Z
y)r   zQhttps://download.pytorch.org/models/quantized/shufflenetv2_x1_fbgemm-1e62bb32.pthr~   r   i" r   gףp=
Q@gh|?U@r   g(\?gy&1@r   r   N)rB   rC   rD   r   r   r   r   r   r   r   r   r   r5   r4   r   r      s[    "_.#>

!5CC##  
" #Gr5   r   c                   l    e Zd Z ed eedd      i eddej                  ddd	d
iddd      Z	e	Z
y)r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x1_5_fbgemm-d7401f05.pthr~      r   resize_size+https://github.com/pytorch/vision/pull/5906iv5 r   gSR@g̬V@r   gl?gK7A`@r{   r   r   r   r   r   r   N)rB   rC   rD   r   r   r   r   r   r   r   r   r   r5   r4   r   r      `    "a.#3O

C!5CC##  
$ #Gr5   r   c                   l    e Zd Z ed eedd      i eddej                  ddd	d
iddd      Z	e	Z
y)r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x2_0_fbgemm-5cac526c.pthr~   r   r   r   ip r   g-R@gZd;W@r   g-?g|?5@r   r   N)rB   rC   rD   r   r   r   r   r   r   r   r   r   r5   r4   r   r      r   r5   r   quantized_shufflenet_v2_x0_5)re   
pretrainedc                 f    | j                  dd      rt        j                  S t        j                  S Nrm   F)getr   r   r   r   r'   s    r4   <lambda>r      +    ::j%( ;OO '55 r5   )rk   TFrk   rl   rm   c                 f    |rt         nt        j                  |       } 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   verifyry   rk   rl   rm   r'   s       r4   r    r       sD    ` 7?2D^ffgnoG*4;hYaek r5   quantized_shufflenet_v2_x1_0c                 f    | j                  dd      rt        j                  S t        j                  S r   )r   r   r   r   r   r   s    r4   r   r     r   r5   c                 f    |rt         nt        j                  |       } 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   ry   r   s       r4   r!   r!     D    ` 7?2D^ffgnoG,6=[cgm r5   quantized_shufflenet_v2_x1_5c                 f    | j                  dd      rt        j                  S t        j                  S r   )r   r   r   r   r   r   s    r4   r   r   F  r   r5   c                 f    |rt         nt        j                  |       } 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   ry   r   s       r4   r"   r"   B  r   r5   quantized_shufflenet_v2_x2_0c                 f    | j                  dd      rt        j                  S t        j                  S r   )r   r   r   r   r   r   s    r4   r   r   |  r   r5   c                 f    |rt         nt        j                  |       } 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   ry   r   s       r4   r#   r#   x  r   r5   )1	functoolsr   typingr   r   r   r   rJ   torch.nnr-   r   torchvision.modelsr	   transforms._presetsr   _apir   r   r   _metar   _utilsr   r   r   r   r   r   utilsr   r   r   __all__InvertedResidualr%   ShuffleNetV2r   intrh   ry   r   r   r   r   r   r    r!   r"   r#   r   r5   r4   <module>r      s    - -    + 6 7 7 ( C  @ ?
,"?"? "#l77 #LIc k"	
    6 &t	#+ #*#+ #*#+ #,#+ #, 34	6 ae	*e?A[[\]* * 	*
 * * 5*Z 34	6 ae	*e?A[[\]* * 	*
 * * 5*Z 34	6 ae	*e?A[[\]* * 	*
 * * 5*Z 34	6 ae	*e?A[[\]* * 	*
 * * 5*r5   