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
  mZ d dlm
Z
 d dlmZ d dlmZmZmZmZ d dlmZ erWd d	lmZ d d
lmZ G dd deZg Z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dZ 	 d&d'd!d"Z!	 d&d'd#d$Z"dS )(    )annotations)TYPE_CHECKING	TypedDict)NotRequiredUnpackN)nn)	ParamAttr)AdaptiveAvgPool2DConv2DDropout	MaxPool2D)get_weights_path_from_url)Tensor)Size2c                   @  s   e Zd ZU ded< ded< dS )_SqueezeNetOptionszNotRequired[int]num_classeszNotRequired[bool]	with_poolN)__name__
__module____qualname____annotations__ r   r   k/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/vision/models/squeezenet.pyr   #   s   
 r   )z[https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_0_pretrained.pdparamsZ 30b95af60a2178f03cf9b66cd77e1db1)z[https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_1_pretrained.pdparamsZ a11250d3a1f91d7131fd095ebbf09eee)squeezenet1_0squeezenet1_1c                      s,   e Zd Z	dd fd
dZdddZ  ZS )MakeFireConvr   input_channelsintoutput_channelsfilter_sizer   paddingreturnNonec                   s(   t    t||||t t d| _d S )N)r    weight_attr	bias_attr)super__init__r
   r   _conv)selfr   r   r   r    	__class__r   r   r&   7   s   
zMakeFireConv.__init__xr   c                 C  s   |  |}t|}|S )N)r'   Frelu)r(   r+   r   r   r   forwardH   s   

zMakeFireConv.forward)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   6   s    r   c                      s(   e Zd Zd fdd	ZdddZ  ZS )MakeFirer   r   squeeze_channelsexpand1x1_channelsexpand3x3_channelsr!   r"   c                   s<   t    t||d| _t||d| _t||ddd| _d S )N      )r    )r%   r&   r   r'   _conv_path1_conv_path2)r(   r   r2   r3   r4   r)   r   r   r&   O   s   
zMakeFire.__init__inputsr   c                 C  s0   |  |}| |}| |}tj||gddS )Nr5   Zaxis)r'   r7   r8   paddleconcat)r(   r9   r+   x1Zx2r   r   r   r.   ]   s   


zMakeFire.forward)
r   r   r2   r   r3   r   r4   r   r!   r"   r9   r   r!   r   r/   r   r   r)   r   r1   N   s    r1   c                      sJ   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 )
SqueezeNeta  SqueezeNet model from
    `"SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size"
    <https://arxiv.org/pdf/1602.07360.pdf>`_.

    Args:
        version (str): Version of SqueezeNet, which can be "1.0" or "1.1".
        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 SqueezeNet model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import SqueezeNet

            >>> # build v1.0 model
            >>> model = SqueezeNet(version='1.0')

            >>> # build v1.1 model
            >>> # model = SqueezeNet(version='1.1')

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

            >>> print(out.shape)
            [1, 1000]
    strversionr   r   boolr     Tr!   r"   c              	     s  t    || _|| _|| _ddg}||v s J d| d| | jdkr{tddddt t d	| _tddd
d| _	t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _nVtdddddt t d| _tddd
d| _	t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _t
dddd| _tddd| _td|dt t d| _td| _d S )N1.01.1zsupported versions are z but input version is r6   `         )strider#   r$   r   )Zkernel_sizerI   r       @             0      i  i   r5   )rI   r    r#   r$   g      ?Zdownscale_in_infer)pmode)r#   r$   )r%   r&   rA   r   r   r
   r   r'   r   _poolr1   _conv1_conv2_conv3_conv4_conv5_conv6_conv7_conv8r   _drop_conv9r	   	_avg_pool)r(   rA   r   r   Zsupported_versionsr)   r   r   r&      sb   


	zSqueezeNet.__init__r9   r   c                 C  s@  |  |}t|}| |}| jdkrG| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| |}n2| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| jdkr| |}| |}| jrt|}| |}tj|ddgd}|S )NrD   r   rH   r6   r:   )r'   r,   r-   rS   rA   rT   rU   rV   rW   rX   rY   rZ   r[   r   r\   r]   r   r^   r;   Zsqueeze)r(   r9   r+   r   r   r   r.      s@   



























zSqueezeNet.forward)rC   T)rA   r@   r   r   r   rB   r!   r"   r>   )r   r   r   __doc__r   r&   r.   r0   r   r   r)   r   r?   d   s   
  9r?   archr@   rA   
pretrainedrB   kwargsUnpack[_SqueezeNetOptions]r!   c                 K  s\   t |f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   r5   )r?   
model_urlsr   r;   loadZset_dict)r`   rA   ra   rb   modelZweight_pathparamr   r   r   _squeezenet   s   


rh   Fc                 K     t dd| fi |S )a  SqueezeNet v1.0 model from
    `"SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size"
    <https://arxiv.org/pdf/1602.07360.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:`SqueezeNet <api_paddle_vision_models_SqueezeNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of SqueezeNet v1.0 model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import squeezenet1_0

            >>> # build model
            >>> model = squeezenet1_0()

            >>> # build model and load imagenet pretrained weight
            >>> # model = squeezenet1_0(pretrained=True)

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

            >>> print(out.shape)
            [1, 1000]
    r   rD   rh   ra   rb   r   r   r   r         !r   c                 K  ri   )a  SqueezeNet v1.1 model from
    `"SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size"
    <https://arxiv.org/pdf/1602.07360.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:`SqueezeNet <api_paddle_vision_models_SqueezeNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of SqueezeNet v1.1 model.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> from paddle.vision.models import squeezenet1_1

            >>> # build model
            >>> model = squeezenet1_1()

            >>> # build model and load imagenet pretrained weight
            >>> # model = squeezenet1_1(pretrained=True)

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

            >>> print(out.shape)
            [1, 1000]
    r   rE   rj   rk   r   r   r   r     rl   r   )
r`   r@   rA   r@   ra   rB   rb   rc   r!   r?   )F)ra   rB   rb   rc   r!   r?   )#
__future__r   typingr   r   Ztyping_extensionsr   r   r;   Zpaddle.nn.functionalr   Z
functionalr,   Zpaddle.base.param_attrr   Z	paddle.nnr	   r
   r   r   Zpaddle.utils.downloadr   r   Zpaddle._typingr   r   __all__rd   ZLayerr   r1   r?   rh   r   r   r   r   r   r   <module>   s4    
%