Ë
    –\;jg  ã                   ó¬   — d dl Z d dl mZ d dlmZ ddlmZ ddlmZ g Zdd	iZ	 G d
„ dej                  «      Z G d„ dej                  «      Zdd„Zdd„Zy)é    N)Únn)Úget_weights_path_from_urlé   )ÚConvNormActivationé   )Ú_make_divisiblezmobilenetv2_1.0)zChttps://paddle-hapi.bj.bcebos.com/models/mobilenet_v2_x1.0.pdparamsÚ 0340af0a901346c8d46f4529882fb63dc                   ó<   ‡ — e Zd Zej                  fˆ fd„	Zd„ Zˆ xZS )ÚInvertedResidualc                 óÖ  •— t         ‰| �  «        || _        |dv sJ ‚t        t	        ||z  «      «      }| j                  dk(  xr ||k(  | _        g }|dk7  r-|j                  t        ||d|t        j                  ¬«      «       |j                  t        |||||t        j                  ¬«      t        j                  ||dddd¬«       ||«      g«       t        j                  |Ž | _        y )N)r   r   r   ©Úkernel_sizeÚ
norm_layerÚactivation_layer)ÚstrideÚgroupsr   r   r   F)Ú	bias_attr)ÚsuperÚ__init__r   ÚintÚroundÚuse_res_connectÚappendr   r   ÚReLU6ÚextendÚConv2DÚ
SequentialÚconv)	ÚselfÚinpÚoupr   Úexpand_ratior   Ú
hidden_dimÚlayersÚ	__class__s	           €úiG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/vision/models/mobilenetv2.pyr   zInvertedResidual.__init__!   sé   ø€ ô 	‰ÑÔØˆŒØ˜ÑÐÐäœ˜s \Ñ1Ó2Ó3ˆ
Ø#Ÿ{™{¨aÑ/Ò>°C¸3±JˆÔàˆØ˜1ÒØ�M‰MÜ"ØØØ !Ø)Ü%'§X¡Xôôð 	�‰ä"ØØØ!Ø%Ø)Ü%'§X¡Xôô —	‘	˜* c¨1¨a°¸eÔDÙ˜3“ðô	
ô —M‘M 6Ð*ˆ�	ó    c                 ód   — | j                   r|| j                  |«      z   S | j                  |«      S )N)r   r   ©r   Úxs     r&   ÚforwardzInvertedResidual.forwardF   s,   € Ø×ÒØ�t—y‘y “|Ñ#Ð#à—9‘9˜Q“<Ðr'   )Ú__name__Ú
__module__Ú__qualname__r   ÚBatchNorm2Dr   r+   Ú__classcell__©r%   s   @r&   r   r       s   ø„ à9;¿¹õ#+öJ r'   r   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ x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]
    c                 ól  •— t         ‰| �  «        || _        || _        d}d}t        }d}t
        j                  }g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g}	t        ||z  |«      }t        |t        d|«      z  |«      | _	        t        d|d|t
        j                  ¬«      g}
|	D ]M  \  }}}}t        ||z  |«      }t        |«      D ])  }|dk(  r|nd}|
j                   ||||||¬«      «       |}Œ+ ŒO |
j                  t        || j                  d|t
        j                  ¬«      «       t        j                  |
Ž | _        |rt        j                   d«      | _        | j                  dkD  rMt        j                  t        j$                  d«      t        j&                  | j                  |«      «      | _        y y )Né    i   é   )r   é   r   r   )é   é   r   r   )r8   r5   é   r   )r8   é@   é   r   )r8   é`   r:   r   )r8   é    r:   r   )r8   i@  r   r   ç      ð?r:   r   )r   r   r   r   r   )r"   r   r   gš™™™™™É?)r   r   Únum_classesÚ	with_poolr   r   r/   r   ÚmaxÚlast_channelr   r   Úranger   r   ÚfeaturesÚAdaptiveAvgPool2DÚ
pool2d_avgÚDropoutÚLinearÚ
classifier)r   Úscaler@   rA   Úinput_channelrC   ÚblockÚround_nearestr   Úinverted_residual_settingrE   ÚtÚcÚnÚsÚoutput_channelÚir   r%   s                     €r&   r   zMobileNetV2.__init__i   s«  ø€ Ü‰ÑÔØ&ˆÔØ"ˆŒØˆØˆä ˆØˆÜ—^‘^ˆ
âÚÚÚÚÚÚð%
Ð!ô (¨¸Ñ(=¸}ÓMˆÜ+Øœ3˜s E›?Ñ*¨Mó
ˆÔô ØØØØ%Ü!#§¡ôð
ˆó 4‰JˆAˆq�!�QÜ,¨Q°©Y¸ÓFˆNÜ˜1–X�Ø 1šf™¨!�Ø—‘ÙØ%Ø&ØØ%&Ø#-ôôð !/‘ñ ð 4ð 	�‰ÜØØ×!Ñ!ØØ%Ü!#§¡ôô	
ô Ÿ™ xÐ0ˆŒáÜ ×2Ñ2°1Ó5ˆDŒOà×Ñ˜aÒÜ Ÿm™mÜ—
‘
˜3“¤§¡¨4×+<Ñ+<¸kÓ!JóˆD�Oð  r'   c                 óÎ   — | j                  |«      }| j                  r| j                  |«      }| j                  dkD  r't	        j
                  |d«      }| j                  |«      }|S )Nr   r   )rE   rA   rG   r@   ÚpaddleÚflattenrJ   r)   s     r&   r+   zMobileNetV2.forward®   sV   € Ø�M‰M˜!Óˆà�>Š>Ø—‘ Ó"ˆAà×Ñ˜aÒÜ—‘˜q !Ó$ˆAØ—‘ Ó"ˆAØˆr'   )r?   iè  T)r,   r-   r.   Ú__doc__r   r+   r0   r1   s   @r&   r3   r3   M   s   ø„ ñõ6CöJ	r'   r3   c                 óÐ   — t        di |¤Ž}|rX| t        v s
J | › d�«       ‚t        t        |    d   t        |    d   «      }t        j                  |«      }|j                  |«       |S )NzJ model do not have a pretrained model now, you should set pretrained=Falser   r   © )r3   Ú
model_urlsr   rW   ÚloadÚ	load_dict)ÚarchÚ
pretrainedÚkwargsÚmodelÚweight_pathÚparams         r&   Ú
_mobilenetre   º   sx   € ÜÑ!˜&Ñ!€EÙà”JÑð	_àˆVÐ]Ð^ó	_Øä/Ü�tÑ˜QÑ¤¨DÑ!1°!Ñ!4ó
ˆô —‘˜KÓ(ˆØ�‰˜Ôà€Lr'   c                 ó<   — t        dt        |«      z   | 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]
    Úmobilenetv2_rK   )re   Ústr)r`   rK   ra   rb   s       r&   Úmobilenet_v2ri   Ê   s4   € ôB Øœ˜U›Ñ# ZñØ7<ðØ@Fñ€Eð €Lr'   )F)Fr?   )rW   r   Úpaddle.utils.downloadr   Úopsr   Ú_utilsr   Ú__all__r\   ÚLayerr   r3   re   ri   r[   r'   r&   Ú<module>ro      sZ   ðó Ý Ý ;å $Ý #à
€ð ð ð€
ô* �r—x‘xô * ôZj�"—(‘(ô jóZô $r'   