§
    ù²Åjû$  ã                   ó  — 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m	Z	 d dl
mZmZ ddlmZ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m Z  ddl!m"Z"m#Z# g d¢Z$ G d„ de¦  «        Z% G d„ de¦  «        Z& G d„ de ¦  «        Z'dee         de(dee         de)de)dede'fd„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ÚListÚOptionalÚUnionN)ÚnnÚTensor)ÚDeQuantStubÚ	QuantStubé   )ÚConv2dNormActivationÚSqueezeExcitation)ÚImageClassificationé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interface)Ú_mobilenet_v3_confÚInvertedResidualÚInvertedResidualConfigÚMobileNet_V3_Large_WeightsÚMobileNetV3é   )Ú_fuse_modulesÚ_replace_relu)ÚQuantizableMobileNetV3Ú#MobileNet_V3_Large_QuantizedWeightsÚmobilenet_v3_largec                   óh   ‡ — e Zd 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
ˆ fd„Zˆ xZS )ÚQuantizableSqueezeExcitationr   ÚargsÚkwargsÚreturnNc                 óž   •— t           j        |d<    t          ¦   «         j        |i |¤Ž t           j                             ¦   «         | _        d S )NÚscale_activation)r   ÚHardsigmoidÚsuperÚ__init__Ú	quantizedÚFloatFunctionalÚskip_mul©Úselfr$   r%   Ú	__class__s      €ú\C:\Projects\Historical\venv\Lib\site-packages\torchvision/models/quantization/mobilenetv3.pyr+   z%QuantizableSqueezeExcitation.__init__!   sE   ø€ Ý%'¤^ˆÐ!Ñ"Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ýœ×4Ò4Ñ6Ô6ˆŒˆˆó    Úinputc                 ó^   — | j                              |                      |¦  «        |¦  «        S ©N)r.   ÚmulÚ_scale)r0   r4   s     r2   Úforwardz$QuantizableSqueezeExcitation.forward&   s&   € ØŒ}× Ò  §¢¨UÑ!3Ô!3°UÑ;Ô;Ð;r3   Úis_qatc                 ó0   — t          | ddg|d¬¦  «         d S )NÚfc1Ú
activationT©Úinplace)r   )r0   r:   s     r2   Ú
fuse_modelz'QuantizableSqueezeExcitation.fuse_model)   s$   € Ý�d˜U LÐ1°6À4ÐHÑHÔHÐHÐHÐHr3   c           	      ó(  •— |                      dd ¦  «        }t          | d¦  «        rÃ|�|dk     r»t          j        dg¦  «        t          j        dg¦  «        t          j        dgt          j        ¬¦  «        t          j        dgt          j        ¬¦  «        t          j        dg¦  «        t          j        dg¦  «        dœ}	|	                     ¦   «         D ]\  }
}||
z   }||vr|||<   Œt          ¦   «                              |||||||¦  «         d S )	NÚversionÚqconfigr   g      ð?r   )Údtyper   )z.scale_activation.activation_post_process.scalezFscale_activation.activation_post_process.activation_post_process.scalez3scale_activation.activation_post_process.zero_pointzKscale_activation.activation_post_process.activation_post_process.zero_pointz;scale_activation.activation_post_process.fake_quant_enabledz9scale_activation.activation_post_process.observer_enabled)ÚgetÚhasattrÚtorchÚtensorÚint32Úitemsr*   Ú_load_from_state_dict)r0   Ú
state_dictÚprefixÚlocal_metadataÚstrictÚmissing_keysÚunexpected_keysÚ
error_msgsrB   Údefault_state_dictÚkÚvÚfull_keyr1   s                €r2   rK   z2QuantizableSqueezeExcitation._load_from_state_dict,   sC  ø€ ð !×$Ò$ Y°Ñ5Ô5ˆå�4˜Ñ#Ô#ð 	-¨¨¸GÀaºK¸KåBGÄ,ÐPSÈuÑBUÔBUÝZ_ÔZfÐhkÐglÑZmÔZmÝGLÄ|ÐUVÐTWÕ_dÔ_jÐGkÑGkÔGkÝ_dÔ_kØ�C�uœ{ð`ñ `ô `õ PUÌ|Ð]^Ð\_ÑO`ÔO`ÝMRÌ\Ð[\ÐZ]ÑM^ÔM^ð	"ð 	"Ðð +×0Ò0Ñ2Ô2ð -ð -‘��1Ø! A™:�Ø :Ð-Ð-Ø+,�J˜xÑ(øå‰Œ×%Ò%ØØØØØØØñ	
ô 	
ð 	
ð 	
ð 	
r3   r6   )Ú__name__Ú
__module__Ú__qualname__Ú_versionr   r+   r	   r9   r   Úboolr@   rK   Ú__classcell__©r1   s   @r2   r#   r#      sÄ   ø€ € € € € Ø€Hð7˜cð 7¨Sð 7°Tð 7ð 7ð 7ð 7ð 7ð 7ð
<˜Vð <¨ð <ð <ð <ð <ðIð I ¨$¤ð I¸4ð Ið Ið Ið Ið$
ð $
ð $
ð $
ð $
ð $
ð $
ð $
ð $
r3   r#   c                   ó<   ‡ — e Zd Zdededdfˆ fd„Zdedefd„Zˆ xZS )ÚQuantizableInvertedResidualr$   r%   r&   Nc                 óŽ   •—  t          ¦   «         j        |dt          i|¤Ž t          j                             ¦   «         | _        d S )NÚse_layer)r*   r+   r#   r   r,   r-   Úskip_addr/   s      €r2   r+   z$QuantizableInvertedResidual.__init__U   s>   ø€ Ø�‰ŒÔ˜$ÐPÕ)EÐPÈÐPÐPÐPÝœ×4Ò4Ñ6Ô6ˆŒˆˆr3   Úxc                 ó–   — | j         r.| j                             ||                      |¦  «        ¦  «        S |                      |¦  «        S r6   )Úuse_res_connectrb   ÚaddÚblock©r0   rc   s     r2   r9   z#QuantizableInvertedResidual.forwardY   s?   € ØÔð 	!Ø”=×$Ò$ Q¨¯
ª
°1©¬Ñ6Ô6Ð6à—:’:˜a‘=”=Ð r3   )rW   rX   rY   r   r+   r	   r9   r\   r]   s   @r2   r_   r_   S   st   ø€ € € € € ð7˜cð 7¨Sð 7°Tð 7ð 7ð 7ð 7ð 7ð 7ð!˜ð ! Fð !ð !ð !ð !ð !ð !ð !ð !r3   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 V3 main class

        Args:
           Inherits args from floating point MobileNetV3
        N)r*   r+   r   Úquantr
   Údequantr/   s      €r2   r+   zQuantizableMobileNetV3.__init__a   s;   ø€ ð 	�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ý‘[”[ˆŒ
Ý"‘}”}ˆŒˆˆr3   rc   c                 ó„   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|S r6   )rk   Ú_forward_implrl   rh   s     r2   r9   zQuantizableMobileNetV3.forwardl   s8   € Ø�JŠJ�q‰MŒMˆØ×Ò˜qÑ!Ô!ˆØ�LŠL˜‰OŒOˆØˆr3   r:   c                 óx  — |                       ¦   «         D ]¤}t          |¦  «        t          u raddg}t          |¦  «        dk    r6t          |d         ¦  «        t          j        u r|                     d¦  «         t          |||d¬¦  «         Œyt          |¦  «        t          u r| 	                    |¦  «         Œ¥d S )NÚ0Ú1r   r   Ú2Tr>   )
ÚmodulesÚtyper   Úlenr   ÚReLUÚappendr   r#   r@   )r0   r:   ÚmÚmodules_to_fuses       r2   r@   z!QuantizableMobileNetV3.fuse_modelr   s¶   € Ø—’‘”ð 	%ð 	%ˆAÝ�A‰wŒwÕ.Ð.Ð.Ø#&¨ *�Ý�q‘6”6˜Q’;�;¥4¨¨!¬¡:¤:µ´Ð#8Ð#8Ø#×*Ò*¨3Ñ/Ô/Ð/Ý˜a °&À$ÐGÑGÔGÐGÐGÝ�a‘”Õ8Ð8Ð8Ø—’˜VÑ$Ô$Ð$øð	%ð 	%r3   r6   )rW   rX   rY   r   r+   r	   r9   r   r[   r@   r\   r]   s   @r2   r   r   `   sŸ   ø€ € € € € ð	%˜cð 	%¨Sð 	%°Tð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð˜ð  Fð ð ð ð ð%ð % ¨$¤ð %¸4ð %ð %ð %ð %ð %ð %ð %ð %r3   r   Úinverted_residual_settingÚlast_channelÚweightsÚprogressÚquantizer%   r&   c                 ó¸  — |�Nt          |dt          |j        d         ¦  «        ¦  «         d|j        v rt          |d|j        d         ¦  «         |                     dd¦  «        }t	          | |fdt
          i|¤Ž}t          |¦  «         |re|                     d¬¦  «         t          j	        j
                             |¦  «        |_        t          j	        j
                             |d¬¦  «         |�*|                     |                     |d¬	¦  «        ¦  «         |r:t          j	        j
                             |d¬¦  «         |                     ¦   «          |S )
