a
    d;                     @   s   d dl Z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
 d dlmZmZmZmZ d dlmZ d dlmZ e G dd	 d	ejZe G d
d dejZdS )    N)Path)data)augmentpaired_random_crop)
FileClientget_root_loggerimfrombytes
img2tensor)dequantize_flow)DATASET_REGISTRYc                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )REDSDataseta  REDS dataset for training.

    The keys are generated from a meta info txt file.
    basicsr/data/meta_info/meta_info_REDS_GT.txt

    Each line contains:
    1. subfolder (clip) name; 2. frame number; 3. image shape, separated by
    a white space.
    Examples:
    000 100 (720,1280,3)
    001 100 (720,1280,3)
    ...

    Key examples: "000/00000000"
    GT (gt): Ground-Truth;
    LQ (lq): Low-Quality, e.g., low-resolution/blurry/noisy/compressed frames.

    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.
            dataroot_flow (str, optional): Data root path for flow.
            meta_info_file (str): Path for meta information file.
            val_partition (str): Validation partition types. 'REDS4' or
                'official'.
            io_backend (dict): IO backend type and other kwarg.

            num_frame (int): Window size for input frames.
            gt_size (int): Cropped patched size for gt patches.
            interval_list (list): Interval list for temporal augmentation.
            random_reverse (bool): Random reverse input frames.
            use_hflip (bool): Use horizontal flips.
            use_rot (bool): Use rotation (use vertical flip and transposing h
                and w for implementation).

            scale (bool): Scale, which will be added automatically.
    c                    s.  t t|   || _t|d t|d  | _| _|d d urJt|d nd | _|d d dksrJ d|d  |d | _|d d | _	g | _
t|d d	L}|D ]6}|d
\ }}| j
 fddtt|D  qW d    n1 s0    Y  |d dkrg dn8|d dkr6dd tddD ntd|d  dfdd| j
D | _
d | _|d | _d| _| jd dkrd| _| jd ur| j| j| jg| jd< g d| jd< n | j| jg| jd< dd g| jd< |d! | _|d" | _d#d$d% |d! D }t }|d&| d'| j d( d S ))Ndataroot_gtdataroot_lqZdataroot_flow	num_frame      z(num_frame should be odd number, but got meta_info_filer c                    s   g | ]}  d |dqS /08d .0ifolderr   b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/data/reds_dataset.py
<listcomp>B       z(REDSDataset.__init__.<locals>.<listcomp>val_partitionREDS4Z000Z011Z015Z020officialc                 S   s   g | ]}|d qS Z03dr   r   vr   r   r   r   H   r         Wrong validation partition *.Supported ones are ['official', 'REDS4'].c                    s"   g | ]}| d d  vr|qS r   r   splitr&   r!   r   r   r   L   r    
io_backendFtypelmdbTdb_pathslqgtflowclient_keysr5   r6   interval_listrandom_reverse,c                 s   s   | ]}t |V  qd S Nstrr   xr   r   r   	<genexpr>^   r    z'REDSDataset.__init__.<locals>.<genexpr>&Temporal augmentation interval list: []; random reverse is .)superr   __init__optr   gt_rootlq_root	flow_rootr   num_half_frameskeysopenr.   extendrangeint
ValueErrorfile_clientio_backend_optis_lmdbr9   r:   joinr   infoselfrG   ZfinlineZ	frame_num_Zinterval_strlogger	__class__r   r!   r   rF   5   sF    "
B



zREDSDataset.__init__c                 C   s   | j d u r&t| jdfi | j| _ | jd }| jd }| j| }|d\}}t|}t	| j
}|| j|  }	|| j|  }
|	dk s|
dkrtdd}|| j|  }	|| j|  }
q|d}tt|	|
d |}| jrt d	k r|  t|| jksJ d
t| | jr,| d| }n| j| | d }| j |d}t|dd}g }|D ]Z}| jr| d|d}n| j| |dd }| j |d}t|dd}|| qb| jd ur
g }t| jddD ]}| jr| d| d| }n| j| | d| d }| j |d}t|ddd}tj|ddd\}}t||ddd}|| qtd| jd D ]}| jr| d| d| }n| j| | d| d }| j |d}t|ddd}tj|ddd\}}t||ddd}|| qv|| t|||||\}}| jd urH|d | j || jd   }}|| | jd ur~t|| jd | jd |\}}nt|| jd | jd }t|}t j!|dd dd}|d }| jd urt|}|"| jt #|d  t j!|dd}| jd ur||||dS |||dS d S ) Nr1   scalegt_sizer   r   c   r   r         ?zWrong length of neighbor list: .pngr6   Tfloat32r5   _pr7   Z	grayscaleF)flagre   r   )Zaxis   )Zmax_valZdenormZ_n	use_hflipuse_rotZdim)r5   r7   r6   keyr5   r6   rm   )$rR   r   rS   poprG   rL   r.   rP   randomchoicer9   rK   randintlistrO   r:   reverselenr   rT   rH   getr   rI   appendrJ   npr
   rN   r   r   r	   torchstackinsertZ
