U
    h?*                  	   @   s  d dl Z 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
  mZ d dlmZ d dl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# dddgZ$G dd dej%Z&G dd dej'Z(G dd dej)Z*G dd dej+Z,G dd dej-Z.G dd dej/Z0G dd dej1Z2G d d dej3Z4G d!d deZ5ed"d#ed$d%d& fd'dd(d)d*eee5ef  e6e6ee4d+d,dZ7dS )-    N)partial)AnyListOptionalUnion)Tensor)	inception)Inception_V3_WeightsInceptionOutputs   )ImageClassification   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface   )_fuse_modules_replace_reluquantize_modelQuantizableInception3Inception_V3_QuantizedWeightsinception_v3c                       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 )QuantizableBasicConv2dNargskwargsreturnc                    s   t  j|| t | _d S N)super__init__nnZReLUreluselfr   r   	__class__ [/var/www/html/venv/lib/python3.8/site-packages/torchvision/models/quantization/inception.pyr"      s    zQuantizableBasicConv2d.__init__xr   c                 C   s"   |  |}| |}| |}|S r    )convbnr$   )r&   r,   r)   r)   r*   forward   s    


zQuantizableBasicConv2d.forwardis_qatr   c                 C   s   t | dddg|dd d S )Nr-   r.   r$   T)Zinplace)r   )r&   r1   r)   r)   r*   
fuse_model%   s    z!QuantizableBasicConv2d.fuse_model)N)__name__
__module____qualname__r   r"   r   r/   r   boolr2   __classcell__r)   r)   r'   r*   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 )QuantizableInceptionANr   c                    s&   t  j|dti| tj | _d S NZ
conv_blockr!   r"   r   r#   	quantizedFloatFunctionalmyopr%   r'   r)   r*   r"   +   s    zQuantizableInceptionA.__init__r+   c                 C   s   |  |}| j|dS Nr   _forwardr=   catr&   r,   outputsr)   r)   r*   r/   /   s    
zQuantizableInceptionA.forwardr3   r4   r5   r   r"   r   r/   r7   r)   r)   r'   r*   r8   )   s   r8   c                       s6   e Zd Zeedd fddZeedddZ  ZS )QuantizableInceptionBNr   c                    s&   t  j|dti| tj | _d S r9   r:   r%   r'   r)   r*   r"   6   s    zQuantizableInceptionB.__init__r+   c                 C   s   |  |}| j|dS r>   r?   rB   r)   r)   r*   r/   :   s    
zQuantizableInceptionB.forwardrD   r)   r)   r'   r*   rE   4   s   rE   c                       s6   e Zd Zeedd fddZeedddZ  ZS )QuantizableInceptionCNr   c                    s&   t  j|dti| tj | _d S r9   r:   r%   r'   r)   r*   r"   A   s    zQuantizableInceptionC.__init__r+   c                 C   s   |  |}| j|dS r>   r?   rB   r)   r)   r*   r/   E   s    
zQuantizableInceptionC.forwardrD   r)   r)   r'   r*   rF   ?   s   rF   c                       s6   e Zd Zeedd fddZeedddZ  ZS )QuantizableInceptionDNr   c                    s&   t  j|dti| tj | _d S r9   r:   r%   r'   r)   r*   r"   L   s    zQuantizableInceptionD.__init__r+   c                 C   s   |  |}| j|dS r>   r?   rB   r)   r)   r*   r/   P   s    
zQuantizableInceptionD.forwardrD   r)   r)   r'   r*   rG   J   s   rG   c                       sJ   e Zd Zeedd fddZeee dddZeeddd	Z  Z	S )
QuantizableInceptionENr   c                    s>   t  j|dti| tj | _tj | _tj | _d S r9   )	r!   r"   r   r#   r;   r<   myop1myop2myop3r%   r'   r)   r*   r"   W   s    zQuantizableInceptionE.__init__r+   c                 C   s   |  |}| |}| || |g}| j|d}| |}| |}| || 	|g}| j
|d}tj|dddd}| |}||||g}|S )Nr   r   )Zkernel_sizeZstridepadding)	branch1x1Zbranch3x3_1Zbranch3x3_2aZbranch3x3_2brI   rA   Zbranch3x3dbl_1Zbranch3x3dbl_2Zbranch3x3dbl_3aZbranch3x3dbl_3brJ   FZ
avg_pool2dbranch_pool)r&   r,   rM   Z	branch3x3Zbranch3x3dblrO   rC   r)   r)   r*   r@   ]   s    




