o
    )j!*                     @   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   w/var/www/html/Deteccion_Ine/venv/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Z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_layerZ
midplanes1Z
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   r9   __classcell__r   r   r1   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   rA   r   r   r   intr   conv1bn1r   r%   r&   r   r'   r(   r?   conv3bn3r)   r*   r+   r   )r,   r-   r.   r   r+   r	   r/   r   r0   width	midplanesr1   r   r   r   n   s    	
(


zBottleneck.__init__c                 C   r3   r4   )
rD   rE   r*   r%   r&   r'   r(   rF   rG   r+   r5   r   r   r   r9      s"   













zBottleneck.forwardr:   r;   r   r   r1   r   rA   k   s    rA   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   rM   rM   )r   r   r   F)r   r   r   r
   r   r   r   r   )r   r   r   Tr   r   )r   rL   rL   )r   r   r   )r   r   r   r      rL   )r   dilate   i   Zfan_outr*   )modeZnonlinearity)0r   rJ   r   r   r   r   _norm_layerfirst_strider-   r   lenformatr	   r/   r   r!   r"   r#   r$   r)   r*   Z	MaxPool3dmaxpool_make_layerlayer1layer2layer3layer4ZAdaptiveAvgPool3davgpooldropoutfcZDropoutZLinearr?   r   modules
isinstanceinitZkaiming_normal_weightZ	GroupNormZ	constant_r
   rA   rG   r   r(   )r,   blocklayersZnum_classesZzero_init_residualr	   Zwidth_per_groupZreplace_stride_with_dilationr_   r-   rU   r0   Z	last_poolrI   mr1   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	   r/   r   r0   )rT   r   r-   r?   r   Z
Sequentialr   appendr	   r/   range)r,   re   r.   blocksr   rQ   r0   r+   Zprevious_dilationrf   _r   r   r   rY   	  s<   
	zResNet2p1d._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| j
rU| 
|}t|d}| jrU| jrU| |}| |}|S )Nr   )r!   r"   r*   r#   r$   rX   rZ   r[   r\   r]   r^   torchflattenr_   r`   )r,   r6   r   r   r   r9   &  s$   













zResNet2p1d.forward)
NTr   r   NrK   r   rL   NT)r   F)r<   r=   r>   r   rY   r9   r@   r   r   r1   r   rJ      s    
arJ   c                  K      t tg dfi | S )N)r   r   r   r   rJ   r   kwargsr   r   r   resnet10_2p1d>     rr   c                  K   rn   N)rL   rL   rL   rL   ro   rp   r   r   r   resnet18_2p1dB  rs   ru   c                  K   rn   rt   rJ   rA   rp   r   r   r   resnet26_2p1dF  rs   rw   c                  K   rn   N)r   rB      r   ro   rp   r   r   r   resnet34_2p1dJ  rs   rz   c                  K   rn   rx   rv   rp   r   r   r   resnet50_2p1dN  rs   r{   c                  K   rn   )N)r   rB      r   rv   rp   r   r   r   resnet101_2p1dR  rs   r}   c                  K   rn   )N)r      $   r   rv   rp   r   r   r   resnet152_2p1dV  rs   r   c                  K   rn   )N)r      r   r   rv   rp   r   r   r   resnet200_2p1dZ  rs   r   rO   )r   )__doc__rl   Ztorch.nnr   r   r   r   Moduler   rA   rJ   rr   ru   rw   rz   r{   r}   r   r   r   r   r   r   <module>   s$   


A; 