o
    *jE                     @   s   d dl 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lmZ d dlmZmZ 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dd 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)MODELS)	ModelFileTasksc                    sp   t   dd  }t fdd|D }t|} fddt|D }dd t|t|D }tj|ddS )N   c                    s   g | ]
}t j| jd qS ))device)torchZaranger   ).0sizeoffset j/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/virual_tryon/sdafnet.py
<listcomp>   s    z apply_offset.<locals>.<listcomp>c                    s0   g | ]\}}|  d  dd|df  qS )r   N.)floatZ	unsqueeze)r	   dimgridr   r   r   r      s    c                 S   s$   g | ]\}}||d  d  d  qS )g      ?g       @r   )r	   r   r
   r   r   r   r      s    r   )listr
   r   Zmeshgridreversed	enumeratezipstack)r   sizesZ	grid_listr   r   r   apply_offset   s   
r   c                       $   e Zd Z fddZdd Z  ZS )ResBlockc                    sd   t t|   tt|tjddtj||ddddt|tjddtj||dddd| _d S )NTinplace      F)kernel_sizepaddingbias)	superr   __init__nn
SequentialBatchNorm2dReLUConv2dblock)selfin_channels	__class__r   r   r&   #   s   

zResBlock.__init__c                 C   s   |  || S Nr,   r-   xr   r   r   forward/   s   zResBlock.forward__name__
__module____qualname__r&   r5   __classcell__r   r   r/   r   r   !       r   c                       r   )
Downsamplec                    sB   t t|   tt|tjddtj||ddddd| _d S )NTr   r    r   r!   F)r"   strider#   r$   )	r%   r<   r&   r'   r(   r)   r*   r+   r,   )r-   r.   out_channelsr/   r   r   r&   5   s   
zDownsample.__init__c                 C   
   |  |S r1   r2   r3   r   r   r   r5   A      
zDownsample.forwardr6   r   r   r/   r   r<   3   r;   r<   c                       s,   e Zd Zg df fdd	Zdd Z  ZS )FeatureEncoder@         rE   rE   c                    s   t t|   g | _t|D ]/\}}|dkr%tt||t|t|}ntt||d  |t|t|}| j	| qt
| j| _d S )Nr   r!   )r%   rA   r&   encodersr   r'   r(   r<   r   append
ModuleList)r-   r.   chnsiZout_chnsencoderr/   r   r   r&   G   s   zFeatureEncoder.__init__c                 C   s&   g }| j D ]}||}|| q|S r1   )rF   rG   )r-   r4   Zencoder_featuresrK   r   r   r   r5   Y   s
   
zFeatureEncoder.forwardr6   r   r   r/   r   rA   E   s    rA   c                       s.   e Zd Zg ddf fdd	Zdd Z  ZS )RefinePyramidrB   rE   c                    s   t t|   || _g | _tt|D ]}tj||dd}| j	| qt
| j| _g | _tt|D ]}tj||ddd}| j	| q4t
| j| _d S )Nr!   )r"   r    )r"   r#   )r%   rL   r&   rI   adaptiver   r   r'   r+   rG   rH   smoothrangelen)r-   rI   fpn_dimZin_chnsZadaptive_layerrJ   Zsmooth_layerr/   r   r   r&   c   s   zRefinePyramid.__init__c                 C   sx   |}g }d }t tt|D ]'\}}| j| |}|d ur'|tj|ddd }| j| |}|}|| qtt|S )Nr   nearestZscale_factormode)	r   r   r   rM   FinterpolaterN   rG   tuple)r-   r4   Zconv_ftr_listZfeature_listZlast_featurerJ   Zconv_ftrfeaturer   r   r   r5   u   s   zRefinePyramid.forwardr6   r   r   r/   r   rL   a   s    rL   c                 C   sx   t ||d}|  \}}}}t | |d}	tj|	| ddddddd}
|
|d||| }tt 	||d}|S )	Nr!   r   r   r    bilinearborderrT   Zpadding_moder   )
r   Zrepeat_interleaver
   rU   grid_sampledetachpermutereshapesumsplit)Zfeatoffsetsatt_mapsZsample_kout_chBCHWZ
multi_featZmulti_warp_featZmulti_att_warp_featZatt_warp_featr   r   r   DAWarp   s   ri   c                       s.   e Zd Zdg df fdd	Zdd Z  ZS )MFEBlockr    )rD   rC       c              
      s   t t|   g }tt|D ]8}|dkr&|tjj||| dddd n|tjj||d  || |d|d d |tjj	ddd q|tjj|d	 ||d|d d tjj
| | _d S )
Nr   r    r!   r.   r>   r"   r=   r#   r   F皙?r   Znegative_sloper   )r%   rj   r&   rO   rP   rG   r   r'   r+   	LeakyReLUr(   layers)r-   r.   r>   r"   num_filtersrp   rJ   r/   r   r   r&      sF   
zMFEBlock.__init__c                 C   r?   r1   )rp   )r-   inputr   r   r   r5      r@   zMFEBlock.forwardr6   r   r   r/   r   rj      s
    #rj   c                       s.   e Zd Zd	 fdd	Z			d
