o
    ߥi                     @   s   d dl Z d dlmZ d dlm  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dS )    Nc                       s0   e Zd Z					d fdd	Zdd Z  ZS )		BasicConv   r   Tc	           	   
      s4   t t|   || _tj||||||||d| _d S )N)kernel_sizestridepaddingdilationgroupsbias)superr   __init__out_channelsnnConv2dconv)	self	in_planes
out_planesr   r   r   r   r   r	   	__class__ g/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/video_object_segmentation/cbam.pyr      s   	zBasicConv.__init__c                 C   s   |  |}|S N)r   r   xr   r   r   forward!   s   
zBasicConv.forward)r   r   r   r   T__name__
__module____qualname__r   r   __classcell__r   r   r   r   r   
   s    r   c                   @      e Zd Zdd ZdS )Flattenc                 C   s   | |ddS )Nr   )viewsizer   r   r   r   r   (   s   zFlatten.forwardNr   r   r   r   r   r   r   r   r!   &       r!   c                       s.   e Zd Zdddgf fdd	Zdd Z  ZS )ChannelGate   avgmaxc              	      sN   t t|   || _tt t||| t t|| || _	|| _
d S r   )r
   r'   r   gate_channelsr   
Sequentialr!   LinearReLUmlp
pool_types)r   r+   reduction_ratior0   r   r   r   r   .   s   
zChannelGate.__init__c                 C   s   d }| j D ]P}|dkr)tj||d|df|d|dfd}| |}n!|dkrJtj||d|df|d|dfd}| |}|d u rQ|}q|| }qt|dd	|}|| S )Nr)         )r   r*   )
r0   F
avg_pool2dr$   r/   
max_pool2dtorchsigmoid	unsqueeze	expand_as)r   r   channel_att_sum	pool_typeavg_poolchannel_att_rawmax_poolscaler   r   r   r   ;   s*   
&&

zChannelGate.forwardr   r   r   r   r   r'   ,   s
    r'   c                   @   r    )ChannelPoolc                 C   s2   t jt |dd dt |ddfddS )Nr   r   )dim)r7   catr*   r9   meanr   r   r   r   r   S   s   &zChannelPool.forwardNr%   r   r   r   r   rA   Q   r&   rA   c                       s$   e Zd Z fddZdd Z  ZS )SpatialGatec                    s:   t t|   d}t | _tdd|d|d d d| _d S )N   r2   r   )r   r   )r
   rE   r   rA   compressr   spatial)r   r   r   r   r   r   [   s   zSpatialGate.__init__c                 C   s&   |  |}| |}t|}|| S r   )rG   rH   r7   r8   )r   r   
x_compressx_outr@   r   r   r   r   b   s   


zSpatialGate.forwardr   r   r   r   r   rE   Y   s    rE   c                       s0   e Zd Zdddgdf fdd	Zdd Z  ZS )	CBAMr(   r)   r*   Fc                    s6   t t|   t|||| _|| _|st | _d S d S r   )r
   rK   r   r'   
no_spatialrE   )r   r+   r1   r0   rL   r   r   r   r   k   s   zCBAM.__init__c                 C   s   |  |}| js| |}|S r   )r'   rL   rE   )r   r   rJ   r   r   r   r   w   s   

zCBAM.forwardr   r   r   r   r   rK   i   s    rK   )r7   torch.nnr   torch.nn.functional
functionalr4   Moduler   r!   r'   rA   rE   rK   r   r   r   r   <module>   s   %