o
    ߥi                     @   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 ]/home/ubuntu/.local/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   meshgridreversed	enumeratezipstack)r   sizes	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reflect	replicater$   r   zUnsupported padding type: {}r"   instancenonezUnsupported normalization: {}reluT)inplacelrelug?r#   selutanhsigmoidzUnsupported activation: {})bias)super__init__use_biasnnReflectionPad2dpadReplicationPad2d	ZeroPad2dformatBatchNorm2dnormInstanceNorm2dReLU
activation	LeakyReLUPReLUSELUTanhSigmoidConv2dconv)self	input_dim
output_dimkernel_sizestridepaddingr:   r=   pad_typer/   norm_dim	__class__r   r   r1   "   sF   

zConv2dBlock.__init__c                 C   s4   | j r|  |}| jr| |}| | |}|S N)r:   r=   rD   r5   rE   xr   r   r   forwardY   s   

zConv2dBlock.forward)r   r"   r#   r$   T__name__
__module____qualname__r1   rR   __classcell__r   r   rM   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rH   rJ   r/   )	r0   rY   r1   r3   
Sequentialr9   r?   rC   blockrE   in_channelsrM   r   r   r1   d   s   
zResBlock.__init__c                 C   s   |  || S rO   r`   rP   r   r   r   rR   p      zResBlock.forwardrS   r   r   rM   r   rY   b       rY   c                       rX   )
ResBlock_2c                    rZ   r[   )	r0   rf   r1   r3   r_   r9   r?   rC   r`   ra   rM   r   r   r1   v   s   
zResBlock_2.__init__c                 C   s   |  || S rO   rc   )rE   x1x2r   r   r   rR      rd   zResBlock_2.forwardrS   r   r   rM   r   rf   t   s    rf   c                       rX   )
DownSamplec                    s>   t t|   tt|t tj||ddddd| _d S )Nr\   r   r]   F)rH   rI   rJ   r/   )	r0   ri   r1   r3   r_   r9   r?   rC   r`   rE   rb   out_channelsrM   r   r   r1      s   
zDownSample.__init__c                 C   
   |  |S rO   rc   rP   r   r   r   rR         
zDownSample.forwardrS   r   r   rM   r   ri      re   ri   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)rH   rI   r/   )	r0   rn   r1   r3   r_   r9   r?   ConvTranspose2dr`   rj   rM   r   r   r1      s   
zUpSample.__init__c                 C   rl   rO   rc   rP   r   r   r   rR      rm   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   r3   UpsamplerE   Fscaleupsampler   r   r   r{         zUpSample.upsamplerT   rU   rV   r1   rR   r{   rW   r   r   rM   r   rn      s    rn   c                       s,   e Zd Zg df fdd	Zdd Z  ZS )FeatureEncoder@         r   r   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]   )r0   r~   r1   encodersr   r3   r_   ri   rY   append
ModuleList)rE   rb   chnsiout_chnsencoderrM   r   r   r1      s   zFeatureEncoder.__init__c                 C   s&   g }| j D ]}||}|| q|S rO   )r   r   )rE   rQ   encoder_featuresr   r   r   r   rR      s
   
zFeatureEncoder.forwardrS   r   r   rM   r   r~      s    r~   c                       s.   e Zd Zg ddf fdd	Zdd Z  ZS )RefinePyramidr   r   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]   rH   r\   )rH   rJ   )r0   r   r1   r   adaptiver   r   r3   rC   r   r   smoothrangelen)rE   r   fpn_dimin_chnsadaptive_layerr   smooth_layerrM   r   r   r1      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   rr   rs   )	r   r   r   r   ry   interpolater   r   tuple)rE   rQ   conv_ftr_listfeature_listlast_featurer   conv_ftrfeaturer   r   r   rR      s   zRefinePyramid.forwardrS   r   r   rM   r   r      s    r   c                 C   s   t | |   |  S z x: tensor )r   rounddetach)rQ   r   r   r   Round   s   r      c                 C   s8   | |k r||    |  } | S | |kr| |   |  } | S r   )r   )rQ   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 )Nr\   r   r      r]   r   r#   r(   r=   r:   r   r   c                 S      g | ]}|d  qS r]   r   r	   r   r   r   r   r         z-CorrelationLayer.__init__.<locals>.<listcomp>r   c                 S   r   r   r   r   r   r   r   r     r   )r0   r   r1   
init_scaler3   Softmaxsoftmax3rB   sigr!   reduce1reduce2step_hstep_wr   intr   r   extendr   mask_hmask_w)rE   r   init_hinit_wstep_h_halfstep_h_half_restep_w_halfstep_w_half_rerM   r   r   r1     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   r]   r   r   r   )rz   r       r\   )r   r   r   r   r   r   )min)r   tensorr   r   shapeonesr   r   r{   r   r   r   r   repeatr   r   matmulzerosr   floorr   clampr   viewpermute
contiguousr   )RrE   locationfea_cfea_pscale_paramHW
c_landmark
p_landmarkr   r   NCfea_Hdownsample_ratiolandmark_flowr   r   fea_cnfea_pn
src_box_h0
src_box_w0
tar_box_h0
tar_box_w0adj_cwadj_chadj_pwadj_phc_hc_wp_hp_w	src_box_h	src_box_w	tar_box_h	tar_box_wsrc_masktar_maskcloth_patch_allperson_patch_alllocation_patch_allone_flow_all
coord_infomaskbr   
c_center_x
c_center_y
p_center_x
p_center_yp_new_top_yp_new_bottom_yp_new_left_xp_new_right_xp_new_hp_new_wc_left_x	c_right_xdelta_x1delta_x2c_top_y
c_bottom_ydelta_y1delta_y2p_left_x	p_right_xdelta_x3delta_x4p_top_y
p_bottom_ydelta_y3delta_y4c_new_top_yc_new_bottom_yc_new_left_xc_new_right_xc_new_hc_new_wQKcorrelationVr   r   r   rR     s  "


