§
    ù²Åj•  ã                   ó¢  — d dl mZ d dlmZmZmZ d dlmZmZ d dl	m
Z
mZ d dlmZmZ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  g d¢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dœdeee$ef                  d e%d!e%d"ed#e#f
d$„¦   «         ¦   «         Z&dS )%é    )Úpartial)ÚAnyÚOptionalÚUnion)ÚnnÚTensor)ÚDeQuantStubÚ	QuantStub)ÚInvertedResidualÚMobileNet_V2_WeightsÚMobileNetV2é   )ÚConv2dNormActivation)ÚImageClassificationé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interfaceé   )Ú_fuse_modulesÚ_replace_reluÚquantize_model)ÚQuantizableMobileNetV2ÚMobileNet_V2_QuantizedWeightsÚmobilenet_v2c                   ó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 )ÚQuantizableInvertedResidualÚargsÚkwargsÚreturnNc                 ó€   •—  t          ¦   «         j        |i |¤Ž t          j                             ¦   «         | _        d S ©N)ÚsuperÚ__init__r   Ú	quantizedÚFloatFunctionalÚskip_add©Úselfr!   r"   Ú	__class__s      €ú\C:\Projects\Historical\venv\Lib\site-packages\torchvision/models/quantization/mobilenetv2.pyr'   z$QuantizableInvertedResidual.__init__   s8   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ýœ×4Ò4Ñ6Ô6ˆŒˆˆó    Úxc                 ó–   — | j         r.| j                             ||                      |¦  «        ¦  «        S |                      |¦  «        S r%   )Úuse_res_connectr*   ÚaddÚconv©r,   r0   s     r.   Úforwardz#QuantizableInvertedResidual.forward   s?   € ØÔð 	 Ø”=×$Ò$ Q¨¯	ª	°!©¬Ñ5Ô5Ð5à—9’9˜Q‘<”<Ðr/   Úis_qatc           	      ó  — t          t          | j        ¦  «        ¦  «        D ]_}t          | j        |         ¦  «        t          j        u r7t          | j        t          |¦  «        t          |dz   ¦  «        g|d¬¦  «         Œ`d S )Nr   T©Úinplace)ÚrangeÚlenr4   Útyper   ÚConv2dr   Ústr)r,   r7   Úidxs      r.   Ú
fuse_modelz&QuantizableInvertedResidual.fuse_model"   sz   € Ý�˜TœY™œÑ(Ô(ð 	Yð 	YˆCÝ�D”I˜c”NÑ#Ô#¥r¤yÐ0Ð0Ý˜dœi­#¨c©(¬(µC¸¸a¹±L´LÐ)AÀ6ÐSWÐXÑXÔXÐXøð	Yð 	Yr/   r%   ©Ú__name__Ú
__module__Ú__qualname__r   r'   r   r6   r   ÚboolrA   Ú__classcell__©r-   s   @r.   r    r       sª   ø€ € € € € ð7˜cð 7¨Sð 7°Tð 7ð 7ð 7ð 7ð 7ð 7ð ˜ð   Fð  ð  ð  ð  ðYð Y ¨$¤ð Y¸4ð Yð Yð Yð Yð Yð Yð Yð Yr/   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        |i |¤Ž t          ¦   «         | _        t	          ¦   «         | _        dS )zq
        MobileNet V2 main class

        Args:
           Inherits args from floating point MobileNetV2
        N)r&   r'   r
   Úquantr	   Údequantr+   s      €r.   r'   zQuantizableMobileNetV2.__init__)   s;   ø€ ð 	�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ý‘[”[ˆŒ
Ý"‘}”}ˆŒˆˆr/   r0   c                 ó„   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|S r%   )rK   Ú_forward_implrL   r5   s     r.   r6   zQuantizableMobileNetV2.forward4   s8   € Ø�JŠJ�q‰MŒMˆØ×Ò˜qÑ!Ô!ˆØ�LŠL˜‰OŒOˆØˆr/   r7   c                 óà   — |                       ¦   «         D ]X}t          |¦  «        t          u rt          |g d¢|d¬¦  «         t          |¦  «        t          u r|                     |¦  «         ŒYd S )N)Ú0Ú1Ú2Tr9   )Úmodulesr=   r   r   r    rA   )r,   r7   Úms      r.   rA   z!QuantizableMobileNetV2.fuse_model:   su   € Ø—’‘”ð 	%ð 	%ˆAÝ�A‰wŒwÕ.Ð.Ð.Ý˜a   °&À$ÐGÑGÔGÐGÝ�A‰wŒwÕ5Ð5Ð5Ø—’˜VÑ$Ô$Ð$øð		%ð 	%r/   r%   rB   rH   s   @r.   r   r   (   sŸ   ø€ € € € € ð	%˜cð 	%¨Sð 	%°Tð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð˜ð  Fð ð ð ð ð%ð % ¨$¤ð %¸4ð %ð %ð %ð %ð %ð %ð %ð %r/   r   c                   ón   — 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   zOhttps://download.pytorch.org/models/quantized/mobilenet_v2_qnnpack_37f702c5.pthéà   )Ú	crop_sizeièz5 )r   r   ÚqnnpackzUhttps://github.com/pytorch/vision/tree/main/references/classification#qat-mobilenetv2zImageNet-1Kg'1¬êQ@gš™™™™‰V@)zacc@1zacc@5gÝ$�•CÓ?gü©ñÒMb@z«
                These weights were produced by doing Quantization Aware Training (eager mode) on top of the unquantized
                weights listed below.
            )
