U
    <þjg‡  ã                   @   s  d dl mZ d dlmZ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 d	d
lmZmZmZ d	dlmZ d	dlmZmZ dddg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ƒZeƒ edejfddddœee eeedœdd„ƒƒZ dS )é    )Úpartial)ÚAnyÚCallableÚOptionalN)Únn)ÚConv3dNormActivationé   )ÚVideoClassification)Ú_log_api_usage_onceé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_KINETICS400_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interfaceÚS3DÚS3D_WeightsÚs3dc                       s6   e Zd Zeeeeeedejf dœ‡ fdd„Z‡  ZS )ÚTemporalSeparableConv.)Ú	in_planesÚ
out_planesÚkernel_sizeÚstrideÚpaddingÚ
norm_layerc                    sZ   t ƒ  t||d||fd||fd||fd|dt|||ddf|ddf|ddfd|d¡ d S )Né   r   F)r   r   r   Úbiasr   )ÚsuperÚ__init__r   )Úselfr   r   r   r   r   r   ©Ú	__class__© ú@/tmp/pip-unpacked-wheel-xh8d94dr/torchvision/models/video/s3d.pyr      s(    	ù	ùözTemporalSeparableConv.__init__)	Ú__name__Ú
__module__Ú__qualname__Úintr   r   ÚModuler   Ú__classcell__r#   r#   r!   r$   r      s   ùr   c                
       sB   e Zd Zeeeeeeeedejf dœ‡ fdd„Zdd„ Z‡  Z	S )ÚSepInceptionBlock3D.)r   Úb0_outÚb1_midÚb1_outÚb2_midÚb2_outÚb3_outr   c	           	         s¢   t ƒ  ¡  t||dd|d| _t t||dd|dt||ddd|d¡| _t t||dd|dt||ddd|d¡| _t tj	ddddt||dd|d¡| _
d S )Nr   ©r   r   r   r   )r   r   r   r   ©r   r   r   ©r   r   r   )r   r   r   Úbranch0r   Ú
Sequentialr   Úbranch1Úbranch2Ú	MaxPool3dÚbranch3)	r    r   r,   r-   r.   r/   r0   r1   r   r!   r#   r$   r   7   s    
þþþzSepInceptionBlock3D.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}t ||||fd¡}|S )Nr   )r5   r7   r8   r:   ÚtorchÚcat)r    ÚxZx0Úx1Zx2Zx3Úoutr#   r#   r$   ÚforwardR   s    



zSepInceptionBlock3D.forward)
r%   r&   r'   r(   r   r   r)   r   r@   r*   r#   r#   r!   r$   r+   6   s   ÷r+   c                       sF   e Zd ZdZdeeeedej	j
f  ddœ‡ fdd„Zd	d
„ Z‡  ZS )r   aW  S3D main class.

    Args:
        num_class (int): number of classes for the classification task.
        dropout (float): dropout probability.
        norm_layer (Optional[Callable]): Module specifying the normalization layer to use.

    Inputs:
        x (Tensor): batch of videos with dimensions (batch, channel, time, height, width)
    é  çš™™™™™É?N.)Únum_classesÚdropoutr   Úreturnc                    sŠ  t ƒ  ¡  t| ƒ |d kr*ttjddd}t tddddd|ƒtjddd	d
t	dddd|dtddddd|ƒtjddd	d
t
ddddddd|ƒt
ddddddd|ƒtjdddd
t
ddddddd|ƒt
ddddddd|ƒt
ddddddd|ƒt
ddddddd|ƒt
d ddd!ddd|ƒtjddd"d
t
d#ddd!ddd|ƒt
d#d$dd$ddd|ƒ¡| _tjd%dd&| _t tj|d'tjd(|ddd)d*¡| _d S )+Ngü©ñÒMbP?)ZepsZmomentumr   é@   é   r   )r   r   r   )r   r   r   )r   r   r   r4   r   r2   éÀ   é`   é€   é   é    é   r3   )r   r   r   )r   r   r   ià  éÐ   é0   i   é    ép   éà   é   é   i   i  i@  )r   r   r   i@  i€  )r   rG   rG   )r   r   )Úpi   T)r   r   r   )r   r   r
   r   r   ZBatchNorm3dr6   r   r9   r   r+   ÚfeaturesZ	AvgPool3dÚavgpoolZDropoutZConv3dÚ
classifier)r    rC   rD   r   r!   r#   r$   r   h   sB    
ûê
þzS3D.__init__c                 C   s0   |   |¡}|  |¡}|  |¡}tj|dd}|S )N)r   r   é   )Zdim)rV   rW   rX   r;   Zmean)r    r=   r#   r#   r$   r@   ’   s
    


zS3D.forward)rA   rB   N)r%   r&   r'   Ú__doc__r(   Úfloatr   r   r;   r   r)   r   r@   r*   r#   r#   r!   r$   r   \   s      üû*c                   @   sF   e Zd Zedeedddddedddd	d
ddœidddœ	dZeZdS )r   z4https://download.pytorch.org/models/s3d-d76dad2f.pth)rR   rR   )rM   rM   )Z	crop_sizeZresize_sizeé   zOhttps://github.com/pytorch/vision/tree/main/references/video_classification#s3dz®The weights aim to approximate the accuracy of the paper. The accuracies are estimated on clip-level with parameters `frame_rate=15`, `clips_per_video=1`, and `clip_len=128`.i0ô~ zKinetics-400gd;ßOQ@g33333V@)zacc@1zacc@5g´Èv¾Ÿú1@gF¶óýÔø?@)	Zmin_sizeZmin_temporal_sizeÚ
categoriesZrecipeZ_docsZ
num_paramsZ_metricsZ_opsÚ
_file_size)ÚurlZ
transformsÚmetaN)	r%   r&   r'   r   r   r	   r   ÚKINETICS400_V1ÚDEFAULTr#   r#   r#   r$   r   š   s.   ýþÿïùZ
pretrained)ÚweightsT)rc   Úprogress)rc   rd   ÚkwargsrE   c                 K   sR   t  | ¡} | dk	r(t|dt| jd ƒƒ tf |Ž}| dk	rN| | j|dd¡ |S )aŸ  Construct Separable 3D CNN model.

    Reference: `Rethinking Spatiotemporal Feature Learning <https://arxiv.org/abs/1712.04851>`__.

    .. betastatus:: video module

    Args:
        weights (:class:`~torchvision.models.video.S3D_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.video.S3D_Weights`
            below for more details, and possible values. By default, no
            pre-trained weights are used.
        progress (bool): If True, displays a progress bar of the download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.video.S3D`` base class.
            Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/video/s3d.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.video.S3D_Weights
        :members:
    NrC   r]   T)rd   Z
check_hash)r   Úverifyr   Úlenr`   r   Zload_state_dictZget_state_dict)rc   rd   re   Úmodelr#   r#   r$   r   ¹   s    

)!Ú	functoolsr   Útypingr   r   r   r;   r   Ztorchvision.ops.miscr   Ztransforms._presetsr	   Úutilsr
   Z_apir   r   r   Z_metar   Ú_utilsr   r   Ú__all__r6   r   r)   r+   r   r   ra   Úboolr   r#   r#   r#   r$   Ú<module>   s(   ý &>