o
    )j                     @   s   d Z ddlmZ ddlZddlZddlm  mZ	 ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZmZ d	d
lmZ d	dlmZmZ dd ZdddZG dd dejjZG dd dejjZejeej dG dd deZ!dS )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                 C   s$   t j| dd}t j| dd}||fS )Nr   )ZaxisF)Zrowvar)npmeanZcov)Zactmusigma r   k/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/metrics/image_inpainting_metric.py#fid_calculate_activation_statistics   s   r   ư>c                 C   s   t | \}}t |\}}|| }tj||dd\}}	t| s9t|jd | }
t||
 ||
 }t	|r]tj
t|jdddsZtt|j}td||j}t|}||t| t| d|  S )NF)Zdispr   g{Gz?)ZatolzImaginary component {}   )r   r   Zsqrtmdotr   isfinitealleyeshapeZiscomplexobjZallcloseZdiagonalimagmaxabs
ValueErrorformatrealtrace)activations_predactivations_targetepsmu1Zsigma1mu2Zsigma2diffZcovmean_offsetmZ
tr_covmeanr   r   r   calculate_frechet_distance   s    

r+   c                       s@   e Zd Zd fdd	ZdddZdd	 Zd
d Zdd Z  ZS )FIDScore   r   c                    sN   t    ttdd d u rtj| }t|g t_tj| _|| _	| 
  d S )N_MODEL)super__init__getattrr,   r   ZBLOCK_INDEX_BY_DIMevalr.   modelr$   reset)selfdimsr$   Z	block_idx	__class__r   r   r0   7   s   

zFIDScore.__init__Nc                 C   s@   |  |}|  |}| j|   | j|   d S N)_get_activationsr"   appenddetachcpur#   )r5   Z
pred_batchZtarget_batchmaskr"   r#   r   r   r   forward@   s   

zFIDScore.forwardc                 C   sN   | j | j}}t|  }t|  }t||| jd}|   |S )N)r$   )	r"   r#   torchcatr=   numpyr+   r$   r4   )r5   r"   r#   Ztotal_distancer   r   r   	get_valueG   s   zFIDScore.get_valuec                 C   s   g | _ g | _d S r9   )r"   r#   r5   r   r   r   r4   S   s   
zFIDScore.resetc                 C   sF   |  |d }|jd dks|jd dkrJ d|dd}|S )Nr   r   r	      FzNWe should not have got here, because Inception always scales inputs to 299x299)r3   r   Zsqueeze)r5   batchZactivationsr   r   r   r:   W   s   zFIDScore._get_activations)r-   r   r9   )	__name__
__module____qualname__r0   r?   rC   r4   r:   __classcell__r   r   r7   r   r,   5   s    
	r,   c                       sN   e Zd ZdZd fdd	Zdd Zdd	 Zd
d Z	dddZdd Z	  Z
S )SSIMzmSSIM. Modified from:
    https://github.com/Po-Hsun-Su/pytorch-ssim/blob/master/pytorch_ssim/__init__.py
       Tc                    s6   t    || _|| _d| _| d| || j d S )Nr	   window)r/   r0   window_sizesize_averagechannelZregister_buffer_create_window)r5   rO   rP   r7   r   r   r0   e   s   
zSSIM.__init__c                 C   s   t |jdks	J | d }|| jkr#| jj |j kr#| j}n| | j|}|	|}|| _|| _| 
|||| j|| jS )N   r	   )lenr   sizerQ   rN   datatyperR   rO   Ztype_as_ssimrP   )r5   img1img2rQ   rN   r   r   r   r?   m   s   
zSSIM.forwardc                    s*   t  fddtD }||  S )Nc              	      s4   g | ]}t |d   d   td  d    qS )r   )r   expfloat).0xr   rO   r   r   
<listcomp>   s    &z"SSIM._gaussian.<locals>.<listcomp>)r@   ZTensorrangesum)r5   rO   r   gaussr   r_   r   	_gaussian   s   zSSIM._gaussianc                 C   sD   |  |dd}||  dd}||d|| S )Ng      ?r	   r   )rd   Z	unsqueezemmtr\   expand
contiguous)r5   rO   rQ   Z
_1D_windowZ
_2D_windowr   r   r   rR      s   
zSSIM._create_windowc                 C   s   t j|||d |d}t j|||d |d}|d}	|d}
|| }t j|| ||d |d|	 }t j|| ||d |d|
 }t j|| ||d |d| }d}d}d| | d| |  |	|
 | || |   }|rs| S |dddS )Nr   )paddinggroupsg-C6?gH}M?r	   )FZconv2dpowr   )r5   rY   rZ   rN   rO   rQ   rP   r%   r&   Zmu1_sqZmu2_sqZmu1_mu2Z	sigma1_sqZ	sigma2_sqZsigma12ZC1ZC2Zssim_mapr   r   r   rX      sF   

z
SSIM._ssimc                 C   s   d S r9   r   )r5   Z
state_dictprefixZlocal_metadatastrictZmissing_keysZunexpected_keys
error_msgsr   r   r   _load_from_state_dict   s   zSSIM._load_from_state_dict)rM   T)T)rH   rI   rJ   __doc__r0   r?   rd   rR   rX   rp   rK   r   r   r7   r   rL   `   s    
%rL   )Z	group_keymodule_namec                   @   sL   e Zd ZdZdd ZdedefddZdd	 ZdddZdd Z	dd Z
dS )ImageInpaintingMetricz?The metric computation class for image inpainting classes.
    c                 C   sB   g | _ g | _tddd | _tj rdnd}t || _	d S )NrM   F)rO   rP   cudar=   )
predstargetsrL   r2   r@   rt   Zis_availabler,   toFID)r5   Zdevicer   r   r   r0      s
   zImageInpaintingMetric.__init__outputsinputsc                 C   s4   |d }|d }| j t| | jt| d S )NZ	inpaintedimage)ru   r;   r   rv   )r5   ry   rz   predtargetr   r   r   add   s   zImageInpaintingMetric.addc                 C   sb   g }t | j| jD ]\}}|| || | || q	t|}| j }tjt	
|tj|iS r9   )zipru   rv   r;   rL   rx   r   rC   r   r   r   )r5   Z	ssim_listr|   r}   Zfidr   r   r   evaluate   s   
zImageInpaintingMetric.evaluateotherc                 C   s    | j |j  | j|j d S r9   )ru   extendrv   )r5   r   r   r   r   merge   s   zImageInpaintingMetric.mergec                 C   s   | j | jfS r9   )ru   rv   rD   r   r   r   __getstate__   s   z"ImageInpaintingMetric.__getstate__c                 C   s   |    |\| _| _d S r9   )r0   ru   rv   )r5   stater   r   r   __setstate__   s   z"ImageInpaintingMetric.__setstate__N)r   rs   )rH   rI   rJ   rq   r0   r   r~   r   r   r   r   r   r   r   r   rs      s    
	rs   )r   )"rq   typingr   rB   r   r@   Ztorch.nn.functionalnnZ
functionalrk   Zscipyr   Zmodelscope.metainfor   Z7modelscope.models.cv.image_inpainting.modules.inceptionr   Zmodelscope.utils.registryr   Zmodelscope.utils.tensor_utilsr   r   baser
   builderr   r   r   r+   Moduler,   rL   Zregister_moduleZimage_inpainting_metricrs   r   r   r   r   <module>   s(    
+X