o
    + iD                     @  s  U d dl mZ d dlZd dlmZ d dl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 ermd d
lmZmZ d dlmZ d dlmZ d dlmZ ed ZG dd deZg ZddddddZ de!d< G dd dej"Z#G dd dej"Z$G dd dej"Z%G dd dej"Z&G d d! d!ej"Z'G d"d# d#ej"Z(d:d-d.Z)	/d;d<d0d1Z*	/d;d<d2d3Z+	/d;d<d4d5Z,	/d;d<d6d7Z-	/d;d<d8d9Z.dS )=    )annotationsN)TYPE_CHECKING)Unpack)nn)	ParamAttr)AdaptiveAvgPool2D	AvgPool2D	BatchNormConv2DDropoutLinear	MaxPool2D)Uniform)get_weights_path_from_url)Literal	TypedDict)NotRequired)Tensor)Size2)densenet121densenet161densenet169densenet201densenet264c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	_DenseNetOptionszNotRequired[int]bn_sizezNotRequired[float]dropoutnum_classeszNotRequired[bool]	with_poolN)__name__
__module____qualname____annotations__ r#   r#   i/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/vision/models/densenet.pyr   4   s
   
 r   )zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet121_pretrained.pdparamsZ db1b239ed80a905290fd8b01d3af08e4)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet161_pretrained.pdparamsZ 62158869cb315098bd25ddbfd308a853)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet169_pretrained.pdparamsZ 82cc7c635c3f19098c748850efb2d796)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet201_pretrained.pdparamsZ 16ca29565a7712329cf9e36e02caaf58)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet264_pretrained.pdparamsZ 3270ce516b85370bba88cfdd9f60bff4zdict[str, tuple[str, str]]
model_urlsc                      2   e Zd Z				dd fddZdddZ  ZS )BNACConvLayer   r   relunum_channelsintnum_filtersfilter_sizer   stridepadgroupsactstrreturnNonec              
     s8   t    t||d| _t||||||t dd| _d S )Nr1   FZin_channelsZout_channelskernel_sizer.   paddingr0   weight_attr	bias_attr)super__init__r	   _batch_normr
   r   _convselfr*   r,   r-   r.   r/   r0   r1   	__class__r#   r$   r<   V   s   

zBNACConvLayer.__init__inputr   c                 C     |  |}| |}|S N)r=   r>   r@   rC   yr#   r#   r$   forwardn      

zBNACConvLayer.forwardr(   r   r(   r)   r*   r+   r,   r+   r-   r   r.   r   r/   r   r0   r+   r1   r2   r3   r4   rC   r   r3   r   r   r    r!   r<   rH   __classcell__r#   r#   rA   r$   r'   U       r'   c                      s2   e Zd ZU ded< d fd	d
ZdddZ  ZS )
DenseLayerfloatr   r*   r+   growth_rater   r3   r4   c                   sZ   t    || _t||| dddd| _t|| |dddd| _|r+t|dd| _d S d S )Nr(   r   r*   r,   r-   r/   r.      Zdownscale_in_infer)pmode)r;   r<   r   r'   bn_ac_func1bn_ac_func2r   dropout_func)r@   r*   rR   r   r   rA   r#   r$   r<   w   s&   
zDenseLayer.__init__rC   r   c                 C  s:   |  |}| |}| jr| |}tj||gdd}|S )Nr(   )Zaxis)rW   rX   r   rY   paddleconcat)r@   rC   convr#   r#   r$   rH      s   


zDenseLayer.forward)
r*   r+   rR   r+   r   r+   r   rQ   r3   r4   rL   r   r    r!   r"   r<   rH   rN   r#   r#   rA   r$   rP   t   s   
 rP   c                      s6   e Zd ZU ded< 	dd fddZdddZ  ZS )
DenseBlockrQ   r   Nr*   r+   
num_layersr   rR   name
str | Noner3   r4   c           	        sb   t    || _g | _|}t|D ]}| j| | d|d  t||||d || }qd S )N_r(   )r*   rR   r   r   )r;   r<   r   dense_layer_funcrangeappendadd_sublayerrP   )	r@   r*   r_   r   rR   r   r`   Zpre_channellayerrA   r#   r$   r<      s$   
	
zDenseBlock.__init__rC   r   c                 C  s   |}| j D ]}||}q|S rE   )rc   )r@   rC   r\   funcr#   r#   r$   rH      s   

zDenseBlock.forwardrE   )r*   r+   r_   r+   r   r+   rR   r+   r   rQ   r`   ra   r3   r4   rL   r]   r#   r#   rA   r$   r^      s
   
 	r^   c                      s(   e Zd Zd fddZdd
dZ  ZS )TransitionLayerr*   r+   num_output_featuresr3   r4   c                   s2   t    t||dddd| _tdddd| _d S )Nr(   r   rS      r7   r.   r8   )r;   r<   r'   conv_ac_funcr   
pool2d_avg)r@   r*   rj   rA   r#   r$   r<      s   
zTransitionLayer.__init__rC   r   c                 C  rD   rE   )rm   rn   rF   r#   r#   r$   rH      rI   zTransitionLayer.forward)r*   r+   rj   r+   r3   r4   rL   rM   r#   r#   rA   r$   ri      s    ri   c                      r&   )ConvBNLayerr(   r   r)   r*   r+   r,   r-   r   r.   r/   r0   r1   r2   r3   r4   c              
     s8   t    t||||||t dd| _t||d| _d S )NFr6   r5   )r;   r<   r
   r   r>   r	   r=   r?   rA   r#   r$   r<      s   


