U
    ­Ê¹j$  ã                	   @   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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# dddgZ$G dd„ deƒZ%G dd„ deƒZ&G dd„ de ƒZ'ee e(ee e)e)ee'dœdd„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'd%œd&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                       s\   e Zd 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
‡ fdd„Z‡  ZS )ÚQuantizableSqueezeExcitationr   N©ÚargsÚkwargsÚreturnc                    s(   t j|d< tƒ j||Ž t j ¡ | _d S )NZscale_activation)r   ZHardsigmoidÚsuperÚ__init__Ú	quantizedÚFloatFunctionalÚskip_mul©Úselfr#   r$   ©Ú	__class__© új/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/models/quantization/mobilenetv3.pyr'   !   s    
z%QuantizableSqueezeExcitation.__init__)Úinputr%   c                 C   s   | j  |  |¡|¡S ©N)r*   ÚmulZ_scale)r,   r1   r/   r/   r0   Úforward&   s    z$QuantizableSqueezeExcitation.forward©Úis_qatr%   c                 C   s   t | ddg|dd� d S )NZfc1Z
activationT©Zinplace)r   )r,   r6   r/   r/   r0   Ú
fuse_model)   s    z'QuantizableSqueezeExcitation.fuse_modelc              	      sº   |  dd ¡}t| dƒrž|d ks&|dk ržt dg¡t dg¡tjdgtjd�tjdgtjd�t dg¡t dg¡dœ}	|	 ¡ D ] \}
}||
 }||kr||||< q|tƒ  |||||||¡ d S )	NÚversionÚqconfigr   g      ð?r   )Z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ÚtorchZtensorZint32Úitemsr&   Ú_load_from_state_dict)r,   Z
state_dictÚprefixZlocal_metadataÚstrictZmissing_keysZunexpected_keysZ
error_msgsr9   Zdefault_state_dictÚkÚvZfull_keyr-   r/   r0   r?   ,   s2    


 ÿ

ø

ùz2QuantizableSqueezeExcitation._load_from_state_dict)N)Ú__name__Ú
__module__Ú__qualname__Ú_versionr   r'   r   r4   r   Úboolr8   r?   Ú__classcell__r/   r/   r-   r0   r!      s
   r!   c                       s6   e Zd Zeeddœ‡ fdd„Zeedœdd„Z‡  ZS )ÚQuantizableInvertedResidualNr"   c                    s&   t ƒ j|dti|—Ž tj ¡ | _d S )NZse_layer)r&   r'   r!   r   r(   r)   Úskip_addr+   r-   r/   r0   r'   U   s    z$QuantizableInvertedResidual.__init__©Úxr%   c                 C   s(   | j r| j ||  |¡¡S |  |¡S d S r2   )Zuse_res_connectrK   ÚaddÚblock©r,   rM   r/   r/   r0   r4   Y   s    z#QuantizableInvertedResidual.forward)rD   rE   rF   r   r'   r   r4   rI   r/   r/   r-   r0   rJ   S   s   rJ   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                    s"   t ƒ j||Ž tƒ | _tƒ | _dS )zq
        MobileNet V3 main class

        Args:
           Inherits args from floating point MobileNetV3
        N)r&   r'   r
   Úquantr	   Údequantr+   r-   r/   r0   r'   a   s    zQuantizableMobileNetV3.__init__rL   c                 C   s"   |   |¡}|  |¡}|  |¡}|S r2   )rQ   Z_forward_implrR   rP   r/   r/   r0   r4   l   s    


zQuantizableMobileNetV3.forwardr5   c                 C   sv   |   ¡ D ]h}t|ƒtkrZddg}t|ƒdkrHt|d ƒtjkrH| d¡ t|||dd� qt|ƒtkr| 	|¡ qd S )NÚ0Ú1r   r   Ú2Tr7   )
ÚmodulesÚtyper   Úlenr   ZReLUÚappendr   r!   r8   )r,   r6   ÚmZmodules_to_fuser/   r/   r0   r8   r   s    
z!QuantizableMobileNetV3.fuse_model)N)rD   rE   rF   r   r'   r   r4   r   rH   r8   rI   r/   r/   r-   r0   r   `   s   )Úinverted_residual_settingÚlast_channelÚ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dti|—Ž}t|ƒ |r–|jdd� tj	j
 |¡|_tj	j
j|dd� |d k	r²| |j|dd	�¡ |rÐtj	j
j|dd� | ¡  |S )
NZnum_classesÚ
categoriesÚbackendÚqnnpackrO   T)r6   r7   )r^   Z
check_hash)r   rX   ÚmetaÚpopr   rJ   r   r8   r=   ZaoZquantizationZget_default_qat_qconfigr:   Zprepare_qatZload_state_dictZget_state_dictÚconvertÚeval)r[   r\   r]   r^   r_   r$   ra   Úmodelr/   r/   r0   Ú_mobilenet_v3_model}   s"    
rh   c                   @   sH   e Zd Zedeedd�ddeddejdd	d
dœiddddœ
d�Z	e	Z
dS )r   zUhttps://download.pytorch.org/models/quantized/mobilenet_v3_large_qnnpack-5bcacf28.pthéà   )Z	crop_sizeiªS )r   r   rb   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.
            )
Z
num_paramsZmin_sizer`   ra   ZrecipeZunquantizedZ_metricsZ_opsÚ
_file_sizeZ_docs)ÚurlZ
transformsrc   N)rD   rE   rF   r   r   r   r   r   ÚIMAGENET1K_V1ÚIMAGENET1K_QNNPACK_V1ÚDEFAULTr/   r/   r/   r0   r   ¡   s(   
þÿñýZquantized_mobilenet_v3_large)ÚnameZ
pretrainedc                 C   s   |   dd¡rtjS tjS )Nr_   F)r;   r   rm   r   rl   )r$   r/   r/   r0   Ú<lambda>Á   s    
ÿrp   )r]   TF)r]   r^   r_   )r]   r^   r_   r$   r%   c                 K   s4   |rt nt | ¡} td|Ž\}}t||| ||f|Ž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   rh   )r]   r^   r_   r$   r[   r\   r/   r/   r0   r    ½   s    -)-Ú	functoolsr   Útypingr   r   r   r   r=   r   r   Ztorch.ao.quantizationr	   r
   Zops.miscr   r   Ztransforms._presetsr   Z_apir   r   r   Ú_metar   Z_utilsr   r   Zmobilenetv3r   r   r   r   r   Úutilsr   r   Ú__all__r!   rJ   r   ÚintrH   rh   r   r    r/   r/   r/   r0   Ú<module>   sV   ý5ù$þÿ
üú