,,







&&&&
9
&&
zCorrelationLayer.forwardc                 C   rp   rq   rv   rx   r   r   r   r{     r|   zCorrelationLayer.upsample)r   r}   r   r   rM   r   r      s
     r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )		LocalFlowr   r\      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   r\   r]   )rH   rI   rJ   groupsr   r#   Fr=   r/   r   bilinearT)rt   ru   align_cornersr(   r   )r   r   )r   )r0   r  r1   use_numfusersfusers_refinelocation_predspatch_preds	map_preds
map_refinereducr   r3   rC   r_   r!   rw   rY   ri   r   AdaptiveAvgPool2dr   r   )rE   r   r  r   r   r   r#  r$  r  fusers_refine_layerr  r   patch_layerr!  	map_layerr"  rM   r   r   r1     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 )Nr]   r   r   r   )r   r   r  r  r   catr  r   r!  r"  r$  r   addr#  r   )rE   clothr   r   r   r   	flow_listmap_listr   _r   r   r   fuser   patchatt_mapfea_c_reducfea_p_reducflowr   	last_flowlast_att_mapadd_mapr   r   r   rR     s.   
$
zLocalFlow.forward)r   r\   r  rS   r   r   rM   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 rO   )name)rE   r9  r   r   r   r1     rm   zEqualLR.__init__c                 C   s>   t || jd }|jd|jd d   }|td|  S )N_origr]   r   r   )getattrr9  datar
   numelr   )rE   moduleweightfan_inr   r   r   compute_weight  s   zEqualLR.compute_weightc                 C   s@   t |}t| |}| j|= | |d t|j | | |S )Nr:  )r8  r;  _parametersregister_parameterr3   	Parameterr<  register_forward_pre_hook)r>  r9  fnr?  r   r   r   apply$  s   

zEqualLR.applyc                 C   s   |  |}t|| j| d S rO   )rA  setattrr9  )rE   r>  inputr?  r   r   r   __call__/  s   
zEqualLR.__call__N)rT   rU   rV   r1   rA  staticmethodrG  rJ  r   r   r   r   r8    s    

r8  r?  c                 C   s   t | | | S rO   )r8  rG  )r>  r9  r   r   r   equal_lr4  s   rL  c                       rX   )EqualLinearc                    s<   t    t||}|jj  |jj  t	|| _
d S rO   )r0   r1   r3   Linearr?  r<  normal_r/   zero_rL  linear)rE   in_dimout_dimrQ  rM   r   r   r1   <  s
   
zEqualLinear.__init__c                 C   rl   rO   )rQ  )rE   rI  r   r   r   rR   E  rm   zEqualLinear.forwardrS   r   r   rM   r   rM  :  s    	rM  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   r]   FTr%   )r0   rT  r1   rb   rk   rH   
demudulater3   rD  r   Tensorr?  r/   r_   rM  	PixelNormmlp_class_stdr4   rJ   r7   r<  rO  rP  )
rE   finfoutrH   padding_typer{   
downsample
latent_dimnormalize_mlppadding_sizerM   r   r   r1   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 )	Nr]   r   r   r   r   r\   gh㈵>)r  )r?  r<  r
   r=  r   r   rk   rb   rH   rY  rV  r   rsqrtsumr   rJ   ry   conv2dr/   )rE   rI  latentr@  r?  sdr"   r.  heightwidthoutr   r   r   rR   q  s:   "$

zModulatedConv2d.forward)r$   FFrU  FrS   r   r   rM   r   rT  I  s    &rT  c                       2   e Zd Z					d
 fdd	Zddd	Z  ZS )StyledConvBlockr   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皙?r\   FrH   r\  r{   r^  r_  r   r]   rH   r\  r]  r^  r_  )r0   rk  r1   r3   r4   r7   rT  EqualConv2dr   
