o
    *jlJ                     @   s   d Z ddlZddlZddlmZ ddlm  mZ ddl	m
Z
 ddd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jZdS )zx
Part of the implementation is borrowed and modified from LaMa, publicly available at
https://github.com/saic-mdal/lama
    N)rotatetanhc                 C   s>   | dkrt  S | dkrt  S | du rt  S td|  )Nr   sigmoidFzUnknown activation kind )nnZTanhSigmoidIdentity
ValueError)kind r
   r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/image_inpainting/modules/ffc.pyget_activation   s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )SELayer   c              	      s\   t t|   td| _ttj||| ddtjddtj|| |ddt	 | _
d S )N   F)biasTZinplace)superr   __init__r   ZAdaptiveAvgPool2davg_pool
SequentialZLinearReLUr   fc)selfZchannelZ	reduction	__class__r
   r   r      s   

zSELayer.__init__c                 C   sJ   |  \}}}}| |||}| |||dd}||| }|S )Nr   )sizer   viewr   Z	expand_as)r   xbc_yresr
   r
   r   forward    s
   zSELayer.forward)r   __name__
__module____qualname__r   r#   __classcell__r
   r
   r   r   r      s    r   c                       s6   e Zd Z								d
 fdd	Zdd	 Z  ZS )FourierUnitr   NbilinearForthoc              	      s   t t|   || _tjj|d |rdnd |d ddd| jdd| _tj|d | _	tjj
dd| _|| _|rJ|d u r?i }t| jjfi || _|| _|| _|| _|	| _|
| _d S )N   r   r   F)in_channelsout_channelskernel_sizestridepaddinggroupsr   Tr   )r   r)   r   r2   torchr   Conv2d
conv_layerBatchNorm2dbnr   reluuse_ser   r-   sespatial_scale_factorspatial_scale_modespectral_pos_encodingffc3dfft_norm)r   r-   r.   r2   r;   r<   r=   r9   Z	se_kwargsr>   r?   r   r
   r   r   *   s.   
zFourierUnit.__init__c                 C   s  |j d }| jd ur|j dd  }tj|| j| jdd}| jr!dnd}tjj||| j	d}tj
|j|jfdd	}|dd
ddd }||df| dd   }| jr|j dd  \}}tdd
|d d d d d f |d
|||}tdd
|d d d d d f |d
|||}	tj||	|fd
d	}| jr| |}| |}| | |}||ddf| dd   dd
ddd }t|d |d }| jr|j dd  n|j dd  }
tjj||
|| j	d}| jd urtj||| jdd}|S )Nr   F)Zscale_factormodealign_corners)r@   )r@   rD   )dimnormrD   rE   r      r,      ).r   ).r   rC   )srE   rF   )r   rA   rB   )shaper;   FZinterpolater<   r>   r3   ZfftZrfftnr?   stackrealimagZpermute
contiguousr   r   r=   Zlinspaceexpandtocatr9   r:   r5   r8   r7   complexZirfftn)r   r   batchZ	orig_sizeZfft_dimZfftedheightwidthZcoords_vertZ
coords_horZifft_shape_sliceoutputr
   r
   r   r#   Q   s   




"

zFourierUnit.forward)r   Nr*   FFNFr+   r$   r
   r
   r   r   r)   (   s    'r)   c                       s,   e Zd Z			d fdd	Zdd Z  ZS )SpectralTransformr   Tc              	      s   t t|   || _|dkrtjddd| _nt | _|| _t	tj
||d d|ddt|d tjdd| _t|d |d |fi || _| jrWt|d |d || _tjj
|d |d|dd| _d S )	Nr,   )r,   r,   )r/   r0   r   F)r/   r2   r   Tr   )r   rY   r   
enable_lfur   Z	AvgPool2d
downsampler   r0   r   r4   r6   r   conv1r)   fulfur3   conv2)r   r-   r.   r0   r2   rZ   Z	fu_kwargsr   r
   r   r      s>   

zSpectralTransform.__init__c           
      C   s   |  |}| |}| |}| jrW|j\}}}}d}|| }tjtj|d d d |d f |dddd }	tjtj|	|dddd }	| 	|	}	|	
dd|| }	nd}	| || |	 }|S )Nr,   rH   r@   rG   r   rD   r   )r[   r\   r]   rZ   rK   r3   rS   splitrP   r^   repeatr_   )
r   r   rX   nr   hwZsplit_noZsplit_sZxsr
   r
   r   r#      s.   


