
    kh?*                        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
c 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# g dZ$ G d dejJ                        Z& G d dejN                        Z( G d dejR                        Z* G d dejV                        Z, G d dejZ                        Z. G d dej^                        Z0 G d dejb                        Z2 G d dejf                        Z4 G d  d!e      Z5 ed"#       ed$d% f&      dd'd(d)d*eee5ef      d+e6d,e6d-ed.e4f
d/              Z7y)0    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                   T     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 )QuantizableBasicConv2dargskwargsreturnNc                 V    t        |   |i | t        j                         | _        y N)super__init__nnReLUreluselfr   r   	__class__s      e/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/models/quantization/inception.pyr$   zQuantizableBasicConv2d.__init__   s"    $)&)GGI	    xc                 l    | j                  |      }| j                  |      }| j                  |      }|S r"   convbnr'   )r)   r-   s     r+   forwardzQuantizableBasicConv2d.forward   s.    IIaLGGAJIIaLr,   is_qatc                 &    t        | g d|d       y )Nr/   T)inplace)r   )r)   r3   s     r+   
fuse_modelz!QuantizableBasicConv2d.fuse_model%   s    d2FDIr,   r"   )__name__
__module____qualname__r   r$   r   r2   r   boolr6   __classcell__r*   s   @r+   r   r      sJ    c S T  F J$ J4 Jr,   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 )QuantizableInceptionAr   r   r    Nc                 v    t        |   |dt        i| t        j                  j                         | _        y N
conv_blockr#   r$   r   r%   	quantizedFloatFunctionalmyopr(   s      r+   r$   zQuantizableInceptionA.__init__+   /    $L+ALVLLL002	r,   r-   c                 \    | j                  |      }| j                  j                  |d      S Nr   _forwardrE   catr)   r-   outputss      r+   r2   zQuantizableInceptionA.forward/   %    --"yy}}Wa((r,   r7   r8   r9   r   r$   r   r2   r;   r<   s   @r+   r>   r>   )   0    3c 3S 3T 3) )F )r,   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 )QuantizableInceptionBr   r   r    Nc                 v    t        |   |dt        i| t        j                  j                         | _        y r@   rB   r(   s      r+   r$   zQuantizableInceptionB.__init__6   rF   r,   r-   c                 \    | j                  |      }| j                  j                  |d      S rH   rI   rL   s      r+   r2   zQuantizableInceptionB.forward:   rN   r,   rO   r<   s   @r+   rR   rR   4   rP   r,   rR   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 )QuantizableInceptionCr   r   r    Nc                 v    t        |   |dt        i| t        j                  j                         | _        y r@   rB   r(   s      r+   r$   zQuantizableInceptionC.__init__A   rF   r,   r-   c                 \    | j                  |      }| j                  j                  |d      S rH   rI   rL   s      r+   r2   zQuantizableInceptionC.forwardE   rN   r,   rO   r<   s   @r+   rV   rV   ?   rP   r,   rV   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 )QuantizableInceptionDr   r   r    Nc                 v    t        |   |dt        i| t        j                  j                         | _        y r@   rB   r(   s      r+   r$   zQuantizableInceptionD.__init__L   rF   r,   r-   c                 \    | j                  |      }| j                  j                  |d      S rH   rI   rL   s      r+   r2   zQuantizableInceptionD.forwardP   rN   r,   rO   r<   s   @r+   rZ   rZ   J   rP   r,   rZ   c                   R     e Zd Zdededdf fdZdedee   fdZdedefdZ xZ	S )	QuantizableInceptionEr   r   r    Nc                    t        |   |dt        i| t        j                  j                         | _        t        j                  j                         | _        t        j                  j                         | _        y r@   )	r#   r$   r   r%   rC   rD   myop1myop2myop3r(   s      r+   r$   zQuantizableInceptionE.__init__W   sW    $L+ALVL\\113
\\113
\\113
r,   r-   c                    | j                  |      }| j                  |      }| j                  |      | j                  |      g}| j                  j                  |d      }| j                  |      }| j                  |      }| j                  |      | j                  |      g}| j                  j                  |d      }t        j                  |ddd      }| j                  |      }||||g}|S )Nr   r   )kernel_sizestridepadding)	branch1x1branch3x3_1branch3x3_2abranch3x3_2br`   rK   branch3x3dbl_1branch3x3dbl_2branch3x3dbl_3abranch3x3dbl_3bra   F
avg_pool2dbranch_pool)r)   r-   rg   	branch3x3branch3x3dblrq   rM   s          r+   rJ   zQuantizableInceptionE._forward]   s    NN1%	$$Q'	&&y143D3DY3OP	JJNN9a0	**1-**<8  .  .
 zz~~lA6ll1!AqI&&{3i{Cr,   c                 \    | j                  |      }| j                  j                  |d      S rH   )rJ   rb   rK   rL   s      r+   r2   zQuantizableInceptionE.forwardr   s%    --"zz~~gq))r,   )
r7   r8   r9   r   r$   r   r   rJ   r2   r;   r<   s   @r+   r^   r^   U   sG    4c 4S 4T 4& T&\ ** *F *r,   r^   c                   ,     e Zd Zdededdf fdZ xZS )QuantizableInceptionAuxr   r   r    Nc                 0    t        |   |dt        i| y r@   )r#   r$   r   r(   s      r+   r$   z QuantizableInceptionAux.__init__y   s    $L+ALVLr,   )r7   r8   r9   r   r$   r;   r<   s   @r+   rv   rv   w   s'    Mc MS MT M Mr,   rv   c                   T     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        |   |dt        t        t        t
        t        t        t        gi| t        j                  j                  j                         | _        t        j                  j                  j                         | _        y )Ninception_blocks)r#   r$   r   r>   rR   rV   rZ   r^   rv   torchaoquantization	QuantStubquantDeQuantStubdequantr(   s      r+   r$   zQuantizableInception3.__init__~   st    	
 '%%%%%'	
 	
 XX**446
xx,,88:r,   r-   c                 j   | j                  |      }| j                  |      }| j                  |      \  }}| j                  |      }| j                  xr | j
                  }t        j                  j                         r#|st        j                  d       t        ||      S | j                  ||      S )NzIScripted QuantizableInception3 always returns QuantizableInception3 Tuple)_transform_inputr   rJ   r   training
aux_logitsr{   jitis_scriptingwarningswarnr   eager_outputs)r)   r-   auxaux_defineds       r+   r2   zQuantizableInception3.forward   s    !!!$JJqMq!3LLOmm799!!#ij#As++%%a--r,   r3   c                 t    | j                         D ]%  }t        |      t        u s|j                  |       ' y)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   r6   )r)   r3   ms      r+   r6   z QuantizableInception3.fuse_model   s2      	%AAw00V$	%r,   r"   )r7   r8   r9   r   r$   r   r   r2   r   r:   r6   r;   r<   s   @r+   r   r   }   sH    ;c ;S ;T ;". .$4 .
%$ 
%4 
%r,   r   c                   l    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
      Z	e	Z
y)r   zUhttps://download.pytorch.org/models/quantized/inception_v3_google_fbgemm-a2837893.pthi+  iV  )	crop_sizeresize_sizeir)K   r   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.
            )

num_paramsmin_size
categoriesbackendrecipeunquantized_metrics_ops
_file_size_docs)url
transformsmetaN)r7   r8   r9   r   r   r   r   r
   IMAGENET1K_V1IMAGENET1K_FBGEMM_V1DEFAULT r,   r+   r   r      sa    "c.#3O" .|/==##   
0 #Gr,   r   quantized_inception_v3)name
pretrainedc                 f    | j                  dd      rt        j                  S t        j                  S )NquantizeF)getr   r   r
   r   )r   s    r+   <lambda>r      s+    ::j%( 5II !// r,   )weightsTF)r   progressr   r   r   r   r   r    c                 6   |rt         nt        j                  |       } |j                  dd      }| id|vrt	        |dd       t	        |dd       t	        |dt        | j                  d                d| j                  v rt	        |d| j                  d          |j                  dd	      }t        di |}t        |       |rt        ||       | F|r|sd|_        d|_        |j                  | j                  |d
             |s|sd|_        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:
    r   FNtransform_inputTnum_classesr   r   r   )r   
check_hashr   )r   r
   verifyr   r   lenr   popr   r   r   r   	AuxLogitsload_state_dictget_state_dict)r   r   r   r   original_aux_logitsr   models          r+   r   r      s   d 19,>RZZ[bcG **\59F*!&*;TBflD9fmSl9S5TU$!&)W\\)5LMjjH-G!+F+E%ug&/$E"EOg44hSW4XY 3$E"EOLr,   )8r   	functoolsr   typingr   r   r   r   r{   torch.nnr%   torch.nn.functional
functionalro   r   torchvision.modelsr	   inception_moduletorchvision.models.inceptionr
   r   transforms._presetsr   _apir   r   r   _metar   _utilsr   r   utilsr   r   r   __all__BasicConv2dr   
InceptionAr>   
InceptionBrR   
InceptionCrV   
InceptionDrZ   
InceptionEr^   InceptionAuxrv   
Inception3r   r   r:   r   r   r,   r+   <module>r      su     - -      < O 6 7 7 ( C ? ?J-99 J),77 )),77 )),77 )),77 )*,77 *DM.;; M)%,77 )%X#K #8 -.	0 UY	Ce9;OOPQC C 	C
 C C /Cr,   