o
    *j                     @   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	dS )    Nc                       s$   e Zd Z fddZdd Z  ZS )	ConvLayerc              	      sF   t t|   ttdtj||dddt|tjdd| _	d S )N      r   kernel_sizepaddingT)Zinplace)
superr   __init__nn
SequentialZReflectionPad2dConv2dZBatchNorm2dZReLUconv)selfZin_chZout_ch	__class__ p/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/image_body_reshaping/model.pyr	   	   s   
zConvLayer.__init__c                 C   s   |  |}|S )N)r   )r   xr   r   r   forward   s   
zConvLayer.forward)__name__
__module____qualname__r	   r   __classcell__r   r   r   r   r      s    r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )SASAc                    s   t t|   || _tj||d dd| _tj||d dd| _tj||dd| _tjd|d dd| _	t
td| _tjdd| _t | _d S )N   r   )Zin_channelsZout_channelsr          dim)r   r   r	   Z	chanel_inr
   r   
query_convkey_conv
value_convmag_conv	ParametertorchzerosgammaZSoftmaxZsoftmaxZSigmoidsigmoid)r   in_dimr   r   r   r	      s"   


zSASA.__init__c           
      C   s  t j|d d ddd d d d f ddd}t |dd}t j|d d ddd d d d f ddd}t |dd}t j|d d ddd d d d f ddd}t |dd}|d d dd d d d f d}d| }t j|||||fdd	}	tj|	||fd
d}	|	S )Nr   r   T)r   Zkeepdimr      r      r   Zarea)sizemode)r%   sumclamp	unsqueezecatFZinterpolate)
r   Zpaf_magZtarget_heightZtarget_widthZ
torso_maskZ	arms_maskZ	legs_maskZfg_maskZbg_maskYr   r   r   structure_encoder*   s   ,,,"zSASA.structure_encoderc                 C   s  |  \}}}}| |||}| ||d|| }t|ddd|}	|	t|	 }
| |
}| 	||d|| ddd}| 
||d|| }t||}|t| }| |}|| }| ||d|| }t||ddd}|||||}| j| | }||fS )a;  extract self-attention features.
        Args:
            X : input feature maps( B x C x H x W)
            PAF_mag : ( B x C x H x W), 1 denotes connectivity, 0 denotes non-connectivity

        Returns:
            out : self attention value + input feature
            Y: B X N X N (N is Width*Height)
        r   r      r   )r,   r4   r#   viewr%   Zbmmpermutemeanr(   r    r!   r"   r'   )r   XPAF_magZm_batchsizeCheightwidthr3   Zconnectivity_mask_vecZaffinityZaffinity_centeredZaffinity_sigmoidZ
proj_queryZproj_keyZselfatten_mapZselfatten_centeredZselfatten_sigmoidZSASA_mapZ
proj_valueoutr   r   r   r   ;   s6   


zSASA.forward)r   r   r   r	   r4   r   r   r   r   r   r   r      s    r   c                       s2   e Zd Zd fdd	ZdddZdd	d
Z  ZS )FlowGeneratorFc                    sd  t t|   || _tt|dtddtdtddtddtdtddtddtdtddtddtdtddtddtddtddtdd| _t	dd| _	ttddtj
ddd	d
tddtddtj
ddd	d
tddtddtddtddtddtjdddddt tj
ddd	d
| _d}tjj|dt|d d d| _d S )N@   r5         i   i   )r)   bilinearT)Zscale_factorr-   Zalign_cornersr   r   r   r   r*      )r   Zstrider   )r   r?   r	   deep_supervisionr
   r   r   Z	MaxPool2dEncoderr   ZUpsampler   ZTanhDecoderr%   intdilation)r   Z
n_channelsrE   Zdilation_ksizer   r   r   r	   f   sV   zFlowGenerator.__init__rC   r&   皙?c                 C   s   |  \}}}}	tt|t|	g\}
}| |	d  d d }|
 |d  d d }
t|d|
dfdd}||j}|d| |  }t	j
||||d}|S )Nr   g       @r   r   r5   )r-   padding_mode)r,   r%   ZmeshgridZarangefloatr1   r0   toZdevicer2   Zgrid_sample)r   r   flowr-   rK   coffnchwZyvZxvgridZgrid_xwarp_xr   r   r   warp   s   "zFlowGenerator.warpc                 C   s   t j||fdd}| |}| \}}}}| |d d }	| ||	\}
}| |
}|dddd}| j|||d}t j	|d	dd
}||fS )a  extract self-attention features.
        Args:
            img : input numpy image
            skeleton_map : skeleton map of input image
            coef: warp degree

        Returns:
            warp_x : warped image
            flow: predicted flow
        r   r   g      ?g      ?r   r5   r   )rO   g      )minmax)
r%   r1   rF   r,   rI   r   rG   r7   rV   r/   )r   ZimgZskeleton_mapZcoefZ
img_concatr9   _r<   r=   r:   r>   r3   rN   rU   r   r   r   r      s   

zFlowGenerator.forward)F)rC   r&   rJ   )rJ   )r   r   r   r	   rV   r   r   r   r   r   r   r?   d   s    
0r?   )
r%   Ztorch.nnr
   Ztorch.nn.functionalZ
functionalr2   Moduler   r   r?   r   r   r   r   <module>   s   N