zeros_like)rX   indexr_   r`   rm   	clip_name
frame_nameZcenter_frame_idxintervalstart_frame_idxend_frame_idxneighbor_listimg_gt_path	img_bytesimg_gtimg_lqsneighborimg_lq_pathimg_lqZ	img_flowsr   Z	flow_pathZcat_flowZdxZdyr7   img_resultsr   r   r   __getitem__c   s    



"

 zREDSDataset.__getitem__c                 C   s
   t | jS r<   ru   rL   rX   r   r   r   __len__   s    zREDSDataset.__len____name__
__module____qualname____doc__rF   r   r   __classcell__r   r   r\   r   r      s   &.mr   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )REDSRecurrentDataseta  REDS dataset for training recurrent networks.

    The keys are generated from a meta info txt file.
    basicsr/data/meta_info/meta_info_REDS_GT.txt

    Each line contains:
    1. subfolder (clip) name; 2. frame number; 3. image shape, separated by
    a white space.
    Examples:
    000 100 (720,1280,3)
    001 100 (720,1280,3)
    ...

    Key examples: "000/00000000"
    GT (gt): Ground-Truth;
    LQ (lq): Low-Quality, e.g., low-resolution/blurry/noisy/compressed frames.

    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.
            dataroot_flow (str, optional): Data root path for flow.
            meta_info_file (str): Path for meta information file.
            val_partition (str): Validation partition types. 'REDS4' or
                'official'.
            io_backend (dict): IO backend type and other kwarg.

            num_frame (int): Window size for input frames.
            gt_size (int): Cropped patched size for gt patches.
            interval_list (list): Interval list for temporal augmentation.
            random_reverse (bool): Random reverse input frames.
            use_hflip (bool): Use horizontal flips.
            use_rot (bool): Use rotation (use vertical flip and transposing h
                and w for implementation).

            scale (bool): Scale, which will be added automatically.
    c                    s  t t|   || _t|d t|d  | _| _|d | _g | _t	|d dL}|D ]6}|
d\ }}| j fddtt|D  qVW d    n1 s0    Y  |d	 d
krg dn6|d	 dkrdd tddD ntd|d	  d|d rfdd| jD | _nfdd| jD | _d | _|d | _d| _| jd dkrd| _t| dr| jd ur| j| j| jg| jd< g d| jd< n | j| jg| jd< ddg| jd< |d d!g| _|d"d| _d#d$d% | jD }t }|d&| d'| j d( d S ))Nr   r   r   r   r   r   c                    s   g | ]}  d |dqS r   r   r   r   r   r   r     r    z1REDSRecurrentDataset.__init__.<locals>.<listcomp>r!   r"   r#   r$   c                 S   s   g | ]}|d qS r%   r   r&   r   r   r   r     r    r(   r)   r*   r+   Z	test_modec                    s"   g | ]}| d d  v r|qS r,   r-   r&   r/   r   r   r     r    c                    s"   g | ]}| d d  vr|qS r,   r-   r&   r/   r   r   r     r    r0   Fr1   r2   TrJ   r3   r4   r8   r5   r6   r9   r   r:   r;   c                 s   s   | ]}t |V  qd S r<   r=   r?   r   r   r   rA   %  r    z0REDSRecurrentDataset.__init__.<locals>.<genexpr>rB   rC   rD   )rE   r   rF   rG   r   rH   rI   r   rL   rM   r.   rN   rO   rP   rQ   rR   rS   rT   hasattrrJ   rv   r9   r:   rU   r   rV   rW   r\   r^   r   rF      sD    
B


zREDSRecurrentDataset.__init__c                 C   s  | j d u r&t| jdfi | j| _ | jd }| jd }| j| }|d\}}t| j	}t
|}|d| j|  krtdd| j|  }|| j|  }	tt||	|}
| jrt dk r|
  g }g }|
D ]}| jr| d|d}| d|d}n,| j| |dd	 }| j| |dd	 }| j |d
}t|dd}|| | j |d}t|dd}|| qt|||||\}}|| t|| jd | jd }t|}tj|t|d d  dd}tj|d t|d  dd}|||dS )Nr1   r_   r`   r   d   r   rb   r   rc   r5   Trd   r6   rj   rk   r   rl   rn   )rR   r   rS   ro   rG   rL   r.   rp   rq   r9   rP   r   rr   rs   rO   r:   rt   rT   rI   rH   rv   r   rw   r   rN   r   r	   ry   rz   ru   )rX   r|   r_   r`   rm   r}   r~   r   r   r   r   r   Zimg_gtsr   r   r   r   r   r   r   r   r   r   r   *  sF    





z REDSRecurrentDataset.__getitem__c                 C   s
   t | jS r<   r   r   r   r   r   r   g  s    zREDSRecurrentDataset.__len__r   r   r   r\   r   r      s   &.=r   )numpyrx   rp   ry   pathlibr   Ztorch.utilsr   Zbasicsr.data.transformsr   r   Zbasicsr.utilsr   r   r   r	   Zbasicsr.utils.flow_utilr
   Zbasicsr.utils.registryr   registerZDatasetr   r   r   r   r   r   <module>   s    G