U
    ­Ê¹jƒA  ã                	   @   sŽ  d dl mZ d dlmZmZmZmZmZmZm	Z	m
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d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j"ƒ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j"ƒZ'e	e
e#e$f  ee	e
ee!e f   ee( ed"ej"f ee e)ee'd#œd$d%„Z*d&ed'd(d)œZ+G d*d„ deƒZ,G d+d„ deƒZ-G d,d„ deƒZ.eƒ ed-e,j/fd.�dd/d0œee, e)ee'd1œd2d„ƒƒZ0eƒ ed-e-j/fd.�dd/d0œee- e)ee'd1œd3d„ƒƒZ1eƒ ed-e.j/fd.�dd/d0œee. e)ee'd1œd4d„ƒƒZ2dd5lm3Z3 e3e,j/j4e-j/j4e.j/j4d6œƒZ5dS )7é    )Úpartial)ÚAnyÚCallableÚListÚOptionalÚSequenceÚTupleÚTypeÚUnionN)ÚTensoré   )ÚVideoClassification)Ú_log_api_usage_onceé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_KINETICS400_CATEGORIES)Ú_ovewrite_named_paramÚhandle_legacy_interfaceÚVideoResNetÚR3D_18_WeightsÚMC3_18_WeightsÚR2Plus1D_18_WeightsÚr3d_18Úmc3_18Úr2plus1d_18c                       sP   e Zd Zd	eeee eeddœ‡ fdd„Zeeeeeef dœdd„ƒZ‡  Z	S )
ÚConv3DSimpleNé   ©Ú	in_planesÚ
out_planesÚ	midplanesÚstrideÚpaddingÚreturnc                    s   t ƒ j||d||dd� d S )N)r   r   r   F©Zin_channelsZout_channelsÚkernel_sizer#   r$   Úbias©ÚsuperÚ__init__©Úselfr    r!   r"   r#   r$   ©Ú	__class__© ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/models/video/resnet.pyr+      s    úzConv3DSimple.__init__©r#   r%   c                 C   s
   | | | fS ©Nr0   ©r#   r0   r0   r1   Úget_downsample_stride'   s    z"Conv3DSimple.get_downsample_stride)Nr   r   ©
