o
    + iB                     @  s   d dl mZ d dlmZmZmZ d dlmZmZ d dl	Z	d dl	m
Z
 d dlmZ ddlmZ d	d
lmZ erDd dl	mZ G dd deZg ZddiZG dd de
jZG dd de
jZ	d#d$ddZ		d%d&d!d"ZdS )'    )annotations)TYPE_CHECKINGCallable	TypedDict)NotRequiredUnpackN)nn)get_weights_path_from_url   )ConvNormActivation   )_make_divisible)Tensorc                   @  s   e Zd ZU ded< ded< dS )_MobileNetV2OptionszNotRequired[int]num_classeszNotRequired[bool]	with_poolN)__name__
__module____qualname____annotations__ r   r   l/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/vision/models/mobilenetv2.pyr   #   s   
 r   zmobilenetv2_1.0)zChttps://paddle-hapi.bj.bcebos.com/models/mobilenet_v2_x1.0.pdparamsZ 0340af0a901346c8d46f4529882fb63dc                      s.   e Zd Zejfd fddZdddZ  ZS )InvertedResidualinpintoupstrideexpand_ratiofloat
norm_layerCallable[..., nn.Layer]returnNonec                   s   t    || _|dv sJ tt|| }| jdko||k| _g }|dkr3|t||d|tj	d |
t|||||tj	dtj||ddddd||g tj| | _d S )N)r   r
   r   Zkernel_sizer   activation_layer)r   groupsr   r$   r   F)Z	bias_attr)super__init__r   r   rounduse_res_connectappendr   r   ReLU6extendZConv2D
Sequentialconv)selfr   r   r   r   r   Z
hidden_dimZlayers	__class__r   r   r'   3   s<   
	zInvertedResidual.__init__xr   c                 C  s   | j r
|| | S | |S )N)r)   r.   r/   r2   r   r   r   forward]   s   
zInvertedResidual.forward)r   r   r   r   r   r   r   r   r   r    r!   r"   r2   r   r!   r   )r   r   r   r   BatchNorm2Dr'   r4   __classcell__r   r   r0   r   r   2   s    *r   c                      sF   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 )MobileNetV2a[  MobileNetV2 model from
    `"MobileNetV2: Inverted Residuals and Linear Bottlenecks" <https://arxiv.org/abs/1801.04381>`_.

    Args:
        scale (float, optional): Scale of channels in each layer. Default: 1.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 MobileNetV2 model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import MobileNetV2

            >>> model = MobileNetV2()

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

            >>> print(out.shape)
            [1, 1000]
    r   r   boolr         ?  Tscaler   r!   r"   c                   sV  t    || _|| _d}d}t}d}tj}g dg dg dg dg dg d	g d
g}	t|| |}t|td| || _	t
d|d|tjdg}
|	D ]*\}}}}t|| |}t|D ]}|dkre|nd}|
||||||d |}q]qL|
t
|| j	d|tjd tj|
 | _|rtd| _| jdkrttdt| j	|| _d S d S )N    i      )r      r   r   )      r
   r
   )r@   r=      r
   )r@   @      r
   )r@   `   rB   r   )r@      rB   r
   )r@   i@  r   r   r:   rB   r
   )r   r   r$   r   r   )r   r   r#   g?)r&   r'   r   r   r   r   r6   r   maxlast_channelr   r+   ranger*   r-   featuresZAdaptiveAvgPool2D
pool2d_avgZDropoutZLinear
classifier)r/   r<   r   r   Zinput_channelrH   blockZround_nearestr   Zinverted_residual_settingrJ   tcnsZoutput_channelir   r0   r   r   r'      sx   


	


zMobileNetV2.__init__r2   r   c                 C  s>   |  |}| jr| |}| jdkrt|d}| |}|S )Nr   r   )rJ   r   rK   r   paddleflattenrL   r3   r   r   r   r4      s   



zMobileNetV2.forward)r:   r;   T)r<   r   r   r   r   r9   r!   r"   r5   )r   r   r   __doc__r   r'   r4   r7   r   r   r0   r   r8   d   s   
 Jr8   Farchstr
pretrainedr9   kwargsUnpack[_MobileNetV2Options]r!   c                 K  sZ   t d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   r   )r8   
model_urlsr	   rS   load	load_dict)rV   rX   rY   modelZweight_pathparamr   r   r   
_mobilenet   s   


r`   r:   r<   r   c                 K  s"   t dt| | fd|i|}|S )a  MobileNetV2 from
    `"MobileNetV2: Inverted Residuals and Linear Bottlenecks" <https://arxiv.org/abs/1801.04381>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained on ImageNet. Default: False.
        scale (float, optional): Scale of channels in each layer. Default: 1.0.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`MobileNetV2 <api_paddle_vision_models_MobileNetV2>`.

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

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import mobilenet_v2

            >>> # Build model
            >>> model = mobilenet_v2()

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

            >>> # Build mobilenet v2 with scale=0.5
            >>> model = mobilenet_v2(scale=0.5)

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

            >>> print(out.shape)
            [1, 1000]
    Zmobilenetv2_r<   )r`   rW   )rX   r<   rY   r^   r   r   r   mobilenet_v2   s   %ra   )F)rV   rW   rX   r9   rY   rZ   r!   r8   )Fr:   )rX   r9   r<   r   rY   rZ   r!   r8   )
__future__r   typingr   r   r   Ztyping_extensionsr   r   rS   r   Zpaddle.utils.downloadr	   opsr   _utilsr   r   r   __all__r[   ZLayerr   r8   r`   ra   r   r   r   r   <module>   s*   2v