U
    hF                  	   @   s  d dl mZ d dlmZmZmZmZmZ d dlZd dl	m
Z
 d dlmZ d dlmZmZmZmZmZ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ddd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%f  ee' ee e(e(ee&dddZ)ded d!d"d#Z*G d$d deZ+G d%d deZ,G d&d deZ-G d'd deZ.ed(d)ed*d+d, fd-dd.d/d0eee+ef  e(e(ee&d1d2dZ/ed3d)ed*d4d, fd-dd.d/d0eee,ef  e(e(ee&d1d5dZ0ed6d)ed*d7d, fd-dd.d/d0eee-ef  e(e(ee&d1d8dZ1ed9d)ed*d:d, fd-dd.d/d0eee.ef  e(e(ee&d1d;dZ2dS )<    )partial)AnyListOptionalTypeUnionN)Tensor)
BasicBlock
BottleneckResNetResNet18_WeightsResNet50_WeightsResNeXt101_32X8D_WeightsResNeXt101_64X4D_Weights   )ImageClassification   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface   )_fuse_modules_replace_reluquantize_modelQuantizableResNetResNet18_QuantizedWeightsResNet50_QuantizedWeights!ResNeXt101_32X8D_QuantizedWeights!ResNeXt101_64X4D_QuantizedWeightsresnet18resnet50resnext101_32x8dresnext101_64x4dc                       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 )QuantizableBasicBlockNargskwargsreturnc                    s    t  j|| tjj | _d S N)super__init__torchnn	quantizedFloatFunctionaladd_reluselfr(   r)   	__class__ X/var/www/html/venv/lib/python3.8/site-packages/torchvision/models/quantization/resnet.pyr-   &   s    zQuantizableBasicBlock.__init__xr*   c                 C   s\   |}|  |}| |}| |}| |}| |}| jd k	rJ| |}| j||}|S r+   )conv1bn1reluconv2bn2
downsampler2   r4   r:   identityoutr7   r7   r8   forward*   s    






zQuantizableBasicBlock.forwardis_qatr*   c                 C   s>   t | dddgddgg|dd | jr:t | jdd	g|dd d S )
Nr;   r<   r=   r>   r?   TZinplace01r   r@   r4   rF   r7   r7   r8   
fuse_model;   s    z QuantizableBasicBlock.fuse_model)N__name__
__module____qualname__r   r-   r   rD   r   boolrL   __classcell__r7   r7   r5   r8   r&   %   s   r&   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 )QuantizableBottleneckNr'   c                    s:   t  j|| tj | _tjdd| _tjdd| _d S )NFrG   )	r,   r-   r/   r0   r1   skip_add_reluZReLUrelu1relu2r3   r5   r7   r8   r-   B   s    zQuantizableBottleneck.__init__r9   c                 C   sz   |}|  |}| |}| |}| |}| |}| |}| |}| |}| jd k	rh| |}| j	
||}|S r+   )r;   r<   rU   r>   r?   rV   conv3bn3r@   rT   r2   rA   r7   r7   r8   rD   H   s    









zQuantizableBottleneck.forwardrE   c                 C   sF   t | dddgdddgddgg|d	d
 | jrBt | jddg|d	d
 d S )Nr;   r<   rU   r>   r?   rV   rW   rX   TrG   rH   rI   rJ   rK   r7   r7   r8   rL   Z   s       z QuantizableBottleneck.fuse_model)NrM   r7   r7   r5   r8   rS   A   s   rS   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jj | _tjj | _d S r+   )	r,   r-   r.   ZaoZquantizationZ	QuantStubquantZDeQuantStubdequantr3   r5   r7   r8   r-   c   s    zQuantizableResNet.__init__r9   c                 C   s"   |  |}| |}| |}|S r+   )rY   Z_forward_implrZ   )r4   r:   r7   r7   r8   rD   i   s    


zQuantizableResNet.forwardrE   c                 C   sJ   t | dddg|dd |  D ]&}t|tks:t|tkr|| qdS )a  Fuse conv/bn/relu modules in resnet models

        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
        r;   r<   r=   TrG   N)r   modulestyperS   r&   rL   )r4   rF   mr7   r7   r8   rL   r   s    zQuantizableResNet.fuse_model)NrM   r7   r7   r5   r8   r   b   s   	)blocklayers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|}t| |rjt|| |d k	r||j|dd |S )NZnum_classes
categoriesbackendfbgemmT)ra   Z
check_hash)	r   lenmetapopr   r   r   Zload_state_dictZget_state_dict)r^   r_   r`   ra   rb   r)   rd   modelr7   r7   r8   _resnet   s    

rj   )r   r   re   zdhttps://github.com/pytorch/vision/tree/main/references/classification#post-training-quantized-modelsz
        These weights were produced by doing Post Training Quantization (eager mode) on top of the unquantized
        weights listed below.
    )Zmin_sizerc   rd   recipeZ_docsc                
   @   sB   e Zd Zedeeddedejddddid	d
ddZ	e	Z
dS )r   zJhttps://download.pytorch.org/models/quantized/resnet18_fbgemm_16fa66dd.pth   	crop_sizei(^ ImageNet-1KgV-_Q@g r8V@zacc@1zacc@5g/$?g`"y&@
num_paramsunquantized_metrics_ops
_file_sizeurlZ
transformsrg   N)rN   rO   rP   r   r   r   _COMMON_METAr   IMAGENET1K_V1IMAGENET1K_FBGEMM_V1DEFAULTr7   r7   r7   r8   r      s    
c                
   @   sv   e Zd Zedeeddedejddddid	d
