o
    *j                     @   s  d dl mZ d dlmZ 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 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d Zd.ddZG dd de	jZG dd de	jZG dd d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#dS )0    )OrderedDict)sqrtNc                    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)torcharanger   ).0sizeoffset j/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/image_try_on/warping.py
<listcomp>   s    z apply_offset.<locals>.<listcomp>c                    s0   g | ]\}}|  d  dd|df  qS )r   N.)float	unsqueeze)r	   dimgridr   r   r   r      s    c                 S   s$   g | ]\}}||d  d  d  qS )      ?       @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                       s0   e Zd Z					d
 fdd	Zdd	 Z  ZS )Conv2dBlockr   batchpreluzeroTc
                    sn  t    |	| _|dkrt|| _n|dkrt|| _n|dkr)t|| _nJ d||}
|dkr=t	|
| _
n|dkrHt|
| _
n|dkrPd | _
nJ d	||d
krctjdd| _nF|dkrptjddd| _n9|dkrzt | _n/|dkrtjdd| _n#|dkrt | _n|dkrt | _n|dkrd | _nJ d|tj||||| jd| _d S )NreflectZ	replicater"   r   zUnsupported padding type: {}r    instancenonezUnsupported normalization: {}reluT)Zinplacelrelug?r!   ZselutanhZsigmoidzUnsupported activation: {})bias)super__init__Zuse_biasnnReflectionPad2dpadZReplicationPad2d	ZeroPad2dformatBatchNorm2dnormZInstanceNorm2dReLU
activation	LeakyReLUPReLUZSELUZTanhSigmoidConv2dconv)selfZ	input_dimZ
output_dimkernel_sizestridepaddingr2   r4   Zpad_typer)   Znorm_dim	__class__r   r   r+   "   sF   

zConv2dBlock.__init__c                 C   s4   | j r|  |}| jr| |}| | |}|S N)r2   r4   r9   r.   r:   xr   r   r   forwardY   s   

zConv2dBlock.forward)r   r    r!   r"   T__name__
__module____qualname__r+   rC   __classcell__r   r   r>   r   r       s    7r   c                       $   e Zd Z fddZdd Z  ZS )ResBlockc                    \   t t|   tt|t tj||ddddt|t tj||dddd| _d S N      Fr;   r=   r)   )	r*   rJ   r+   r,   
Sequentialr1   r6   r8   blockr:   in_channelsr>   r   r   r+   d   s   
zResBlock.__init__c                 C   s   |  || S r@   rQ   rA   r   r   r   rC   p      zResBlock.forwardrD   r   r   r>   r   rJ   b       rJ   c                       rI   )
ResBlock_2c                    rK   rL   )	r*   rW   r+   r,   rP   r1   r6   r8   rQ   rR   r>   r   r   r+   v   s   
zResBlock_2.__init__c                 C   s   |  || S r@   rT   )r:   x1Zx2r   r   r   rC      rU   zResBlock_2.forwardrD   r   r   r>   r   rW   t   s    rW   c                       rI   )
DownSamplec                    s>   t t|   tt|t tj||ddddd| _d S )NrM   r   rN   F)r;   r<   r=   r)   )	r*   rY   r+   r,   rP   r1   r6   r8   rQ   r:   rS   out_channelsr>   r   r   r+      s   
zDownSample.__init__c                 C   
   |  |S r@   rT   rA   r   r   r   rC         
