
    9i                         S r SSKrSSK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  \" 5       rS rS r " S	 S
5      r " S S5      rSS jr " S S\
5      rg)zx
Part of the implementation is borrowed and modified from LaMa, publicly available at
https://github.com/saic-mdal/lama
    N)
get_logger   )BaseInpaintingTrainingModule)feature_matching_lossmasked_l1_lossc                 >    U R                  5        H	  nXl        M     g N)
parametersrequires_grad)modulevalueparams      m/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/cv/image_inpainting/default.pyset_requires_gradr      s    ""$# %    c                 ^    U R                  5        VVs0 s H
  u  p#X-   U_M     snn$ s  snnf r	   )items)dctprefixkvs       r   add_prefix_to_keysr      s(    &)iik2kdaFJMk222s   )c                   $    \ rS rSrSS jrS rSrg)
LinearRamp   c                 4    Xl         X l        X0l        X@l        g r	   )start_value	end_value
start_iterend_iter)selfr   r   r   r    s        r   __init__LinearRamp.__init__   s    &"$ r   c                    XR                   :  a  U R                  $ XR                  :  a  U R                  $ XR                   -
  U R                  U R                   -
  -  nU R                  SU-
  -  U R                  U-  -   $ Nr   )r   r   r    r   )r!   iparts      r   __call__LinearRamp.__call__"   sm    ###>>!OO#(GH1t8,t~~/DDDr   )r    r   r   r   N)r   r   r   __name__
__module____qualname____firstlineno__r"   r(   __static_attributes__ r   r   r   r      s    !Er   r   c                        \ rS rSrS rS rSrg)
LadderRamp+   c                     Xl         X l        [        U5      [        U5      S-   :X  d   [        U5      [        U5      45       eg r%   )start_itersvalueslen)r!   r6   r7   s      r   r"   LadderRamp.__init__-   sF    &6{c+.22 	GS[585E5G 	G2r   c                 b    [         R                  " U R                  U5      nU R                  U   $ r	   )bisectbisect_rightr6   r7   )r!   r&   	segment_is      r   r(   LadderRamp.__call__3   s)    ''(8(8!<	{{9%%r   )r6   r7   Nr+   r1   r   r   r3   r3   +   s    G&r   r3   c                 b    U S:X  a  [        S0 UD6$ U S:X  a  [        S0 UD6$ [        SU  35      e)NlinearladderzUnexpected ramp kind: r1   )r   r3   
ValueError)kindkwargss     r   get_ramprE   8   sA    x#F##x#F##
-dV4
55r   c                   `   ^  \ rS rSr            SU 4S jjrS rS rS rS	S jrSr	U =r
$ )
DefaultInpaintingTrainingModule@   c                    > [         TU ]  XS9  X0l        Ub  [        S0 UD6OS U l        XPl        X`l        Xpl        Xl        S U l	        Xl
        SU l        SU l        SU l        Xl        g )N)	model_dirpredict_onlyd   
   r   r1   )superr"   concat_maskrE   rescale_size_getterimage_to_discriminatoradd_noise_kwargsnoise_fill_holeconst_area_crop_kwargsrefine_mask_for_losses distance_weighted_mask_for_discrfeature_matching_weightlosses_l1_weight_knownlosses_l1_weight_missingfake_fakes_proba)r!   rJ   rK   rO   rescale_scheduler_kwargsrQ   rR   rS   rT   distance_weighter_kwargsrV   rZ   fake_fakes_generator_kwargsrD   	__class__s                 r   r"   (DefaultInpaintingTrainingModule.__init__B   s     	9H& &1 $, $
&$
7; 	  '=# 0.&<#&*#0P-'*$&(#()% 0r   c                     US   nUS   nUSU-
  -  nU R                   (       a  [        R                  " XC/SS9nU R                  U5      US'   X1S   -  SU-
  US   -  -   US'   X1S'   U$ )Nimagemaskr   )dimpredicted_image	inpaintedmask_for_losses)rO   torchcat	generator)r!   batchimgrb   
