o
    hR                     @   sx  d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlZd dlZd dlmZ ddlmZmZ d	d
lmZ d	dlmZmZ d	dlmZ eejejeej eej f Zeejejeej f ZdZ G dd deeZ!G dd de!Z"G dd de!Z#G dd de!Z$G dd de!Z%G dd de!Z&de'dejfddZ(de'deejejf fddZ)dS )     N)ABCabstractmethod)globPath)AnyCallableOptionalUnion)Image   )
decode_png	read_file   )default_loader)	_read_pfmverify_str_arg)VisionDataset)	KittiFlowSintelFlyingThings3DFlyingChairsHD1Kc                	       s   e Zd ZdZdefdeeef dee	 de	ege
f ddf fddZd	edeejejf fd
dZed	efddZdedeeef fddZdefddZdedejjjfddZ  ZS )FlowDatasetFNroot
transformsloaderreturnc                    s*   t  j|d || _g | _g | _|| _d S )N)r   )super__init__r   
_flow_list_image_list_loader)selfr   r   r   	__class__ h/home/www/facesmatcher.com/frenv_anti/lib/python3.10/site-packages/torchvision/datasets/_optical_flow.pyr   $   s
   
zFlowDataset.__init__	file_namec                 C   s
   |  |S N)r"   r#   r(   r&   r&   r'   	_read_img2      
zFlowDataset._read_imgc                 C   s   d S r)   r&   r*   r&   r&   r'   
_read_flow5   s   zFlowDataset._read_flowindexc                 C   s   |  | j| d }|  | j| d }| jr*| | j| }| jr'|\}}q.d }nd  }}| jd ur?| ||||\}}}}| jsF|d urL||||fS |||fS )Nr   r   )r+   r!   r    r-   _has_builtin_flow_maskr   )r#   r.   img1img2flowvalid_flow_maskr&   r&   r'   __getitem__:   s   


zFlowDataset.__getitem__c                 C   s
   t | jS r)   )lenr!   )r#   r&   r&   r'   __len__Q   r,   zFlowDataset.__len__vc                 C   s   t jj| g| S r)   )torchutilsdataConcatDataset)r#   r7   r&   r&   r'   __rmul__T   s   zFlowDataset.__rmul__)__name__
__module____qualname__r/   r   r
   strr   r	   r   r   r   r   r8   ZTensorr+   r   r-   intT1T2r4   r6   r9   r:   r;   r<   __classcell__r&   r&   r$   r'   r      s&    
 r   c                       s   e Zd ZdZdddefdeeef dededee	 d	e	ege
f d
df fddZded
eeef f fddZded
ejfddZ  ZS )r   a  `Sintel <http://sintel.is.tue.mpg.de/>`_ Dataset for optical flow.

    The dataset is expected to have the following structure: ::

        root
            Sintel
                testing
                    clean
                        scene_1
                        scene_2
                        ...
                    final
                        scene_1
                        scene_2
                        ...
                training
                    clean
                        scene_1
                        scene_2
                        ...
                    final
                        scene_1
                        scene_2
                        ...
                    flow
                        scene_1
                        scene_2
                        ...

    Args:
        root (str or ``pathlib.Path``): Root directory of the Sintel Dataset.
        split (string, optional): The dataset split, either "train" (default) or "test"
        pass_name (string, optional): The pass to use, either "clean" (default), "final", or "both". See link above for
            details on the different passes.
        transforms (callable, optional): A function/transform that takes in
            ``img1, img2, flow, valid_flow_mask`` and returns a transformed version.
            ``valid_flow_mask`` is expected for consistency with other datasets which
            return a built-in valid mask, such as :class:`~torchvision.datasets.KittiFlow`.
        loader (callable, optional): A function to load an image given its path.
            By default, it uses PIL as its image loader, but users could also pass in
            ``torchvision.io.decode_image`` for decoding image data into tensors directly.
    traincleanNr   split	pass_namer   r   r   c              	      s  t  j|||d t|ddd t|ddd |dkrdd	gn|g}t|d
 }|d d }|D ]T}|dkr8dn|}|| | }	t|	D ]>}
ttt|	|
 d }t	t
|d D ]}|  j|| ||d  gg7  _q[|dkr|  jttt||
 d 7  _qEq0d S )Nr   r   r   rG   rE   testZvalid_valuesrH   rF   finalbothrO   rF   rN   r   Ztrainingr2   rE   *.pngr   *.flo)r   r   r   r   oslistdirsortedr   r@   ranger5   r!   r    )r#   r   rG   rH   r   r   passesZ	flow_rootZ	split_dirZ
