o
    ߥif/                     @   s   d dl Z d dlmZ d dlmZ ddd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ZdddZdddZdddZdddZdS )    N)Backbone   r   r   c                 C      t j| |d|dddS )Nr      r   r   r   r   Fkernel_sizestridepaddingbiasnnConv3d	in_planes
out_planesr    r   h/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/action_detection/modules/resnet.py	conv1x3x3      r   c                 C   r   )N)r   r   r   r   Fr	   r   r   r   r   r   	conv3x3x3   r   r   c                 C   s   t j| |d|ddS )Nr   F)r
   r   r   r   r   r   r   r   	conv1x1x1   s   
r   c                 C   r   )N)r   r   r   )r   r   r   Fr	   r   r   r   r   r   	conv3x1x1!   r   r   c                       s@   e Zd ZdZ					d fdd	Zdd Zed	d
 Z  ZS )BasicBlock3Dr   c2dN@   c           
         s   t t|   d}d}	|d u rtj}|	dks|dkrtd|dkr&tdt|tr0|gd n|}|d | _	|| _
dgt|dd   }t|||| _||| _tjdd| _t||| _t||| _||| _|| _d S )	Nr   r   z3BasicBlock only supports groups=1 and base_width=64z(Dilation > 1 not supported in BasicBlockr   r   Tinplace)superr   __init__r   BatchNorm3d
ValueErrorNotImplementedError
isinstanceintt_strider   listr   conv1bn1ReLUrelur   conv1dconv2bn2
downsample)
selfinplanesplanesr   opr0   
base_width
norm_layerdilationgroups	__class__r   r   r!   .   s0   



zBasicBlock3D.__init__c                 C   s   |}|  |}| jdkrtj|| jddg| jddgd}| |}| |}| |}| |}| |}| j	d ur?| 	|}||7 }| |}|S )Nr   )r   )
r)   r'   torch
max_pool3dr*   r,   r-   r.   r/   r0   r1   xidentityoutr   r   r   forwardP   s    









zBasicBlock3D.forwardc                 C      | j jS N)r.   out_channelsr1   r   r   r   rD   g      zBasicBlock3D.out_channelsr   r   Nr   N	__name__
__module____qualname__	expansionr!   rA   propertyrD   __classcell__r   r   r9   r   r   +   s    "r   c                       s@   e Zd ZdZ					d fdd	Zdd	 Zed
d Z  ZS )Bottleneck3D   r   r   Nr   c           	         s   t t|   || _|d u rtj}t||d  }t|tr#|gd n|}|dkr.t||nt	||| _
||| _|dkrCt|||nt|||| _||| _t	||| j | _||| j | _tjdd| _|| _d S )Ng      P@r   p3dc3dTr   )r    rO   r!   r4   r   r"   r&   r%   r   r   r)   r*   r   r   r.   r/   rL   conv3bn3r+   r,   r0   )	r1   r2   r3   r   r4   r0   r5   r6   widthr9   r   r   r!   o   s.   


zBottleneck3D.__init__c                 C   s   |}|  |}| |}| |}| |}| |}| |}| jdkr*| |}| |}| |}| j	d ur>| 	|}||7 }| |}|S )Ntsm)
r)   r*   r,   r.   r/   r4   rV   rS   rT   r0   r=   r   r   r   rA      s    












zBottleneck3D.forwardc                 C   rB   rC   )rS   rD   rE   r   r   r   rD      rF   zBottleneck3D.out_channelsrG   rH   r   r   r9   r   rO   l   s    rO   c                       s^   e Zd Z							d fdd	Zdd
dZdd Zdd Zdd Ze	 dd Z
  ZS )ResNet3D  Fr   r   Nr   c              
      s6  |
| _ || _tt|   |d u rtj}|| _dddd| _g d| _	i | _
i | _d| _|	d u r4g d}	t|	dkrAtd|	|| _|| _tjd| jd	|d
 ddfddd| _|| j| _tjdd| _tjd|d ddfdd| _| j|d|d
 d|d |d
  d| _| j|d|d |d ddf||d
 d  d |d  d| _| j|d|d |d ddf|t|d d d