masked_imgs        r   forward'DefaultInpaintingTrainingModule.forwarda   s    GnV}AH%
J#51=J#'>>*#= !*;$<<Hg@' 'k $( r   c                    US   nXR                      nUS   nUS   n[        X2UU R                  U R                  5      nUn[	        US9nU R
                  (       a  UOUn	U R                  R                  UUU R                  U R                  S9  U R                  U5      u  pU R                  U5      u  pU R                  R                  UUU
UU	S9u  pX~-   nXS'   UR                  [        US5      5        U R                  S	:  a.  S
nU(       a  UOS n[        XUS9U R                  -  nUU-   nUUS'   U R                  b  U R                  X25      nUU-   nUUS'   Xx4$ )Nra   rb   rf   )gen_l1
real_batch
fake_batchri   discriminatorrr   rs   discr_real_preddiscr_fake_predrb   gen_advadv_r   F)rb   gen_fmgen_resnet_pl)rQ   r   rX   rY   dictrV   adversarial_losspre_generator_stepri   rt   generator_lossupdater   rW   r   loss_resnet_pl)r!   rj   rk   predicted_imgoriginal_masksupervised_maskl1_value
total_lossmetricsmask_for_discrrv   discr_real_featuresrw   discr_fake_featuresadv_gen_lossadv_metricsneed_mask_in_fmmask_for_fmfm_valueresnet_pl_values                       r   r   .DefaultInpaintingTrainingModule.generator_lossr   s   Gn99:f 12 "-o"&"="="&"?"?A 
h' -1,Q,QWd00$nn,,	 	1 	.
 04/A/A#/F,/3/A/A0,$($9$9$H$H$++ %I %!!  .
)	)+v>? ''!+#O-</$K,# "$($@$@AH $h.J (GH*"11-EO#o5J'6GO$""r   c                    Sn0 nXR                      R                  5       nU R                  R                  US   UU R                  U R
                  S9  U R                  US   5      u  pVU R                  U5      u  pxU R                  R                  US   UUUUS   S9u  pX)-   S-  nXS'   UR                  [        U
S5      5        X#4$ )	Nr   ra   rq   rb   ru   g?	discr_advry   )	rQ   detachr}   pre_discriminator_stepri   rt   discriminator_lossr   r   )r!   rj   r   r   r   rv   r   rw   r   adv_discr_lossr   s              r   r   2DefaultInpaintingTrainingModule.discriminator_loss   s    
99:AAC44W~$nn,,	 	5 	.
 04/A/A'N0,/3/A/A0,&*&;&;&N&NW~$++v 'O ' # !1S8
-)+v>?""r   c                 h   US:X  a-  [        U R                  S5        [        U R                  S5        O2US:X  a,  [        U R                  S5        [        U R                  S5        U " U5      nSnUb  US:X  a  U R                  U5      u  p4OUb  US:X  a  U R	                  U5      u  p4[        US9nU$ )Nr   TFr   )loss)r   ri   rt   r   r   r|   )r!   rj   optimizer_idxr   r   results         r   _do_step(DefaultInpaintingTrainingModule._do_step   s    Adnnd3d00%8adnne4d00$7U
 MQ$6"&"5"5e"<J"mq&8"&"9"9%"@J:&r   )rR   rO   rT   rV   rZ   rW   rQ   rX   rY   rS   rU   rP   ) FTNrd   NFNNFr   Nr	   )r,   r-   r.   r/   r"   rm   r   r   r   r0   __classcell__)r^   s   @r   rG   rG   @   sH     #!*.(9"&!&(,*.27"#-11>"2#h#6 r   rG   )rA   )__doc__r;   rg   torch.nn.functionalnn
functionalFmodelscope.utils.loggerr   baser   modules.feature_matchingr   r   LOGGERr   r   r   r3   rE   rG   r1   r   r   <module>r      s\        . . K	$
3E E"
& 
&6R&B Rr   