o
    ߥi"                     @   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   h/home/ubuntu/.local/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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   r7   r   r   r   intr   r   r   r   r    r!   r5   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!   r:   r;   r"   r+   r   r   r   r/   h   s   










zBottleneck.forwardr0   r1   r   r   r(   r   r7   N   s    r7   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      rA   )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   fan_outr   )modenonlinearity)-r   r=   r   r   r   r   _norm_layerr$   r	   lenformatr   r&   r   r   r   r   r   	MaxPool3dmaxpool_make_layerlayer1layer2layer3layer4AdaptiveAvgPool3davgpooldropoutfcDropoutLinearr5   r   modules
isinstanceinitkaiming_normal_weight	GroupNorm	constant_r   r7   r;   r   r!   )r#   blocklayersnum_classeszero_init_residualr   width_per_groupreplace_stride_with_dilationrU   r$   first_strider'   	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'   )rI   r	   r$   r5   r   
Sequentialr   appendr   r&   range)r#   r`   r%   blocksr   rC   r'   r"   previous_dilationra   _r   r   r   rN      s<   
	zResNet3d._make_layerc                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| jrF| |}t	
|d}| jrF| jrF| |}| |}|S )Nr   )r   r   r   rM   rO   rP   rQ   rR   rT   torchflattenrU   rV   )r#   r,   r   r   r   r/      s   










zResNet3d.forward)
r>   Tr   r   Nr?   r   r@   NT)r   F)r2   r3   r4   r   rN   r/   r6   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     ru   c                  K   rq   N)r@   r@   r@   r@   rr   rs   r   r   r   resnet18_3d  rv   rx   c                  K   rq   rw   r=   r7   rs   r   r   r   resnet26_3d  rv   rz   c                  K   rq   N)r   r8      r   rr   rs   r   r   r   resnet34_3d  rv   r}   c                  K   rq   r{   ry   rs   r   r   r   resnet50_3d  rv   r~   c                  K   rq   )N)r   r8      r   ry   rs   r   r   r   resnet101_3d  rv   r   c                  K   rq   )N)r      $   r   ry   rs   r   r   r   resnet152_3d  rv   r   c                  K   rq   )N)r      r   r   ry   rs   r   r   r   resnet200_3d#  rv   r   rE   )r   )__doc__ro   torch.nnr   r   r   Moduler   r7   r=   ru   rx   rz   r}   r~   r   r   r   r   r   r   r   <module>   s"   

01 	