a
    dN/                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZmZ d dlmZ e G dd dejZe G d	d
 d
ejZe G dd deZe G dd deZdS )    N)path)data)duf_downsamplegenerate_frame_indicesread_img_seq)get_root_loggerscandir)DATASET_REGISTRYc                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )VideoTestDatasetuM  Video test dataset.

    Supported datasets: Vid4, REDS4, REDSofficial.
    More generally, it supports testing dataset with following structures:

    dataroot
    ├── subfolder1
        ├── frame000
        ├── frame001
        ├── ...
    ├── subfolder1
        ├── frame000
        ├── frame001
        ├── ...
    ├── ...

    For testing datasets, there is no need to prepare LMDB files.

    Args:
        opt (dict): Config for train dataset. It contains the following keys:
            dataroot_gt (str): Data root path for gt.
            dataroot_lq (str): Data root path for lq.
            io_backend (dict): IO backend type and other kwarg.
            cache_data (bool): Whether to cache testing datasets.
            name (str): Dataset name.
            meta_info_file (str): The path to the file storing the list of test
                folders. If not provided, all the folders in the dataroot will
                be used.
            num_frame (int): Window size for input frames.
            padding (str): Padding mode.
    c                    s  t t   | _|d  _|d |d   _ _g g g g g d _d  _|d  _	 j	d dkslJ dt
 }|d	|d
   i i   _ _d|v r t|d dB}dd |D } fdd|D } fdd|D }W d    n1 s0    Y  n0ttt jd}ttt jd}|d
  dv rt||D ]d\}}t|}	ttt|dd}
ttt|dd}t|
}|t|ksJ d| dt| d jd |
  jd |  jd |	g|  t|D ] } jd | d|  qdg| }t jd d D ]}d ||< d ||| d  < q4 jd! |  jr|d"|	 d# t|
 j|	< t| j|	< n|
 j|	< | j|	< qLntd$t|d
  d S )%N
cache_datadataroot_gtdataroot_lqlq_pathgt_pathfolderidxborder
io_backendtypelmdb+No need to use lmdb during validation/test.*Generate data info for VideoTestDataset - namemeta_info_filerc                 S   s   g | ]}| d d qS  r   split.0line r#   h/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/data/video_test_dataset.py
<listcomp>=       z-VideoTestDataset.__init__.<locals>.<listcomp>c                    s   g | ]}t  j|qS r#   ospjoinlq_rootr!   keyselfr#   r$   r%   >   r&   c                    s   g | ]}t  j|qS r#   )r(   r)   gt_rootr+   r-   r#   r$   r%   ?   r&   *)Zvid4Zreds4ZredsofficialT)	full_pathz"Different number of images in lq (z) and gt folders ()r   r   r   r   /r   	num_frame      r   zCache z for VideoTestDataset...z"Non-supported video test dataset: )superr
   __init__optr   r/   r*   	data_infofile_clientio_backend_optr   infoimgs_lqimgs_gtopensortedglobr(   r)   lowerzipbasenamelistr   lenextendrangeappendr   
ValueErrorr   )r.   r9   loggerfin
subfoldersZsubfolders_lqZsubfolders_gtZsubfolder_lqZsubfolder_gtZsubfolder_nameimg_paths_lqZimg_paths_gtmax_idxiZborder_l	__class__r-   r$   r8   -   sX    


2



zVideoTestDataset.__init__c           
         s   j d |  j d | d\}}t|t| }}j d | }j d | }t||jd jd d}jrj  d	t	|}j
  | }n: fd
d|D }	t|	}tj
  | g}|d	 || j d | ||dS )Nr   r   r3   r   r   r4   paddingrT   r   c                    s   g | ]}j   | qS r#   r>   r!   rQ   r   r.   r#   r$   r%   r   r&   z0VideoTestDataset.__getitem__.<locals>.<listcomp>lqgtr   r   r   r   )r:   r   intr   r9   r   r>   index_selecttorch
