§
    ù²ÅjŸC  ã                   ó  — 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j!        ¦  «        Z" G d„ dej#        ¦  «        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:„¦   «         ¦   «         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                   ó<   ‡ — 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                 ó€   •—  t          ¦   «         j        |i |¤Ž t          j                             ¦   «         | _        d S ©N)ÚsuperÚ__init__ÚnnÚ	quantizedÚFloatFunctionalÚcat©Úselfr&   r'   Ú	__class__s      €ú]C:\Projects\Historical\venv\Lib\site-packages\torchvision/models/quantization/shufflenetv2.pyr,   z$QuantizableInvertedResidual.__init__$   s8   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ý”<×/Ò/Ñ1Ô1ˆŒˆˆó    Úxc                 óf  — | j         dk    rL|                     dd¬¦  «        \  }}| j                             ||                      |¦  «        gd¬¦  «        }nD| 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™   € ØŒ;˜!ÒÐØ—W’W˜Q A�WÑ&Ô&‰FˆB�Ø”(—,’,  D§L¢L°Ñ$4Ô$4Ð5¸1�,Ñ=Ô=ˆCˆCà”(—,’, §¢¨Q¡¤°·²¸a±´ÐAÀq�,ÑIÔIˆCåÔ*¨3°Ñ2Ô2ˆàˆ
r5   )Ú__name__Ú
__module__Ú__qualname__r   r,   r   rA   Ú__classcell__©r3   s   @r4   r%   r%   #   st   ø€ € € € € ð2˜cð 2¨Sð 2°Tð 2ð 2ð 2ð 2ð 2ð 2ð	˜ð 	 Fð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r5   r%   c                   óZ   ‡ — 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          ¦   «         j        |dt          i|¤Ž t          j        j                             ¦   «         | _        t          j        j                             ¦   «         | _	        d S )NÚinverted_residual)
r+   r,   r%   ÚtorchÚaoÚquantizationÚ	QuantStubÚquantÚDeQuantStubÚdequantr1   s      €r4   r,   z QuantizableShuffleNetV2.__init__6   sZ   ø€ Ø�‰ŒÔ˜$ÐXÕ2MÐXÐQWÐXÐXÐXÝ”XÔ*×4Ò4Ñ6Ô6ˆŒ
Ý”xÔ,×8Ò8Ñ:Ô:ˆŒˆˆr5   r6   c                 ó„   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|S r*   )rN   Ú_forward_implrP   )r2   r6   s     r4   rA   zQuantizableShuffleNetV2.forward;   s8   € Ø�JŠJ�q‰MŒMˆØ×Ò˜qÑ!Ô!ˆØ�LŠL˜‰OŒOˆØˆr5   Úis_qatc                 ó²  — | j                              ¦   «         D ]!\  }}|dv r|�t          |g d¢g|d¬¦  «         Œ"|                      ¦   «         D ]†}t	          |¦  «        t
          u rnt          |j        j                              ¦   «         ¦  «        dk    rt          |j        ddgg d	¢g|d¬¦  «         t          |j        g d¢d
