o
    *ÎjÍ;  ã                   @   sr  d dl Z d dlmZ d dlm  mZ d dlmZ d dlm	Z	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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ƒZG dd„ deƒZG dd„ deƒ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G d$d%„ d%ejƒZdS )&é    N)Úmodels)ÚcbamÚ
mod_resnetc                       ó&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚResBlockNc                    sj   t t| ƒ ¡  |d u r|}||krd | _n
tj||ddd| _tj||ddd| _tj||ddd| _d S ©Né   é   ©Úkernel_sizeÚpadding)Úsuperr   Ú__init__Ú
downsampleÚnnÚConv2dÚconv1Úconv2©ÚselfÚindimÚoutdim©Ú	__class__© úw/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/video_object_segmentation/modules.pyr      s   ÿzResBlock.__init__c                 C   s<   |   t |¡¡}|  t |¡¡}| jd ur|  |¡}|| S ©N)r   ÚFÚrelur   r   ©r   ÚxÚrr   r   r   Úforward   s
   

zResBlock.forwardr   ©Ú__name__Ú
__module__Ú__qualname__r   r"   Ú__classcell__r   r   r   r   r      s    r   c                       ó$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚFeatureFusionBlockc                    s2   t ƒ  ¡  t||ƒ| _t |¡| _t||ƒ| _d S r   )r   r   r   Úblock1r   ZCBAMÚ	attentionÚblock2r   r   r   r   r   '   s   
zFeatureFusionBlock.__init__c                 C   s6   t  ||gd¡}|  |¡}|  |¡}|  || ¡}|S ©Nr	   )ÚtorchÚcatr*   r+   r,   )r   r    Úf16r!   r   r   r   r"   .   s
   

zFeatureFusionBlock.forwardr#   r   r   r   r   r)   %   ó    r)   c                       r(   )ÚValueEncoderSOc                    ó`   t ƒ  ¡  tjddd}|j| _|j| _|j| _|j| _|j| _|j	| _	|j
| _
tddƒ| _d S )NFr	   ©Ú
pretrainedZ
extra_chané   é   ©r   r   r   Zresnet18r   Úbn1r   ÚmaxpoolÚlayer1Úlayer2Úlayer3r)   Úfuser©r   Zresnetr   r   r   r   ;   ó   
zValueEncoderSO.__init__c                 C   sf   t  ||gd¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  	||¡}|S r-   ©
r.   r/   r   r9   r   r:   r;   r<   r=   r>   )r   ÚimageÚkey_f16ÚmaskÚfr    r   r   r   r"   J   s   






zValueEncoderSO.forwardr#   r   r   r   r   r2   9   ó    r2   c                       r(   )ÚValueEncoderc                    r3   )NFé   r4   r6   r7   r8   r?   r   r   r   r   _   r@   zValueEncoder.__init__c                 C   sh   t  |||gd¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  	||¡}|S r-   rA   )r   rB   rC   rD   Zother_masksrE   r    r   r   r   r"   n   s   






zValueEncoder.forwardr#   r   r   r   r   rG   ]   rF   rG   c                       r(   )Ú
KeyEncoderc                    sR   t ƒ  ¡  tjdd}|j| _|j| _|j| _|j| _|j| _	|j
| _
|j| _d S )NF)r5   )r   r   r   Zresnet50r   r9   r   r:   r;   Úres2r<   r=   r?   r   r   r   r   „   s   
zKeyEncoder.__init__c                 C   sP   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|||fS r   )r   r9   r   r:   rJ   r<   r=   )r   rE   r    Zf4Zf8r0   r   r   r   r"   ’   s   







zKeyEncoder.forwardr#   r   r   r   r   rI   ‚   s    rI   c                       r   )ÚUpsampleBlockrH   c                    s4   t ƒ  ¡  tj||ddd| _t||ƒ| _|| _d S r   )r   r   r   r   Ú	skip_convr   Úout_convÚscale_factor)r   Zskip_cZup_cZout_crN   r   r   r   r       s   

zUpsampleBlock.__init__c                 C   s0   |   |¡}|tj|| jddd }|  |¡}|S )NZbilinearF)rN   ÚmodeZalign_corners)rL   r   ZinterpolaterN   rM   )r   Zskip_fZup_fr    r   r   r   r"   ¦   s   
ü
zUpsampleBlock.forward©rH   r#   r   r   r   r   rK   ž   s    rK   c                       r(   )ÚKeyProjectionc                    sF   t ƒ  ¡  tj||ddd| _tj | jjj¡ tj 	| jj
j¡ d S r   )r   r   r   r   Úkey_projÚinitZorthogonal_ÚweightÚdataZzeros_Úbias)r   r   Zkeydimr   r   r   r   ³   s   
zKeyProjection.__init__c                 C   s
   |   |¡S r   )rR   ©r   r    r   r   r   r"   º   s   
