o
    #je                     @   s  d dl Z d dl mZ d dlmZ g Zdddddd	d
dddddddZG dd dejZG dd dejZG dd dejZ	dd Z
d5ddZd5ddZd5dd Zd5d!d"Zd5d#d$Zd5d%d&Zd5d'd(Zd5d)d*Zd5d+d,Zd5d-d.Zd5d/d0Zd5d1d2Zd5d3d4ZdS )6    N)nn)get_weights_path_from_url)z:https://paddle-hapi.bj.bcebos.com/models/resnet18.pdparamsZ cf548f46534aa3560945be4b95cd11c4)z:https://paddle-hapi.bj.bcebos.com/models/resnet34.pdparamsZ 8d2275cf8706028345f78ac0e1d31969)z:https://paddle-hapi.bj.bcebos.com/models/resnet50.pdparamsZ ca6f485ee1ab0492d38f323885b0ad80)z;https://paddle-hapi.bj.bcebos.com/models/resnet101.pdparamsZ 02f35f034ca3858e1e54d4036443c92d)z;https://paddle-hapi.bj.bcebos.com/models/resnet152.pdparamsZ 7ad16a2f1e7333859ff986138630fd7a)zAhttps://paddle-hapi.bj.bcebos.com/models/resnext50_32x4d.pdparamsZ dc47483169be7d6f018fcbb7baf8775d)zAhttps://paddle-hapi.bj.bcebos.com/models/resnext50_64x4d.pdparamsZ 063d4b483e12b06388529450ad7576db)zBhttps://paddle-hapi.bj.bcebos.com/models/resnext101_32x4d.pdparamsZ 967b090039f9de2c8d06fe994fb9095f)zBhttps://paddle-hapi.bj.bcebos.com/models/resnext101_64x4d.pdparamsZ 98e04e7ca616a066699230d769d03008)zBhttps://paddle-hapi.bj.bcebos.com/models/resnext152_32x4d.pdparamsZ 18ff0beee21f2efc99c4b31786107121)zBhttps://paddle-hapi.bj.bcebos.com/models/resnext152_64x4d.pdparamsZ 77c4af00ca42c405fa7f841841959379)zAhttps://paddle-hapi.bj.bcebos.com/models/wide_resnet50_2.pdparamsZ 0282f804d73debdab289bd9fea3fa6dc)zBhttps://paddle-hapi.bj.bcebos.com/models/wide_resnet101_2.pdparamsZ d4360a2d23657f059216f5d5a1a9ac93)resnet18resnet34resnet50	resnet101	resnet152resnext50_32x4dresnext50_64x4dresnext101_32x4dresnext101_64x4dresnext152_32x4dresnext152_64x4dwide_resnet50_2wide_resnet101_2c                       s6   e Zd ZdZ						d fdd	Zdd Z  ZS )	
BasicBlock   N@   c	           	         s   t    |d u rtj}|dkrtdtj||dd|dd| _||| _t | _	tj||dddd| _
||| _|| _|| _d S )Nr   z(Dilation > 1 not supported in BasicBlock   F)paddingstride	bias_attr)r   r   )super__init__r   BatchNorm2DNotImplementedErrorConv2Dconv1bn1ReLUreluconv2bn2
downsampler   )	selfinplanesplanesr   r#   groups
base_widthdilation
norm_layer	__class__ \/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/vision/models/resnet.pyr   P   s    




