o
    + i$                     @  s   d dl mZ d dl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 erBd d	lmZ d 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	TypedDict)NotRequiredUnpackN)nn)get_weights_path_from_url   )ConvNormActivation)Tensor)Size2c                   @  s   e Zd ZU ded< ded< dS )_MobileNetV1Optionsz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/mobilenetv1.pyr   "   s   
 r   zmobilenetv1_1.0)zAhttps://paddle-hapi.bj.bcebos.com/models/mobilenetv1_1.0.pdparamsZ 3033ab1975b1670bef51545feb65fc45c                      s(   e Zd Zd fddZdddZ  ZS )DepthwiseSeparablein_channelsintout_channels1out_channels2
num_groupsstrider   scalefloatreturnNonec              	     sX   t    t|t|| d|dt|| d| _tt|| t|| dddd| _d S )N      )kernel_sizer   paddinggroupsr   )r#   r   r$   )super__init__r
   r   _depthwise_conv_pointwise_conv)selfr   r   r   r   r   r   	__class__r   r   r'   3   s    
	

	

zDepthwiseSeparable.__init__xr   c                 C  s   |  |}| |}|S )N)r(   r)   )r*   r-   r   r   r   forwardO   s   

zDepthwiseSeparable.forward)r   r   r   r   r   r   r   r   r   r   r   r   r   r    r-   r   r   r   )r   r   r   r'   r.   __classcell__r   r   r+   r   r   2   s    r   c                      sN   e Zd ZU dZded< ded< ded< 				
dd fddZdddZ  ZS )MobileNetV1aw  MobileNetV1 model from
    `"MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications" <https://arxiv.org/abs/1704.04861>`_.

    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 MobileNetV1 model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import MobileNetV1

            >>> model = MobileNetV1()

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

            >>> print(out.shape)
            [1, 1000]
    r   r   r   r   boolr         ?  Tr   r    c              
     sT  t    || _g | _|| _|| _tdtd| dddd| _| j	t
td| dddd|ddd	}| j| | j	t
td| dd
dd|ddd	}| j| | j	t
td
| d
d
d
d|ddd	}| j| | j	t
td
| d
dd
d|ddd	}| j| | j	t
td| dddd|ddd	}| j| | j	t
td| dddd|ddd	}	| j|	 tdD ]!}
| j	t
td| dddd|ddt|
d  d	}| j| q| j	t
td| dddd|ddd	}| j| | j	t
td| dddd|ddd	}| j| |rtd| _|dkr(ttd| || _d S d S )Nr!       r	   r"   )r   Zout_channelsr#   r   r$   @   )r   r   r   r   r   r   Zconv2_1)Zsublayername   Zconv2_2Zconv3_1   Zconv3_2Zconv4_1i   Zconv4_2   Zconv5_i   Zconv5_6Zconv6r   )r&   r'   r   dwslr   r   r
   r   conv1Zadd_sublayerr   appendrangestrr   ZAdaptiveAvgPool2D
pool2d_avgZLinearfc)r*   r   r   r   Zdws21Zdws22Zdws31Zdws32Zdws41Zdws42itmpZdws56Zdws6r+   r   r   r'   u   s   











zMobileNetV1.__init__r-   r   c                 C  sR   |  |}| jD ]}||}q| jr| |}| jdkr't|d}| |}|S )Nr   r"   )r<   r;   r   r@   r   paddleflattenrA   )r*   r-   Zdwsr   r   r   r.     s   





zMobileNetV1.forward)r3   r4   T)r   r   r   r   r   r2   r   r    r/   )r   r   r   __doc__r   r'   r.   r0   r   r   r+   r   r1   U   s   
  r1   Farchr?   
pretrainedr2   kwargsUnpack[_MobileNetV1Options]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   )r1   
model_urlsr   rD   load	load_dict)rG   rH   rI   modelZweight_pathparamr   r   r   
_mobilenet  s   


rP   r3   r   r   c                 K  s"   t dt| | fd|i|}|S )a  MobileNetV1 from
    `"MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications" <https://arxiv.org/abs/1704.04861>`_.

    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:`MobileNetV1 <api_paddle_vision_models_MobileNetV1>`.

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

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import mobilenet_v1

            >>> # Build model
            >>> model = mobilenet_v1()

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

            >>> # build mobilenet v1 with scale=0.5
            >>> model_scale = mobilenet_v1(scale=0.5)

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

            >>> print(out.shape)
            [1, 1000]
    Zmobilenetv1_r   )rP   r?   )rH   r   rI   rN   r   r   r   mobilenet_v1%  s   &rQ   )F)rG   r?   rH   r2   rI   rJ   r   r1   )Fr3   )rH   r2   r   r   rI   rJ   r   r1   )
__future__r   typingr   r   Ztyping_extensionsr   r   rD   r   Zpaddle.utils.downloadr   opsr
   r   Zpaddle._typingr   r   __all__rK   ZLayerr   r1   rP   rQ   r   r   r   r   <module>   s,   # @