actvn_gainmodulated_convr<   r>   conv0r_   actvn0conv1actvn1rE   rZ  r[  r^  rJ   actvnnormalize_affine_outputrq  padding_layerrc  r=   rr  seq0rt  seq1rM   r   r   r1     sV   
	
	
zStyledConvBlock.__init__Nc                 C   s`   | j r
| ||}n| |}| || j }| j r!| ||}n| |}| || j }|S rO   )rq  rr  rs  rp  rt  ru  rE   rI  rd  ri  r   r   r   rR     s   

zStyledConvBlock.forward)r   r$   r+   FFrO   rS   r   r   rM   r   rk    s    Ark  c                       rj  )Styled_F_ConvBlockr   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)   Trl  r   r\   Frm  r   r]   rn  )r0   r}  r1   r3   r4   r7   rT  ro  r   rp  rq  r<   r>   rr  r_   rs  rt  rv  rM   r   r   r1     sT   
		zStyled_F_ConvBlock.__init__Nc                 C   sR   | j r
| ||}n| |}| || j }| j r"| ||}|S | |}|S rO   )rq  rr  rs  rp  rt  r|  r   r   r   rR   #  s   

zStyled_F_ConvBlock.forward)r   r$   r#   FFrO   rS   r   r   rM   r   r}    s    ?r}  c                       s0   e Zd Zd
 fdd	ZdddZdd	 Z  ZS )AFlowNetr   r\   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   r   r\   r]   )rk   rH   rI   rJ   r   )rb   rk   rH   rI   rJ   r      1   r   )r^  rJ   rw  rx  rq  r   r#   r(   r   $      r   )   r  )rH   rI   rJ   )r0   r~  r1   r  	netRefinenetStylenetFr"  r#  r   r   r3   r_   rC   r?   rY   r}  r!   r   r   
cond_styleimage_style)rE   num_pyramidr   r  r\  rw  r_  rq  r   netRefine_layerstyle_blockstyle_F_blockr"  r#  rM   r   r   r1   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   r]   r   r\   r   )r   r   r   )r]   r]   )r   r]   r   )r   r  r   )r]   r   r   )r   r   r]   )r\   r\   r]   r   F)r<  requires_gradr  borderru   padding_modeg      ?rs   r   r   )npr   r   FloatTensorr   tor3   rD  r?  r   r   r   ry   grid_sampler   r  r)  r    r  r"  r  r#  r{   r   splitrc  ))rE   global_flow_inputr   warp_featurerQ   x_edgex_warpsx_condslocalmap_listr5  	last_gmapgmap_alllast_flow_all
delta_listx_all
x_edge_allcond_fea_alldelta_x_alldelta_y_allfilter_xfilter_yfilter_diag1filter_diag2weight_arrayfea_numr   x_warpx_condx_warp_afterr4  concatg_mapupsample_tmpcur_x
cur_x_warp
cur_x_edgecur_x_warp_edgeflow_xflow_ydelta_xdelta_yr   r   r   rR     s   









zAFlowNet.forwardc                 C   rp   rq   rv   rx   r   r   r   r{   J  r|   zAFlowNet.upsample)r   r\   )Tr}   r   r   rM   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
    #   r\   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 )Nr   r]   r\   r   Fr^   r   r  r#   r  )r  r   )r  r   r   r   )r0   r  r1   r   numr3   rC   cloth_inputperson_inputr!   c_input_refinep_input_refiner~   src_featurestar_featuresr   src_FPNtar_FPNr~  global_flowr  
local_flowr   softmaxinput_scale)rE   input_ncr  num_filtersrM   r   r   r1   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   r]   r   r\   r   r   r     r  r   r   r  r  r  r   bicubic)r
   ru   )r   r  r  r  r   r)  r  r  r  r  r  r  r  r   r   r  
zeros_likery   r  r   r   r   r   )9rE   warping_inputr+  person	c_heatmap	p_heatmapr   r   r  	org_clothr   r   r.  r   r   cfpf	src_input	tar_input
src_en_fea
tar_en_fea	src_c_fea	tar_c_feasrc_fuse_featar_fuse_fealocalflow_listr  r  r  r5  r  flow_allr  r  r  r  r  r  local_warped_cloth_listr   localmapwarped_clothjonce_warped_cloth	globalmap
fuse_clothhwup_last_flowup_warped_gclothup_mapup_flowup_warped_lclothonce_up_flowup_globalmapup_fuse_clothup_clothr   r   r   rR   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)Variabler]   r   r   r   r   r\   gH.?)torch.autogradautogradr  r
   r   r   r   r   r)  r   is_cudacudaclonemaxr   r3   
functionalr  r   r  )rE   rQ   flor   r  r  Br   r   r   xxyyr   vgridoutputr   r   r   r   warp  s4   44zWarping.warp)r  r\   )rT   rU   rV   __doc__r1   rR   r  rW   r   r   rM   r   r  S  s
    [r  )r   r   )r?  )$collectionsr   mathr   cv2numpyr  r   torch.nnr3   torch.nn.functionalr  ry   torch.optimoptimr    Moduler!   rY   rf   ri   rn   r~   r   r   r   r   r  r8  rL  rM  rT  rk  r}  r~  r  r   r   r   r   <module>   s>   B(
	 6e
DUQ  "