image_rootZsceneZ
image_listir$   r&   r'   r      s$   ""zSintel.__init__r.   c                       t  |S a  Return example at given index.

        Args:
            index(int): The index of the example to retrieve

        Returns:
            tuple: A 3-tuple with ``(img1, img2, flow)``.
            The flow is a numpy array of shape (2, H, W) and the images are PIL images.
            ``flow`` is None if ``split="test"``.
            If a valid flow mask is generated within the ``transforms`` parameter,
            a 4-tuple with ``(img1, img2, flow, valid_flow_mask)`` is returned.
        r   r4   r#   r.   r$   r&   r'   r4         zSintel.__getitem__r(   c                 C      t |S r)   	_read_flor*   r&   r&   r'   r-         zSintel._read_flowr=   r>   r?   __doc__r   r
   r@   r   r	   r   r   r   rA   rB   rC   r4   npndarrayr-   rD   r&   r&   r$   r'   r   X   s*    .
r   c                       s   e Zd ZdZdZddefdeeef dede	e
 de
egef d	df
 fd
dZded	eeef f fddZded	eejejf fddZ  ZS )r   a  `KITTI <http://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=flow>`__ dataset for optical flow (2015).

    The dataset is expected to have the following structure: ::

        root
            KittiFlow
                testing
                    image_2
                training
                    image_2
                    flow_occ

    Args:
        root (str or ``pathlib.Path``): Root directory of the KittiFlow Dataset.
        split (string, optional): The dataset split, either "train" (default) or "test"
        transforms (callable, optional): A function/transform that takes in
            ``img1, img2, flow, valid_flow_mask`` and returns a transformed version.
        loader (callable, optional): A function to load an image given its path.
            By default, it uses PIL as its image loader, but users could also pass in
            ``torchvision.io.decode_image`` for decoding image data into tensors directly.
    TrE   Nr   rG   r   r   r   c           	         s   t  j|||d t|ddd t|d |d  }ttt|d d }ttt|d d	 }|r6|s:td
t||D ]\}}|  j	||gg7  _	q?|dkrattt|d d | _
d S d S )NrI   rG   rJ   rL   r   Zingimage_2z*_10.pngz*_11.pngzZCould not find the Kitti flow images. Please make sure the directory structure is correct.rE   flow_occ)r   r   r   r   rT   r   r@   FileNotFoundErrorzipr!   r    )	r#   r   rG   r   r   images1images2r0   r1   r$   r&   r'   r      s   zKittiFlow.__init__r.   c                    rX   )a  Return example at given index.

        Args:
            index(int): The index of the example to retrieve

        Returns:
            tuple: A 4-tuple with ``(img1, img2, flow, valid_flow_mask)``
            where ``valid_flow_mask`` is a numpy boolean mask of shape (H, W)
            indicating which flow values are valid. The flow is a numpy array of
            shape (2, H, W) and the images are PIL images. ``flow`` and ``valid_flow_mask`` are None if
            ``split="test"``.
        rZ   r[   r$   r&   r'   r4      r\   zKittiFlow.__getitem__r(   c                 C   r]   r)   )_read_16bits_png_with_flow_and_valid_maskr*   r&   r&   r'   r-      r`   zKittiFlow._read_flow)r=   r>   r?   rb   r/   r   r
   r@   r   r	   r   r   r   rA   rB   rC   r4   tuplerc   rd   r-   rD   r&   r&   r$   r'   r      s&    
&r   c                	       sr   e Zd ZdZddeeef dedee ddf fdd	Z	d
e
deeef f fddZdedejfddZ  ZS )r   a  `FlyingChairs <https://lmb.informatik.uni-freiburg.de/resources/datasets/FlyingChairs.en.html#flyingchairs>`_ Dataset for optical flow.

    You will also need to download the FlyingChairs_train_val.txt file from the dataset page.

    The dataset is expected to have the following structure: ::

        root
            FlyingChairs
                data
                    00001_flow.flo
                    00001_img1.ppm
                    00001_img2.ppm
                    ...
                FlyingChairs_train_val.txt


    Args:
        root (str or ``pathlib.Path``): Root directory of the FlyingChairs Dataset.
        split (string, optional): The dataset split, either "train" (default) or "val"
        transforms (callable, optional): A function/transform that takes in
            ``img1, img2, flow, valid_flow_mask`` and returns a transformed version.
            ``valid_flow_mask`` is expected for consistency with other datasets which
            return a built-in valid mask, such as :class:`~torchvision.datasets.KittiFlow`.
    rE   Nr   rG   r   r   c           
         s  t  j||d t|ddd t|d }ttt|d d }ttt|d d }d	}tj	|| s;t