zDownSample.forwardrD   r   r   r>   r   rY      rV   rY   c                       s,   e Zd Z fddZdd Zdd Z  ZS )UpSamplec                    s<   t t|   tt|t tj||dddd| _d S )Nr   F)r;   r<   r)   )	r*   r^   r+   r,   rP   r1   r6   ZConvTranspose2drQ   rZ   r>   r   r   r+      s   
zUpSample.__init__c                 C   r\   r@   rT   rA   r   r   r   rC      r]   zUpSample.forwardc                 C      t jj|dd}||S z[2x nearest neighbor upsampling]
        Arguments:
            F {[torch tensor]} -- [tensor to be upsampled, (B, C, H, W)]
        nearestscale_factormoder   r,   Upsampler:   Fscaleupsampler   r   r   rj         zUpSample.upsamplerE   rF   rG   r+   rC   rj   rH   r   r   r>   r   r^      s    r^   c                       s,   e Zd Zg df fdd	Zdd Z  ZS )FeatureEncoder@         rq   rq   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   rN   )r*   rm   r+   encodersr   r,   rP   rY   rJ   append
ModuleList)r:   rS   chnsiZout_chnsencoderr>   r   r   r+      s   zFeatureEncoder.__init__c                 C   s&   g }| j D ]}||}|| q|S r@   )rr   rs   )r:   rB   Zencoder_featuresrw   r   r   r   rC      s
   
zFeatureEncoder.forwardrD   r   r   r>   r   rm      s    rm   c                       s.   e Zd Zg ddf fdd	Zdd Z  ZS )RefinePyramidrn   rq   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 )NrN   r;   rM   )r;   r=   )r*   rx   r+   ru   adaptiver   r   r,   r8   rs   rt   smoothrangelen)r:   ru   fpn_dimin_chnsZadaptive_layerrv   Zsmooth_layerr>   r   r   r+      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   ra   rb   )	r   r   r   rz   rh   interpolater{   rs   tuple)r:   rB   Zconv_ftr_listZfeature_listZlast_featurerv   Zconv_ftrfeaturer   r   r   rC      s   zRefinePyramid.forwardrD   r   r   r>   r   rx      s    rx   c                 C   s   t | |   |  S z x: tensor )r   rounddetach)rB   r   r   r   Round   s   r      c                 C   s8   | |k r||    |  } | S | |kr| |   |  } | S r   )r   )rB   mimar   r   r   Camp   s   r   c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	CorrelationLayer   c              	      s2  t t|   || _tjdd| _t | _t	dddddddd	| _
t	dddddddd	| _d
| j d| j }}g g | _| _dd tdt|d dD }tt|dd  }| j| | j| dd tdt|d dD }tt|dd  }| j| | j| t| jt| j| _| _d S )NrM   r   ro      rN   r   r!   r%   r4   r2   r   rq   c                 S      g | ]}|d  qS rN   r   r	   rv   r   r   r   r         z-CorrelationLayer.__init__.<locals>.<listcomp>r   c                 S   r   r   r   r   r   r   r   r     r   )r*   r   r+   
init_scaler,   Softmaxsoftmax3r7   sigr   reduce1reduce2step_hstep_wr|   intr   r   extendr}   mask_hmask_w)r:   r   init_hinit_wZstep_h_halfZstep_h_half_reZstep_w_halfZstep_w_half_rer>   r   r   r+     s*   
zCorrelationLayer.__init__c	           R   
   C   s  t j|| j |jdt j|| j |jd}	}
