o
    )j;                     @   s   d dl Z 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	  m
Z d dlmZ d dlmZ d dlmZmZ d dlmZ ejeejdG d	d
 d
eZdd ZdddZdd Z					dddZdd ZdS )    N)exp)Dict)Metrics)Metric)METRICS
MetricKeys)default_group)Z	group_keymodule_namec                       s\   e Zd ZdZdZdZ fddZdedefdd	Zd
d Z	dddZ
dd Zdd Z  ZS )VideoFrameInterpolationMetriczlThe metric computation class for video frame interpolation,
    which will return PSNR, SSIM and LPIPS.
    predtargetc                    s0   t t|   g | _g | _tjdd | _d S )NZalex)net)	superr
   __init__predslabelslpipsLPIPScudaloss_fn_alexself	__class__ t/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/metrics/video_frame_interpolation_metric.pyr      s   z&VideoFrameInterpolationMetric.__init__outputsinputsc                 C   s0   |t j }|t j }| j| | j| d S N)r
   
label_name	pred_namer   appendr   )r   r   r   Zground_truthsZeval_resultsr   r   r   add#   s   

z!VideoFrameInterpolationMetric.addc                 C   s   g g g }}}t  I t| j| jD ]9\}}|d|d}}|d d d d d|d|f }|t|| |t|| |t	||| j
 qW d    n1 sXw   Y  tjt|tjt|tjt|iS )N      r   )torchZno_gradzipr   r   sizer!   calculate_psnrcalculate_ssimcalculate_lpipsr   r   ZPSNRnpmeanZSSIMr   )r   Z	psnr_listZ	ssim_listZ
lpips_listr   labelheightwidthr   r   r   evaluate)   s    
 z&VideoFrameInterpolationMetric.evaluateotherc                 C   s    | j |j  | j|j d S r   )r   extendr   )r   r1   r   r   r   merge<   s   z#VideoFrameInterpolationMetric.mergec                 C   s   | j | jfS r   )r   r   r   r   r   r   __getstate__@   s   z*VideoFrameInterpolationMetric.__getstate__c                 C   s   |    |\| _| _d S r   )r   r   r   )r   stater   r   r   __setstate__C   s   z*VideoFrameInterpolationMetric.__setstate__)r1   r
   )__name__
__module____qualname____doc__r    r   r   r   r"   r0   r3   r4   r6   __classcell__r   r   r   r   r
      s    
r
   c                    s*   t  fddtD }||  S )Nc                    s2   g | ]}t |d   d   td  d    qS )r#   )r   float).0xsigmawindow_sizer   r   
<listcomp>I   s    $zgaussian.<locals>.<listcomp>)r%   ZTensorrangesum)rA   r@   gaussr   r?   r   gaussianH   s   rF      c                 C   sP   t | dd}|| }|d|  }|d|| | |  |}|S )Ng      ?rG   r#   )rF   	unsqueezemmtexpand
contiguousto)rA   channeldeviceZ
_1D_windowZ
_2D_windowZ
_3D_windowwindowr   r   r   create_window_3dP   s   
rQ   c              	   C   s:   dt t| d |d  | d |d    j }|S )Nir   )mathlog10r%   r,   cpudata)img1img2Zpsnrr   r   r   r(   Y   s   *r(      TFc                 C   s  |d u r!t | dkrd}nd}t | dk rd}nd}|| }	n|}	d}
|  \}}}}|d u rCt|||}t|d| jd| j}| d} |d}tj	tj
| dd	d
||
dd}tj	tj
|dd	d
||
dd}|d}|d}|| }tj	t
| |  dd	||
dd| }tj	t
|| dd	||
dd| }tj	t
| | dd	||
dd| }d|	 d }d|	 d }d| | }|| | }t || }d| | | || | |  }|r| }n|ddd}|r||fS | S )N      rG   g      r   )rN   rO   )   r\   r\   r\   r\   r\   Z	replicate)mode)paddinggroupsr#   g{Gz?gQ?g       @)r%   maxminr'   rQ   rO   rM   rH   FZconv3dpadpowr,   rT   )rV   rW   rA   rP   Zsize_averagefullZ	val_rangeZmax_valZmin_valLZpadd_r.   r/   Z	real_sizeZmu1Zmu2Zmu1_sqZmu2_sqZmu1_mu2Z	sigma1_sqZ	sigma2_sqZsigma12ZC1ZC2Zv1Zv2csZssim_mapretr   r   r   r)   _   s   




 
r)   c                 C   s.   | d d } |d d }|| |}|   S )Nr#   rG   )rT   item)rV   rW   r   dr   r   r   r*      s   
r*   )rG   N)rX   NTFN)rR   r   typingr   r   numpyr+   r%   Ztorch.nn.functionalnnZ
functionalrb   Zmodelscope.metainfor   Zmodelscope.metrics.baser   Zmodelscope.metrics.builderr   r   Zmodelscope.utils.registryr   Zregister_moduleZ video_frame_interpolation_metricr
   rF   rQ   r(   r)   r*   r   r   r   r   <module>   s4   2
	
S