d
tjt|| tjd}tt|D ]4}|| }	|dkr[|	dksc|dkr|	dkr|  j|| g7  _|  j|d|  |d| d  gg7  _qMd S )N)r   r   rG   )rE   valrL   r   r:   z*.ppmrQ   zFlyingChairs_train_val.txtzmThe FlyingChairs_train_val.txt file was not found - please download it from the dataset page (see docstring).)ZdtyperE   r   rn   r   )r   r   r   r   rT   r   r@   rR   pathexistsrg   rc   ZloadtxtZint32rU   r5   r    r!   )
r#   r   rG   r   imagesflowsZsplit_file_nameZ
split_listrW   Zsplit_idr$   r&   r'   r     s$    (zFlyingChairs.__init__r.   c                    rX   )a  Return example at given index.

        Args:
            index(int): The index of the example to retrieve

        Returns:
            tuple: A 3-tuple with ``(img1, img2, flow)``.
            The flow is a numpy array of shape (2, H, W) and the images are PIL images.
            ``flow`` is None if ``split="val"``.
            If a valid flow mask is generated within the ``transforms`` parameter,
            a 4-tuple with ``(img1, img2, flow, valid_flow_mask)`` is returned.
        rZ   r[   r$   r&   r'   r4   *  r\   zFlyingChairs.__getitem__r(   c                 C   r]   r)   r^   r*   r&   r&   r'   r-   9  r`   zFlyingChairs._read_flow)rE   N)r=   r>   r?   rb   r
   r@   r   r	   r   r   rA   rB   rC   r4   rc   rd   r-   rD   r&   r&   r$   r'   r      s
    ,r   c                       s   e Zd ZdZddddefdeeef deded	ed
ee	 de	ege
f ddf fddZdedeeef f fddZdedejfddZ  ZS )r   a  `FlyingThings3D <https://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html>`_ dataset for optical flow.

    The dataset is expected to have the following structure: ::

        root
            FlyingThings3D
                frames_cleanpass
                    TEST
                    TRAIN
                frames_finalpass
                    TEST
                    TRAIN
                optical_flow
                    TEST
                    TRAIN

    Args:
        root (str or ``pathlib.Path``): Root directory of the intel FlyingThings3D Dataset.
        split (string, optional): The dataset split, either "train" (default) or "test"
        pass_name (string, optional): The pass to use, either "clean" (default) or "final" or "both". See link above for
            details on the different passes.
        camera (string, optional): Which camera to return images from. Can be either "left" (default) or "right" or "both".
        transforms (callable, optional): A function/transform that takes in
            ``img1, img2, flow, valid_flow_mask`` and returns a transformed version.
            ``valid_flow_mask`` is expected for consistency with other datasets which
            return a built-in valid mask, such as :class:`~torchvision.datasets.KittiFlow`.
        loader (callable, optional): A function to load an image given its path.
            By default, it uses PIL as its image loader, but users could also pass in
            ``torchvision.io.decode_image`` for decoding image data into tensors directly.
    rE   rF   leftNr   rG   rH   camerar   r   r   c              	      s  t  j|||d t|ddd | }t|ddd dgdgddgd| }t d	d
