o
    ߥi!*                     @   s   d Z ddlZddlmZ d ddZd dd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 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )"z" ResNet2plus1d Model Architecture.    N   c                 C   s,   t j| |dd||fd||f|dd||fdS )Nr      r   r   r   Fkernel_sizestridepaddinggroupsbiasdilationnnConv3d	in_planes
out_planesr   r	   r    r   j/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/cmdssl_video_embedding/resnet2p1d.py	conv1x3x3      r   c                 C   s,   t j| |d|ddf|ddf|d|ddfdS )Nr   r   r   r   r   Fr   r   r   r   r   r   	conv3x1x1   r   r   c                 C   s   t j| |d|ddS )Nr   F)r   r   r
   r   )r   r   r   r   r   r   	conv1x1x1%   s   
r   c                       s6   e Zd ZdZ						d fdd	Zdd Z  ZS )	
BasicBlockr   N@   c	                    s  t t|   |d u rtj}|dks|dkrtd|dkr"td|| d d d |d d |d   }	t||	|| _||	| _	t
|	||| _||| _|| d d d |d d |d   }
t||
| _||
| _t
|
|| _||| _tjdd| _|| _|| _d S )Nr   r   z3BasicBlock only supports groups=1 and base_width=64z(Dilation > 1 not supported in BasicBlockr   Tinplace)superr   __init__r   BatchNorm3d
ValueErrorNotImplementedErrorr   conv1_sbn1_sr   conv1_tbn1_tconv2_sbn2_sconv2_tbn2_tReLUrelu
downsampler   )selfinplanesplanesr   r,   r	   
base_widthr   
norm_layer
midplanes1
midplanes2	__class__r   r   r   -   s8   	




zBasicBlock.__init__c                 C      |}|  |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| j	d urC| 	|}||7 }| |}|S N)
r"   r#   r+   r$   r%   r&   r'   r(   r)   r,   r-   xidentityoutr   r   r   forwardR   s"   













zBasicBlock.forwardr   Nr   r   r   N__name__
__module____qualname__	expansionr   r<   __classcell__r   r   r4   r   r   *   s    %r   c                       s6   e Zd ZdZ						d	 fdd	Zdd Z  ZS )

Bottleneck   r   Nr   c	                    s   t t|   |d u rtj}t||d  | }	t||	| _||	| _|	|	 d d d |	d d |	d   }
t	|	|
|||| _
||
| _t|
|	|||| _||	| _t|	|| j | _||| j | _tjdd| _|| _|| _d S )Ng      P@r   Tr   )r   rD   r   r   r   intr   conv1bn1r   r&   r'   r   r(   r)   rB   conv3bn3r*   r+   r,   r   )r-   r.   r/   r   r,   r	   r0   r   r1   width	midplanesr4   r   r   r   n   s    	
(


zBottleneck.__init__c                 C   r6   r7   )
rG   rH   r+   r&   r'   r(   r)   rI   rJ   r,   r8   r   r   r   r<      s"   













zBottleneck.forwardr=   r>   r   r   r4   r   rD   k   s    rD   c                       sD   e Zd Z										d fdd		ZdddZdd Z  ZS )
ResNet2p1dNTr   r         ?r      c                    s  t t|   |d u rtj}|s|d urtd|| _|
| _d| _d| _	|d u r,g d}t
|dkr9td||| _|| _d| j d d d d| jd   }tj|	|d	d|
|
fd
dd| _||| _tj|| jddddd| _|| j| _tjdd| _tjdddd| _| |d|d | _| j|d|d d|d d| _| j|d|d d|d d| _| j|d|d d|d d| _|rtdnd | _|d u rd | _d | _nt || _t!d|j" || _d|j" | _#| $ D ].}t%|tjrtj&j'|j(ddd qt%|tjtj)frtj&*|j(d tj&*|j+d q|rH| $ D ]%}t%|t,r7tj&*|j-j(d q$t%|t.rFtj&*|j/j(d q$d S d S )Nz/num_classes should be None when last_pool=Falser   r   )FFFr   zHreplace_stride_with_dilation should be None or a 3-element tuple, got {}      )r   rP   rP   )r   r   r   F)r   r   r   r
   r   r   r   r   )r   r   r   Tr   r   )r   rO   rO   )r   r   r   )r   r   r   r      rO   )r   dilate   i   fan_outr+   )modenonlinearity)0r   rM   r   r   r   r    _norm_layerfirst_strider.   r   lenformatr	   r0   r   r"   r#   r$   r%   r*   r+   	MaxPool3dmaxpool_make_layerlayer1layer2layer3layer4AdaptiveAvgPool3davgpooldropoutfcDropoutLinearrB   r   modules
isinstanceinitkaiming_normal_weight	GroupNorm	constant_r
   rD   rJ   r   r)   )r-   blocklayersnum_classeszero_init_residualr	   width_per_groupreplace_stride_with_dilationrf   r.   rZ   r1   	last_poolrL   mr4   r   r   r      s   
zResNet2p1d.__init__Fc                 C   s   | j }d }| j}|r|  j|9  _d}|dks| j||j kr2tt| j||j ||||j }g }	|	|| j|||| j| j	|| ||j | _t
d|D ]}
|	|| j|| j| j	| j|d qPtj|	 S )Nr   )r	   r0   r   r1   )rY   r   r.   rB   r   
Sequentialr   appendr	   r0   range)r-   rq   r/   blocksr   rT   r1   r,   previous_dilationrr   _r   r   r   r_   	  s<   
	zResNet2p1d._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| j
rU| 
|}t|d}| jrU| jrU| |}| |}|S )Nr   )r"   r#   r+   r$   r%   r^   r`   ra   rb   rc   re   torchflattenrf   rg   )r-   r9   r   r   r   r<   &  s$   













zResNet2p1d.forward)
NTr   r   NrN   r   rO   NT)r   F)r?   r@   rA   r   r_   r<   rC   r   r   r4   r   rM      s    
arM   c                  K      t tg dfi | S )N)r   r   r   r   rM   r   kwargsr   r   r   resnet10_2p1d>     r   c                  K   r   N)rO   rO   rO   rO   r   r   r   r   r   resnet18_2p1dB  r   r   c                  K   r   r   rM   rD   r   r   r   r   resnet26_2p1dF  r   r   c                  K   r   N)r   rE      r   r   r   r   r   r   resnet34_2p1dJ  r   r   c                  K   r   r   r   r   r   r   r   resnet50_2p1dN  r   r   c                  K   r   )N)r   rE      r   r   r   r   r   r   resnet101_2p1dR  r   r   c                  K   r   )N)r      $   r   r   r   r   r   r   resnet152_2p1dV  r   r   c                  K   r   )N)r      r   r   r   r   r   r   r   resnet200_2p1dZ  r   r   rR   )r   )__doc__r   torch.nnr   r   r   r   Moduler   rD   rM   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s$   


A; 