o
    Qeg                     @   s   d dl mZ d dl mZ 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d6ddZd6ddZd6d d!Zd6d"d#Zd6d$d%Zd6d&d'Zd6d(d)Zd6d*d+Zd6d,d-Zd6d.d/Zd6d0d1Zd6d2d3Zd6d4d5ZdS )7    )division)print_functionN)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 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   )superr   __init__nnBatchNorm2DNotImplementedErrorConv2Dconv1bn1ReLUreluconv2bn2
downsampler   )	selfinplanesplanesr   r%   groups
base_widthdilation
norm_layer	__class__ KD:\Projects\ConvertPro\env\Lib\site-packages\paddle/vision/models/resnet.pyr   B   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/   r0   forward`   s   







zBasicBlock.forwardr   Nr   r   r   N__name__
__module____qualname__	expansionr   r6   __classcell__r/   r/   r-   r0   r   ?   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 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   r   intr   r   r    r#   r$   r<   conv3bn3r!   r"   r%   r   )
r&   r'   r(   r   r%   r)   r*   r+   r,   widthr-   r/   r0   r   w   s2   	



zBottleneckBlock.__init__c                 C   s~   |}|  |}| |}| |}| |}| |}| |}| |}| |}| jd ur4| |}||7 }| |}|S r1   )r   r    r"   r#   r$   rA   rB   r%   r2   r/   r/   r0   r6      s   










zBottleneckBlock.forwardr7   r8   r/   r/   r-   r0   r>   s   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           	         s:  t 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)   rG   rG   rG   )r   r?      r   )r   r?      r   )r      $   r   )   "   rE   e      r   r   r      rG   F)kernel_sizer   r   r   )rQ   r   r   r      )r      i   )r   r   )r   rD   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depthrC   rT   rU   r)   Z	layer_cfglayersr-   r/   r0   r      sD   
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,   )rV   r+   r'   r<   r   Z
Sequentialr   appendr)   r*   range)r&   r_   r(   blocksr   Zdilater,   r%   Zprevious_dilationra   _r/   r/   r0   rX     sB   	
zResNet._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| jr0| 	|}| j
dkr@t|d}| |}|S )Nr   r   )r   r    r"   rW   rY   rZ   r[   r\   rU   r]   rT   paddleflattenr^   )r&   r3   r/   r/   r0   r6   (  s   










zResNet.forward)rE   r   rF   Tr   )r   F)r9   r:   r;   __doc__r   rX   r6   r=   r/   r/   r-   r0   rD      s    +
, rD   c                 K   s^   t ||fi |}|r-| tv sJ d| tt|  d t|  d }t|}|| |S )NzL{} model do not have a pretrained model now, you should set pretrained=Falser   r   )rD   
model_urlsformatr   rf   loadZset_dict)archZBlockr`   
pretrainedkwargsmodelZweight_pathparamr/   r/   r0   _resnet<  s   


rq   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_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   rL   rq   r   rm   rn   r/   r/   r0   r   J     r   c                 K   rr   )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_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   rM   rs   rt   r/   r/   r0   r   k  ru   r   c                 K   rr   )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_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   rE   rq   r>   rt   r/   r/   r0   r     ru   r   c                 K   rr   )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_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   rN   rv   rt   r/   r/   r0   r     ru   r   c                 K   rr   )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_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	   rO   rv   rt   r/   r/   r0   r	     ru   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_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?   rC   r
   rE   rv   rt   r/   r/   r0   r
        r
   c                 K   rw   )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_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?   rC   r   rE   rv   rt   r/   r/   r0   r     ry   r   c                 K   rw   )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_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]
    rx   r)   r?   rC   r   rN   rv   rt   r/   r/   r0   r   5  
   r   c                 K   rw   )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_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?   rC   r   rN   rv   rt   r/   r/   r0   r   Y  rz   r   c                 K   rw   )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_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]
    rx   r)   r?   rC   r   rO   rv   rt   r/   r/   r0   r   }  rz   r   c                 K   rw   )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_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?   rC   r   rO   rv   rt   r/   r/   r0   r     rz   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_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]
    rR   rC   r   rE   rv   rt   r/   r/   r0   r     s   r   c                 K   r{   )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_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]
    rR   rC   r   rN   rv   rt   r/   r/   r0   r     s   r   )F)
__future__r   r   rf   Z	paddle.nnr   Zpaddle.utils.downloadr   __all__ri   ZLayerr   r>   rD   rq   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   sL   &4? 

!
!
!
!
!
#
#
$
$
$
$"