o
    )jf/                     @   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Z	in_planesZ
out_planesr    r   u/var/www/html/Deteccion_Ine/venv/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Zinplace)superr   __init__r   BatchNorm3d
ValueErrorNotImplementedError
isinstanceintt_strider   listr   conv1bn1ReLUrelur   conv1dconv2bn2
downsample)
selfinplanesplanesr   opr-   
base_width
norm_layerZ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$   torchZ
max_pool3dr'   r)   r*   r+   r,   r-   r.   xidentityoutr   r   r   forwardP   s    









zBasicBlock3D.forwardc                 C      | j jS N)r+   out_channelsr.   r   r   r   r?   g      zBasicBlock3D.out_channelsr   r   Nr   N	__name__
__module____qualname__	expansionr   r<   propertyr?   __classcell__r   r   r5   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   Zp3dZc3dTr   )r   rJ   r   r1   r   r   r#   r"   r   r   r&   r'   r   r   r+   r,   rG   conv3bn3r(   r)   r-   )	r.   r/   r0   r   r1   r-   r2   r3   widthr5   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,   r1   rO   rL   rM   r-   r8   r   r   r   r<      s    












zBottleneck3D.forwardc                 C   r=   r>   )rL   r?   r@   r   r   r   r?      rA   zBottleneck3D.out_channelsrB   rC   r   r   r5   r   rJ   l   s    rJ   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      rX   r   rK   )r   r   r   F)r   r   r   Tr   r   r   r   )r
   r   r   r   )r   ops      i      )r   r   rX   )r
   r   g      ?)r
   rU   rV   rW   Zfan_outr)   )modeZnonlinearity)3
reduce_dimnum_classesr   rP   r   r   r   _norm_layerZ_out_feature_stridesZ_out_featuresZ_out_feature_channelsoutputsr/   lenr    formatr4   r2   r   r&   r'   r(   r)   Z	MaxPool3dmaxpool_make_layerlayer1layer2sumlayer3layer4ZAdaptiveAvgPool2davgpoolZConv2dspatial_attenZDropoutdroprG   rd_convclcr?   modulesr"   initZkaiming_normal_weightZ	GroupNormZ	constant_r   rJ   rM   )r.   blocklayersrY   r$   r`   Zzero_init_residualr4   Zwidth_per_groupZreplace_stride_with_dilationr_   r3   mr5   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   )r1   r2   r3   )	ra   r/   rG   r   Z
Sequentialr   appendr2   range)
r.   rt   r0   blocksrY   r   r3   r-   ru   ir   r   r   rf   
  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 )NrK   )dimrU   rV   rW   r   T)r{   Zkeepdimr   rK   r   ftr)norm_xr&   r'   r)   re   rg   rh   meanrb   rj   rk   r`   r7   catmaxrm   Zsigmoidscorerl   r_   ro   )r.   r9   r}   r   r   r   r   features#  s4   













zResNet3D.featuresc                 C   s   |  |}| |}|S r>   )r   rp   )r.   r9   r   r   r   logitsA  s   

zResNet3D.logitsc                 C   s>   |  |}| jd ur| |}| |}t|d}|S | jS )Nr|   )r   r`   rn   rp   r7   r   rb   )r.   r9   r}   r   r   r   r<   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?)Z
new_tensorZreshape)r.   r9   rv   sr   r   r   r~   P  s
   zResNet3D.norm_x)rQ   Fr   r   Nr   Nr   )rD   rE   rF   r   rf   r   r   r<   r7   Zno_gradr~   rI   r   r   r5   r   rP      s    
a
rP   c                 C      t tg d| |||d}|S )N)r   r\      r   rY   r$   r`   r_   rP   rJ   rY   r$   Z	num_classr_   netr   r   r   resnet101_3dY     r   c                 C   r   N)r   r\      r   r   r   r   r   r   r   resnet50_3dc  r   r   c                 C   r   r   rP   r   r   r   r   r   resnet34_3dm  r   r   c                 C   r   )N)rK   rK   rK   rK   r   r   r   r   r   r   resnet18_3dw  r   r   r   )r   )r7   Ztorch.nnr   Zdetectron2.modelingr   r   r   r   r   Moduler   rJ   rP   r   r   r   r   r   r   r   r   <module>   s   






A; 
3