LongTensorr?   r   squeeze_
r.   indexr   rP   r   r   Z
select_idxr>   img_gtrO   r#   rX   r$   __getitem__e   s(    
zVideoTestDataset.__getitem__c                 C   s   t | jd S Nr   rG   r:   r-   r#   r#   r$   __len__   s    zVideoTestDataset.__len____name__
__module____qualname____doc__r8   rd   rg   __classcell__r#   r#   rR   r$   r
      s    8r
   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )VideoTestVimeo90KDataseta.  Video test dataset for Vimeo90k-Test dataset.

    It only keeps the center frame for testing.
    For testing datasets, there is no need to prepare LMDB files.

    Args:
        opt (dict): Config for train dataset. It contains the following keys:
            dataroot_gt (str): Data root path for gt.
            dataroot_lq (str): Data root path for lq.
            io_backend (dict): IO backend type and other kwarg.
            cache_data (bool): Whether to cache testing datasets.
            name (str): Dataset name.
            meta_info_file (str): The path to the file storing the list of test
                folders. If not provided, all the folders in the dataroot will
                be used.
            num_frame (int): Window size for input frames.
            padding (str): Padding mode.
    c           	         s  t t   _ d _jr,td d  d  __g g g g g d_ fddt	 d D }d _
 d	 _jd
 dksJ dt }|d d   t d d}dd |D }W d    n1 s0    Y  t|D ]\}tjd}jd | fdd|D }jd | jd d jd | dt|  jd d qd S )Nr   z7cache_data in Vimeo90K-Test dataset is not implemented.r   r   r   c                    s    g | ]}|d  d  d  qS )	   r4   r5   r#   rW   )r9   r#   r$   r%      r&   z5VideoTestVimeo90KDataset.__init__.<locals>.<listcomp>r4   r   r   r   r   r   r   r   r   c                 S   s   g | ]}| d d qS r   r   r    r#   r#   r$   r%      r&   zim4.pngr   c              	      s$   g | ]}t  jd | dqS )Zimz.pngr'   rW   )r.   	subfolderr#   r$   r%      r&   r   r   Zvimeo90kr   r3   r   r   )r7   rn   r8   r9   r   NotImplementedErrorr/   r*   r:   rI   r;   r<   r   r=   r@   	enumerater(   r)   rJ   rG   )	r.   r9   Zneighbor_listrL   rM   rN   r   r   Zlq_pathsrR   )r9   r.   rp   r$   r8      s.    

,z!VideoTestVimeo90KDataset.__init__c                 C   sv   | j d | }| j d | }t|}t|g}|d ||| j d | | j d | | j d | || jd d  d	S )
Nr   r   r   r   r   r   r4   r5   rY   )r:   r   r`   r9   )r.   rb   r   r   r>   rc   r#   r#   r$   rd      s    

z$VideoTestVimeo90KDataset.__getitem__c                 C   s   t | jd S re   rf   r-   r#   r#   r$   rg      s    z VideoTestVimeo90KDataset.__len__rh   r#   r#   rR   r$   rn      s   rn   c                   @   s   e Zd ZdZdd ZdS )VideoTestDUFDataseta   Video test dataset for DUF dataset.

    Args:
        opt (dict): Config for train dataset.
            Most of keys are the same as VideoTestDataset.
            It has the following extra keys:

            use_duf_downsampling (bool): Whether to use duf downsampling to
                generate low-resolution frames.
            scale (bool): Scale, which will be added automatically.
    c           
         s  j d |  j d | d\}}t|t| }}j d | }j d | }t||jd jd d}jrֈjd	 rj  d
t	|}t
|djd d}nj  d
t	|}j  | }njd	 r  fdd|D }	t|	djd d}t
|djd d}n fdd|D }	t|	}tj  | gdjd d}|d
 || j d | ||dS )Nr   r   r3   r   r   r4   rT   rU   Zuse_duf_downsamplingr      scale)Zkernel_sizeru   c                    s   g | ]}j   | qS r#   )r?   rW   rX   r#   r$   r%      r&   z3VideoTestDUFDataset.__getitem__.<locals>.<listcomp>T)Zrequire_mod_cropru   c                    s   g | ]}j   | qS r#   rV   rW   rX   r#   r$   r%      r&   rY   )r:   r   r\   r   r9   r   r?   r]   r^   r_   r   r>   r   r`   ra   r#   rX   r$   rd      s6    
 
zVideoTestDUFDataset.__getitem__N)ri   rj   rk   rl   rd   r#   r#   r#   r$   rs      s   rs   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )VideoRecurrentTestDatasetzVideo test dataset for recurrent architectures, which takes LR video
    frames as input and output corresponding HR video frames.

    Args:
        Same as VideoTestDataset.
        Unused opt:
            padding (str): Padding mode.

    c                    s,   t t| | ttt| jd | _d S )Nr   )r7   rv   r8   rA   rF   setr:   folders)r.   r9   rR   r#   r$   r8   
  s    z"VideoRecurrentTestDataset.__init__c                 C   s:   | j | }| jr&| j| }| j| }ntd|||dS )Nz&Without cache_data is not implemented.)rZ   r[   r   )rx   r   r>   r?   rq   )r.   rb   r   r>   r?   r#   r#   r$   rd     s    

z%VideoRecurrentTestDataset.__getitem__c                 C   s
   t | jS )N)rG   rx   r-   r#   r#   r$   rg     s    z!VideoRecurrentTestDataset.__len__rh   r#   r#   rR   r$   rv      s   
rv   )rB   r^   osr   r(   Ztorch.utilsr   Zbasicsr.data.data_utilr   r   r   Zbasicsr.utilsr   r   Zbasicsr.utils.registryr	   registerZDatasetr
   rn   rs   rv   r#   r#   r#   r$   <module>   s   xD4