|jd |jd |jd }}}|| }dt j|d||f|jd }| j| j}}| j||d}| j||d}| 	|}| 
|}|jd }t j| j|jdjddjdd|d	d}t j| j|jdjddjdd|d	d}t j| j|jdjddjdd|d	d}t j| j|jdjddjdd|d	d}|d d d d ddf |d d d d ddf |d d d d ddf |d d d d ddf f\}}}}|	| | jdd|
| | jdd}}|	| | jdd|
| | jdd}}| || d } | || d }!| || d }"| || d }#| jd
d|!jdd} }!|"jd
d|#jdd}"}#t | |!}$t |"|#}%t j|d	| ||f|jd}&t j|d	| ||f|jd}'dt j|d||f|jd }(dt j|d||f|jd })g }*t j|d	||f|jd}+t|D ]},td	D ]}-||,|-df ||,|-df }.}/||,|-df ||,|-df }0}1|.dkr|/dks|0dkr|1dkrd\}2}3}4}5}6}7nt |. |d  }8t |. |d  }9tt jd|8 dd}:tt j|9| dd};t|8t|9}8}9t |/ |d  }<t |/ |d  }=tt jd|< dd}>tt j|=| dd}?t|<t|=}<}=t |0 |d  }@t |0 |d  }Att jd|@ dd}Btt j|A| dd}Ct|@t|A}@}At |1 |d  }Dt |1 |d  }Ett jd|D dd}Ftt j|E| dd}Gt|Dt|E}D}E|<|> |=|? |8|: |9|; f\}H}I}J}K|D|F |E|G |@|B |A|C f\}2}3}4}5|I|H |K|J }L}M|3|2 |5|4 }6}7||,d d |H|I|J|Kf |$|,|-d|> ||? d|: ||; f  |&|,|-| |-d | d |Ld |Mf< ||,d d |2|3|4|5f |%|,|-d|F ||G d|B ||C f  |'|,|-| |-d | d |6d |7f< ||,|-d |-d d |H|I|J|Kf |(|,|-d |-d d d |Ld |Mf< |*|2|3|4|5|6|7g qq|'|d	||||d	|dddd
d }N|&|d	||||d	|d}O| t |N|O}P|(|d	d|||d	ddddd
d }Qt |P|Qddd
d |d||})t|D ][},td	D ]S}-|*|,d	 |-  \}2}3}4}5}6}7|6dkrM|7dkrM|)|,|-d |-d d d |6d |7f ||,|-d |-d d |2|3|4|5f< t jd|jd|+|,|-|2|3|4|5f< qq||+fS )Nr   r   rN   r   r   ro   )ri   r       rM   )r   r   r   r   r   r   )min)r   Ztensorr   r   shapeonesr   r   rj   r   r   r   r   repeatr   r   matmulzerosr|   floorr   clamprs   viewpermute
contiguousr   )Rr:   locationfea_cfea_pZscale_paramHW
c_landmark
p_landmarkr   r   NCZfea_HZdownsample_ratioZlandmark_flowr   r   Zfea_cnZfea_pnZ
src_box_h0Z
src_box_w0Z
tar_box_h0Z
tar_box_w0Zadj_cwZadj_chZadj_pwZadj_phZc_hZc_wZp_hZp_wZ	src_box_hZ	src_box_wZ	tar_box_hZ	tar_box_wZsrc_maskZtar_maskZcloth_patch_allZperson_patch_allZlocation_patch_allZone_flow_allZ
coord_infomaskbrv   Z
c_center_xZ
c_center_yZ
p_center_xZ
p_center_yZp_new_top_yZp_new_bottom_yZp_new_left_xZp_new_right_xZp_new_hZp_new_wZc_left_xZ	c_right_xZdelta_x1Zdelta_x2Zc_top_yZ
c_bottom_yZdelta_y1Zdelta_y2Zp_left_xZ	p_right_xZdelta_x3Zdelta_x4Zp_top_yZ
p_bottom_yZdelta_y3Zdelta_y4Zc_new_top_yZc_new_bottom_yZc_new_left_xZc_new_right_xZc_new_hZc_new_wQKZcorrelationVr   r   r   rC     s  "


,,