zKeyProjection.forwardr#   r   r   r   r   rQ   ±   r1   rQ   c                       s.   e Zd Z				d	‡ fdd„	Zdd„ Z‡  ZS )
Ú_NonLocalBlockNDNr   TFc           	   	      sj  t t| ƒ ¡  |dv sJ ‚|| _|| _|| _|| _| jd u r+|d | _| jdkr+d| _|dkr<tj}tj	dd}tj
}n|dkrMtj}tjdd}tj}ntj}tjdd}tj}|| j| jdddd	| _|r{t || j| jdddd	|| jƒ¡| _n|| j| jdddd	| _|| j| jdddd	| _|| j| jdddd	| _|r³t | j|¡| _t | j|¡| _d S d S )
N)r	   rH   r   rH   r   r	   r   )r	   rH   rH   )r   )rH   rH   )Úin_channelsZout_channelsr   Ústrider   )r   rX   r   Ú	dimensionÚ
sub_samplerY   Úinter_channelsr   ÚConv3dZ	MaxPool3dÚInstanceNorm3dr   Z	MaxPool2dZBatchNorm2dZConv1dZ	MaxPool1dZBatchNorm1dÚgÚ
SequentialÚWÚthetaÚphi)	r   rY   r]   r[   r\   Úbn_layerZconv_ndZmax_pool_layerZbnr   r   r   r   À   s€   


ûûú
û	ûûþz_NonLocalBlockND.__init__c                 C   sÜ   |  d¡}|  |¡ || jd¡}| ddd¡}|  |¡ || jd¡}| ddd¡}|  |¡ || jd¡}t ||¡}|  d¡}|| }t ||¡}	|	 ddd¡ 	¡ }	|	j|| jg|  ¡ dd… ¢R Ž }	|  
|	¡}
|
| }|S )z<
        :param x: (b, c, t, h, w)
        :return:
        r   éÿÿÿÿrH   r	   N)Úsizer`   Úviewr]   Zpermuterc   rd   r.   ÚmatmulÚ
contiguousrb   )r   r    Z
batch_sizeZg_xZtheta_xZphi_xrE   ÚNZf_div_CÚyZW_yÚzr   r   r   r"     s   

"
z_NonLocalBlockND.forward)Nr   TFr#   r   r   r   r   rX   ¾   s    ûOrX   c                       ó$   e Zd Z			d‡ fdd„	Z‡  ZS )ÚNONLocalBlock1DNTc                    ó   t t| ƒj||d||d d S )Nr	   ©r]   r[   r\   re   )r   ro   r   ©r   rY   r]   r\   re   r   r   r   r   ,  ó   

ûzNONLocalBlock1D.__init__©NTT©r$   r%   r&   r   r'   r   r   r   r   ro   *  ó
    üro   c                       s$   e Zd Z			d‡ fdd„	Z‡  ZS )ÚNONLocalBlock2DNTFc                    rp   )NrH   rq   )r   rw   r   rr   r   r   r   r   ;  rs   zNONLocalBlock2D.__init__)NTFru   r   r   r   r   rw   9  rv   rw   c                       rn   )ÚNONLocalBlock3DNTc                    rp   )Nr   rq   )r   rx   r   rr   r   r   r   r   J  rs   zNONLocalBlock3D.__init__rt   ru   r   r   r   r   rx   H  rv   rx   c                       r(   )Ú_ASPPModule3Dc              	      s,   t t| ƒ ¡  tj|||d||dd| _d S )Nr	   F)r   rZ   r   ÚdilationrV   )r   ry   r   r   r^   Úatrous_conv)r   ÚinplanesÚplanesr   r   rz   r   r   r   r   Y  s   ùz_ASPPModule3D.__init__c                 C   s   |   |¡}tj|ddS )NT©Zinplace)r{   r   r   rW   r   r   r   r"   d  s   
z_ASPPModule3D.forwardr#   r   r   r   r   ry   W  s    ry   c                       r   )ÚASPP3Dé   c              	      sà   t ƒ  ¡  g d¢}|| }t||dd|d d| _t||dd|d |d fd|d |d fd| _t||dd|d |d fd|d |d fd| _t||dd|d |d fd|d |d fd| _tj|d |dd	d
d| _	d S )N)r	   rH   r€   é   r	   r   )r   rz   ©r	   r   r   rH   r   r€   ©r   r	   r	   F)r   r   rV   )
r   r   ry   Úaspp1Úaspp2Úaspp3Úaspp4r   r^   r   )r   Zin_planeZ	out_planeÚ	reductionZ	dilationsZ	mid_planer   r   r   r   k  s>   
ÿüüüûzASPP3D.__init__c                 C   sV   |   |¡}|  |¡}|  |¡}|  |¡}tj||||fdd}tj|  |¡dd}|S )Nr	   )ÚdimTr~   )	r„   r…   r†   r‡   r.   r/   r   r   r   )r   r    Úx1Zx2Zx3Zx4r   r   r   r"   ‡  s   



zASPP3D.forward)r€   r#   r   r   r   r   r   i  s    r   c                       r   )ÚSELayerSé   c              	      sd   t t| ƒ ¡  |d }t d¡| _t tj||| ddtjddtj|| |ddt 	¡ ¡| _
d S )NrH   )rH   r	   r	   F)rV   Tr~   )r   r‹   r   r   ZAdaptiveAvgPool3dÚavg_poolra   ZLinearÚReLUZSigmoidÚfc)r   Zchannelrˆ   r   r   r   r   “  s   

ýzSELayerS.__init__c                 C   sN   |  ¡ \}}}}}|  |¡ |d| ¡}|  |¡ ||ddd¡}|| |¡ S )NrH   r	   )rg   r   rh   r   Z	expand_as)r   r    ÚbÚcÚ_rl   r   r   r   r"   œ  s   zSELayerS.forward)rŒ   r#   r   r   r   r   r‹   ‘  s    	r‹   c                       s0   e Zd ZdZ			d‡ fdd„	Zdd„ Z‡  ZS )	ÚSEBasicBlockr	   Né   c                    s„   t t| ƒ ¡  tj||ddd| _t |¡| _tjdd| _	tj||ddd| _
t |¡| _t||ƒ| _t |¡| _|| _|| _d S )Nr‚   rƒ   r
   Tr~   )r   r“   r   r   r^   r   r_   Úin1rŽ   r   r   Úin2r‹   ÚsesÚin3r   rZ   )r   r|   r}   rZ   r   rˆ   r   r   r   r   ¨  s   ÿÿ
zSEBasicBlock.__init__c                 C   st   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd ur/|  |¡}||7 }|  |¡}|S r   )r   r•   r   r   r–   r—   r˜   r   )r   r    ZresidualÚoutr   r   r   r"   »  s   









zSEBasicBlock.forward)r	   Nr”   )r$   r%   r&   Z	expansionr   r"   r'   r   r   r   r   r“   £  s    ûr“   c                       s4   e Zd ZdZd‡ fdd„	Zddd	„Zd
d„ Z‡  ZS )ÚSAMz2
    Spatio-temporal aggregation module (SAM)
    Nr   Fc                    s\   t t| ƒ ¡  || _|| _|d u r|}|dkr|  |¡| _t||dd| _t	|dd| _
d S )Nr   r€   )rˆ   F)re   )r   rš   r   r   ÚrepeatÚseRepeatÚse_blockr   r   rx   Ú	non_local)r   r   r   r›   Únormr   r   r   r   Õ  s   zSAM.__init__rH   c                    s"   t jt  ‡ fdd„t|ƒD ƒ¡Ž S )Nc                    s   g | ]	}t ˆ jˆ jƒ‘qS r   )r“   r   )Ú.0r’   ©r   r   r   Ú
<listcomp>ä  s    z SAM.seRepeat.<locals>.<listcomp>)r   ra   Z
ModuleListÚrange)r   r›   r   r¡   r   rœ   â  s   ÿzSAM.seRepeatc                 C   s4   |   |¡}| jdkr|  |¡}|}|  |¡| }|S )Nr   )rž   r›   r   r   r   r   r   r   r"   æ  s   


zSAM.forward)Nr   FrP   )r$   r%   r&   Ú__doc__r   rœ   r"   r'   r   r   r   r   rš   Ð  s
    
rš   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚMemCrompressr   Tc                    sZ   t ƒ  ¡  tdd||d| _tdd||d| _tjddddd| _tjddddd| _d S )Né@   )r›   rŸ   r7   )rH   r   r   rƒ   r
   )	r   r   rš   Úkey_encoderÚvalue_encoderr   r^   Úcompress_keyÚcompress_value)r   r›   rŸ   r   r   r   r   ò  s   
ÿÿzMemCrompress.__init__c                 C   s\   |j \}}}}}}|jddd}|  |  |¡¡}	|  |  |¡¡}
|
 |||d||¡}
|	|
fS )Nr   r	   )Z	start_dimZend_dim)ÚshapeÚflattenr©   r§   rª   r¨   rh   )r   ÚkeyÚvaluerk   ÚOÚCÚTÚHrb   ÚkÚvr   r   r   r"   þ  s   ÿzMemCrompress.forward)r   Tr#   r   r   r   r   r¥   ð  s    r¥   )r.   Ztorch.nnr   Ztorch.nn.functionalZ
functionalr   Ztorchvisionr   Z.modelscope.models.cv.video_object_segmentationr   r   ÚModuler   r)   r2   rG   rI   rK   rQ   rX   ro   rw   rx   ry   r   r‹   r“   rš   r¥   r   r   r   r   Ú<module>   s,   $%l(- 