dgg d¢g|d¬¦  «         Œ‡d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   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ð 	J‰GˆD�!ØÐ)Ð)Ð)¨a¨mÝ˜a / / /Ð!2°FÀDÐIÑIÔIÐIøØ—’‘”ð 		ð 		ˆAÝ�A‰wŒwÕ5Ð5Ð5Ý�q”yÔ)×/Ò/Ñ1Ô1Ñ2Ô2°QÒ6Ð6Ý! !¤)¨s°C¨j¸/¸/¸/Ð-JÈFÐ\`ÐaÑaÔaÐaÝØ”IØ$�_�_ s¨C j°/°/°/ÐBØØ ð	ñ ô ð øð			ð 		r5   r*   )rB   rC   rD   r   r,   r   rA   r   Úboolrg   rE   rF   s   @r4   r   r   4   sŸ   ø€ € € € € ð;˜cð ;¨Sð ;°Tð ;ð ;ð ;ð ;ð ;ð ;ð
˜ð  Fð ð ð ð ðð  ¨$¤ð ¸4ð ð ð ð ð ð ð ð r5   r   Ústages_repeatsÚstages_out_channelsÚweightsÚprogressÚquantizer'   r(   c                óˆ  — |�Nt          |dt          |j        d         ¦  «        ¦  «         d|j        v rt          |d|j        d         ¦  «         |                     dd¦  «        }t	          | |fi |¤Ž}t          |¦  «         |rt          ||¦  «         |�*|                     |                     |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Õ   € ð ÐÝ˜f mµS¸¼ÀlÔ9SÑ5TÔ5TÑUÔUÐUØ˜œÐ$Ð$Ý! &¨)°W´\À)Ô5LÑMÔMÐMØ�jŠj˜ HÑ-Ô-€Gå# NÐ4GÐRÐRÈ6ÐRÐR€EÝ�%ÑÔÐØð 'Ý�u˜gÑ&Ô&Ð&àÐØ×Ò˜g×4Ò4¸hÐSWÐ4ÑXÔXÑYÔYÐ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                   ól   — 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
dS )r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x0.5_fbgemm-00845098.pthéà   ©Ú	crop_sizeiÛ úImageNet-1Kg#Ûù~jüL@gR¸…ëñS@©zacc@1zacc@5g{®Gáz¤?gj¼t“ø?©Ú
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‡   € € € € € Ø"˜7ØaØ�7Ð.¸#Ð>Ñ>Ô>ð
Øð
à!Ø5ÔCàØ#Ø#ð ð  ðð Øð
ð 
ð 
ðñ ô Ðð" #€G€G€Gr5   r   c                   ól   — 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
dS )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‡   € € € € € Ø"˜7Ø_Ø�7Ð.¸#Ð>Ñ>Ô>ð
Øð
à!Ø5ÔCàØ#Ø#ð ð  ðð Øð
ð 
ð 
ðñ ô Ðð" #€G€G€Gr5   r   c                   óp   — 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
dS )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‚   g‹lçû©ñÒ?gÇK7‰A`@©r{   r„   r…   r†   r‡   rˆ   r‰   N)rB   rC   rD   r   r   r   rŒ   r   r�   rŽ   r�   r�   r5   r4   r   r   ª   óŒ   € € € € € Ø"˜7ØaØ�7Ð.¸#È3ÐOÑOÔOð
Øð
àCØ!Ø5ÔCàØ#Ø#ð ð  ðð Øð
ð 
ð 
ðñ ô Ðð$ #€G€G€Gr5   r   c                   óp   — 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
dS )r   zShttps://download.pytorch.org/models/quantized/shufflenetv2_x2_0_fbgemm-5cac526c.pthr~   r“   r”   r–   iÌÒp 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                 ó^   — |                       dd¦  «        rt          j        nt          j        S ©Nrm   F)Úgetr   rŽ   r   r�   ©r'   s    r4   ú<lambda>r    Ú   ó,   € Ø�:Š:�j %Ñ(Ô(ð6Õ:ÔOÐOå'Ô5ð r5   )rk   TF©rk   rl   rm   c                 ót   — |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   Úverifyry   ©rk   rl   rm   r'   s       r4   r    r    Ö   sa   € ð` 7?Ð^Õ2Ð2ÕD^×fÒfÐgnÑoÔo€GÝØˆ	ˆ	Ð*Ð*Ð*ðØ4;ÀhÐYaðð Øekðð ð r5   Úquantized_shufflenet_v2_x1_0c                 ó^   — |                       dd¦  «        rt          j        nt          j        S r�   )rž   r   rŽ   r   r�   rŸ   s    r4   r    r      r¡   r5   c                 ót   — |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¬   ry   r­   s       r4   r!   r!     óa   € ð` 7?Ð^Õ2Ð2ÕD^×fÒfÐgnÑoÔo€GÝØˆ	ˆ	Ð,Ð,Ð,ðØ6=ÈÐ[cðð Øgmðð ð r5   Úquantized_shufflenet_v2_x1_5c                 ó^   — |                       dd¦  «        rt          j        nt          j        S r�   )rž   r   rŽ   r   r�   rŸ   s    r4   r    r    F  r¡   r5   c                 ót   — |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¬   ry   r­   s       r4   r"   r"   B  r²   r5   Úquantized_shufflenet_v2_x2_0c                 ó^   — |                       dd¦  «        rt          j        nt          j        S r�   )rž   r   rŽ   r   r�   rŸ   s    r4   r    r    |  r¡   r5   c                 ót   — |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¬   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Ð 6Ð 6Ð 6Ð 6Ð 6Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø (Ð (Ð (Ð (Ð (Ð (Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ Cðð ð ð ð ð ð ð ð ð ð ð ð @Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?ð
ð 
ð 
€ðð ð ð ð  ,Ô"?ñ ô ð ð"#ð #ð #ð #ð #˜lÔ7ñ #ô #ð #ðLØ˜”Iðà˜cœðð �kÔ"ð	ð
 ðð ðð ðð ðð ð ð ð6 Ø&ØØtðð	ð 	€ð#ð #ð #ð #ð #¨+ñ #ô #ð #ð*#ð #ð #ð #ð #¨+ñ #ô #ð #ð*#ð #ð #ð #ð #¨+ñ #ô #ð #ð,#ð #ð #ð #ð #¨+ñ #ô #ð #ð, €Ð3Ð4Ñ4Ô4ØÐàð	6ð 	6ððñ ô ð aeØØð	*ð *ð *à�eÐ?ÐA[Ð[Ô\Ô]ð*ð ð*ð ð	*ð
 ð*ð ð*ð *ð *ñô ñ 5Ô4ð*ðZ €Ð3Ð4Ñ4Ô4ØÐàð	6ð 	6ððñ ô ð aeØØð	*ð *ð *à�eÐ?ÐA[Ð[Ô\Ô]ð*ð ð*ð ð	*ð
 ð*ð ð*ð *ð *ñô ñ 5Ô4ð*ðZ €Ð3Ð4Ñ4Ô4ØÐàð	6ð 	6ððñ ô ð aeØØð	*ð *ð *à�eÐ?ÐA[Ð[Ô\Ô]ð*ð ð*ð ð	*ð
 ð*ð ð*ð *ð *ñô ñ 5Ô4ð*ðZ €Ð3Ð4Ñ4Ô4ØÐàð	6ð 	6ððñ ô ð aeØØð	*ð *ð *à�eÐ?ÐA[Ð[Ô\Ô]ð*ð ð*ð ð	*ð
 ð*ð ð*ð *ð *ñô ñ 5Ô4ð*ð *ð *r5   