&&&&
9
&&
zCorrelationLayer.forwardc                 C   r_   r`   re   rg   r   r   r   rj     rk   zCorrelationLayer.upsample)r   rl   r   r   r>   r   r      s
     r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )		LocalFlowrq   rM      c                    sJ  t t|   || _g | _g | _g | _g | _g | _g | _	g | _
t|D ]}|}tjddddddd}tt|ddddddd}tt|d	 |ddddddt|ddddddd}tjd	d
ddtdg|d  }	tj|	 }
ttddddddddtddddddddtdddddddd}tddtdg|d	  }|td tj| }g }tdtddddddddg}tj| }| j
| | j| | j|
 | j| | j| | j| | j	| q#t| j
| _
t| j| _t| j| _t| j| _t| j| _t| j| _t| j	| _	t|d| _d S )Nr   rM   rN   )r;   r<   r=   groupsro   r!   Fr4   r)   r   bilinearT)rc   rd   Zalign_cornersr%   r   )r   r   )r   )r*   r   r+   use_numfusersfusers_refinelocation_predspatch_preds	map_preds
map_refinereducr|   r,   r8   rP   r   rf   rJ   rY   rs   ZAdaptiveAvgPool2drt   r   )r:   r~   r   r   rv   r   r   r   r   Zfusers_refine_layerr   r   Zpatch_layerr   Z	map_layerr   r>   r   r   r+     s   


zLocalFlow.__init__c                 C   s  g g }}|j \}}	}
}t| jD ]w}| j| tj|| || fdd}| j| |}| j| |}| j| |}| j	| |}| j
| || }| j
| || }| |||||
|||\}}|dkrx|| d }t||}| j| |}|}|| || }|| q||fS )NrN   r   r   r   )r   r|   r   r   r   catr   r   r   r   r   r   addr   rs   )r:   clothr   r   r   r   Z	flow_listZmap_listr   _r   r   rv   Zfuser   patchZatt_mapZfea_c_reducZfea_p_reducflowr   	last_flowZlast_att_mapZadd_mapr   r   r   rC     s.   
$
zLocalFlow.forward)rq   rM   r   rD   r   r   r>   r   r     s    Hr   c                   @   s0   e Zd Zdd Zdd Zedd Zdd Zd	S )
EqualLRc                 C   s
   || _ d S r@   )name)r:   r   r   r   r   r+     r]   zEqualLR.__init__c                 C   s>   t || jd }|jd|jd d   }|td|  S )N_origrN   r   r   )getattrr   datar
   numelr   )r:   moduleweightfan_inr   r   r   compute_weight  s   zEqualLR.compute_weightc                 C   s@   t |}t| |}| j|= | |d t|j | | |S )Nr   )r   r   _parametersZregister_parameterr,   	Parameterr   Zregister_forward_pre_hook)r   r   fnr   r   r   r   apply$  s   

zEqualLR.applyc                 C   s   |  |}t|| j| d S r@   )r   setattrr   )r:   r   inputr   r   r   r   __call__/  s   
zEqualLR.__call__N)rE   rF   rG   r+   r   staticmethodr   r   r   r   r   r   r     s    

r   r   c                 C   s   t | | | S r@   )r   r   )r   r   r   r   r   equal_lr4  s   r   c                       rI   )EqualLinearc                    s<   t    t||}|jj  |jj  t	|| _
d S r@   )r*   r+   r,   ZLinearr   r   normal_r)   zero_r   linear)r:   Zin_dimZout_dimr   r>   r   r   r+   <  s
   
zEqualLinear.__init__c                 C   r\   r@   )r   )r:   r   r   r   r   rC   E  r]   zEqualLinear.forwardrD   r   r   r>   r   r   :  s    	r   c                       s0   e Zd Z					d fdd	Zdd Z  ZS )	ModulatedConv2dr"   F   c	           
         s   t t|   || _|| _|| _|d }	|dkrd| _nd| _tt	
||||| _tt	
d|dd| _|rEtt||t | _nt||| _|dkrVt|	| _nt|	| _| jj  | jj  d S )Nr   rN   FTr#   )r*   r   r+   rS   r[   r;   
demudulater,   r   r   ZTensorr   r)   rP   r   Z	PixelNormmlp_class_stdr-   r=   r/   r   r   r   )
r:   finfoutr;   padding_typerj   
downsample
latent_dimnormalize_mlpZpadding_sizer>   r   r   r+   K  s,   	zModulatedConv2d.__init__c                 C   s,  | j jd| j jd d   }| j td|  }|d| j| j| j| j}| 	|dd| jdd}|| }| j
rct|d dddd d| jddd}|| d| j| j| j}n|d| j| j| j}|j\}}}	}
|dd|	|
}| |}tj|||d|| j|	|
| j }|S )	NrN   r   r   r   r   rM   gh㈵>)r   )r   r   r
   r   r   r   r[   rS   r;   r   r   r   Zrsqrtsumr   r=   rh   conv2dr)   )r:   r   latentr   r   sdr    r   heightwidthoutr   r   r   rC   q  s:   "$

zModulatedConv2d.forward)r"   FFr   FrD   r   r   r>   r   r   I  s    &r   c                       2   e Zd Z					d
 fdd	Zddd	Z  ZS )StyledConvBlockrq   r"   r'   Fc              	      s  t t|   |s|dkrtj}ntj}|rt}	nt}	|r#td| _	nd| _	|| _
|dkr3td}
ntdd}
| j
rI|	||d|d||d	| _n|	||dd
}|d|g}tj| | _|
| _| j
ro|	||d|d||d| _n|	||dd
}|d|g}tj| | _|
| _d S )Nr#   r   r   r&   T皙?rM   Fr;   r   rj   r   r   ry   rN   r;   r   r   r   r   )r*   r   r+   r,   r-   r/   r   EqualConv2dr   
actvn_gainmodulated_convr3   r5   conv0rP   actvn0conv1actvn1r:   r   r   r   r=   actvnnormalize_affine_outputr   Zpadding_layerr   r4   r   Zseq0r  Zseq1r>   r   r   r+     sV   
	
	
zStyledConvBlock.__init__Nc                 C   s`   | j r
| ||}n| |}| || j }| j r!| ||}n| |}| || j }|S r@   )r   r   r  r   r  r  r:   r   r   r   r   r   r   rC     s   