NÚnum_classesÚ
categoriesÚbackendÚqnnpackrg   T)r:   r>   )r}   Ú
check_hash)r   ru   ÚmetaÚpopr   r_   r   r@   rG   ÚaoÚquantizationÚget_default_qat_qconfigrC   Úprepare_qatÚload_state_dictÚget_state_dictÚconvertÚeval)rz   r{   r|   r}   r~   r%   r‚   Úmodels           r2   Ú_mobilenet_v3_modelr�   }   sP  € ð ÐÝ˜f mµS¸¼ÀlÔ9SÑ5TÔ5TÑUÔUÐUØ˜œÐ$Ð$Ý! &¨)°W´\À)Ô5LÑMÔMÐMØ�jŠj˜ IÑ.Ô.€Gå"Ð#<¸lÐxÐxÕRmÐxÐqwÐxÐx€EÝ�%ÑÔÐàð ?ð
 	×Ò ÐÑ%Ô%Ð%ÝœÔ-×EÒEÀgÑNÔNˆŒÝŒÔ×)Ò)¨%¸Ð)Ñ>Ô>Ð>àÐØ×Ò˜g×4Ò4¸hÐSWÐ4ÑXÔXÑYÔYÐYàð ÝŒÔ×%Ò% e°TÐ%Ñ:Ô:Ð:Ø�
