o
    ߥi;                     @   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)	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 )Nalex)net)	superr   __init__predslabelslpipsLPIPScudaloss_fn_alexself	__class__ g/home/ubuntu/.local/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   ground_truths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   )torchno_gradzipr   r   sizer#   calculate_psnrcalculate_ssimcalculate_lpipsr   r   PSNRnpmeanSSIMr   )r   	psnr_list	ssim_list
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   r;   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__)r;   r   )__name__
__module____qualname____doc__r"   r!   r   r   r&   r:   r=   r>   r@   __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)   Tensorrangesum)rK   rJ   gaussr   rI   r   gaussianH   s   rQ      c                 C   sP   t | dd}|| }|d|  }|d|| | |  |}|S )Ng      ?rR   r'   )rQ   	unsqueezemmtexpand
contiguousto)rK   channeldevice
_1D_window
_2D_window
_3D_windowwindowr   r   r   create_window_3dP   s   
r_   c              	   C   s:   dt t| d |d  | d |d    j }|S )Nir   )mathlog10r)   r2   cpudata)img1img2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      rR   g      r   )rY   rZ   )   rk   rk   rk   rk   rk   	replicate)mode)paddinggroupsr'   g{Gz?gQ?g       @)r)   maxminr,   r_   rZ   rX   rS   Fconv3dpadpowr2   rb   )rd   re   rK   r^   size_averagefull	val_rangemax_valmin_valLpadd_r8   r9   	real_sizemu1mu2mu1_sqmu2_sqmu1_mu2	sigma1_sq	sigma2_sqsigma12C1C2v1v2csssim_mapretr   r   r   r.   _   s   




 
r.   c                 C   s.   | d d } |d d }|| |}|   S )Nr'   rR   )rb   item)rd   re   r   dr   r   r   r/      s   
r/   )rR   N)rg   NTFN)r`   r   typingr   r   numpyr1   r)   torch.nn.functionalnn
functionalrr   modelscope.metainfor   modelscope.metrics.baser   modelscope.metrics.builderr   r   modelscope.utils.registryr   register_module video_frame_interpolation_metricr   rQ   r_   r-   r.   r/   r   r   r   r   <module>   s4   2
	
S