zStyledConvBlock.forward)rq   r"   r'   FFr@   rD   r   r   r>   r   r     s    Ar   c                       r   )Styled_F_ConvBlockrq   r"   r!   Fc              	      s
  t t|   |s|dkrtj}ntj}|rt}	nt}	|r#td| _	nd| _	|| _
|dkr3td}
ntdd}
| j
rI|	|dd|d	||d
| _n|	|ddd}|d|g}tj| | _|
| _| j
rp|	d|d|d	||d| _d S |	d|dd}|d|g}tj| | _d S )Nr#   r   r   r&   Tr   rp   rM   Fr   ry   rN   r   )r*   r  r+   r,   r-   r/   r   r   r   r   r   r3   r5   r   rP   r  r  r  r>   r   r   r+     sT   
		zStyled_F_ConvBlock.__init__Nc                 C   sR   | j r
| ||}n| |}| || j }| j r"| ||}|S | |}|S r@   )r   r   r  r   r  r  r   r   r   rC   #  s   

zStyled_F_ConvBlock.forward)rq   r"   r!   FFr@   rD   r   r   r>   r   r    s    ?r  c                       s0   e Zd Zd
 fdd	ZdddZdd	 Z  ZS )AFlowNetrq   rM   c                    s  t t|   d}d}d}d}|| _g | _g | _g | _g | _g | _t	|D ]Q}t
jt
jjd| ddddd	t tdtdt
jjdd
ddddt t
jjd
dddddt t
jjddddddt t
jjdddddd}	t
jt
jjd| |dddd	t t
jj|ddddd	t t
jjdd
ddddt t
jjd
dddddt t
jjdddddd	}
tddd||||d}t
jt
jjd| ddddd	t t
jjdd
ddddt t
jjd
dddddt t
jjdddddd}|dkrttddddddddtdddddddd}n@|dkrAttddddddddtddddddddtdddddddd}nttddddddddtdddddddd}| j|	 | j|
 | j| | j| | j| q%t| j| _t| j| _t| j| _t| j| _t| j| _t