d  d |d  d| _| j|d|d |d ddf|t|d d d
d  d |d  d| _|d ur-td| _ tj!ddddd| _"t#d| _$|
d
kr!tj!d|j% |
dd| _&tj!|
|dd| _'ntj!d|j% |dd| _'| jd  j(| j
d!< | jd  j(| j
d"< | jd  j(| j
d#< | ) D ]0}t*|tjratj+j,|j-d$d%d& qLt*|tjtj.fr{tj+/|j-d tj+/|j0d
 qL|r| ) D ]}t*|t1rtj+/|j2j-d
 qd S d S )'N          )res3res4res5r   )FFFr   zHreplace_stride_with_dilation should be None or a 3-element tuple, got {})r      r_   r   rP   )r   r   r   F)r   r   r   Tr   r   r   r   )r
   r   r   r   )r   ops      i      )r   r   r_   )r
   r   g      ?)r
   r\   r]   r^   fan_outr,   )modenonlinearity)3
reduce_dimnum_classesr    rW   r!   r   r"   _norm_layer_out_feature_strides_out_features_out_feature_channelsoutputsr2   lenr#   formatr8   r5   r   r)   r*   r+   r,   	MaxPool3dmaxpool_make_layerlayer1layer2sumlayer3layer4AdaptiveAvgPool2davgpoolConv2dspatial_attenDropoutdroprL   rd_convclcrD   modulesr%   initkaiming_normal_weight	GroupNorm	constant_r   rO   rT   )r1   blocklayersr`   r'   ri   zero_init_residualr8   width_per_groupreplace_stride_with_dilationrh   r6   mr9   r   r   r!      s   
$$


zResNet3D.__init__r   c           
   
   C   s   | j }d }|dks| j||j kr$tt| j||j ||||j }g }||| j|||d || j| ||j | _td|D ]}	||| j|||	 | j|d qBtj| S )Nr   r   r   )r4   r5   r6   )	rj   r2   rL   r   
Sequentialr   appendr5   range)
r1   r   r3   blocksr`   r   r6   r0   r   ir   r   r   rs   
  s2   
zResNet3D._make_layerc                 C   s$  |  |}| |}| |}| |}| |}| |}| |}|jdd| jd< | 	|}|jdd| jd< | 
|}|jdd| jd< | jd urtj|dd}tj|jdddd	 |jdddfdd}| |}|t| }|| _| |}| jd	kr| |}|jd
d| jd< |S )NrP   )dimr\   r]   r^   r   T)r   keepdimr   rP   r   ftr)norm_xr)   r*   r,   rr   rt   ru   meanrn   rw   rx   ri   r;   catmaxr|   sigmoidscorerz   rh   r   )r1   r>   r   r   r   r   r   features#  s4   













zResNet3D.featuresc                 C   s   |  |}| |}|S rC   )r   r   )r1   r>   r   r   r   logitsA  s   

zResNet3D.logitsc                 C   s>   |  |}| jd ur| |}| |}t|d}|S | jS )Nr   )r   ri   r~   r   r;   r   rn   )r1   r>   r   r   r   r   rA   F  s   



zResNet3D.forwardc                 C   sD   | g dg d}| g dg d}||8 }|| }|S )N)g
ףp=
?gv/?gCl?)r   r   r   r   r   )gZd;O?gy&1?g?)
new_tensorreshape)r1   r>   r   sr   r   r   r   P  s
   zResNet3D.norm_x)rX   Fr   r   Nr   Nr   )rI   rJ   rK   r!   rs   r   r   rA   r;   no_gradr   rN   r   r   r9   r   rW      s    
a
rW   c                 C      t tg d| |||d}|S )N)r   rc      r   r`   r'   ri   rh   rW   rO   r`   r'   	num_classrh   netr   r   r   resnet101_3dY     r   c                 C   r   N)r   rc      r   r   r   r   r   r   r   resnet50_3dc  r   r   c                 C   r   r   rW   r   r   r   r   r   resnet34_3dm  r   r   c                 C   r   )N)rP   rP   rP   rP   r   r   r   r   r   r   resnet18_3dw  r   r   r   )r   )r;   torch.nnr   detectron2.modelingr   r   r   r   r   Moduler   rO   rW   r   r   r   r   r   r   r   r   <module>   s   






A; 
3




