o
    )j"                     @   s   d Z ddlZddlm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 ResNet3D Model Architecture.    N   c              
   C   s   t j| |d|||d|dS )N   F)kernel_sizestridepaddinggroupsbiasdilationnnConv3d)	in_planes
out_planesr   r   r	    r   u/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/cmdssl_video_embedding/resnet3d.py	conv3x3x3   s   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t|||| _||| _	tj
dd| _t||| _||| _|| _|| _d S )Nr   r   z3BasicBlock only supports groups=1 and base_width=64z(Dilation > 1 not supported in BasicBlockTZinplace)superr   __init__r   BatchNorm3d
ValueErrorNotImplementedErrorr   conv1bn1ReLUreluconv2bn2
downsampler   )	selfinplanesplanesr   r!   r   
base_widthr	   
norm_layer	__class__r   r   r   !   s$   	


zBasicBlock.__init__c                 C   s`   |}|  |}| |}| |}| |}| |}| jd ur%| |}||7 }| |}|S N)r   r   r   r   r    r!   r"   xidentityoutr   r   r   forward;   s   







zBasicBlock.forwardr   Nr   r   r   N__name__
__module____qualname__	expansionr   r.   __classcell__r   r   r'   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||	| _||	| _t	|	|	|||| _
||	| _t|	|| j | _||| j | _tjdd| _|| _|| _d S )Ng      P@Tr   )r   r6   r   r   r   intr   r   r   r   r   r    r4   conv3bn3r   r   r!   r   )
r"   r#   r$   r   r!   r   r%   r	   r&   widthr'   r   r   r   Q   s   	


zBottleneck.__init__c                 C   s~   |}|  |}| |}| |}| |}| |}| |}| |}| |}| jd ur4| |}||7 }| |}|S r)   )r   r   r   r   r    r9   r:   r!   r*   r   r   r   r.   h   s   










zBottleneck.forwardr/   r0   r   r   r'   r   r6   N   s    r6   c                       sD   e Zd Z										d fd	d
	ZdddZdd Z  ZS )ResNet3d  Tr   r   N      ?r      c                    sD  t t|   |d u rtj}|s|d urtd|| _d| _d| _|d u r)g d}t	|dkr6td
||| _|| _tj|	| jdd|
|
f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rtj#j$|j%ddd qt"|tjtj&frtj#'|j%d tj#'|j(d q|r| ! D ]#}t"|t)rtj#'|j*j%d qt"|t+rtj#'|j,j%d qd 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      r@   )r   r   r   F)r   r   r   r   Tr   )r   r?   r?   )r   r   r   )r   r   r   r      r?   )r   dilate   i   r   r   r   Zfan_outr   )modeZnonlinearity)-r   r<   r   r   r   r   _norm_layerr#   r	   lenformatr   r%   r   r   r   r   r   Z	MaxPool3dmaxpool_make_layerlayer1layer2layer3layer4ZAdaptiveAvgPool3davgpooldropoutfcZDropoutZLinearr4   r   modules
isinstanceinitZkaiming_normal_weightZ	GroupNormZ	constant_r   r6   r:   r   r    )r"   blocklayersZnum_classesZzero_init_residualr   Zwidth_per_groupZreplace_stride_with_dilationrP   r#   Zfirst_strider&   Z	last_poolmr'   r   r   r      s   zResNet3d.__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	   r&   )rF   r	   r#   r4   r   Z
Sequentialr   appendr   r%   range)r"   rV   r$   blocksr   rB   r&   r!   Zprevious_dilationrW   _r   r   r   rJ      s<   
	zResNet3d._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| jrF| |}t	
|d}| jrF| jrF| |}| |}|S )Nr   )r   r   r   rI   rK   rL   rM   rN   rO   torchflattenrP   rQ   )r"   r+   r   r   r   r.      s   










zResNet3d.forward)
r=   Tr   r   Nr>   r   r?   NT)r   F)r1   r2   r3   r   rJ   r.   r5   r   r   r'   r   r<      s    
Tr<   c                  K      t tg dfi | S )N)r   r   r   r   r<   r   kwargsr   r   r   resnet10_3d     rc   c                  K   r_   N)r?   r?   r?   r?   r`   ra   r   r   r   resnet18_3d  rd   rf   c                  K   r_   re   r<   r6   ra   r   r   r   resnet26_3d  rd   rh   c                  K   r_   N)r   r7      r   r`   ra   r   r   r   resnet34_3d  rd   rk   c                  K   r_   ri   rg   ra   r   r   r   resnet50_3d  rd   rl   c                  K   r_   )N)r   r7      r   rg   ra   r   r   r   resnet101_3d  rd   rn   c                  K   r_   )N)r      $   r   rg   ra   r   r   r   resnet152_3d  rd   rq   c                  K   r_   )N)r      rp   r   rg   ra   r   r   r   resnet200_3d#  rd   rs   rD   )r   )__doc__r]   Ztorch.nnr   r   r   Moduler   r6   r<   rc   rf   rh   rk   rl   rn   rq   rs   r   r   r   r   <module>   s"   

01 	