Ú__name__Ú
__module__Ú__qualname__Úintr   r+   Ústaticmethodr   r5   Ú__classcell__r0   r0   r.   r1   r      s        ÿ    þr   c                       sL   e Zd Zd	eeeeeddœ‡ fdd„Zeeeeeef dœdd„ƒZ‡  ZS )
ÚConv2Plus1Dr   Nr   c                    s`   t ƒ  tj||dd||fd||fdd�t |¡tjdd�tj||d|ddf|ddfdd�¡ d S )	N©r   r   r   r   r   F©r'   r#   r$   r(   T©Zinplace©r   r   r   ©r*   r+   ÚnnÚConv3dÚBatchNorm3dÚReLUr,   r.   r0   r1   r+   -   s(    ú
     ÿõzConv2Plus1D.__init__r2   c                 C   s
   | | | fS r3   r0   r4   r0   r0   r1   r5   >   s    z!Conv2Plus1D.get_downsample_stride)r   r   )	r7   r8   r9   r:   r+   r;   r   r5   r<   r0   r0   r.   r1   r=   ,   s   r=   c                       sP   e Zd Zd	eeee eeddœ‡ fdd„Zeeeeeef dœdd„ƒZ‡  Z	S )
ÚConv3DNoTemporalNr   r   c                    s(   t ƒ j||dd||fd||fdd� d S )Nr>   r   r   Fr&   r)   r,   r.   r0   r1   r+   D   s    úzConv3DNoTemporal.__init__r2   c                 C   s
   d| | fS ©Nr   r0   r4   r0   r0   r1   r5   Q   s    z&Conv3DNoTemporal.get_downsample_stride)Nr   r   r6   r0   r0   r.   r1   rG   C   s        ÿ    þrG   c                       sR   e Zd ZdZd
eeedejf eeej ddœ‡ fdd„Z	e
e
dœdd	„Z‡  ZS )Ú
BasicBlockr   N.©ÚinplanesÚplanesÚconv_builderr#   Ú
downsampler%   c                    s”   || d d d |d d d|   }t ƒ  ¡  t |||||ƒt |¡tjdd�¡| _t ||||ƒt |¡¡| _tjdd�| _|| _	|| _
d S )Nr   Tr@   )r*   r+   rC   Ú
SequentialrE   rF   Úconv1Úconv2ÚrelurN   r#   ©r-   rK   rL   rM   r#   rN   r"   r.   r0   r1   r+   Z   s    (
  
ÿzBasicBlock.__init__©Úxr%   c                 C   sB   |}|   |¡}|  |¡}| jd k	r,|  |¡}||7 }|  |¡}|S r3   )rP   rQ   rN   rR   ©r-   rU   ZresidualÚoutr0   r0   r1   Úforwardm   s    




zBasicBlock.forward)r   N©r7   r8   r9   Ú	expansionr:   r   rC   ÚModuler   r+   r   rX   r<   r0   r0   r.   r1   rI   V   s     úùrI   c                       sR   e Zd ZdZdeeedejf eeej ddœ‡ fdd„Z	e
e
dœd	d
„Z‡  ZS )Ú
Bottlenecké   r   N.rJ   c                    sÒ   t ƒ  ¡  || d d d |d d d|   }t tj||ddd�t |¡tjdd�¡| _t |||||ƒt |¡tjdd�¡| _t tj||| j	 ddd�t || j	 ¡¡| _
tjdd�| _|| _|| _d S )Nr   r   F)r'   r(   Tr@   )r*   r+   rC   rO   rD   rE   rF   rP   rQ   rZ   Úconv3rR   rN   r#   rS   r.   r0   r1   r+   ~   s&    	
(  
ÿ  
ÿþzBottleneck.__init__rT   c                 C   sL   |}|   |¡}|  |¡}|  |¡}| jd k	r6|  |¡}||7 }|  |¡}|S r3   )rP   rQ   r^   rN   rR   rV   r0   r0   r1   rX   œ   s    





zBottleneck.forward)r   NrY   r0   r0   r.   r1   r\   {   s     úùr\   c                       s&   e Zd ZdZddœ‡ fdd„Z‡  ZS )Ú	BasicStemz$The default conv-batchnorm-relu stemN©r%   c              
      s4   t ƒ  tjddddddd�t d¡tjdd	�¡ d S )
Nr   é@   )r   é   rb   ©r   r   r   r>   Fr?   Tr@   rB   ©r-   r.   r0   r1   r+   ¯   s
    
ýzBasicStem.__init__©r7   r8   r9   Ú__doc__r+   r<   r0   r0   r.   r1   r_   ¬   s   r_   c                       s&   e Zd ZdZddœ‡ fdd„Z‡  ZS )ÚR2Plus1dStemzRR(2+1)D stem is different than the default one as it uses separated 3D convolutionNr`   c                    sZ   t ƒ  tjddddddd�t d¡tjdd	�tjdd
ddddd�t d
¡tjdd	�¡ d S )Nr   é-   )r   rb   rb   rc   )r   r   r   Fr?   Tr@   ra   rA   ©r   r   r   )r   r   r   rB   rd   r.   r0   r1   r+   º   s    

úzR2Plus1dStem.__init__re   r0   r0   r.   r1   rg   ·   s   rg   c                	       s¢   e Zd Zdeeeef  eeeee	e
f   ee edejf eeddœ‡ fdd„Zeedœd	d
„Zdeeeef  eeee	e
f  eeeejdœdd„Z‡  ZS )r   é�  F.N)ÚblockÚconv_makersÚlayersÚstemÚnum_classesÚzero_init_residualr%   c                    sœ  t ƒ  ¡  t| ƒ d| _|ƒ | _| j||d d|d dd�| _| j||d d|d dd�| _| j||d d|d dd�| _| j||d d	|d dd�| _	t
 d