Ú
num_paramsÚmin_sizeÚ
categoriesÚbackendÚrecipeÚunquantizedÚ_metricsÚ_opsÚ
_file_sizeÚ_docs)ÚurlÚ
transformsÚmetaN)rC   rD   rE   r   r   r   r   r   ÚIMAGENET1K_V1ÚIMAGENET1K_QNNPACK_V1ÚDEFAULT© r/   r.   r   r   B   s†   € € € € € Ø#˜GØ]Ø�7Ð.¸#Ð>Ñ>Ô>à!ØØ.Ø ØmØ/Ô=àØ#Ø#ð ð  ðð Øðð
ð 
ðñ ô Ðð0 $€G€G€Gr/   r   Úquantized_mobilenet_v2)ÚnameÚ
pretrainedc                 ó^   — |                       dd¦  «        rt          j        nt          j        S )NÚquantizeF)Úgetr   rg   r   rf   )r"   s    r.   ú<lambda>rp   b   s,   € Ø�:Š:�j %Ñ(Ô(ð0Õ4ÔJÐJå!Ô/ð r/   )ÚweightsNTF)rq   Úprogressrn   rq   rr   rn   r"   r#   c                 óØ  — |rt           nt                               | ¦  «        } | �Nt          |dt	          | j        d         ¦  «        ¦  «         d| j        v rt          |d| j        d         ¦  «         |                     dd¦  «        }t          d	dt          i|¤Ž}t          |¦  «         |rt          ||¦  «         | �*|                     |                      |d¬¦  «        ¦  «         |S )
aÞ  
    Constructs a MobileNetV2 architecture from
    `MobileNetV2: Inverted Residuals and Linear Bottlenecks
    <https://arxiv.org/abs/1801.04381>`_.

    .. 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.MobileNet_V2_QuantizedWeights` or :class:`~torchvision.models.MobileNet_V2_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.MobileNet_V2_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, returns a quantized version of the model. Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.QuantizableMobileNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/mobilenetv2.py>`_
            for more details about this class.
    .. autoclass:: torchvision.models.quantization.MobileNet_V2_QuantizedWeights
        :members:
    .. autoclass:: torchvision.models.MobileNet_V2_Weights
        :members:
        :noindex:
    NÚnum_classesr[   r\   rX   ÚblockT)rr   Ú
check_hashri   )r   r   Úverifyr   r<   re   Úpopr   r    r   r   Úload_state_dictÚget_state_dict)rq   rr   rn   r"   r\   Úmodels         r.   r   r   ^   s÷   € ðX 19ÐRÕ,Ð,Õ>R×ZÒZÐ[bÑcÔc€GàÐÝ˜f mµS¸¼ÀlÔ9SÑ5TÔ5TÑUÔUÐUØ˜œÐ$Ð$Ý! &¨)°W´\À)Ô5LÑMÔMÐMØ�jŠj˜ IÑ.Ô.€Gå"ÐOÐOÕ)DÐOÈÐOÐO€EÝ�%ÑÔÐØð 'Ý�u˜gÑ&Ô&Ð&àÐØ×Ò˜g×4Ò4¸hÐSWÐ4ÑXÔXÑYÔYÐYà€Lr/   )'Ú	functoolsr   Útypingr   r   r   Útorchr   r   Útorch.ao.quantizationr	   r
   Útorchvision.models.mobilenetv2r   r   r   Úops.miscr   Útransforms._presetsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   Úutilsr   r   r   Ú__all__r    r   r   rF   r   ri   r/   r.   ú<module>rˆ      sg  ðØ Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à Ð Ð Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø (Ð (Ð (Ð (Ð (Ð (Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð €ðYð Yð Yð Yð YÐ"2ñ Yô Yð Yð"%ð %ð %ð %ð %˜[ñ %ô %ð %ð4$ð $ð $ð $ð $ Kñ $ô $ð $ð8 €Ð-Ð.Ñ.Ô.ØÐàð	0ð 	0ððñ ô ð UYØØð	3ð 3ð 3à�eÐ9Ð;OÐOÔPÔQð3ð ð3ð ð	3ð
 ð3ð ð3ð 3ð 3ñô ñ /Ô.ð3ð 3ð 3r/   