a
    hF                  	   @   s  d dl mZ d dl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  g d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,d-eee+ef  e(e(ee$d.d/d0Z/ed1d&ed'd2d) fd*dd+d,d-eee,ef  e(e(ee$d.d3d4Z0ed5d&ed'd6d) fd*dd+d,d-eee-ef  e(e(ee$d.d7d8Z1ed9d&ed'd:d) fd*dd+d,d-eee.ef  e(e(ee$d.d;d<Z2dS )=    )partial)AnyOptional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|i | tjj | _d S N)super__init__torchnn	quantizedFloatFunctionaladd_reluselfr&   r'   	__class__ T/var/www/auris/lib/python3.9/site-packages/torchvision/models/quantization/resnet.pyr+   &   s    zQuantizableBasicBlock.__init__xr(   c                 C   s\   |}|  |}| |}| |}| |}| |}| jd urJ| |}| j||}|S r)   )conv1bn1reluconv2bn2
downsampler0   r2   r8   identityoutr5   r5   r6   forward*   s    






zQuantizableBasicBlock.forwardis_qatr(   c                 C   s<   t | g dddgg|dd | jr8t | jddg|dd d S )Nr9   r:   r;   r<   r=   TZinplace01r   r>   r2   rD   r5   r5   r6   
fuse_model;   s    z QuantizableBasicBlock.fuse_model)N__name__
__module____qualname__r   r+   r   rB   r   boolrK   __classcell__r5   r5   r3   r6   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|i | tj | _tjdd| _tjdd| _d S )NFrF   )	r*   r+   r-   r.   r/   skip_add_reluZReLUrelu1relu2r1   r3   r5   r6   r+   B   s    zQuantizableBottleneck.__init__r7   c                 C   sz   |}|  |}| |}| |}| |}| |}| |}| |}| |}| jd urh| |}| j	
||}|S r)   )r9   r:   rT   r<   r=   rU   conv3bn3r>   rS   r0   r?   r5   r5   r6   rB   H   s    









zQuantizableBottleneck.forwardrC   c                 C   sB   t | g dg dddgg|dd | jr>t | jddg|dd d S )	N)r9   r:   rT   )r<   r=   rU   rV   rW   TrF   rG   rH   rI   rJ   r5   r5   r6   rK   Z   s
    z QuantizableBottleneck.fuse_model)NrL   r5   r5   r3   r6   rR   A   s   rR   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                    s2   t  j|i | tjj | _tjj | _d S r)   )	r*   r+   r,   ZaoZquantizationZ	QuantStubquantZDeQuantStubdequantr1   r3   r5   r6   r+   c   s    zQuantizableResNet.__init__r7   c                 C   s"   |  |}| |}| |}|S r)   )rX   Z_forward_implrY   )r2   r8   r5   r5   r6   rB   i   s    


zQuantizableResNet.forwardrC   c                 C   sH   t | g d|dd |  D ]&}t|tu s8t|tu 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
        rE   TrF   N)r   modulestyperR   r$   rK   )r2   rD   mr5   r5   r6   rK   r   s    zQuantizableResNet.fuse_model)NrL   r5   r5   r3   r6   r   b   s   	r   )blocklayersweightsprogressquantizer'   r(   c                 K   s   |d ur:t |dt|jd  d|jv r:t |d|jd  |dd}t| |fi |}t| |rnt|| |d ur||j|dd |S )NZnum_classes
categoriesbackendfbgemmT)r`   Z
check_hash)	r   lenmetapopr   r   r   Zload_state_dictZget_state_dict)r]   r^   r_   r`   ra   r'   rc   modelr5   r5   r6   _resnet   s    

ri   )r   r   rd   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_sizerb   rc   recipeZ_docsc                
   @   sF   e Zd Zedeeddi 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
transformsrf   N)rM   rN   rO   r   r   r   _COMMON_METAr
   IMAGENET1K_V1IMAGENET1K_FBGEMM_V1DEFAULTr5   r5   r5   r6   r      s$   
r   c                
   @   s~   e Zd Zedeeddi edejddddid	d
ddZ	edeedddi 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.pthrk   rl   i(rn   g{GR@gjt4W@ro   gB`"[@gM8@rp   rv   zJhttps://download.pytorch.org/models/quantized/resnet50_fbgemm-23753f79.pth   rm   Zresize_sizeg5^IT@gX9vW@g8@N)rM   rN   rO   r   r   r   rx   r   ry   rz   IMAGENET1K_V2IMAGENET1K_FBGEMM_V2r{   r5   r5   r5   r6   r      sF   
r   c                
   @   s~   e Zd Zedeeddi edejddddid	d
ddZ	edeedddi 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.pthrk   rl   i(Jrn   gvS@gQW@ro   gDli0@gV-U@rp   rv   zQhttps://download.pytorch.org/models/quantized/resnext101_32x8_fbgemm-ee16d00c.pthr|   r}   g~jT@g rX@gzGU@N)rM   rN   rO   r   r   r   rx   r   ry   rz   r~   r   r{   r5   r5   r5   r6   r      sF   
r   c                   @   sJ   e Zd Zedeedddi 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.pthrk   r|   r}   i(mz+https://github.com/pytorch/vision/pull/5935rn   gxT@g/X@ro   gQ.@g$cT@)rq   rj   rr   rs   rt   ru   rv   N)rM   rN   rO   r   r   r   rx   r   ry   rz   r{   r5   r5   r5   r6   r     s&   r   Zquantized_resnet18)nameZ
pretrainedc                 C   s   |  ddrtjS tjS Nra   F)getr   rz   r
   ry   r'   r5   r5   r6   <lambda>  s    
r   )r_   TF)r_   r`   ra   )r_   r`   ra   r'   r(   c                 K   s.   |rt nt| } ttg d| ||fi |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   r   )r   r
   verifyri   r$   r_   r`   ra   r'   r5   r5   r6   r      s    /r    Zquantized_resnet50c                 C   s   |  ddrtjS tjS r   )r   r   rz   r   ry   r   r5   r5   r6   r   S  s    
c                 K   s.   |rt nt| } ttg d| ||fi |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   r   ri   rR   r   r5   r5   r6   r!   O  s    /r!   Zquantized_resnext101_32x8dc                 C   s   |  ddrtjS tjS r   )r   r   rz   r   ry   r   r5   r5   r6   r     s    
c                 K   sF   |rt nt| } t|dd t|dd ttg d| ||fi |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   r   ri   rR   r   r5   r5   r6   r"     s    /r"   Zquantized_resnext101_64x4dc                 C   s   |  ddrtjS tjS r   )r   r   rz   r   ry   r   r5   r5   r6   r     s    
c                 K   sF   |rt nt| } t|dd t|dd ttg d| ||fi |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   ri   rR   r   r5   r5   r6   r#     s    /r#   )3	functoolsr   typingr   r   r   r,   Ztorch.nnr-   r   Ztorchvision.models.resnetr   r   r	   r
   r   r   r   Ztransforms._presetsr   Z_apir   r   r   Z_metar   _utilsr   r   utilsr   r   r   __all__r$   rR   r   r[   listintrP   ri   rx   r   r   r   r   r    r!   r"   r#   r5   r5   r5   r6   <module>   s   $
!&&))+