ddZ  ZS )	DAFlowNetrE   r!   c                    sP  t t|   g | _g | _g | _|| _|| _t|D ]6}t	d| | jd dd}t	d| | jd d}t	d| | jd d}| j
| | j
| | j
| qt| j| _t| j| _t| j| _tjtjjddd	d	d
tjjdddtjjdddd	d	d| _tjtjjdddd	d	dtjjdddtjjddd	d	d| _d S )Nr   r       )r.   r>   r"   )r.   r>      rC   rk   r!   )r>   r"   r=   Frm   rn   rl   )r>   r"   r=   r#   )r.   r>   r"   r=   )r%   rs   r&   	Self_MFEs
Cross_MFEsRefine_MFEskrd   rO   rj   rG   r'   rH   r   r(   r+   ro   lights_decoderlights_encoder)r-   Znum_pyramidrQ   	head_numsrJ   ZSelf_MFE_layerZCross_MFE_layerZRefine_MFE_layerr/   r   r   r&      sX   	

zDAFlowNet.__init__FTc           !      C   sJ  d}d}	|rg }
t t|D ]}|t|d |  }|t|d |  }| \}}}}|	durH|rHt||	|| j| j}t|||| j| j}n|}|}t||gd}| j| |}t	j
|dd| jd dddddf dd}t|ddd| jd ddddf dd||}|	durt	j|	|ddd}n|d	d
dd}|}	t||	|| j| j}t||gd}| j| |}t	j
|dd| jd dddddf dd}t|ddd| jd ddddf dd||}|durt	j||ddd}n|d	d
dd}|}t|||| j| j}t||gd}| j| |}t	j
|dd| jd dddddf dd}t|ddd| jd ddddf dd||}t|dd| jd | jd ddddf dd||}t	j|	|ddd}	t	j||ddd}t	j|	ddd}	t	j|ddd}t	j|ddd| jddddf ddd}t	j|dd| jdddddf ddd}|r&t	j||d |d fdd}t	j||d |d fdd}|r| |}| |}t||	|| jd}t|||| jd}| || } nt||	|| jd
}t|||| jd
}|| } |
|  qt	j|| dd dd}t	j|	| dd dd}	t	j|| dd dd}t	j|| dd dd}|r| |}| |}t||	|| jd}t|||| jd}| || } nt||	|| jd
}t|||| jd
}|| } |r| |fS | S )a  
        Args:
            source_image: cloth rgb image for tryon
            reference_image: model rgb image for try on
            source_feats: cloth FPN features
            reference_feats: model and pose features
            return_all: bool return all intermediate try-on results in training phase
            warp_feature: use DAFlow for both features and images
            use_light_en_de: use shallow encoder and decoder to project the images from RGB to high dimensional space

        Nr!   r   r   r   rY   rZ   r[   r   r       rS   )rT   rC   )rO   rP   r
   ri   ry   rd   r   catrw   rU   Zsoftmaxr   r_   r\   r^   rv   rx   rV   r{   rz   rG   )!r-   source_imageZreference_imagesource_featsreference_feats
return_allwarp_featureuse_light_en_deZlast_multi_self_offsetsZlast_multi_cross_offsetsZresults_allrJ   Zfeat_sourceZfeat_refre   rf   rg   rh   Zcross_att_mapsZatt_source_featZself_att_mapsZatt_reference_featZ
input_featZoffsets_attrb   rc   Zcross_offsetsZself_offsetsZcur_source_imageZcur_reference_imageZwarp_att_source_imageZwarp_att_reference_imageZresult_tryonr   r   r   r5      sL  

&(
0(

00$$



zDAFlowNet.forward)rE   r!   )FTTr6   r   r   r/   r   rs      s    1rs   c                       s.   e Zd Zd	 fdd	Z			d
ddZ  ZS )SDAFNet_Tryonr    ru   c                    sX   t t|   g d}t||| _t||| _t|| _t|| _t	t
||d| _d S )NrB   )r|   )r%   r   r&   rA   source_featuresreference_featuresrL   
source_FPNreference_FPNrs   rP   dafnet)r-   Zref_in_channelZsource_in_channelr|   rq   r/   r   r   r&     s   

zSDAFNet_Tryon.__init__TFc           
   	   C   s<   |  | |}| | |}| j|||||||d}	|	S )N)r   r   r   )r   r   r   r   r   )
r-   Z	ref_inputr   Z	ref_imager   r   r   r   r   resultr   r   r   r5     s   zSDAFNet_Tryon.forward)r    ru   )TFTr6   r   r   r/   r   r     s    r   )randomnumpynpr   Ztorch.nnr'   Ztorch.nn.functionalZ
functionalrU   Zmodelscope.metainfor   Zmodelscope.modelsr   Zmodelscope.utils.constantr   r   r   Moduler   r<   rA   rL   ri   rj   rs   r   r   r   r   r   <module>   s$    () ^