ddZ	edeedddedej
ddddid	dddZeZdS )r   zJhttps://download.pytorch.org/models/quantized/resnet50_fbgemm_bf931d71.pthrl   rm   i(ro   g{GR@gjt4W@rp   gB`"[@gM8@rq   rw   zJhttps://download.pytorch.org/models/quantized/resnet50_fbgemm-23753f79.pth   rn   Zresize_sizeg5^IT@gX9vW@g8@N)rN   rO   rP   r   r   r   ry   r   rz   r{   IMAGENET1K_V2IMAGENET1K_FBGEMM_V2r|   r7   r7   r7   r8   r      s>   
c                
   @   sv   e Zd Zedeeddedejddddid	d
ddZ	edeedddedej
ddddid	dddZeZdS )r    zQhttps://download.pytorch.org/models/quantized/resnext101_32x8_fbgemm_09835ccf.pthrl   rm   i(Jro   gvS@gQW@rp   gDli0@gV-U@rq   rw   zQhttps://download.pytorch.org/models/quantized/resnext101_32x8_fbgemm-ee16d00c.pthr}   r~   g~jT@g rX@gzGU@N)rN   rO   rP   r   r   r   ry   r   rz   r{   r   r   r|   r7   r7   r7   r8   r       s>   
c                   @   sF   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!   zRhttps://download.pytorch.org/models/quantized/resnext101_64x4d_fbgemm-605a1cb3.pthrl   r}   r~   i(mz+https://github.com/pytorch/vision/pull/5935ro   gxT@g/X@rp   gQ.@g$cT@)rr   rk   rs   rt   ru   rv   rw   N)rN   rO   rP   r   r   r   ry   r   rz   r{   r|   r7   r7   r7   r8   r!     s"   Zquantized_resnet18)nameZ
pretrainedc                 C   s   |  ddrtjS tjS Nrb   F)getr   r{   r   rz   r)   r7   r7   r8   <lambda>  s    
r   )r`   TF)r`   ra   rb   )r`   ra   rb   r)   r*   c                 K   s.   |rt nt| } ttddddg| ||f|S )a  ResNet-18 model from
    `Deep Residual Learning for Image Recognition <https://arxiv.org/abs/1512.03385>`_

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

    .. autoclass:: torchvision.models.quantization.ResNet18_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNet18_Weights
        :members:
        :noindex:
    r   )r   r   verifyrj   r&   r`   ra   rb   r)   r7   r7   r8   r"     s    -Zquantized_resnet50c                 C   s   |  ddrtjS tjS r   )r   r   r{   r   rz   r   r7   r7   r8   r   Q  s    
c                 K   s.   |rt nt| } ttddddg| ||f|S )a  ResNet-50 model from
    `Deep Residual Learning for Image Recognition <https://arxiv.org/abs/1512.03385>`_

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

    .. autoclass:: torchvision.models.quantization.ResNet50_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNet50_Weights
        :members:
        :noindex:
    r         )r   r   r   rj   rS   r   r7   r7   r8   r#   M  s    -Zquantized_resnext101_32x8dc                 C   s   |  ddrtjS tjS r   )r   r    r{   r   rz   r   r7   r7   r8   r     s    
c                 K   sF   |rt nt| } t|dd t|dd ttddddg| ||f|S )a  ResNeXt-101 32x8d model from
    `Aggregated Residual Transformation for Deep Neural Networks <https://arxiv.org/abs/1611.05431>`_

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

    .. autoclass:: torchvision.models.quantization.ResNeXt101_32X8D_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNeXt101_32X8D_Weights
        :members:
        :noindex:
    groups    width_per_group   r   r      )r    r   r   r   rj   rS   r   r7   r7   r8   r$     s    -Zquantized_resnext101_64x4dc                 C   s   |  ddrtjS tjS r   )r   r!   r{   r   rz   r   r7   r7   r8   r     s    
c                 K   sF   |rt nt| } t|dd t|dd ttddddg| ||f|S )a  ResNeXt-101 64x4d model from
    `Aggregated Residual Transformation for Deep Neural Networks <https://arxiv.org/abs/1611.05431>`_

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

    .. autoclass:: torchvision.models.quantization.ResNeXt101_64X4D_QuantizedWeights
        :members:

    .. autoclass:: torchvision.models.ResNeXt101_64X4D_Weights
        :members:
        :noindex:
    r   @   r   r   r   r   )r!   r   r   r   rj   rS   r   r7   r7   r8   r%     s    -)3	functoolsr   typingr   r   r   r   r   r.   Ztorch.nnr/   r   Ztorchvision.models.resnetr	   r
   r   r   r   r   r   Ztransforms._presetsr   Z_apir   r   r   _metar   Z_utilsr   r   utilsr   r   r   __all__r&   rS   r   intrQ   rj   ry   r   r   r    r!   r"   r#   r$   r%   r7   r7   r7   r8   <module>   s   $
!&&
)
)
+