zBasicBlock.__init__c                 C   s`   |}|  |}| |}| |}| |}| |}| jd ur%| |}||7 }| |}|S N)r   r   r    r!   r"   r#   r$   xidentityoutr-   r-   r.   forwardn   s   







zBasicBlock.forwardr   Nr   r   r   N__name__
__module____qualname__	expansionr   r4   __classcell__r-   r-   r+   r.   r   M   s    r   c                       s6   e Zd ZdZ						d	 fdd	Zdd Z  ZS )
BottleneckBlock   r   Nr   c	           
   
      s   t    |d u rtj}t||d  | }	tj||	ddd| _||	| _tj|	|	d||||dd| _||	| _	tj|	|| j
 ddd| _||| j
 | _t | _|| _|| _d S )Ng      P@r   F)r   r   )r   r   r'   r)   r   )r   r   r   r   intr   r   r   r!   r"   r:   conv3bn3r   r    r#   r   )
r$   r%   r&   r   r#   r'   r(   r)   r*   widthr+   r-   r.   r      s0   





zBottleneckBlock.__init__c                 C   s~   |}|  |}| |}| |}| |}| |}| |}| |}| |}| jd ur4| |}||7 }| |}|S r/   )r   r   r    r!   r"   r?   r@   r#   r0   r-   r-   r.   r4      s   










zBottleneckBlock.forwardr5   r6   r-   r-   r+   r.   r<      s    'r<   c                       s>   e Zd ZdZ					d fdd	Zdd
dZdd Z  ZS )ResNeta.  ResNet model from
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.

    Args:
        Block (BasicBlock|BottleneckBlock): Block module of model.
        depth (int, optional): Layers of ResNet, Default: 50.
        width (int, optional): Base width per convolution group for each convolution block, Default: 64.
        num_classes (int, optional): Output dim of last fc layer. If num_classes <= 0, last fc layer
                            will not be defined. Default: 1000.
        with_pool (bool, optional): Use pool before the last fc layer or not. Default: True.
        groups (int, optional): Number of groups for each convolution block, Default: 1.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNet model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import ResNet
            >>> from paddle.vision.models.resnet import BottleneckBlock, BasicBlock

            >>> # build ResNet with 18 layers
            >>> resnet18 = ResNet(BasicBlock, 18)

            >>> # build ResNet with 50 layers
            >>> resnet50 = ResNet(BottleneckBlock, 50)

            >>> # build Wide ResNet model
            >>> wide_resnet50_2 = ResNet(BottleneckBlock, 50, width=64*2)

            >>> # build ResNeXt model
            >>> resnext50_32x4d = ResNet(BottleneckBlock, 50, width=4, groups=32)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = resnet18(x)

            >>> print(out.shape)
            [1, 1000]
    2   r     Tr   c           	         s6  t    g dg dg dg dg dd}|| }|| _|| _|| _|| _tj| _d| _	d| _
tjd| j	d	d
ddd| _| | j	| _t | _tjdd
dd| _| |d|d | _| j|d|d d
d| _| j|d|d
 d
d| _| j|d|d d
d| _|rtd| _|dkrtd|j || _d S d S )N)   rE   rE   rE   )r   r=      r   )r   r=      r   )r      $   r   )   "   rC   e      r   r   r      rE   F)kernel_sizer   r   r   )rO   r   r   r      )r      i   )r   r   )r   r   r'   r(   num_classes	with_poolr   r   _norm_layerr%   r)   r   r   r   r   r    Z	MaxPool2Dmaxpool_make_layerlayer1layer2layer3layer4ZAdaptiveAvgPool2DavgpoolZLinearr:   fc)	r$   blockdepthrA   rR   rS   r'   Z	layer_cfglayersr+   r-   r.   r      sF   
	
zResNet.__init__Fc                 C   s   | j }d }| j}|r|  j|9  _d}|dks| j||j kr6ttj| j||j d|dd|||j }g }	|	|| j|||| j| j	|| ||j | _t
d|D ]}
|	|| j|| j| j	|d qTtj|	 S )Nr   F)r   r   )r'   r(   r*   )rT   r)   r%   r:   r   Z
Sequentialr   appendr'   r(   range)r$   r]   r&   blocksr   Zdilater*   r#   Zprevious_dilationr_   _r-   r-   r.   rV     sT   

zResNet._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| jr0| 	|}| j
dkr@t|d}| |}|S )Nr   r   )r   r   r    rU   rW   rX   rY   rZ   rS   r[   rR   paddleflattenr\   )r$   r1   r-   r-   r.   r4   J  s   










zResNet.forward)rC   r   rD   Tr   )r   F)r7   r8   r9   __doc__r   rV   r4   r;   r-   r-   r+   r.   rB      s    ,
0.rB   c                 K   s^   t ||fi |}|r-| tv sJ |  dtt|  d t|  d }t|}|| |S )NzJ model do not have a pretrained model now, you should set pretrained=Falser   r   )rB   
model_urlsr   rd   loadZset_dict)archZBlockr^   
pretrainedkwargsmodelZweight_pathparamr-   r-   r.   _resnet^  s   


rn   Fc                 K      t dtd| fi |S )a  ResNet 18-layer model from
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 18-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnet18

            >>> # build model
            >>> model = resnet18()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet18(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   rJ   rn   r   rj   rk   r-   r-   r.   r   n     r   c                 K   ro   )a  ResNet 34-layer model from
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 34-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnet34

            >>> # build model
            >>> model = resnet34()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet34(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   rK   rp   rq   r-   r-   r.   r     rr   r   c                 K   ro   )a  ResNet 50-layer model from
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 50-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnet50

            >>> # build model
            >>> model = resnet50()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet50(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   rC   rn   r<   rq   r-   r-   r.   r     rr   r   c                 K   ro   )a  ResNet 101-layer model from
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 101-layer.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnet101

            >>> # build model
            >>> model = resnet101()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet101(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   rL   rs   rq   r-   r-   r.   r     rr   r   c                 K   ro   )a  ResNet 152-layer model from
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 152-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnet152

            >>> # build model
            >>> model = resnet152()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet152(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   rM   rs   rq   r-   r-   r.   r     rr   r   c                 K   &   d|d< d|d< t dtd| fi |S )a  ResNeXt-50 32x4d model from
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 32x4d model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnext50_32x4d

            >>> # build model
            >>> model = resnext50_32x4d()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext50_32x4d(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
        r'   r=   rA   r	   rC   rs   rq   r-   r-   r.   r	        r	   c                 K   rt   )a  ResNeXt-50 64x4d model from
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 64x4d model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnext50_64x4d

            >>> # build model
            >>> model = resnext50_64x4d()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext50_64x4d(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   r'   r=   rA   r
   rC   rs   rq   r-   r-   r.   r
   6  rv   r
   c                 K   rt   )a  ResNeXt-101 32x4d model from
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 32x4d model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnext101_32x4d

            >>> # build model
            >>> model = resnext101_32x4d()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext101_32x4d(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    ru   r'   r=   rA   r   rL   rs   rq   r-   r-   r.   r   Y     r   c                 K   rt   )a  ResNeXt-101 64x4d model from
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 64x4d model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnext101_64x4d

            >>> # build model
            >>> model = resnext101_64x4d()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext101_64x4d(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   r'   r=   rA   r   rL   rs   rq   r-   r-   r.   r   ~  rw   r   c                 K   rt   )a  ResNeXt-152 32x4d model from
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 32x4d model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnext152_32x4d

            >>> # build model
            >>> model = resnext152_32x4d()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext152_32x4d(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    ru   r'   r=   rA   r   rM   rs   rq   r-   r-   r.   r     rw   r   c                 K   rt   )a  ResNeXt-152 64x4d model from
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 64x4d model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import resnext152_64x4d

            >>> # build model
            >>> model = resnext152_64x4d()

            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext152_64x4d(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   r'   r=   rA   r   rM   rs   rq   r-   r-   r.   r     rw   r   c                 K      d|d< t dtd| fi |S )a  Wide ResNet-50-2 model from
    `"Wide Residual Networks" <https://arxiv.org/pdf/1605.07146.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-50-2 model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import wide_resnet50_2

            >>> # build model
            >>> model = wide_resnet50_2()

            >>> # build model and load imagenet pretrained weight
            >>> # model = wide_resnet50_2(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    rP   rA   r   rC   rs   rq   r-   r-   r.   r     s   r   c                 K   rx   )a  Wide ResNet-101-2 model from
    `"Wide Residual Networks" <https://arxiv.org/pdf/1605.07146.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-101-2 model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import wide_resnet101_2

            >>> # build model
            >>> model = wide_resnet101_2()

            >>> # build model and load imagenet pretrained weight
            >>> # model = wide_resnet101_2(pretrained=True)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    rP   rA   r   rL   rs   rq   r-   r-   r.   r     s   r   )F)rd   r   Zpaddle.utils.downloadr   __all__rg   ZLayerr   r<   rB   rn   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r-   r-   r-   r.   <module>   sH   84A 

!
!
!
!
!
#
#
%
%
%
%"