zConvBNLayer.__init__rC   r   c                 C  rD   rE   )r>   r=   rF   r#   r#   r$   rH      rI   zConvBNLayer.forwardrJ   rK   rL   rM   r#   r#   rA   r$   ro      rO   ro   c                      sJ   e Zd ZU dZded< ded< 						
dd fddZdddZ  ZS )DenseNeta  DenseNet model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`_.

    Args:
        layers (int, optional): Layers of DenseNet. Default: 121.
        bn_size (int, optional): Expansion of growth rate in the middle layer. Default: 4.
        dropout (float, optional): Dropout rate. Default: :math:`0.0`.
        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.

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

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import DenseNet

            >>> # Build model
            >>> densenet = DenseNet()

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

            >>> print(out.shape)
            [1, 1000]
    r+   r   boolr   y                Tlayersr   r   rQ   r3   r4   c                   s  t    || _|| _g d}||v sJ d| d| ddg dfddg d	fddg d
fddg dfddg dfd}|| \}}	}
td|ddddd| _tdddd| _|
| _g | _	g | _
|}|}t|
D ]O\}}| j	| d|d  t||||	|dt|d  d |||	  }|}|t|
d kr| j
| d|d  dt||d d |d }|d }qit|dd| _| jrtd| _| jdkrdt|d  }t||tt| |dt d| _d S d S )N)rr              zsupported layers are z but input layer is @       )            `   0   )r}   r~   $   r   )r}   r~   r|   r|   )r}   r~   r   r|   )r}   r~   r{   r   rT      rk   r)   )r*   r,   r-   r.   r/   r1   r(   rl   Zdb_conv_r\   )r*   r_   r   rR   r   r`   Ztr_convZ_blk)r*   rj   r5   r   g      ?)Zinitializer)r9   r:   )r;   r<   r   r   ro   
conv1_funcr   
pool2d_maxblock_configdense_block_func_listtransition_func_list	enumeratere   rf   r^   r2   lenri   r	   
batch_normr   rn   mathsqrtr   r   r   out)r@   rv   r   r   r   r   Zsupported_layersZdensenet_specZnum_init_featuresrR   r   Zpre_num_channelsZnum_featuresir_   ZstdvrA   r#   r$   r<     s   

	

zDenseNet.__init__rC   r   c                 C  s   |  |}| |}t| jD ]\}}| j| |}|t| jd kr*| j| |}q| |}| jr8| 	|}| j
dkrJtj|ddd}| |}|S )Nr(   r   )Z
start_axisZ	stop_axis)r   r   r   r   r   r   r   r   r   rn   r   rZ   flattenr   )r@   rC   r\   r   r_   rG   r#   r#   r$   rH   f  s   





zDenseNet.forward)rr   rs   rt   ru   T)rv   r+   r   r+   r   rQ   r   r+   r   rq   r3   r4   rL   )r   r    r!   __doc__r"   r<   rH   rN   r#   r#   rA   r$   rp      s   
 Rrp   arch_DenseNetArchrv   r+   
pretrainedrq   kwargsUnpack[_DenseNetOptions]r3   c                 K  s^   t dd|i|}|r-| tv sJ |  dtt|  d t|  d }t|}|| |S )Nrv   zJ model do not have a pretrained model now, you should set pretrained=Falser   r(   r#   )rp   r%   r   rZ   loadZset_dict)r   rv   r   r   modelZweight_pathparamr#   r#   r$   	_densenet{  s   


r   Fc                 K     t dd| fi |S )a  DenseNet 121-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_models_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 121-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import densenet121

            >>> # Build model
            >>> model = densenet121()

            >>> # Build model and load imagenet pretrained weight
            >>> # model = densenet121(pretrained=True)

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

            >>> print(out.shape)
            [1, 1000]
    r   rr   r   r   r   r#   r#   r$   r         r   c                 K  r   )a  DenseNet 161-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_models_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 161-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import densenet161

            >>> # Build model
            >>> model = densenet161()

            >>> # Build model and load imagenet pretrained weight
            >>> # model = densenet161(pretrained=True)

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

            >>> print(out.shape)
            [1, 1000]
    r   rw   r   r   r#   r#   r$   r     r   r   c                 K  r   )a  DenseNet 169-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_models_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 169-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import densenet169

            >>> # Build model
            >>> model = densenet169()

            >>> # Build model and load imagenet pretrained weight
            >>> # model = densenet169(pretrained=True)

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

            >>> print(out.shape)
            [1, 1000]
    r   rx   r   r   r#   r#   r$   r     r   r   c                 K  r   )a  DenseNet 201-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_models_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 201-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import densenet201

            >>> # Build model
            >>> model = densenet201()

            >>> # Build model and load imagenet pretrained weight
            >>> # model = densenet201(pretrained=True)
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            [1, 1000]
    r   ry   r   r   r#   r#   r$   r     s   r   c                 K  r   )a  DenseNet 264-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_models_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 264-layer model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import densenet264

            >>> # Build model
            >>> model = densenet264()

            >>> # Build model and load imagenet pretrained weight
            >>> # model = densenet264(pretrained=True)

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

            >>> print(out.shape)
            [1, 1000]
    r   rz   r   r   r#   r#   r$   r     r   r   )
r   r   rv   r+   r   rq   r   r   r3   rp   )F)r   rq   r   r   r3   rp   )/
__future__r   r   typingr   Ztyping_extensionsr   rZ   r   Zpaddle.base.param_attrr   Z	paddle.nnr   r   r	   r
   r   r   r   Zpaddle.nn.initializerr   Zpaddle.utils.downloadr   r   r   r   r   Zpaddle._typingr   r   r   __all__r%   r"   ZLayerr'   rP   r^   ri   ro   rp   r   r   r   r   r   r   r#   r#   r#   r$   <module>   sX   $	%& 

$$$#