d  dkr6ddgn g}t|d }d}	t|||	D ]\} ttt	|| | d }
t fdd|
D }
ttt	|d | d }t fdd|D }|
r|st
dt|
|D ]b\}}ttt	|d }ttt	|d }tt|d D ]A}dkr|  j|| ||d  gg7  _|  j|| g7  _qdkr|  j||d  || gg7  _|  j||d  g7  _qqqHd S )NrI   rG   rJ   rL   rH   rM   Zframes_cleanpassZframes_finalpassrt   )rs   rightrO   rO   rs   ru   r   )into_future	into_pastz*/*c                 3   s    | ]	}t |  V  qd S r)   r   ).0	image_dir)rt   r&   r'   	<genexpr>z  s    z*FlyingThings3D.__init__.<locals>.<genexpr>Zoptical_flowc                 3   s     | ]}t |   V  qd S r)   r   )rx   flow_dirrt   	directionr&   r'   rz   }  s    zcCould not find the FlyingThings3D flow images. Please make sure the directory structure is correct.rP   z*.pfmr   rv   rw   )r   r   r   upperr   	itertoolsproductrT   r   r@   rg   rh   rU   r5   r!   r    )r#   r   rG   rH   rt   r   r   rV   ZcamerasZ
directionsZ
image_dirsZ	flow_dirsry   r{   rq   rr   rW   r$   r|   r'   r   ]  sJ   	  zFlyingThings3D.__init__r.   c                    rX   rY   rZ   r[   r$   r&   r'   r4     r\   zFlyingThings3D.__getitem__r(   c                 C   r]   r)   )r   r*   r&   r&   r'   r-     r`   zFlyingThings3D._read_flowra   r&   r&   r$   r'   r   =  s0    "
3r   c                       s   e Zd ZdZdZddefdeeef dede	e
 de
egef d	df
 fd
dZded	eejejf fddZded	eeef f fddZ  ZS )r   a  `HD1K <http://hci-benchmark.iwr.uni-heidelberg.de/>`__ dataset for optical flow.

    The dataset is expected to have the following structure: ::

        root
            hd1k
                hd1k_challenge
                    image_2
                hd1k_flow_gt
                    flow_occ
                hd1k_input
                    image_2

    Args:
        root (str or ``pathlib.Path``): Root directory of the HD1K Dataset.
        split (string, optional): The dataset split, either "train" (default) or "test"
        transforms (callable, optional): A function/transform that takes in
            ``img1, img2, flow, valid_flow_mask`` and returns a transformed version.
        loader (callable, optional): A function to load an image given its path.
            By default, it uses PIL as its image loader, but users could also pass in
            ``torchvision.io.decode_image`` for decoding image data into tensors directly.
    TrE   Nr   rG   r   r   r   c                    sH  t  j|||d t|ddd t|d }|dkrktdD ]K}ttt|d d	 |d
d }ttt|d d |d
d }tt|d D ]}|  j	|| g7  _	|  j
|| ||d  gg7  _
qLqn0ttt|d d d }	ttt|d d d }
t|	|
D ]\}}|  j
||gg7  _
q| j
stdd S )NrI   rG   rJ   rL   Zhd1krE   $   Zhd1k_flow_gtrf   Z06dz_*.pngZ
hd1k_inputre   r   Zhd1k_challengez*10.pngz*11.pngzTCould not find the HD1K images. Please make sure the directory structure is correct.)r   r   r   r   rU   rT   r   r@   r5   r    r!   rh   rg   )r#   r   rG   r   r   Zseq_idxrr   rq   rW   ri   rj   Zimage1Zimage2r$   r&   r'   r     s*   $$"zHD1K.__init__r(   c                 C   r]   r)   rk   r*   r&   r&   r'   r-     r`   zHD1K._read_flowr.   c                    rX   )a  Return example at given index.

        Args:
            index(int): The index of the example to retrieve

        Returns:
            tuple: A 4-tuple with ``(img1, img2, flow, valid_flow_mask)`` where ``valid_flow_mask``
            is a numpy boolean mask of shape (H, W)
            indicating which flow values are valid. The flow is a numpy array of
            shape (2, H, W) and the images are PIL images. ``flow`` and ``valid_flow_mask`` are None if
            ``split="test"``.
        rZ   r[   r$   r&   r'   r4     r\   zHD1K.__getitem__)r=   r>   r?   rb   r/   r   r
   r@   r   r	   r   r   r   rm   rc   rd   r-   rA   rB   rC   r4   rD   r&   r&   r$   r'   r     s&    
&r   r(   r   c                 C   s   t | dF}tj|ddd }|dkrtdttj|ddd}ttj|ddd}tj|d	d
| | d}|||d
d
ddW  d   S 1 sNw   Y  dS )z#Read .flo file in Middlebury formatrbc   )counts   PIEHz)Magic number incorrect. Invalid .flo filez<i4r   z<f4r   r   N)openrc   fromfiletobytes
ValueErrorrA   ZreshapeZ	transpose)r(   fmagicwhr:   r&   r&   r'   r_     s   $r_   c                 C   sj   t t| tj}|d dd d d d f |dd d d d f }}|d d }| }| | fS )Nr   i   @   )r   r   tor8   Zfloat32boolnumpy)r(   Zflow_and_validr2   r3   r&   r&   r'   rl      s
   2rl   )*r   rR   abcr   r   r   pathlibr   typingr   r   r	   r
   r   rc   r8   ZPILr   Zio.imager   r   folderr   r9   r   r   Zvisionr   rm   rd   rB   rC   __all__r   r   r   r   r   r   r@   r_   rl   r&   r&   r&   r'   <module>   s0     	:[FDfL"