¡| _t
 d	|j |¡| _|  ¡ D ]¢}t|t
jƒ�rt
jj|jddd� |jdk	�rbt
j |jd¡ qÀt|t
jƒ�r4t
j |jd¡ t
j |jd¡ qÀt|t
jƒrÀt
j |jdd¡ t
j |jd¡ qÀ|�r˜|  ¡ D ]$}t|tƒ�rrt
j |jjd¡ �qrdS )a^  Generic resnet video generator.

        Args:
            block (Type[Union[BasicBlock, Bottleneck]]): resnet building block
            conv_makers (List[Type[Union[Conv3DSimple, Conv3DNoTemporal, Conv2Plus1D]]]): generator
                function for each layer
            layers (List[int]): number of blocks per layer
            stem (Callable[..., nn.Module]): module specifying the ResNet stem.
            num_classes (int, optional): Dimension of the final FC layer. Defaults to 400.
            zero_init_residual (bool, optional): Zero init bottleneck residual BN. Defaults to False.
        ra   r   r   r4   é€   r   é   r   i   ri   Zfan_outrR   )ÚmodeZnonlinearityNg{®Gáz„?)r*   r+   r   rK   rn   Ú_make_layerÚlayer1Úlayer2Úlayer3Úlayer4rC   ZAdaptiveAvgPool3dÚavgpoolZLinearrZ   ÚfcÚmodulesÚ
isinstancerD   ÚinitZkaiming_normal_Úweightr(   Z	constant_rE   Znormal_r\   Zbn3)r-   rk   rl   rm   rn   ro   rp   Úmr.   r0   r1   r+   Æ   s2    
zVideoResNet.__init__rT   c                 C   sT   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| d¡}|  |¡}|S rH   )rn   ru   rv   rw   rx   ry   Úflattenrz   )r-   rU   r0   r0   r1   rX   ú   s    







zVideoResNet.forwardr   )rk   rM   rL   Úblocksr#   r%   c           
   	   C   s¬   d }|dks| j ||j krV| |¡}t tj| j ||j d|dd�t ||j ¡¡}g }| || j ||||ƒ¡ ||j | _ td|ƒD ]}	| || j ||ƒ¡ qˆtj|Ž S )Nr   F)r'   r#   r(   )	rK   rZ   r5   rC   rO   rD   rE   ÚappendÚrange)
r-   rk   rM   rL   r�   r#   rN   Z	ds_striderm   Úir0   r0   r1   rt   	  s    
þzVideoResNet._make_layer)rj   F)r   )r7   r8   r9   r	   r
   rI   r\   r   r   rG   r=   r   r:   r   rC   r[   Úboolr+   r   rX   rO   rt   r<   r0   r0   r.   r1   r   Å   s*     ùø4 úù.)rk   rl   rm   rn   ÚweightsÚprogressÚkwargsr%   c                 K   sP   |d k	rt |dt|jd ƒƒ t| |||f|Ž}|d k	rL| |j|dd�¡ |S )Nro   Ú
