o
    )j((                     @   sr   d dl Z d dlmZ G dd dejZG dd dejZG dd dejZG dd	 d	ejZG d
d dejZdS )    Nc                       s,   e Zd ZdZ	d fdd	Zdd Z  ZS )InceptionBaseConv3Dz~
    Constructs basic inception 3D conv.
    Modified from https://github.com/TengdaHan/CoCLR/blob/main/backbone/s3dg.py.
    r   c                    sv   t t|   tj|||||dd| _t|| _tjdd| _	| jj
jjddd | jj
jd | jjj  d S )	NFkernel_sizestridepaddingbiasTZinplacer   {Gz?meanZstd   )superr   __init__nnConv3dconvBatchNorm3dbnReLUreluweightdatanormal_fill_r   zero_)selfcfg	in_planes
out_planesr   r   r   	__class__ m/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/action_recognition/s3dg.pyr      s    
zInceptionBaseConv3D.__init__c                 C   s"   |  |}| |}| |}|S N)r   r   r   r   xr!   r!   r"   forward&   s   


zInceptionBaseConv3D.forwardr   __name__
__module____qualname____doc__r   r&   __classcell__r!   r!   r   r"   r      s
    r   c                       s(   e Zd ZdZ fddZdd Z  ZS )InceptionBlock3D
    Element constructing the S3D/S3DG.
    See models/base/backbone.py L99-186.

    Modified from https://github.com/TengdaHan/CoCLR/blob/main/backbone/s3dg.py.
    c                    s.  t t|   |jjjj}t|dksJ t|t	sJ |\}}}}}	}
t
t|||ddd| _t
t|||dddt|||dddd| _t
t|||dddt|||	dddd| _t
t
jddddt|||
ddd| _t|||	|
g| _|| _|rt|| _t|| _t|	| _t|
| _d S d S )N   r   r   r      r   r   r   r2   r2   r2   )r   r.   r   ZVIDEOZBACKBONEBRANCHZGATINGlen
isinstancelistr   
Sequentialr   branch0STConv3dbranch1branch2	MaxPool3dbranch3sumZout_channelsgating
SelfGating	gating_b0	gating_b1	gating_b2	gating_b3)r   r   r   r   Z_gatingZnum_out_0_0aZnum_out_1_0aZnum_out_1_0bZnum_out_2_0aZnum_out_2_0bZnum_out_3_0br   r!   r"   r   5   sn   







zInceptionBlock3D.__init__c                 C   sn   |  |}| |}| |}| |}| jr+| |}| |}| |}| |}t	
||||fd}|S )Nr   )r:   r<   r=   r?   rA   rC   rD   rE   rF   torchcat)r   r%   Zx0x1Zx2Zx3outr!   r!   r"   r&   k   s   







zInceptionBlock3D.forwardr(   r!   r!   r   r"   r.   -   s    6r.   c                       s$   e Zd Z fddZdd Z  ZS )rB   c                    s    t t|   t||| _d S r#   )r   rB   r   r   ZLinearfc)r   Z	input_dimr   r!   r"   r   }   s   zSelfGating.__init__c                 C   sD   t j|g dd}| |}t |}|dddddddf | S )zFeature gating as used in S3D-G)   r2      )dimN)rG   r   rK   Zsigmoid)r   Zinput_tensorZspatiotemporal_averageweightsr!   r!   r"   r&      s   

zSelfGating.forward)r)   r*   r+   r   r&   r-   r!   r!   r   r"   rB   {   s    rB   c                       s8   e Zd ZdZ	d	 fdd	Z	d	ddZdd Z  ZS )
r;   r/   r   c              	      s`   t t|   t|tr|d }|d }n|}|jj| _t|jj	| _
| ||||||| d S )Nr   )r   r;   r   r7   tupleBNZMOMENTUMbn_mmtfloatZEPSbn_eps_construct_branch)r   r   r   r   r   r   r   t_strider   r!   r"   r      s   


zSTConv3d.__init__c                 C   s   t j||d||fd||fd||fdd| _t j|||ddf|ddf|ddfdd| _t j|| j| jd| _t j|| j| jd| _t j	dd| _
| jjjjddd	 | jjjjddd	 | jjjd | jjj  | jjjd | jjj  d S )
Nr   r   Fr   )epsZmomentumTr   r	   r
   )r   r   conv1conv2r   rU   rS   bn1bn2r   r   r   r   r   r   r   r   )r   r   r   r   r   r   rW   r   r!   r!   r"   rV      sB   



zSTConv3d._construct_branchc                 C   s@   |  |}| |}| |}| |}| |}| |}|S r#   )rY   r[   r   rZ   r\   r$   r!   r!   r"   r&      s   





zSTConv3d.forwardr'   )r)   r*   r+   r,   r   rV   r&   r-   r!   r!   r   r"   r;      s    
'r;   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )Inception3Dz~
    Backbone architecture for I3D/S3DG.
    Modified from https://github.com/TengdaHan/CoCLR/blob/main/backbone/s3dg.py.
    c                    s&   t t|   |jj}| || dS )zG
        Args:
            cfg (Config): global config object.
        N)r   r]   r   ZDATAZNUM_INPUT_CHANNELS_construct_backbone)r   r   Z_input_channelr   r!   r"   r      s   zInception3D.__init__c                 C   s  t ||ddddd| _t| j| _tjdddd| _t|ddd	d	d
| _t |dddd	d	d| _	t| j| j| j	| _
tjdddd| _t|dg dd| _t|dg dd| _t| j| j| j| _tjdddd| _t|dg dd| _t|dg dd| _t|dg dd| _t|dg dd| _t|dg dd| _t| j| j| j| j| j| j| _tjdddd| _t|dg dd| _t|dg dd| _t| j| j| j| _d S )N@      rL   r2   r3   )r   r2   r2   )r   rL   rL   )r   r   r   r   r1      )r_   `             re   )r   r      )rc   rc   ra   re   rb   r_   r4   )rL   rL   rL   )r   r   r   i  )ra   rb      rd   0   r_   i   )   p         r_   r_   )rc   rc   rf   rl   r_   r_   )rj      i   re   r_   r_   i  )rf   ri   i@  re   rc   rc   )r   r   r   i@  )  ra   rn   rh   rc   rc   )r;   ZConv_1ar   r9   block1r>   Z
MaxPool_2ar   ZConv_2bZConv_2cblock2Z
MaxPool_3ar.   ZMixed_3bZMixed_3cblock3Z
MaxPool_4aZMixed_4bZMixed_4cZMixed_4dZMixed_4eZMixed_4fblock4Z
MaxPool_5aZMixed_5bZMixed_5cblock5)r   r   Zinput_channelr!   r!   r"   r^      s   







	


zInception3D._construct_backbonec                 C   sH   t |tr	|d }| |}| |}| |}| |}| |}|S )NZvideo)r7   dictro   rp   rq   rr   rs   r$   r!   r!   r"   r&   (  s   





zInception3D.forward)r)   r*   r+   r,   r   r^   r&   r-   r!   r!   r   r"   r]      s
    	Dr]   )	rG   Ztorch.nnr   Moduler   r.   rB   r;   r]   r!   r!   r!   r"   <module>   s   %NL