zQuantizableInceptionE._forwardc                 C   s   |  |}| j|dS r>   )r@   rK   rA   rB   r)   r)   r*   r/   r   s    
zQuantizableInceptionE.forward)
r3   r4   r5   r   r"   r   r   r@   r/   r7   r)   r)   r'   r*   rH   U   s   rH   c                       s&   e Zd Zeedd fddZ  ZS )QuantizableInceptionAuxNr   c                    s   t  j|dti| d S r9   )r!   r"   r   r%   r'   r)   r*   r"   y   s    z QuantizableInceptionAux.__init__)r3   r4   r5   r   r"   r7   r)   r)   r'   r*   rP   w   s   rP   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              
      sD   t  j|dtttttttgi| t	j
j | _t	j
j | _d S )NZinception_blocks)r!   r"   r   r8   rE   rF   rG   rH   rP   torchZaoZquantizationZ	QuantStubquantZDeQuantStubdequantr%   r'   r)   r*   r"   ~   s     zQuantizableInception3.__init__r+   c                 C   sj   |  |}| |}| |\}}| |}| jo6| j}tj rZ|sPt	
d t||S | ||S d S )NzIScripted QuantizableInception3 always returns QuantizableInception3 Tuple)Z_transform_inputrR   r@   rS   Ztraining
aux_logitsrQ   ZjitZis_scriptingwarningswarnr
   Zeager_outputs)r&   r,   ZauxZaux_definedr)   r)   r*   r/      s    





zQuantizableInception3.forwardr0   c                 C   s(   |   D ]}t|tkr|| qdS )a  Fuse conv/bn/relu modules in inception model

        Fuse conv+bn+relu/ conv+relu/conv+bn modules to prepare for quantization.
        Model is modified in place.  Note that this operation does not change numerics
        and the model after modification is in floating point
        N)modulestyper   r2   )r&   r1   mr)   r)   r*   r2      s    z QuantizableInception3.fuse_model)N)r3   r4   r5   r   r"   r   r
   r/   r   r6   r2   r7   r)   r)   r'   r*   r   }   s   c                   @   sJ   e Zd Zedeed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/inception_v3_google_fbgemm-a2837893.pthi+  iV  )Z	crop_sizeZresize_sizeir)K   rZ   fbgemmzdhttps://github.com/pytorch/vision/tree/main/references/classification#post-training-quantized-modelszImageNet-1Kg%CKS@g-VW@)zacc@1zacc@5g'1@gL7A`%7@z
                These weights were produced by doing Post Training Quantization (eager mode) on top of the unquantized
                weights listed below.
            )
Z
num_paramsZmin_size
categoriesbackendZrecipeZunquantizedZ_metricsZ_ops
_file_sizeZ_docs)urlZ
transformsmetaN)r3   r4   r5   r   r   r   r   r	   IMAGENET1K_V1IMAGENET1K_FBGEMM_V1DEFAULTr)   r)   r)   r*   r      s(   Zquantized_inception_v3)nameZ
pretrainedc                 C   s   |  ddrtjS tjS )NquantizeF)getr   rb   r	   ra   )r   r)   r)   r*   <lambda>   s    
rg   )weightsTF)rh   progressre   )rh   ri   re   r   r   c                 K   s   |rt nt| } |dd}| dk	rxd|kr:t|dd t|dd t|dt| jd  d| jkrxt|d| jd  |dd	}tf |}t	| |rt
|| | dk	r|r|sd|_d|_|| j|dd
 |s|sd|_d|_|S )a  Inception v3 model architecture from
    `Rethinking the Inception Architecture for Computer Vision <http://arxiv.org/abs/1512.00567>`__.

    .. note::
        **Important**: In contrast to the other models the inception_v3 expects tensors with a size of
        N x 3 x 299 x 299, so ensure your images are sized accordingly.

    .. 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.Inception_V3_QuantizedWeights` or :class:`~torchvision.models.Inception_V3_Weights`, optional): The pretrained
            weights for the model. See
            :class:`~torchvision.models.quantization.Inception_V3_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.QuantizableInception3``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/quantization/inception.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.quantization.Inception_V3_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.Inception_V3_Weights
        :members:
        :noindex:
    rT   FNZtransform_inputTZnum_classesr\   r]   r[   )ri   Z
check_hash)r   r	   verifyrf   r   lenr`   popr   r   r   rT   Z	AuxLogitsZload_state_dictZget_state_dict)rh   ri   re   r   Zoriginal_aux_logitsr]   modelr)   r)   r*   r      s.    2


)8rU   	functoolsr   typingr   r   r   r   rQ   Ztorch.nnr#   Ztorch.nn.functionalZ
functionalrN   r   Ztorchvision.modelsr   Zinception_moduleZtorchvision.models.inceptionr	   r
   Ztransforms._presetsr   Z_apir   r   r   _metar   Z_utilsr   r   utilsr   r   r   __all__ZBasicConv2dr   Z
InceptionAr8   Z
InceptionBrE   Z
InceptionCrF   Z
InceptionDrG   Z
InceptionErH   ZInceptionAuxrP   Z
Inception3r   r   r6   r   r)   r)   r)   r*   <module>   sT   ",