categoriesT)r‡   Z
check_hash)r   ÚlenÚmetar   Zload_state_dictZget_state_dict)rk   rl   rm   rn   r†   r‡   rˆ   Úmodelr0   r0   r1   Ú_video_resnet#  s    	r�   )r   r   zKhttps://github.com/pytorch/vision/tree/main/references/video_classificationz­The weights reproduce closely the accuracy of the paper. The accuracies are estimated on video-level with parameters `frame_rate=15`, `clips_per_video=5`, and `clip_len=16`.)Zmin_sizer‰   ZrecipeZ_docsc                	   @   s@   e Zd Zedeeddd�eddddd	œid
ddœ–d�ZeZdS )r   z7https://download.pytorch.org/models/r3d_18-b3b3357e.pth©ép   r�   ©rq   é«   ©Z	crop_sizeZresize_sizeiP5ýúKinetics-400gš™™™™™O@g-²�ï§ÞT@©zacc@1zacc@5gð§ÆK7YD@gåÐ"ÛùÖ_@©Z
num_paramsZ_metricsZ_opsÚ
_file_size©ÚurlZ
transformsr‹   N©	r7   r8   r9   r   r   r   Ú_COMMON_METAÚKINETICS400_V1ÚDEFAULTr0   r0   r0   r1   r   B  s   þÿöýc                	   @   s@   e Zd Zedeeddd�eddddd	œid
ddœ–d�ZeZdS )r   z7https://download.pytorch.org/models/mc3_18-a90a0ba3.pthrŽ   r�   r’   iPu² r“   g{®GáúO@g¸…ëQU@r”   g–C‹lç«E@g¼t“VF@r•   r—   Nr™   r0   r0   r0   r1   r   V  s   þÿöýc                	   @   s@   e Zd Zedeeddd�eddddd	œid
ddœ–d�ZeZdS )r   z<https://download.pytorch.org/models/r2plus1d_18-91a641e6.pthrŽ   r�   r’   i­»àr“   gƒÀÊ¡ÝP@g33333‹U@r”   gßO�—nBD@g1¬Z^@r•   r—   Nr™   r0   r0   r0   r1   r   j  s   þÿöýZ
pretrained)r†   T)r†   r‡   )r†   r‡   rˆ   r%   c                 K   s.   t  | ¡} tttgd ddddgt| |f|ŽS )aÔ  Construct 18 layer Resnet3D model.

    .. betastatus:: video module

    Reference: `A Closer Look at Spatiotemporal Convolutions for Action Recognition <https://arxiv.org/abs/1711.11248>`__.

    Args:
        weights (:class:`~torchvision.models.video.R3D_18_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.video.R3D_18_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.resnet.VideoResNet`` base class.
            Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/video/resnet.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.video.R3D_18_Weights
        :members:
    r]   r   )r   Úverifyr�   rI   r   r_   ©r†   r‡   rˆ   r0   r0   r1   r   ~  s    

úùc                 K   s4   t  | ¡} tttgtgd  ddddgt| |f|ŽS )aä  Construct 18 layer Mixed Convolution network as in

    .. betastatus:: video module

    Reference: `A Closer Look at Spatiotemporal Convolutions for Action Recognition <https://arxiv.org/abs/1711.11248>`__.

    Args:
        weights (:class:`~torchvision.models.video.MC3_18_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.video.MC3_18_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.resnet.VideoResNet`` base class.
            Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/video/resnet.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.video.MC3_18_Weights
        :members:
    r   r   )r   r�   r�   rI   r   rG   r_   rž   r0   r0   r1   r   £  s    

úùc                 K   s.   t  | ¡} tttgd ddddgt| |f|ŽS )aî  Construct 18 layer deep R(2+1)D network as in

    .. betastatus:: video module

    Reference: `A Closer Look at Spatiotemporal Convolutions for Action Recognition <https://arxiv.org/abs/1711.11248>`__.

    Args:
        weights (:class:`~torchvision.models.video.R2Plus1D_18_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.video.R2Plus1D_18_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.resnet.VideoResNet`` base class.
            Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/video/resnet.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.video.R2Plus1D_18_Weights
        :members:
    r]   r   )r   r�   r�   rI   r=   rg   rž   r0   r0   r1   r   È  s    

úù)Ú
_ModelURLs)r   r   r   )6Ú	functoolsr   Útypingr   r   r   r   r   r   r	   r
   Ztorch.nnrC   Ztorchr   Ztransforms._presetsr   Úutilsr   Z_apir   r   r   Ú_metar   Z_utilsr   r   Ú__all__rD   r   rO   r=   rG   r[   rI   r\   r_   rg   r   r:   r…   r�   rš   r   r   r   r›   r   r   r   rŸ   r˜   Z
model_urlsr0   r0   r0   r1   Ú<module>   sr   (ù%1_øû$#$#$$ýÿ