"
zSpectralTransform.forward)r   r   Tr$   r
   r
   r   r   rY      s    $rY   c                       s<   e Zd Z			d fdd	Zdd Zdd	 Zd
d Z  ZS ) LearnableSpatialTransformWrapper      ?P   Tc                    s@   t    || _td| | _|rtj| jdd| _|| _d S )Nr   T)Zrequires_grad)	r   r   implr3   Zrandangler   	Parameterpad_coef)r   rh   rk   Zangle_init_rangeZtrain_angler   r
   r   r      s   

z)LearnableSpatialTransformWrapper.__init__c                    sz   t |r   ||S t|tr4t fdd|D } |}t fddt||D S tdt	| )Nc                 3   s    | ]}  |V  qd S N)	transform).0elemr   r
   r   	<genexpr>   s    z;LearnableSpatialTransformWrapper.forward.<locals>.<genexpr>c                 3   s     | ]\}}  ||V  qd S rl   )inverse_transform)rn   ro   orig_xrp   r
   r   rq      s
    

zUnexpected input type )
r3   	is_tensorrr   rh   rm   
isinstancetuplezipr   type)r   r   Zx_transZy_transr
   rp   r   r#      s   


z(LearnableSpatialTransformWrapper.forwardc                 C   s`   |j dd  \}}t|| j t|| j }}tj|||||gdd}t|| j|d}|S )Nr,   reflect)rA   ri   )rK   intrk   rL   padr   ri   rR   )r   r   rV   rW   pad_hpad_wZx_paddedZx_padded_rotatedr
   r
   r   rm      s
   z*LearnableSpatialTransformWrapper.transformc                 C   s   |j dd  \}}t|| j t|| j }}t|| j| d}|j dd  \}}	|d d d d ||| ||	| f }
|
S )Nr,   rz   )rK   r{   rk   r   ri   rR   )r   Zy_padded_rotatedrs   rV   rW   r}   r~   Zy_paddedZy_heightZy_widthr!   r
   r
   r   rr      s   (z2LearnableSpatialTransformWrapper.inverse_transform)rf   rg   T)r%   r&   r'   r   r#   rm   rr   r(   r
   r
   r   r   re      s    re   c                       s6   e Zd Z								d
 fdd	Zdd	 Z  ZS )FFCr   r   FTry   c                    s  t t|   |dks|dksJ d|| _t|| }|| }t|| }|| }|| _|| _|| _|dks;|dkr>tj	ntj
}||||||||	|
|d	| _|dksW|dkrZtj	ntj
}||||||||	|
|d	| _|dkss|dkrvtj	ntj
}||||||||	|
|d	| _|dks|dkrtj	nt}|||||	dkrdn|	d |fi || _|| _|dks|dks| jstj	ntj
}||dd| _d S )Nr   r,   zStride should be 1 or 2.r   )Zpadding_mode)r   r   r   r0   r{   	ratio_gin
ratio_goutglobal_in_numr   r   r4   convl2lconvl2gconvg2lrY   convg2ggatedgate)r   r-   r.   r/   r   r   r0   r1   dilationr2   r   rZ   padding_typer   Zspectral_kwargsZin_cgZin_clZout_cgZout_clmoduler   r
   r   r      sn   


"zFFC.__init__c                 C   s   t |tu r|n|df\}}d\}}| jr;|g}t|r"|| tj|dd}t| |}|j	ddd\}	}
nd\}	}
| j
dkrP| || ||	  }| j
dkra| ||
 | | }||fS )Nr   )r   r   r   rG   r,   )r   r   )rx   rv   r   r3   rt   appendrS   r   r   chunkr   r   r   r   r   )r   r   x_lx_gZout_xlZout_xgZtotal_input_partsZtotal_inputZgatesZg2l_gateZl2g_gater
   r
   r   r#   A  s   



zFFC.forward)r   r   r   r   FTry   Fr$   r
   r
   r   r   r      s    Gr   c                	       s<   e Zd Zdddddejejddf	 fdd	Zdd	 Z  ZS )

FFC_BN_ACTr   r   Fry   Tc                    s   t t|   t|||||||||	|
|fd|i|| _|dkr#tjn|}|dkr,tjn|}t|| }||| | _||| _	|dkrGtjn|}|dkrPtjn|}|dd| _
|dd| _d S )Nr   r   r   Tr   )r   r   r   r   ffcr   r   r{   bn_lbn_gact_lact_g)r   r-   r.   r/   r   r   r0   r1   r   r2   r   
norm_layeractivation_layerr   rZ   kwargsZlnormZgnormZglobal_channelsZlactZgactr   r
   r   r   Z  s6   
zFFC_BN_ACT.__init__c                 C   s6   |  |\}}| | |}| | |}||fS rl   )r   r   r   r   r   r   r   r   r   r
   r
   r   r#     s   zFFC_BN_ACT.forward)	r%   r&   r'   r   r6   r   r   r#   r(   r
   r
   r   r   r   X  s    *r   c                       s0   e Zd Zejdddf fdd	Zdd Z  ZS )FFCResnetBlockr   NFc           	   	      s   t    t||fd|||||d|| _t||fd|||||d|| _|d ur?t| jfi || _t| jfi || _|| _d S )NrI   )r/   r1   r   r   r   r   )r   r   r   r\   r_   re   inline)	r   rE   r   r   r   r   spatial_transform_kwargsr   Zconv_kwargsr   r
   r   r     sN   
		
	

zFFCResnetBlock.__init__c                 C   s   | j r!|d d d | jjj f |d d | jjj d f }}nt|tu r)|n|df\}}||}}| ||f\}}| ||f\}}|| || }}||f}| j r]tj|dd}|S )Nr   r   rG   )	r   r\   r   r   rx   rv   r_   r3   rS   )r   r   r   r   Zid_lZid_goutr
   r
   r   r#     s   
zFFCResnetBlock.forward)r%   r&   r'   r   r   r   r#   r(   r
   r
   r   r   r     s    %r   c                   @   s   e Zd Zdd ZdS )ConcatTupleLayerc                 C   sJ   t |tsJ |\}}t|st|sJ t|s|S tj|ddS )Nr   rG   )ru   rv   r3   rt   rS   r   r
   r
   r   r#     s   
zConcatTupleLayer.forwardN)r%   r&   r'   r#   r
   r
   r
   r   r     s    r   c                       sp   e Zd Zdddddejdejejeddddd	dddd	d
d
dd	di dddi f fdd	Zdd Z  ZS )FFCResNetGeneratorrH   rI   @      ry   Tr   F)r   r   rZ   g      ?Nr   i   c              
      s  |dksJ t    tdt||fdd||d|g}t|D ]9}d| }||d kr;t|}|dd|d< n|}|tt||| t||| d fddd||d	|g7 }q"d| }t||| }t|D ]#}t	|f|||d
|}|d ur||v rt
|fi |}||g7 }qk|t g7 }t|D ]1}d||  }|tjt||| t|t|| d ddddd|	t|t|| d |
g7 }q|r|t	|f|||dd|g7 }|tdtj||dddg7 }|r|t|du rdn| tj| | _d S )Nr   rI      )r/   r1   r   r   r,   r   r   r   )r/   r0   r1   r   r   )r   r   r   )r/   r0   r1   Zoutput_paddingT)r   r   r   r   )r/   r1   r   )r   r   r   ZReflectionPad2dr   rangedictgetminr   re   r   ZConvTranspose2dr{   r4   r   r   r   model)r   Zinput_ncZ	output_ncZngfZn_downsamplingZn_blocksr   r   r   Zup_norm_layerZup_activationZinit_conv_kwargsZdownsample_conv_kwargsZresnet_conv_kwargsZspatial_transform_layersr   Zadd_out_actZmax_featuresZout_ffcZout_ffc_kwargsr   iZmultZcur_conv_kwargsZfeats_num_bottleneckZcur_resblockr   r
   r   r     s    


zFFCResNetGenerator.__init__c                 C   s
   |  |S rl   )r   )r   inputr
   r
   r   r#   K  s   
zFFCResNetGenerator.forward)	r%   r&   r'   r   r6   r   r   r#   r(   r
   r
   r   r   r     s>    yr   )r   )__doc__numpynpr3   Ztorch.nnr   Ztorch.nn.functionalZ
functionalrL   Zkornia.geometry.transformr   r   Moduler   r)   rY   re   r   r   r   r   r   r
   r
   r
   r   <module>   s     

e?,`3: