
    I g                         d dl Z d dlmZ d dlmc mZ d dlmZ d dlm	Z	 d dl
mZ d dl  G d dej                        Zy)    N)	Parameter)xor)Optional)*c                   H     e Zd Zd fd	Zddeej                     fdZ xZS )SICAc           	      j   t         t        |           || _        || _        || _        |||d   d|z  z  |d   d|z  z  f| _        nd | _        t        j                  t        ||dd      t        ||dd            | _
        t        j                  t        ||dd      t        ||dd            | _        t        j                  t        ||dd      t        ||dd            | _        | j
                  du rd| _        nd| _        t        ||dd      | _        t        ||z   |dd      | _        t        ||dd      | _        t        ||d      | _        t%        t'        j(                  dg            | _        | j
                  du r%t%        t'        j(                  dg            | _        y y )	Nr            T)relu   g      ?)superr   __init__
in_channeldepthlmap_in
stage_sizenn
SequentialConv2d
conv_queryconv_key
conv_valuectx	conv_out1	conv_out2	conv_out3	conv_out4r   torchtensor	threshold
lthreshold)selfr   out_channelr   	base_sizestager   	__class__s          W/var/www/html/transparent-background/transparent_background/modules/attention_module.pyr   zSICA.__init__   s   dD"$$
 U%6(|U
;Yq\aSXj=YZDO"DO--z5!$(O(.ueQT(JL--z5!$(O(.ueQT(JL--z5!$(O(.ueQT(JL <<4DHDHuad;
U 2E14Huad;{A6"5<<#67<<4'cU(;<DO      lmapc                    t        | j                  du |d u      rJ |j                  \  }}}}t        j                  ||j                  dd  dd      }t        j                  |      }|| j                  z
  }t        j                  |dd      }	t        j                  | dd      }
| j                  t        j                  |      z
  }| j                  du r|t        j                  ||j                  dd  dd      }t        j                  |      }|| j                  z
  }t        j                  |dd      }t        j                  | dd      }|	|
|||g}n|	|
|g}t        j                  |d      }| j                  ,| j                  }| j                  d   | j                  d   z  }n	||f}||z  }t        j                  ||dd      j                  ||d	      }t        j                  ||dd      j                  || j                  |      }t        j                  ||      j!                  dd
d      j#                  d      }| j%                  |      j                  || j&                  d	      j!                  dd
d      }| j)                  |      j                  || j&                  d	      }| j+                  |      j                  || j&                  d	      j!                  dd
d      }t        j                  ||      }| j&                  dz  |z  }t        j,                  |d	      }t        j                  ||      j!                  dd
d      j/                         j                  |d	||      }| j1                  |      }t        j                  ||gd      }| j3                  |      }| j5                  |      }| j7                  |      }||fS )NTbilinearF)sizemodealign_cornersr   r   )dimr
   r   g      )r   r   shapeFinterpolater    sigmoidr"   clipabsr#   catr   viewr   bmmpermute	unsqueezer   r   r   r   softmax
contiguousr   r   r   r   )r$   xsmapr+   bchwpfgbgcglpfpbpprobr4   	shape_mulfcontextquerykeyvaluesimouts                            r)   forwardzSICA.forward,   sR   t||t+T-=>>>WW
1a }}T:UZ[}}T"4>>!ZZ1a ZZAq!^^eiil*<<4D$4==AGGBCLzY^_D==&D'BB1%BRCA&BBB'DB<Dyy1% ??&OOE*T__Q-??IFEAIMM!%jNSSTUW`bde}}TJeTYYZ[]a]e]egpq ))D!$,,Q15??B "''4::r:BB1aKmmG$))!TZZ<(--aR@HHAqQ iis#zzS C'ii$ ))C'//1a8CCEJJ1bRSUVW..)IIq'l*NN1NN1nnQ#vr*   )r   @   NNF)N)	__name__
__module____qualname__r   r   r    TensorrW   __classcell__)r(   s   @r)   r   r      s    =@;Xell%; ;r*   r   )r    torch.nnr   torch.nn.functional
functionalr5   torch.nn.parameterr   operatorr   typingr   %transparent_background.modules.layersModuler    r*   r)   <module>rg      s/        (   3\299 \r*   