
    9i                     p   S r SSKJ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  SSKJr  SSKJrJr  S	S
KJr  S	SKJrJr  S rSS jr " S S\R                  R8                  5      r " S S\R                  R8                  5      r\R>                  " \\R@                  S9 " S S\5      5       r!g)zx
Part of the implementation is borrowed and modified from LaMa, publicly available at
https://github.com/saic-mdal/lama
    )DictN)linalg)Metrics)InceptionV3)default_group)torch_nested_detachtorch_nested_numpify   )Metric)METRICS
MetricKeysc                 \    [         R                  " U SS9n[         R                  " U SS9nX4$ )Nr   )axisF)rowvar)npmeancov)actmusigmas      j/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/metrics/image_inpainting_metric.py#fid_calculate_activation_statisticsr      s*    	1	BFF3u%E9    c                    [        U 5      u  p4[        U5      u  pVX5-
  n[        R                  " UR                  U5      SS9u  p[        R
                  " U5      R                  5       (       dO  [        R                  " UR                  S   5      U-  n
[        R                  " XJ-   R                  Xj-   5      5      n[        R                  " U5      (       a  [        R                  " [        R                  " U5      R                  SSS9(       dN  [        R                  " [        R                  " UR                  5      5      n[        SR!                  U5      5      eUR"                  n[        R$                  " U5      nUR                  U5      [        R$                  " U5      -   [        R$                  " U5      -   SU-  -
  $ )NF)dispr   g{Gz?)atolzImaginary component {}   )r   r   sqrtmdotr   isfinitealleyeshapeiscomplexobjallclosediagonalimagmaxabs
ValueErrorformatrealtrace)activations_predactivations_targetepsmu1sigma1mu2sigma2diffcovmean_offsetm
tr_covmeans                r   calculate_frechet_distancer;      sA   56FGKC56HIKC9D fjj0u=JG;;w##%%Q(3.,,44V_EF 
w{{2;;w/44adCrvvgll+,A5<<Q?@@,,'"JHHTNRXXf--0@@*n r   c                   H   ^  \ rS rSrSU 4S jjrS	S jrS rS rS rSr	U =r
$ )
FIDScore5   c                   > [         TU ]  5         [        [        SS 5      c6  [        R
                  U   n[	        U/5      R                  5       [        l        [        R                  U l        X l	        U R                  5         g )N_MODEL)super__init__getattrr=   r   BLOCK_INDEX_BY_DIMevalr@   modelr0   reset)selfdimsr0   	block_idx	__class__s       r   rB   FIDScore.__init__7   s]    8Xt,4#66t<I)9+6;;=HO__


r   c                 $   U R                  U5      nU R                  U5      nU R                  R                  UR                  5       R	                  5       5        U R
                  R                  UR                  5       R	                  5       5        g N)_get_activationsr.   appenddetachcpur/   )rH   
pred_batchtarget_batchmaskr.   r/   s         r   forwardFIDScore.forward@   sr    00<!22<@$$%5%<%<%>%B%B%DE&&'9'@'@'B'F'F'HIr   c                 D   U R                   U R                  p![        R                  " U5      R	                  5       R                  5       n[        R                  " U5      R	                  5       R                  5       n[        XU R                  S9nU R                  5         U$ )N)r0   )	r.   r/   torchcatrR   numpyr;   r0   rG   )rH   r.   r/   total_distances       r   	get_valueFIDScore.get_valueG   s    040E0E040G0G - 99%56::<BBD"YY'9:>>@FFH3dhh@ 	

r   c                      / U l         / U l        g rN   )r.   r/   rH   s    r   rG   FIDScore.resetS   s     ""$r   c                     U R                  U5      S   nUR                  S   S:w  d  UR                  S   S:w  a   S5       eUR                  S5      R                  S5      nU$ )Nr   r   r
      zNWe should not have got here, because Inception always scales inputs to 299x299)rF   r#   squeeze)rH   batchactivationss      r   rO   FIDScore._get_activationsW   sl    jj'*Q1$(9(9!(<(Aa`a5!))"-55b9r   )r.   r/   r0   rF   )i   ư>rN   )__name__
__module____qualname____firstlineno__rB   rV   r]   rG   rO   __static_attributes____classcell__rK   s   @r   r=   r=   5   s"    J
% r   r=   c                   T   ^  \ rS rSrSrS
U 4S jjrS rS rS r SS jr	S r
S	rU =r$ )SSIM`   zeSSIM. Modified from:
https://github.com/Po-Hsun-Su/pytorch-ssim/blob/master/pytorch_ssim/__init__.py
c                    > [         TU ]  5         Xl        X l        SU l        U R                  SU R                  XR                  5      5        g )Nr
   window)rA   rB   window_sizesize_averagechannelregister_buffer_create_window)rH   rv   rw   rK   s      r   rB   SSIM.__init__e   sD    &(X!00llK	Mr   c                    [        UR                  5      S:X  d   eUR                  5       S   nX0R                  :X  aM  U R                  R
                  R                  5       UR
                  R                  5       :X  a  U R                  nO9U R                  U R                  U5      nUR                  U5      nX@l        X0l        U R                  XX@R                  UU R                  5      $ )N   r
   )lenr#   sizerx   ru   datatyperz   rv   type_as_ssimrw   )rH   img1img2rx   ru   s        r   rV   SSIM.forwardm   s    4::!###))+a.ll"t{{'7'7'<'< (
YY^^([[F(()9)97CF^^D)F K"Lzz$f.>.>++- 	-r   c                     [         R                  " [        U5       Vs/ s H4  n[        R                  " X1S-  -
  S-  * [        SUS-  -  5      -  5      PM6     sn5      nXDR                  5       -  $ s  snf )Nr   )rY   Tensorranger   expfloatsum)rH   rv   r   xgausss        r   	_gaussianSSIM._gaussian   sq    ;'
' FFQ*+a//%E1H2EEF'
  yy{""	
s   ;A2c                    U R                  US5      R                  S5      nUR                  UR                  5       5      R	                  5       R                  S5      R                  S5      nUR                  USUU5      R                  5       $ )Ng      ?r
   r   )r   	unsqueezemmtr   expand
contiguous)rH   rv   rx   
_1D_window
_2D_windows        r   rz   SSIM._create_window   sq    ^^K5??B
]]LLN!EGIIaL1 	  ![!,..8jl	;r   c                 <   [         R                  " XUS-  US9n[         R                  " X#US-  US9nUR                  S5      n	UR                  S5      n
Xx-  n[         R                  " X-  X4S-  US9U	-
  n[         R                  " X"-  X4S-  US9U
-
  n[         R                  " X-  X4S-  US9U-
  nSnSnSU-  U-   SU-  U-   -  X-   U-   X-   U-   -  -  nU(       a  UR                  5       $ UR                  S5      R                  S5      R                  S5      $ )Nr   )paddinggroupsg-C6?gH}M?r
   )Fconv2dpowr   )rH   r   r   ru   rv   rx   rw   r1   r3   mu1_sqmu2_sqmu1_mu2	sigma1_sq	sigma2_sqsigma12C1C2ssim_maps                     r   r   
SSIM._ssim   sK    hh;!#3WFhh;!#3WF )HHK*:$%	 HHK*:$%	 ((K*:%& [2%!g+*:;_r)i.Cb.HIK ==?"}}Q$$Q',,Q//r   c                     g rN    )rH   
state_dictprefixlocal_metadatastrictmissing_keysunexpected_keys
error_msgss           r   _load_from_state_dictSSIM._load_from_state_dict   s    r   )rx   rw   ru   rv   )   T)T)rj   rk   rl   rm   __doc__rB   rV   r   rz   r   r   rn   ro   rp   s   @r   rr   rr   `   s2    M-&#;  #0J r   rr   )	group_keymodule_namec                   L    \ rS rSrSrS rS\S\4S jrS rSS jr	S	 r
S
 rSrg)ImageInpaintingMetric   z?The metric computation class for image inpainting classes.
    c                     / U l         / U l        [        SSS9R                  5       U l        [        R
                  R                  5       (       a  SOSn[        5       R                  U5      U l	        g )Nr   F)rv   rw   cudarR   )
predstargetsrr   rE   rY   r   is_availabler=   toFID)rH   devices     r   rB   ImageInpaintingMetric.__init__   sR    
Re<AAC	 ::2244%:==(r   outputsinputsc                     US   nUS   nU R                   R                  [        U5      5        U R                  R                  [        U5      5        g )N	inpaintedimage)r   rP   r   r   )rH   r   r   predtargets        r   addImageInpaintingMetric.add   sE    {#

-d34/78r   c                 p   / n[        U R                  U R                  5       H6  u  p#UR                  U R	                  X#5      5        U R                  X#5        M8     [        U5      nU R
                  R                  5       n[        R                  [        R                  " U5      [        R
                  U0$ rN   )zipr   r   rP   rr   r   r	   r]   r   r   r   )rH   	ssim_listr   r   fids        r   evaluateImageInpaintingMetric.evaluate   s    	!$**dll;NTTYYt45HHT" < )3	hh  "!3Z^^SIIr   c                     U R                   R                  UR                   5        U R                  R                  UR                  5        g rN   )r   extendr   )rH   others     r   mergeImageInpaintingMetric.merge   s.    

%++&EMM*r   c                 2    U R                   U R                  4$ rN   )r   r   r`   s    r   __getstate__"ImageInpaintingMetric.__getstate__   s    zz4<<''r   c                 B    U R                  5         Uu  U l        U l        g rN   )rB   r   r   )rH   states     r   __setstate__"ImageInpaintingMetric.__setstate__   s    #( 
DLr   )r   rr   r   r   N)r   r   )rj   rk   rl   rm   r   rB   r   r   r   r   r   r   rn   r   r   r   r   r      s4    )94 9 9J+()r   r   )ri   )"r   typingr   r[   r   rY   torch.nn.functionalnn
functionalr   scipyr   modelscope.metainfor   7modelscope.models.cv.image_inpainting.modules.inceptionr   modelscope.utils.registryr   modelscope.utils.tensor_utilsr   r	   baser   builderr   r   r   r;   Moduler=   rr   register_moduleimage_inpainting_metricr   r   r   r   <module>r      s          ' O 3A  (4(uxx (VU588?? Up 	)H)HJ#)F #)J#)r   