jt
jjddddddt | _t
jt
jjddddddt | _d S )Nr"   r'   FTr   rp   rM   rN   )r[   r;   r<   r=   ro   )rS   r[   r;   r<   r=   r      1   rq   )r   r=   r  r  r   r   r!   r%   r   $      r   )   r   )r;   r<   r=   )r*   r	  r+   r   	netRefinenetStyleZnetFr   r   r|   r   r,   rP   r8   r6   rJ   r  r   rs   rt   Z
cond_styleZimage_style)r:   Znum_pyramidr~   r   r   r  r   r   rv   ZnetRefine_layerZstyle_blockZstyle_F_blockr   r   r>   r   r   r+   5  sn    	


zAFlowNet.__init__Tc           )      C   sJ  |d }|d }|d }|d }|d }d }	d }
g }g }g }g }g }g }g }g }g dg dg dg}g dg d	g dg}g d
g d	g dg}g dg d	g d
g}t g d}||d d d d ddf< ||d d d d ddf< ||d d d d ddf< ||d d d d ddf< t|dddd|}tj|dd| _t	|}t
|D ]_}||d |  }||d |  }|| |	d ur|rtj||	 ddddddd}n|}| j| t||gd}|| t|}|	d urtj|	|ddd}n|dddd}|}	tj||ddddddd}t||gd}| j| |}| j| |}||| j krVd||  } | j| t||
| |||| j   | gd}n|
d uri| j| t||
gd}n|dkru| j| |}| |d}
||
 || t|}tj|	|ddd}tj|ddd}	||	 tj|dt	|d |  dd}!tj|!|	ddddddd}"||" tj|dt	|d |  dd}#tj|#|	ddddddd}$||$ tj|	ddd\}%}&t|%| j}'t|&| j}(||' ||( qtj||	ddddddd}||	||||||||f
S )Nr   rN   r   rM   r   )r   r   r   )rN   rN   )r   rN   r   )r   r  r   )rN   r   r   )r   r   rN   )rM   rM   rN   r   F)r   Zrequires_gradr   borderrd   Zpadding_modeg      ?rb   r   r   )npr   r   ZFloatTensorr   tor,   r   r   r}   r|   rs   rh   grid_sampler   r  r   r   r  r   r   r   rj   r   splitr   ))r:   global_flow_inputr   Zwarp_featurerB   x_edgeZx_warpsZx_condslocalmap_listr   Z	last_gmapgmap_alllast_flow_all
delta_listx_all
x_edge_allZcond_fea_alldelta_x_alldelta_y_allZfilter_xZfilter_yZfilter_diag1Zfilter_diag2Zweight_arrayZfea_numrv   x_warpZx_condZx_warp_afterr   concatZg_mapZupsample_tmpZcur_xZ
cur_x_warpZ
cur_x_edgeZcur_x_warp_edgeZflow_xZflow_yZdelta_xZdelta_yr   r   r   rC     s   









