U
    ­Ê¹j`  ã                   @   sp   d dl Z d dlmZmZmZmZmZmZ d dlm	Z	 ddl
mZmZ ddlmZ ddlmZ G dd	„ d	eƒZdS )
é    N)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)ÚTensoré   )Úfind_classesÚmake_dataset)Ú
VideoClips)ÚVisionDatasetc                       sº   e Zd ZdZdeeeeee eeee ee	ee
f  eeeeeeddœ‡ fdd	„Zee	ee
f d
œdd„ƒZee eeeee dœdd„Zed
œdd„Zeeeeef dœdd„Z‡  ZS )ÚUCF101aÉ  
    `UCF101 <https://www.crcv.ucf.edu/data/UCF101.php>`_ dataset.

    UCF101 is an action recognition video dataset.
    This dataset consider every video as a collection of video clips of fixed size, specified
    by ``frames_per_clip``, where the step in frames between each clip is given by
    ``step_between_clips``. The dataset itself can be downloaded from the dataset website;
    annotations that ``annotation_path`` should be pointing to can be downloaded from `here
    <https://www.crcv.ucf.edu/data/UCF101/UCF101TrainTestSplits-RecognitionTask.zip>`_.

    To give an example, for 2 videos with 10 and 15 frames respectively, if ``frames_per_clip=5``
    and ``step_between_clips=5``, the dataset size will be (2 + 3) = 5, where the first two
    elements will come from video 1, and the next three elements from video 2.
    Note that we drop clips which do not have exactly ``frames_per_clip`` elements, so not all
    frames in a video might be present.

    Internally, it uses a VideoClips object to handle clip creation.

    Args:
        root (string): Root directory of the UCF101 Dataset.
        annotation_path (str): path to the folder containing the split files;
            see docstring above for download instructions of these files
        frames_per_clip (int): number of frames in a clip.
        step_between_clips (int, optional): number of frames between each clip.
        fold (int, optional): which fold to use. Should be between 1 and 3.
        train (bool, optional): if ``True``, creates a dataset from the train split,
            otherwise from the ``test`` split.
        transform (callable, optional): A function/transform that  takes in a TxHxWxC video
            and returns a transformed version.
        output_format (str, optional): The format of the output video tensors (before transforms).
            Can be either "THWC" (default) or "TCHW".

    Returns:
        tuple: A 3-tuple with the following entries:

            - video (Tensor[T, H, W, C] or Tensor[T, C, H, W]): The `T` video frames
            -  audio(Tensor[K, L]): the audio frames, where `K` is the number of channels
               and `L` is the number of points
            - label (int): class of the video clip
    r	   NTr   ÚTHWC)ÚrootÚannotation_pathÚframes_per_clipÚstep_between_clipsÚ
frame_rateÚfoldÚtrainÚ	transformÚ_precomputed_metadataÚnum_workersÚ_video_widthÚ_video_heightÚ_video_min_dimensionÚ_audio_samplesÚoutput_formatÚreturnc                    sÂ   t ƒ  |¡ d|  kr dks0n td|› �ƒ‚d}|| _|| _t| jƒ\| _}t| j||d d�| _	dd„ | j	D ƒ}t
|||||	|
|||||d�}|| _|  ||||¡| _| | j¡| _|| _d S )	Nr	   é   z$fold should be between 1 and 3, got )Zavi)Zis_valid_filec                 S   s   g | ]}|d  ‘qS )r   © ©Ú.0Úxr!   r!   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/datasets/ucf101.pyÚ
<listcomp>Q   s     z#UCF101.__init__.<locals>.<listcomp>)r   r   r   r   r   r   )ÚsuperÚ__init__Ú
ValueErrorr   r   r
   r   Úclassesr   Úsamplesr   Úfull_video_clipsÚ_select_foldÚindicesZsubsetÚvideo_clipsr   )Úselfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú
extensionsZclass_to_idxÚ
video_listr/   ©Ú	__class__r!   r%   r(   5   s4    õzUCF101.__init__)r   c                 C   s   | j jS ©N)r,   Úmetadata©r0   r!   r!   r%   r6   g   s    zUCF101.metadata)r2   r   r   r   r   c           
   	      s˜   |rdnd}|› d|d›d�}t j ||¡}tƒ ‰ t|ƒ�8}| ¡ }dd„ |D ƒ}‡fdd„|D ƒ}ˆ  |¡ W 5 Q R X ‡ ‡fd	d„ttˆƒƒD ƒ}	|	S )
Nr   ÚtestÚlistÚ02dz.txtc                 S   s   g | ]}|  ¡  d ¡d ‘qS )ú r   )ÚstripÚsplitr"   r!   r!   r%   r&   r   s     z'UCF101._select_fold.<locals>.<listcomp>c                    s&   g | ]}t jjˆ jf| d ¡žŽ ‘qS )ú/)ÚosÚpathÚjoinr   r=   r"   r7   r!   r%   r&   s   s     c                    s   g | ]}ˆ| ˆ kr|‘qS r!   r!   )r#   Úi)Úselected_filesr2   r!   r%   r&   u   s      )	r?   r@   rA   ÚsetÚopenÚ	readlinesÚupdateÚrangeÚlen)
r0   r2   r   r   r   ÚnameÚfZfidÚdatar.   r!   )rC   r0   r2   r%   r-   k   s    
zUCF101._select_foldc                 C   s
   | j  ¡ S r5   )r/   Z	num_clipsr7   r!   r!   r%   Ú__len__x   s    zUCF101.__len__)Úidxr   c                 C   sF   | j  |¡\}}}}| j| j|  d }| jd k	r<|  |¡}|||fS )Nr	   )r/   Zget_clipr+   r.   r   )r0   rN   ZvideoZaudioÚinfoZ	video_idxÚlabelr!   r!   r%   Ú__getitem__{   s
    

zUCF101.__getitem__)r	   Nr	   TNNr	   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚintr   Úboolr   r   r   r(   Úpropertyr6   r   r-   rM   r   r   rQ   Ú__classcell__r!   r!   r3   r%   r      sH   .            ðï2r   )r?   Útypingr   r   r   r   r   r   Ztorchr   Úfolderr
   r   Zvideo_utilsr   Zvisionr   r   r!   r!   r!   r%   Ú<module>   s    