Š
‰Œˆà€Lr3   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    zUhttps://download.pytorch.org/models/quantized/mobilenet_v3_large_qnnpack-5bcacf28.pthéà   )Ú	crop_sizeiªS )r   r   rƒ   zUhttps://github.com/pytorch/vision/tree/main/references/classification#qat-mobilenetv3zImageNet-1KgÇK7‰A@R@gôýÔxé¶V@)zacc@1zacc@5g-²�ï§ÆË?gçû©ñÒ�5@z«
                These weights were produced by doing Quantization Aware Training (eager mode) on top of the unquantized
                weights listed below.
            )
Ú
num_paramsÚmin_sizer�   r‚   ÚrecipeÚunquantizedÚ_metricsÚ_opsÚ
_file_sizeÚ_docs)ÚurlÚ
transformsr…   N)rW   rX   rY   r   r   r   r   r   ÚIMAGENET1K_V1ÚIMAGENET1K_QNNPACK_V1ÚDEFAULT© r3   r2   r    r    ¡   s†   € € € € € Ø#˜GØcØ�7Ð.¸#Ð>Ñ>Ô>à!ØØ.Ø ØmØ5ÔCàØ#Ø#ð ð  ðð Ø ðð
ð 
ðñ ô Ðð0 $€G€G€Gr3   r    Úquantized_mobilenet_v3_large)ÚnameÚ
pretrainedc                 ó^   — |                       dd¦  «        rt          j        nt          j        S )Nr~   F)rE   r    rŸ   r   rž   )r%   s    r2   ú<lambda>r¦   Á   s,   € Ø�:Š:�j %Ñ(Ô(ð6Õ:ÔPÐPå'Ô5ð r3   )r|   TF)r|   r}   r~   c                 óˆ   — |rt           nt                               | ¦  «        } t          di |¤Ž\  }}t	          ||| ||fi |¤ŽS )aÔ  
    MobileNetV3 (Large) model from
    `Searching for MobileNetV3 <https://arxiv.org/abs/1905.02244>`_.

    .. 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_V3_Large_QuantizedWeights` or :class:`~torchvision.models.MobileNet_V3_Large_Weights`, optional): The
            pretrained weights for the model. See
            :class:`~torchvision.models.quantization.MobileNet_V3_Large_QuantizedWeights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool): If True, displays a progress bar of the
            download to stderr. Default is True.
        quantize (bool): If True, return a quantized version of the model. Default is False.
        **kwargs: parameters passed to the ``torchvision.models.quantization.MobileNet_V3_Large_QuantizedWeights``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/mobilenetv3.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.MobileNet_V3_Large_QuantizedWeights
        :members:
    .. autoclass:: torchvision.models.MobileNet_V3_Large_Weights
        :members:
        :noindex:
    r!   )r!   )r    r   Úverifyr   r�   )r|   r}   r~   r%   rz   r{   s         r2   r!   r!   ½   sa   € ðZ 7?Ð^Õ2Ð2ÕD^×fÒfÐgnÑoÔo€Gå.@Ð.`Ð.`ÐY_Ð.`Ð.`Ñ+Ð˜|ÝÐ8¸,ÈÐQYÐ[cÐnÐnÐgmÐnÐnÐnr3   )-Ú	functoolsr   Útypingr   r   r   r   rG   r   r	   Útorch.ao.quantizationr
   r   Úops.miscr   r   Útransforms._presetsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   Úmobilenetv3r   r   r   r   r   Úutilsr   r   Ú__all__r#   r_   r   Úintr[   r�   r    r!   r¡   r3   r2   ú<module>rµ      s3  ðØ Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø 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ðð ð ð ð ð ð ð ð ð ð ð ð ð ð 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /ðð ð €ð2
ð 2
ð 2
ð 2
ð 2
Ð#4ñ 2
ô 2
ð 2
ðj
!ð 
!ð 
!ð 
!ð 
!Ð"2ñ 
!ô 
!ð 
!ð%ð %ð %ð %ð %˜[ñ %ô %ð %ð:!Ø#Ð$:Ô;ð!àð!ð �kÔ"ð!ð ð	!ð
 ð!ð ð!ð ð!ð !ð !ð !ðH$ð $ð $ð $ð $¨+ñ $ô $ð $ð8 €Ð3Ð4Ñ4Ô4ØÐàð	6ð 	6ððñ ô ð aeØØð	'oð 'oð 'oà�eÐ?ÐA[Ð[Ô\Ô]ð'oð ð'oð ð	'oð
 ð'oð ð'oð 'oð 'oñô ñ 5Ô4ð'oð 'oð 'or3   