
    9iE                        S SK r S SKrS SKrS SKJr  S SKJs  Jr  S SK	J
r
  S SKJr  S SKJrJr  S r " S S\R"                  5      r " S S	\R"                  5      r " S
 S\R"                  5      r " S S\R"                  5      rS r " S S\R"                  5      r " S S\R"                  5      r " S S\R"                  5      rg)    N)Models)MODELS)	ModelFileTasksc           
         [        U R                  5       SS  5      n[        R                  " U Vs/ s H!  n[        R                  " X R
                  S9PM#     sn5      n[        U5      n[        U5       VVs/ s H/  u  pEUR                  5       R                  S5      U S S 2US4   -   PM1     nnn[        U[        U5      5       VVs/ s H  u  pRXRS-
  S-  -  S-
  PM     nnn[        R                  " USS9$ s  snf s  snnf s  snnf )	N   )devicer   .g      ?g       @dim)listsizetorchmeshgridaranger	   reversed	enumeratefloat	unsqueezezipstack)offsetsizesr   	grid_listr   grids         i/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/cv/virual_tryon/sdafnet.pyapply_offsetr      s    qr"#E>CDedd==	1eDFI#I #9--IC 	

q!F1c3;$77-   i%99JD 	s"#c)9  
 ;;yb)) 	E
s   (C;96D 
Dc                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )ResBlock!   c                 V  > [         [        U ]  5         [        R                  " [        R
                  " U5      [        R                  " SS9[        R                  " XSSSS9[        R
                  " U5      [        R                  " SS9[        R                  " XSSSS95      U l        g )NTinplace      F)kernel_sizepaddingbias)	superr   __init__nn
SequentialBatchNorm2dReLUConv2dblock)selfin_channels	__class__s     r   r*   ResBlock.__init__#   s{    h&(]]NN;')>IIa'(*{(CGGD!IIa
    c                 *    U R                  U5      U-   $ Nr0   r1   xs     r   forwardResBlock.forward/   s    zz!}q  r5   r8   __name__
__module____qualname____firstlineno__r*   r;   __static_attributes____classcell__r3   s   @r   r   r   !   s    
! !r5   r   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )
Downsample3   c                    > [         [        U ]  5         [        R                  " [        R
                  " U5      [        R                  " SS9[        R                  " UUSSSSS95      U l        g )NTr"   r$   r   r%   F)r&   strider'   r(   )	r)   rF   r*   r+   r,   r-   r.   r/   r0   )r1   r2   out_channelsr3   s      r   r*   Downsample.__init__5   sU    j$(*]]NN;')>II
r5   c                 $    U R                  U5      $ r7   r8   r9   s     r   r;   Downsample.forwardA   s    zz!}r5   r8   r=   rD   s   @r   rF   rF   3   s    
 r5   rF   c                   8   ^  \ rS rSr/ SQ4U 4S jjrS rSrU =r$ )FeatureEncoderE   @         rT   rT   c                   > [         [        U ]  5         / U l        [	        U5       H  u  p4US:X  a4  [
        R                  " [        X5      [        U5      [        U5      5      nO9[
        R                  " [        X#S-
     U5      [        U5      [        U5      5      nU R                  R                  U5        M     [
        R                  " U R                  5      U l        g )Nr   r%   )r)   rO   r*   encodersr   r+   r,   rF   r   append
ModuleList)r1   r2   chnsiout_chnsencoderr3   s         r   r*   FeatureEncoder.__init__G   s    nd,.$T?KAAv--{5x7IX&( --tE{H5x7IX&( MM  ) + dmm4r5   c                 b    / nU R                    H  nU" U5      nUR                  U5        M     U$ r7   )rV   rW   )r1   r:   encoder_featuresr\   s       r   r;   FeatureEncoder.forwardY   s5    }}G
A##A& %  r5   )rV   r=   rD   s   @r   rO   rO   E   s    )A 5$   r5   rO   c                   :   ^  \ rS rSr/ SQS4U 4S jjrS rSrU =r$ )RefinePyramida   rQ   rT   c                   > [         [        U ]  5         Xl        / U l        [        [        U5      5       H3  n[        R                  " X2SS9nU R                  R                  U5        M5     [        R                  " U R                  5      U l        / U l        [        [        U5      5       H4  n[        R                  " X"SSS9nU R                  R                  U5        M6     [        R                  " U R                  5      U l        g )Nr%   )r&   r$   )r&   r'   )r)   rb   r*   rY   adaptiver   r   r+   r/   rW   rX   smoothrangelen)r1   rY   fpn_dimin_chnsadaptive_layerrZ   smooth_layerr3   s          r   r*   RefinePyramid.__init__c   s    mT+-	 HTN+GYYwQGNMM  0 , dmm4s4y!A99a<LKK|, " mmDKK0r5   c                 4   Un/ nS n[        [        [        U5      5      5       H^  u  pVU R                  U   " U5      nUb  U[        R
                  " USSS9-   nU R                  U   " U5      nUnUR                  U5        M`     [        [        U5      5      $ )Nr   nearestscale_factormode)	r   r   r   re   Finterpolaterf   rW   tuple)r1   r:   conv_ftr_listfeature_listlast_featurerZ   conv_ftrfeatures           r   r;   RefinePyramid.forwardu   s    $T(=*A%BCKAmmA&x0G'!AMM qy%B B kk!nW-G"L( D Xl+,,r5   )re   rY   rf   r=   rD   s   @r   rb   rb   a   s    4c 1$- -r5   rb   c           	      b   [         R                  " X$S5      nU R                  5       u  pVpx[         R                  " XS5      n	[        R                  " U	UR                  5       R                  SSSS5      SSS9n
U
R                  USXx5      U-  n[        [         R                  " XS5      5      nU$ )	Nr%   r   r   r$   bilinearborderrr   padding_moder
   )
r   repeat_interleaver   rs   grid_sampledetachpermutereshapesumsplit)featoffsetsatt_mapssample_kout_chBCHW
multi_featmulti_warp_featmulti_att_warp_featatt_warp_feats                r   DAWarpr      s    &&x;HJA!((;Jmm  Aq!,	O
 *11!R>I$7CDMr5   c                   :   ^  \ rS rSrS/ SQ4U 4S jjrS rSrU =r$ )MFEBlock   r$   )rS   rR       c                 T  > [         [        U ]  5         / n[        [	        U5      5       H  nUS:X  a3  UR                  [        R                  R                  UXF   SSSS95        O:UR                  [        R                  R                  XFS-
     XF   USUS-  S95        UR                  [        R                  R                  SSS95        M     UR                  [        R                  R                  US	   UUSUS-  S95        [        R                  R                  " U6 U l        g )
Nr   r$   r%   r2   rJ   r&   rI   r'   r   F皙?r#   negative_sloper
   )r)   r   r*   rg   rh   rW   r   r+   r/   	LeakyReLUr,   layers)r1   r2   rJ   r&   num_filtersr   rZ   r3   s          r   r*   MFEBlock.__init__   s   
 	h&(s;'(AAvHHOO$/%0^$%  ! $ #$ HHOO$/A$6%0^$/  +q 0 $ 23 MM""5"EG# )& 	HHOO'O)'#q(  *	+ hh))62r5   c                 $    U R                  U5      $ r7   r   )r1   inputs     r   r;   MFEBlock.forward   s    {{5!!r5   r   r=   rD   s   @r   r   r      s    
 *	!3F" "r5   r   c                   <   ^  \ rS rSrSU 4S jjr   SS jrSrU =r$ )	DAFlowNet   c                   > [         [        U ]  5         / U l        / U l        / U l        X0l        X l        [        U5       H  n[        SU-  U R                  S-  SS9n[        SU-  U R                  S-  S9n[        SU-  U R                  S-  S9nU R                  R                  U5        U R                  R                  U5        U R
                  R                  U5        M     [        R                  " U R                  5      U l        [        R                  " U R                  5      U l        [        R                  " U R
                  5      U l        [        R                  R                  [        R                  R                  SSS	S	S
9[        R                  R!                  SSS9[        R                  R                  SSSS	S	S95      U l        [        R                  R                  [        R                  R                  SSSS	S	S9[        R                  R!                  SSS9[        R                  R                  SSS	S	S95      U l        g )Nr   r$      )r2   rJ   r&   )r2   rJ      rR   r   r%   )rJ   r&   rI   Fr   r   r   )rJ   r&   rI   r'   )r2   rJ   r&   rI   )r)   r   r*   	Self_MFEs
Cross_MFEsRefine_MFEskr   rg   r   rW   r+   rX   r   r,   r/   r   lights_decoderlights_encoder)	r1   num_pyramidri   	head_numsrZ   Self_MFE_layerCross_MFE_layerRefine_MFE_layerr3   s	           r   r*   DAFlowNet.__init__   s   i'){#A%K!VVaZN
 'KdffqjBO  (Kdffqj BNN!!.1OO""?3##$45 $  t~~6--8==)9)9:#hh11HHOOBRQqOIHHuSAHHOO   $hh11HHOO!Q  HHHuSAHHOORQq  J	Kr5   c           	         SnSn	U(       a  / n
[        [        U5      5       GH  nU[        U5      S-
  U-
     nU[        U5      S-
  U-
     nUR                  5       u  pnnU	bL  U(       aE  [        XWU R                  U R
                  5      n[        XWU R                  U R
                  5      nOUnUn[        R                  " UU/S5      nU R                  U   " U5      n[        R                  " USS2U R                  S-  S2SS2SS24   SS9n[        USS2SU R                  S-  2SS2SS24   R                  SSUU5      5      nU	b  [        R                  " U	USSS9nOUR                  S	S
SS5      nUn	[        XUU R                  U R
                  5      n[        R                  " UU/S5      nU R                  U   " U5      n[        R                  " USS2U R                  S-  S2SS2SS24   SS9n[        USS2SU R                  S-  2SS2SS24   R                  SSUU5      5      nUb  [        R                  " UUSSS9nOUR                  S	S
SS5      nUn[        XUU R                  U R
                  5      n[        R                  " UU/S5      nU R                   U   " U5      n[        R                  " USS2U R                  S-  S2SS2SS24   SS9n[        USS2SU R                  S-  2SS2SS24   R                  SSUU5      5      n[        USS2U R                  S-  U R                  S-  2SS2SS24   R                  SSUU5      5      n[        R                  " U	USSS9n	[        R                  " UUSSS9n[        R"                  " U	SSS9n	[        R"                  " USSS9n[        R"                  " USS2SU R                  2SS2SS24   SSS9n[        R"                  " USS2U R                  S2SS2SS24   SSS9nU(       d  GM	  [        R"                  " UUS-  US-  4SS9n[        R"                  " UUS-  US-  4SS9nU(       ai  U R%                  U5      nU R%                  U5      n[        UU	UU R                  S5      n[        UUUU R                  S5      nU R'                  UU-   5      n O7[        UU	UU R                  S
5      n[        UUUU R                  S
5      nUU-   n W
R)                  U 5        GM      [        R"                  " UUR                  5       SS SS9n[        R"                  " XR                  5       SS SS9n	[        R"                  " WUR                  5       SS SS9n[        R"                  " WUR                  5       SS SS9nU(       ai  U R%                  U5      nU R%                  U5      n[        UU	UU R                  S5      n[        UUUU R                  S5      nU R'                  UU-   5      n O7[        UU	UU R                  S
5      n[        UUUU R                  S
5      nUU-   n U(       a  U U4$ U $ )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
   r}   r~   r   r   r$      rp   )rr   rR   )rg   rh   r   r   r   r   r   catr   rs   softmaxr   r   r   r   r   r   rt   r   r   rW   )!r1   source_imagereference_imagesource_featsreference_feats
return_allwarp_featureuse_light_en_delast_multi_self_offsetslast_multi_cross_offsetsresults_allrZ   feat_sourcefeat_refr   r   r   r   cross_att_mapsatt_source_featself_att_mapsatt_reference_feat
input_featoffsets_attr   r   cross_offsetsself_offsetscur_source_imagecur_reference_imagewarp_att_source_imagewarp_att_reference_imageresult_tryons!                                    r   r;   DAFlowNet.forward   s   * #'#' Ks<()A&s<'81'<q'@AK&s?';a'?!'CDH$))+JA!Q (3"()7#N%+H,94664;;&P" #.%-"OX#>BJ//!,Z8KYYAtvvz{Aq01q:N";q+466A:+q!/C#D#L#LAq!$ G'3--,#!)	+ "//!Q15'.$$[%3TVVT[[JO O5G#H!LJ..+J7KIIk!TVVaZ[!Q2F&GQOM";q+466A:+q!/C#D#L#LAq!$ G&2--+#!)	+ "//!Q15&-#!'(5tvvt{{"L O5G#H!LJ**1-j9KyyQ
Q-A!BJH(A{
{Aq0199"aAFHM'A FFQJtvvz11a8 99@Q19MOL ()}}(%	('$
 '(mm'%	''# ()}}(qz(K$&'mm'aj'J#MMGTVVGQ)*MM]]DFFGQ)*MN z#$== 1q5!a%.z$C &'mm#a!eQU^*'F#"'+':':;K'L$*.*=*=++-' -33C3K3A4662-O) 066I6M6CTVV680:, $(#6#6-0HH$JL -33C3K3A4661-N) 066I6M6CTVVQ0P, $9;S#SL""<0] *` #$--#  "12&# $%==$&7&7&9!"&=J$P ?//1!"5JHL--/3*F..|<L"11/BO$*<+C+94662%G! (.o.E.;TVVR(I$  ../D1I0J KL %+<+C+94661%F! (.o.E.;TVVQ(H$ 13KKL++r5   )r   r   r   r   r   r   r   )rT   r%   )FTTr=   rD   s   @r   r   r      s!    *Kb !! $l lr5   r   c                   <   ^  \ rS rSrSU 4S jjr   SS jrSrU =r$ )SDAFNet_Tryoni  c                    > [         [        U ]  5         / SQn[        X$5      U l        [        X5      U l        [        U5      U l        [        U5      U l        [        [        U5      US9U l        g )NrQ   )r   )r)   r   r*   rO   source_featuresreference_featuresrb   
source_FPNreference_FPNr   rh   dafnet)r1   ref_in_channelsource_in_channelr   r   r3   s        r   r*   SDAFNet_Tryon.__init__  s\    mT+-.-.?M"0"M'4*;7K 0IFr5   c           
          U R                  U R                  U5      5      nU R                  U R                  U5      5      nU R	                  UUUUUUUS9n	U	$ )N)r   r   r   )r   r   r   r   r   )
r1   	ref_inputr   	ref_imager   r   r   r   r   results
             r   r;   SDAFNet_Tryon.forward  sj     ,,##I.0t';';L'IJ+!%  ' r5   )r   r   r   r   r   )r$   r   )TFTr=   rD   s   @r   r   r     s    G !% ! r5   r   )randomnumpynpr   torch.nnr+   torch.nn.functional
functionalrs   modelscope.metainfor   modelscope.modelsr   modelscope.utils.constantr   r   r   Moduler   rF   rO   rb   r   r   r   r    r5   r   <module>r      s          & $ 6*(!ryy !$ $ RYY  8%-BII %-P&"ryy &"RZ		 ZzBII r5   