zAFlowNet.forwardc                 C   r_   r`   re   rg   r   r   r   rj   J  rk   zAFlowNet.upsample)rq   rM   )Trl   r   r   r>   r   r	  3  s
     
zr	  c                       s2   e Zd ZdZd
 fdd	Zdd Zdd	 Z  ZS )Warpingz(initialize the try on warping model
    #   rM   c              	      s   t t|   g d}t|d | _tjdddddd| _tjdddddd| _t	dddddd	dd
| _
t	dddddd	dd
| _t||| _t||| _t|| _t|| _tt||d| _t|dd| _tjdd| _d| _d S )Nrn   rN   rM   r   FrO   ro   r%  r!   r   )r   r   )r   r   r   r   )r*   r$  r+   r}   numr,   r8   cloth_inputperson_inputr   c_input_refinep_input_refinerm   src_featurestar_featuresrx   src_FPNtar_FPNr	  global_flowr   
local_flowr   softmaxZinput_scale)r:   Zinput_ncr   Znum_filtersr>   r   r   r+   W  s.   




zWarping.__init__c           9      C   s  |d }|d }|d }|d }|d }|d }|d }|d }	|d	 }
|j \}}}}| |}| |}| tj||fdd
}| tj||fdd
}| |}| |}| 	|}| 
|}|}|}| |||||\}}||||||g}| ||
\
}}}}} }!}"}#}$}%g }&tt|D ]U}'| ||' }(t|})tdD ]=}*tj|||' d d |*d |*d d d d d d f ddddddd}+|)|+|(d d |*d d d d f jdd
 7 })q|&|) q| |%d },|,d d dd d d d f jdd
| |,d d dd d d d f jdd
|&d   }-|	j \}}}.}/tj||.|/fdd}0tj|	|0ddddddd}1| |d }(tj|(|.|/fdd}2tj|d |.|/fdd}3t|	}4tdD ]F}*tj|3d d |*d |*d d d d d d f |.|/fdd}5tj|	|5ddddddd}+|4|+|2d d |*d d d d f jdd
 7 }4q]tj|,|.|/fdd}6|6d d dd d d d f jdd
|1 |6d d dd d d d f jdd
|4  }7t|1|4|7gd}8||||| |!|"|#|$|&|-|%|8fS )Nr   rN   r   rM   r   r   r      r  r   r   r   r  r  r   Zbicubic)r
   rd   )r   r'  r(  r)  r   r   r*  r+  r,  r-  r.  r0  r/  r|   r}   r1  Z
zeros_likerh   r  r   r   rs   r   )9r:   Zwarping_inputr   ZpersonZ	c_heatmapZ	p_heatmapr   r   r  Z	org_clothr   r   r   r   r   cfpfZ	src_inputZ	tar_inputZ
src_en_feaZ
tar_en_feaZ	src_c_feaZ	tar_c_feaZsrc_fuse_feaZtar_fuse_feaZlocalflow_listr  r  r"  r   r  Zflow_allr  r  r  r   r!  r  Zlocal_warped_cloth_listrv   ZlocalmapZwarped_clothjZonce_warped_clothZ	globalmapZ
fuse_clothhwZup_last_flowZup_warped_gclothZup_mapZup_flowZup_warped_lclothZonce_up_flowZup_globalmapZup_fuse_clothZup_clothr   r   r   rC   o  s   









0&*
*
zWarping.forwardc                 C   s  ddl m} ddl m} | \}}}}	td|	dd|d}
td|ddd|	}|
dd||	|ddd}
|dd||	|ddd}t|
|fd	 }|j
r]| }||| }d|dddddddf   t|	d d d |dddddddf< d|dddddddf   t|d d d |dddddddf< |ddd	d}tj||}tjt| |}tj||}d||d
k < d||dk< || S )z
        warp an image/tensor (im2) back to im1, according to the optical flow
        x: [B, C, H, W] (im2)
        flo: [B, 2, H, W] flow
        r   N)VariablerN   r   r   r   r   rM   gH.?)Ztorch.autogradautogradr8  r
   r   r   r   r   r   r   Zis_cudacudaclonemaxr   r,   
functionalr  r   r  )r:   rB   flor   r9  r8  Br   r   r   xxyyr   Zvgridoutputr   r   r   r   warp  s4   44zWarping.warp)r%  rM   )rE   rF   rG   __doc__r+   rC   rC  rH   r   r   r>   r   r$  S  s
    [r$  )r   r   )r   )$collectionsr   mathr   Zcv2numpyr  r   Ztorch.nnr,   Ztorch.nn.functionalr=  rh   Ztorch.optimZoptimr   Moduler   rJ   rW   rY   r^   rm   rx   r   r   r   r   r   r   r   r   r   r  r	  r$  r   r   r   r   <module>   s>   B(
	 6e
DUQ  "