
    kh                        d dl Z d dlZd dlZ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mZmZ d dlZd dlmZ ddlmZmZmZ dd	lmZ eej*                  ej*                  eej8                     ej8                  f   Zeej*                  ej*                  eej8                     f   Zd
Z e j@                  ed      Z! G d dee      Z" G d de"      Z# G d de"      Z$ G d de"      Z% G d de"      Z& G d de"      Z' G d de"      Z( G d de"      Z) G d de"      Z* G d de"      Z+ G d  d!e"      Z,y)"    N)ABCabstractmethod)glob)Path)CallablecastListOptionalTupleUnion)Image   )	_read_pfmdownload_and_extract_archiveverify_str_arg)VisionDataset )slice_channelsc                   &    e Zd ZdZdZddeeef   dee	   ddf fdZ
deeef   dej                  fd	Z	 dd
edee   deeeee   f      fdZededeeej$                     eej$                     f   fd       Zdedeeef   fdZdefdZ xZS )StereoMatchingDatasetz+Base interface for Stereo matching datasetsFNroot
transformsreturnc                 P    t         |   |       || _        g | _        g | _        y)a}  
        Args:
            root(str): Root directory of the dataset.
            transforms(callable, optional): A function/transform that takes in Tuples of
                (images, disparities, valid_masks) and returns a transformed version of each of them.
                images is a Tuple of (``PIL.Image``, ``PIL.Image``)
                disparities is a Tuple of (``np.ndarray``, ``np.ndarray``) with shape (1, H, W)
                valid_masks is a Tuple of (``np.ndarray``, ``np.ndarray``) with shape (H, W)
                In some cases, when a dataset does not provide disparities, the ``disparities`` and
                ``valid_masks`` can be Tuples containing None values.
                For training splits generally the datasets provide a minimal guarantee of
                images: (``PIL.Image``, ``PIL.Image``)
                disparities: (``np.ndarray``, ``None``) with shape (1, H, W)
                Optionally, based on the dataset, it can return a ``mask`` as well:
                valid_masks: (``np.ndarray | None``, ``None``) with shape (H, W)
                For some test splits, the datasets provides outputs that look like:
                imgaes: (``PIL.Image``, ``PIL.Image``)
                disparities: (``None``, ``None``)
                Optionally, based on the dataset, it can return a ``mask`` as well:
                valid_masks: (``None``, ``None``)
        )r   N)super__init__r   _images_disparities)selfr   r   	__class__s      a/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/datasets/_stereo_matching.pyr   zStereoMatchingDataset.__init__   s+    , 	d#$    	file_pathc                 p    t        j                  |      }|j                  dk7  r|j                  d      }|S )NRGB)r   openmodeconvert)r   r#   imgs      r!   	_read_imgzStereoMatchingDataset._read_img:   s/    jj#88u++e$C
r"   paths_left_patternpaths_right_patternc                    t        t        t        |                  }|rt        t        t        |                  }nt        d |D              }|st        d|       |st        d|       t	        |      t	        |      k7  r*t        dt	        |       dt	        |       d| d| d	      t        d t        ||      D              }|S )	Nc              3       K   | ]  }d   y wNr   .0_s     r!   	<genexpr>z4StereoMatchingDataset._scan_pairs.<locals>.<genexpr>L   s     8t8   z0Could not find any files matching the patterns: zFound z left files but z# right files using:
 left pattern: z
right pattern: 
c              3   *   K   | ]  \  }}||f  y wr/   r   )r1   leftrights      r!   r3   z4StereoMatchingDataset._scan_pairs.<locals>.<genexpr>[   s     S{tUdE]Ss   )listsortedr   FileNotFoundErrorlen
ValueErrorzip)r   r+   r,   
left_pathsright_pathspathss         r!   _scan_pairsz!StereoMatchingDataset._scan_pairs@   s     &&8!9:;
 vd+>&?@AK8Z88K#&VWiVj$kll#&VWjVk$lmmz?c+..Z))9#k:J9K L!!3 4 5""5!6b:  Sc*k6RSSr"   c                      y r/   r   )r   r#   s     r!   _read_disparityz%StereoMatchingDataset._read_disparity^   s     	r"   indexc                    | j                  | j                  |   d         }| j                  | j                  |   d         }| j                  | j                  |   d         \  }}| j                  | j                  |   d         \  }}||f}||f}	||f}
| j                  | j	                  ||	|
      \  }}	}
| j
                  s|
d   *|d   |d   |	d   t        t        j                  |
d         fS |d   |d   |	d   fS )ao  Return example at given index.

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

        Returns:
            tuple: A 3 or 4-tuple with ``(img_left, img_right, disparity, Optional[valid_mask])`` where ``valid_mask``
                can be a numpy boolean mask of shape (H, W) if the dataset provides a file
                indicating which disparity pixels are valid. The disparity is a numpy array of
                shape (1, H, W) and the images are PIL images. ``disparity`` is None for
                datasets on which for ``split="test"`` the authors did not provide annotations.
        r   r   )	r*   r   rD   r   r   _has_built_in_disparity_maskr   npndarray)r   rE   img_left	img_rightdsp_map_leftvalid_mask_leftdsp_map_rightvalid_mask_rightimgsdsp_mapsvalid_maskss              r!   __getitem__z!StereoMatchingDataset.__getitem__c   s*    >>$,,u"5a"89NN4<<#6q#9:	(,(<(<T=N=Nu=UVW=X(Y%o*.*>*>t?P?PQV?WXY?Z*['')$ -0&(89??&
 h<	 ,,A0J7DGXa[$rzz;q>2RRR7DGXa[00r"   c                 ,    t        | j                        S r/   )r<   r   )r   s    r!   __len__zStereoMatchingDataset.__len__   s    4<<  r"   r/   )__name__
__module____qualname____doc__rG   r   strr   r
   r   r   r   r*   r	   r   rB   r   rH   rI   rD   intT1T2rS   rU   __classcell__r    s   @r!   r   r      s    5#( U39- 8H;M Y] 85d#3   .2 &c] 
eC#&'	(	<  x

7KXVXV`V`Ma7a1b  !1 !1r2v !1F! !r"   r   c                        e Zd ZdZddeeef   dee   ddf fdZ	dede
ej                  df   fdZd	edef fd
Z xZS )CarlaStereoaz  
    Carla simulator data linked in the `CREStereo github repo <https://github.com/megvii-research/CREStereo>`_.

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

        root
            carla-highres
                trainingF
                    scene1
                        img0.png
                        img1.png
                        disp0GT.pfm
                        disp1GT.pfm
                        calib.txt
                    scene2
                        img0.png
                        img1.png
                        disp0GT.pfm
                        disp1GT.pfm
                        calib.txt
                    ...

    Args:
        root (str or ``pathlib.Path``): Root directory where `carla-highres` is located.
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    Nr   r   r   c                 F   t         	|   ||       t        |      dz  }t        |dz  dz  dz        }t        |dz  dz  dz        }| j	                  ||      }|| _        t        |dz  dz  dz        }t        |dz  dz  dz        }| j	                  ||      }|| _        y )Nzcarla-highres	trainingF*im0.pngim1.pngdisp0GT.pfmzdisp1GT.pfmr   r   r   rZ   rB   r   r   )
r   r   r   left_image_patternright_image_patternrP   left_disparity_patternright_disparity_patterndisparitiesr    s
            r!   r   zCarlaStereo.__init__   s    z*DzO+ !3c!9I!EF!$"4s":Y"FG 24GH!$TK%7#%=%M!N"%d[&83&>&N"O&&'=?VW'r"   r#   c                 N    t        |      }t        j                  |      }d }||fS r/   _read_pfm_filerH   absr   r#   disparity_map
valid_masks       r!   rD   zCarlaStereo._read_disparity   *    &y1}-
j((r"   rE   c                 >    t        t        t        |   |            S a  Return example at given index.

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

        Returns:
            tuple: A 3-tuple with ``(img_left, img_right, disparity)``.
            The disparity is a numpy array of shape (1, H, W) and the images are PIL images.
            If a ``valid_mask`` is generated within the ``transforms`` parameter,
            a 4-tuple with ``(img_left, img_right, disparity, valid_mask)`` is returned.
        r   r\   r   rS   r   rE   r    s     r!   rS   zCarlaStereo.__getitem__        B+E233r"   r/   rV   rW   rX   rY   r   rZ   r   r
   r   r   r   rH   rI   rD   r[   r\   rS   r^   r_   s   @r!   ra   ra      sj    6(U39- (8H;M (Y] () )rzz47G1H )4 4 4 4r"   ra   c            	            e Zd ZdZdZddeeef   dedee	   ddf fdZ
d	edeeej                     df   fd
Zdedef fdZ xZS )Kitti2012Stereoa
  
    KITTI dataset from the `2012 stereo evaluation benchmark <http://www.cvlibs.net/datasets/kitti/eval_stereo_flow.php>`_.
    Uses the RGB images for consistency with KITTI 2015.

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

        root
            Kitti2012
                testing
                    colored_0
                        1_10.png
                        2_10.png
                        ...
                    colored_1
                        1_10.png
                        2_10.png
                        ...
                training
                    colored_0
                        1_10.png
                        2_10.png
                        ...
                    colored_1
                        1_10.png
                        2_10.png
                        ...
                    disp_noc
                        1.png
                        2.png
                        ...
                    calib

    Args:
        root (str or ``pathlib.Path``): Root directory where `Kitti2012` is located.
        split (string, optional): The dataset split of scenes, either "train" (default) or "test".
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    TNr   splitr   r   c                 z   t         |   ||       t        |dd       t        |      dz  |dz   z  }t	        |dz  dz        }t	        |dz  dz        }| j                  ||      | _        |d	k(  r)t	        |d
z  dz        }| j                  |d       | _        y t        d | j                  D              | _        y )Nr~   traintestvalid_values	Kitti2012ing	colored_0z*_10.png	colored_1r   disp_noc*.pngc              3       K   | ]  }d   ywNNNr   r0   s     r!   r3   z+Kitti2012Stereo.__init__.<locals>.<genexpr>       $Ha\$Hr4   	r   r   r   r   rZ   rB   r   r   r9   )r   r   r~   r   left_img_patternright_img_patterndisparity_patternr    s          r!   r   zKitti2012Stereo.__init__   s    z*ug4EFDzK'55=9tk1J>?{ 2Z ?@''(8:KLG #D:$5$? @ $ 0 01BD ID $$H4<<$H HDr"   r#   c                     |yt        j                  t        j                  |            dz  }|d d d d d f   }d }||fS Nr   g      p@rH   asarrayr   r&   rr   s       r!   rD   zKitti2012Stereo._read_disparity  G    

5::i#89EA%dAqj1
j((r"   rE   c                 >    t        t        t        |   |            S a  Return example at given index.

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

        Returns:
            tuple: A 4-tuple with ``(img_left, img_right, disparity, valid_mask)``.
            The disparity is a numpy array of shape (1, H, W) and the images are PIL images.
            ``valid_mask`` is implicitly ``None`` if the ``transforms`` parameter does not
            generate a valid mask.
            Both ``disparity`` and ``valid_mask`` are ``None`` if the dataset split is test.
        rx   ry   s     r!   rS   zKitti2012Stereo.__getitem__       B+E233r"   r   NrV   rW   rX   rY   rG   r   rZ   r   r
   r   r   r   rH   rI   rD   r[   r\   rS   r^   r_   s   @r!   r}   r}      s    $L $( IU39- Ic IQYZbQc Ios I"	) 	)x

7KT7Q1R 	)4 4 4 4r"   r}   c            	            e Zd ZdZdZddeeef   dedee	   ddf fdZ
d	edeeej                     df   fd
Zdedef fdZ xZS )Kitti2015StereoaM  
    KITTI dataset from the `2015 stereo evaluation benchmark <http://www.cvlibs.net/datasets/kitti/eval_scene_flow.php>`_.

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

        root
            Kitti2015
                testing
                    image_2
                        img1.png
                        img2.png
                        ...
                    image_3
                        img1.png
                        img2.png
                        ...
                training
                    image_2
                        img1.png
                        img2.png
                        ...
                    image_3
                        img1.png
                        img2.png
                        ...
                    disp_occ_0
                        img1.png
                        img2.png
                        ...
                    disp_occ_1
                        img1.png
                        img2.png
                        ...
                    calib

    Args:
        root (str or ``pathlib.Path``): Root directory where `Kitti2015` is located.
        split (string, optional): The dataset split of scenes, either "train" (default) or "test".
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    TNr   r~   r   r   c                    t         |   ||       t        |dd       t        |      dz  |dz   z  }t	        |dz  dz        }t	        |dz  dz        }| j                  ||      | _        |d	k(  r:t	        |d
z  dz        }t	        |dz  dz        }| j                  ||      | _        y t        d | j                  D              | _        y )Nr~   r   r   	Kitti2015r   image_2r   image_3r   
disp_occ_0
disp_occ_1c              3       K   | ]  }d   ywr   r   r0   s     r!   r3   z+Kitti2015Stereo.__init__.<locals>.<genexpr>Z  r   r4   r   	r   r   r~   r   r   r   rk   rl   r    s	           r!   r   zKitti2015Stereo.__init__K  s    z*ug4EFDzK'55=9ti/'9:y 07 :;''(8:KLG%()<w)F%G"&)$*=*G&H# $ 0 01GI` aD $$H4<<$H HDr"   r#   c                     |yt        j                  t        j                  |            dz  }|d d d d d f   }d }||fS r   r   rr   s       r!   rD   zKitti2015Stereo._read_disparity\  r   r"   rE   c                 >    t        t        t        |   |            S r   rx   ry   s     r!   rS   zKitti2015Stereo.__getitem__g  r   r"   r   r   r_   s   @r!   r   r     s    'R $( IU39- Ic IQYZbQc Ios I"	) 	)x

7KT7Q1R 	)4 4 4 4r"   r   c                   0    e Zd ZdZg dg dg ddZdZ	 	 	 	 	 ddeeef   d	ed
e	e   de
de	e   de
ddf fdZdeeef   dej                  f fdZdedeed   eej"                  ej"                  f   f   fdZdeeef   ddfdZdedef fdZ xZS )Middlebury2014StereoaZ	  Publicly available scenes from the Middlebury dataset `2014 version <https://vision.middlebury.edu/stereo/data/scenes2014/>`.

    The dataset mostly follows the original format, without containing the ambient subdirectories.  : ::

        root
            Middlebury2014
                train
                    scene1-{perfect,imperfect}
                        calib.txt
                        im{0,1}.png
                        im1E.png
                        im1L.png
                        disp{0,1}.pfm
                        disp{0,1}-n.png
                        disp{0,1}-sd.pfm
                        disp{0,1}y.pfm
                    scene2-{perfect,imperfect}
                        calib.txt
                        im{0,1}.png
                        im1E.png
                        im1L.png
                        disp{0,1}.pfm
                        disp{0,1}-n.png
                        disp{0,1}-sd.pfm
                        disp{0,1}y.pfm
                    ...
                additional
                    scene1-{perfect,imperfect}
                        calib.txt
                        im{0,1}.png
                        im1E.png
                        im1L.png
                        disp{0,1}.pfm
                        disp{0,1}-n.png
                        disp{0,1}-sd.pfm
                        disp{0,1}y.pfm
                    ...
                test
                    scene1
                        calib.txt
                        im{0,1}.png
                    scene2
                        calib.txt
                        im{0,1}.png
                    ...

    Args:
        root (str or ``pathlib.Path``): Root directory of the Middleburry 2014 Dataset.
        split (string, optional): The dataset split of scenes, either "train" (default), "test", or "additional"
        use_ambient_views (boolean, optional): Whether to use different expose or lightning views when possible.
            The dataset samples with equal probability between ``[im1.png, im1E.png, im1L.png]``.
        calibration (string, optional): Whether or not to use the calibrated (default) or uncalibrated scenes.
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
        download (boolean, optional): Whether or not to download the dataset in the ``root`` directory.
    )

Adirondack	Jadeplant
MotorcyclePianoPipesPlayroom	PlaytableRecycleShelvesVintage)BackpackBicycle1Cable
Classroom1CouchFlowersMaskShopvacSticksStorageSword1Sword2Umbrella)PlantsClassroom2E
Classroom2	AustraliaDjembeLCrusadePCrusadeHoopsBicycle2	StaircaseNewkuba
AustraliaPDjembe
LivingroomComputer)r   
additionalr   TNr   r~   calibrationuse_ambient_viewsr   downloadr   c                    t         |   ||       t        |dd       || _        |rt        |dd       |dk(  r"t	        d      |dk7  rt	        d| d	| d
      |r| j                  |       t        |      dz  }t        j                  j                  ||z        st        d| d      | j                  |   t        fdt        j                  ||z        D              st        d| d      dgdgdgddgd|   }|D ]  }d|z   }	t        ||z  |	z  dz        }
t        ||z  |	z  dz        }| xj                  | j!                  |
|      z  c_        |dk(  r"t#        d | j                  D              | _        |t        ||z  |	z  dz        }t        ||z  |	z  dz        }| xj$                  | j!                  ||      z  c_         || _        y )Nr~   )r   r   r   r   r   )perfect	imperfectbothNr   zMSplit 'test' has only no calibration settings, please set `calibration=None`.zSplit 'zr' has calibration settings, however None was provided as an argument.
Setting calibration to 'perfect' for split 'zF'. Available calibration settings are: 'perfect', 'imperfect', 'both'.Middlebury2014zThe z7 directory was not found in the provided root directoryc              3   N   K   | ]  }D ]  }|j                  |         y wr/   )
startswith)r1   scenessplit_sceness      r!   r3   z0Middlebury2014Stereo.__init__.<locals>.<genexpr>  s;      
 !	
  Q

s   "%z:Provided root folder does not contain any scenes from the z split. z-perfectz
-imperfect)Nr   r   r   rd   re   rf   c              3       K   | ]  }d   ywr   r   r0   s     r!   r3   z0Middlebury2014Stereo.__init__.<locals>.<genexpr>  s     (L!(Lr4   z	disp0.pfmz	disp1.pfm)r   r   r   r~   r=   _download_datasetr   ospathexistsr;   splitsanylistdirrZ   r   rB   r9   r   r   )r   r   r~   r   r   r   r   calibrartion_suffixescalibration_suffixscene_patternr   r   left_dispartity_patternright_dispartity_patternr   r    s                 @r!   r   zMiddlebury2014Stereo.__init__  s(    	z*ug4ST
;Djk !pqq eW %EEJG  LRS 
 ""4(Dz,,ww~~dUl+#d5'1h$ijj{{5) 
 D5L1
 
 $&`af`ggn$opp $"|&.	!

 ! #8 	i"44M"4%<-#?)#KL #D5L=$@9$L MLLD,,-=?PQQL$((Lt||(L$L!*-dUl].J[.X*Y'+.te|m/Kk/Y+Z(!!T%5%56MOg%hh!	i "3r"   r#   c                 H   t        |t              st        |      }|j                  dk(  rh| j                  r\|j                  t        fddD              }t        t        d |            }|j                  |       t        j                  |      }t        | -  |      S )a  
        Function that reads either the original right image or an augmented view when ``use_ambient_views`` is True.
        When ``use_ambient_views`` is True, the dataset will return at random one of ``[im1.png, im1E.png, im1L.png]``
        as the right image.
        rf   c              3   (   K   | ]	  }|z    y wr/   r   )r1   	view_name	base_paths     r!   r3   z1Middlebury2014Stereo._read_img.<locals>.<genexpr>0  s     %f	i)&;%fs   )zim1E.pngzim1L.pngc                 @    t         j                  j                  |       S r/   )r   r   r   )ps    r!   <lambda>z0Middlebury2014Stereo._read_img.<locals>.<lambda>2  s    rww~~a7H r"   )
isinstancer   namer   parentr9   filterappendrandomchoicer   r*   )r   r#   ambient_file_pathsr   r    s      @r!   r*   zMiddlebury2014Stereo._read_img"  s     )T*YI>>Y&4+A+A!((I!%%fMe%f!f!%f-HJ\&]!^%%i0&89Iw ++r"   r   c                     |yt        |      }t        j                  |      }d||t        j                  k(  <   |dkD  j	                  d      }||fS )Nr   r   )rp   rH   rq   infsqueezerr   s       r!   rD   z$Middlebury2014Stereo._read_disparity8  sV    &y1}-12mrvv-.#a'003
j((r"   c           	         d}t              dz  | j                  }|dk7  r_| j                  |   D ]L  }|z  }dD ]@  }| d| }| d| d}||z  j                         r&t	        || dt        |      d	       B N y t        j                  dz         t        fd
| j                  d   D              rd}	t	        |	t              d       t        j                  t        dz              D ]_  \  }
}}|D ]T  }dz  }t        |
      |z  }t        j                  |d       t        j                  t        |      t        |             V a t        j                  t        dz               y y )Nz8https://vision.middlebury.edu/stereo/data/scenes2014/zipr   r   )r   r   -/z.zipT)urlfilenamedownload_rootremove_finishedc              3   R   K   | ]  }|t        j                  d z        v   yw)r   N)r   r   )r1   r   r   s     r!   r3   z9Middlebury2014Stereo._download_dataset.<locals>.<genexpr>Y  s#     S!1BJJtf}55Ss   $'zEhttps://vision.middlebury.edu/stereo/submit3/zip/MiddEval3-data-F.zip)r  r  r  zMiddEval3/testF)exist_ok	MiddEval3)r   r~   r   r   r   rZ   r   makedirsr   walkshutilmovermtree)r   r   base_url
split_namesplit_scene
split_rootr   
scene_name	scene_urltest_set_url	scene_dirscene_namesr2   r   scene_dst_dirscene_src_dirs    `              r!   r   z&Middlebury2014Stereo._download_datasetC  s   MDz,,ZZ
#{{:6 !J.
#; 
K$/=+!?J#+*Aj\ >I&3;;=4 )(2|4%8*-j/,0	
 KKv&St{{6?RSSf -SQUYhlm13TDU=U9V1W L-I{A!, L(,v(,Y%(?MDAC$6M8JK	LL c$"456 Tr"   rE   c                 >    t        t        t        |   |            S )az  Return example at given index.

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

        Returns:
            tuple: A 4-tuple with ``(img_left, img_right, disparity, valid_mask)``.
            The disparity is a numpy array of shape (1, H, W) and the images are PIL images.
            ``valid_mask`` is implicitly ``None`` for `split=test`.
        r   r]   r   rS   ry   s     r!   rS   z Middlebury2014Stereo.__getitem__i       B+E233r"   )r   r   FNF)rV   rW   rX   rY   r   rG   r   rZ   r   r
   boolr   r   r   r*   r   rH   rI   rD   r   r[   r]   rS   r^   r_   s   @r!   r   r   w  s$   6r


9-F^ $( 
 %."')-?3CI?3 ?3 c]	?3
  ?3 X&?3 ?3 
?3B,5d#3 , ,,	) 	)uZ7H%PRPZPZ\^\f\fPfJg7g1h 	)$7eCI&6 $74 $7L4 4 4 4r"   r   c                        e Zd ZdZdZ	 ddeeef   dee	   ddf fdZ
dedeej                  df   fd	Zd
edef fdZ xZS )	CREStereoa  Synthetic dataset used in training the `CREStereo <https://arxiv.org/pdf/2203.11483.pdf>`_ architecture.
    Dataset details on the official paper `repo <https://github.com/megvii-research/CREStereo>`_.

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

        root
            CREStereo
                tree
                    img1_left.jpg
                    img1_right.jpg
                    img1_left.disp.jpg
                    img1_right.disp.jpg
                    img2_left.jpg
                    img2_right.jpg
                    img2_left.disp.jpg
                    img2_right.disp.jpg
                    ...
                shapenet
                    img1_left.jpg
                    img1_right.jpg
                    img1_left.disp.jpg
                    img1_right.disp.jpg
                    ...
                reflective
                    img1_left.jpg
                    img1_right.jpg
                    img1_left.disp.jpg
                    img1_right.disp.jpg
                    ...
                hole
                    img1_left.jpg
                    img1_right.jpg
                    img1_left.disp.jpg
                    img1_right.disp.jpg
                    ...

    Args:
        root (str): Root directory of the dataset.
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    TNr   r   r   c                 |   t         |   ||       t        |      dz  }g d}|D ]  }t        ||z  dz        }t        ||z  dz        }| j	                  ||      }| xj
                  |z  c_        t        ||z  dz        }t        ||z  dz        }	| j	                  ||	      }
| xj                  |
z  c_         y )Nr  )shapenet
reflectivetreeholez
*_left.jpgz*_right.jpgz*_left.disp.pngz*_right.disp.pngrh   )r   r   r   dirsr   ri   rj   rP   rk   rl   rm   r    s              r!   r   zCREStereo.__init__  s    
 	z*DzK'9 		-A!$TAX%<!="%dQh&>"?##$68KLDLLD L%(4E)E%F"&)$(5G*G&H#**+ACZ[K,		-r"   r#   c                     t        j                  t        j                  |      t         j                        }|d d d d d f   dz  }d }||fS )Ndtypeg      @@rH   r   r   r&   float32rr   s       r!   rD   zCREStereo._read_disparity  sD    

5::i#8

K%dAqj1D8
j((r"   rE   c                 >    t        t        t        |   |            S )a  Return example at given index.

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

        Returns:
            tuple: A 4-tuple with ``(img_left, img_right, disparity, valid_mask)``.
            The disparity is a numpy array of shape (1, H, W) and the images are PIL images.
            ``valid_mask`` is implicitly ``None`` if the ``transforms`` parameter does not
            generate a valid mask.
        rx   ry   s     r!   rS   zCREStereo.__getitem__  rz   r"   r/   r   r_   s   @r!   r  r  w  s~    'R $( 
 *.-CI- X&- 
	-,) )rzz47G1H )4 4 4 4r"   r  c            	            e Zd ZdZddeeef   dedee   ddf fdZ	dede
ej                  df   fd	Zd
edef fdZ xZS )FallingThingsStereoa  `FallingThings <https://research.nvidia.com/publication/2018-06_falling-things-synthetic-dataset-3d-object-detection-and-pose-estimation>`_ dataset.

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

        root
            FallingThings
                single
                    dir1
                        scene1
                            _object_settings.json
                            _camera_settings.json
                            image1.left.depth.png
                            image1.right.depth.png
                            image1.left.jpg
                            image1.right.jpg
                            image2.left.depth.png
                            image2.right.depth.png
                            image2.left.jpg
                            image2.right
                            ...
                        scene2
                    ...
                mixed
                    scene1
                        _object_settings.json
                        _camera_settings.json
                        image1.left.depth.png
                        image1.right.depth.png
                        image1.left.jpg
                        image1.right.jpg
                        image2.left.depth.png
                        image2.right.depth.png
                        image2.left.jpg
                        image2.right
                        ...
                    scene2
                    ...

    Args:
        root (str or ``pathlib.Path``): Root directory where FallingThings is located.
        variant (string): Which variant to use. Either "single", "mixed", or "both".
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    Nr   variantr   r   c                    t         |   ||       t        |      dz  }t        |dd       dgdgddgd|   }t        d      dz  t        d      d}|D ]  }t	        ||z  ||   z  d	z        }t	        ||z  ||   z  d
z        }| xj
                  | j                  ||      z  c_        t	        ||z  ||   z  dz        }	t	        ||z  ||   z  dz        }
| xj                  | j                  |	|
      z  c_         y )NFallingThingsr-  )singlemixedr   r   r0  r1  rd   )r0  r1  z
*.left.jpgz*.right.jpgz*.left.depth.pngz*.right.depth.pngr   r   r   r   rZ   r   rB   r   )r   r   r-  r   variantssplit_prefixr   r   r   rk   rl   r    s              r!   r   zFallingThingsStereo.__init__  s3   z*DzO+w	8ST  jYw'
 	 3i#o#Y

  	cA"4!8l1o#=#LM #D1H|A$>$N OLLD,,-=?PQQL%(LO)CFX)X%Y"&)$(\!_*DGZ*Z&[#!1!12HJa!bb	cr"   r#   c                    t        j                  t        j                  |            }t	        |      j
                  dz  }t        |d      5 }t        j                  |      }|d   d   d   d   }d\  }}||z  |z  |j                  t         j                        z  }	|	d d d d d f   }	d }
|	|
fcd d d        S # 1 sw Y   y xY w)Nz_camera_settings.jsonrcamera_settingsr   intrinsic_settingsfx)   d   )
rH   r   r   r&   r   r   jsonloadastyper)  )r   r#   depthcamera_settings_pathf
intrinsicsfocalbaselinepixel_constantrs   rt   s              r!   rD   z#FallingThingsStereo._read_disparity  s    

5::i01  $I558OO&, 		-1J01!45IJ4PE'-$Hn%->%,,rzzBZZM)$1*5MJ *,		- 		- 		-s   A"B99CrE   c                 >    t        t        t        |   |            S rw   rx   ry   s     r!   rS   zFallingThingsStereo.__getitem__(  rz   r"   )r0  Nr{   r_   s   @r!   r,  r,    sy    *XcU39- c cT\]eTf crv c6- -rzz47G1H -"4 4 4 4r"   r,  c                        e Zd ZdZ	 	 	 ddeeef   dededee   ddf
 fdZ	d	ede
ej                  df   fd
Zdedef fdZ xZS )SceneFlowStereoa  Dataset interface for `Scene Flow <https://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html>`_ datasets.
    This interface provides access to the `FlyingThings3D, `Monkaa` and `Driving` datasets.

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

        root
            SceneFlow
                Monkaa
                    frames_cleanpass
                        scene1
                            left
                                img1.png
                                img2.png
                            right
                                img1.png
                                img2.png
                        scene2
                            left
                                img1.png
                                img2.png
                            right
                                img1.png
                                img2.png
                    frames_finalpass
                        scene1
                            left
                                img1.png
                                img2.png
                            right
                                img1.png
                                img2.png
                        ...
                        ...
                    disparity
                        scene1
                            left
                                img1.pfm
                                img2.pfm
                            right
                                img1.pfm
                                img2.pfm
                FlyingThings3D
                    ...
                    ...

    Args:
        root (str or ``pathlib.Path``): Root directory where SceneFlow is located.
        variant (string): Which dataset variant to user, "FlyingThings3D" (default), "Monkaa" or "Driving".
        pass_name (string): Which pass to use, "clean" (default), "final" or "both".
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.

    Nr   r-  	pass_namer   r   c                 j   t         |   ||       t        |      dz  }t        |dd       t        |dd       dgdgddgd|   }||z  }t        d	      t        d	      d	z  d	z  t        d	      d	z  d	z  d
}|D ]  }t	        ||z  ||   z  dz  dz        }t	        ||z  ||   z  dz  dz        }	| xj
                  | j                  ||	      z  c_        t	        |dz  ||   z  dz  dz        }
t	        |dz  ||   z  dz  dz        }| xj                  | j                  |
|      z  c_         y )N	SceneFlowr-  )FlyingThings3DDrivingMonkaar   rI  )cleanfinalr   frames_cleanpassframes_finalpassrd   )rN  rL  rM  r7   r   r8   	disparityz*.pfmr2  )r   r   r-  rI  r   passesprefix_directoriesr   ri   rj   rk   rl   r    s               r!   r   zSceneFlowStereo.__init__m  s    	z*DzK'w	8_`y+<VW ))()');<
 	 g~ 3i"3i#o3Cy3,
  	cA!$TAX0B70K%Kf%TW^%^!_"%dQh1CG1L&Lw&VY`&`"aLLD,,-?ATUUL%();>PQX>Y)Y\b)bel)l%m"&)$*<?QRY?Z*Z]d*dgn*n&o#!1!12HJa!bb	cr"   r#   c                 N    t        |      }t        j                  |      }d }||fS r/   ro   rr   s       r!   rD   zSceneFlowStereo._read_disparity  ru   r"   rE   c                 >    t        t        t        |   |            S rw   rx   ry   s     r!   rS   zSceneFlowStereo.__getitem__  rz   r"   )rL  rO  Nr{   r_   s   @r!   rH  rH  7  s    3p ( )-#cCI#c #c 	#c
 X&#c 
#cJ) )rzz47G1H )4 4 4 4r"   rH  c            	            e Zd ZdZdZddeeef   dedee	   ddf fdZ
d	edeeef   fd
Zd	edeed   eej                  ej                  f   f   fdZdedef fdZ xZS )SintelStereoa  Sintel `Stereo Dataset <http://sintel.is.tue.mpg.de/stereo>`_.

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

        root
            Sintel
                training
                    final_left
                        scene1
                            img1.png
                            img2.png
                            ...
                        ...
                    final_right
                        scene2
                            img1.png
                            img2.png
                            ...
                        ...
                    disparities
                        scene1
                            img1.png
                            img2.png
                            ...
                        ...
                    occlusions
                        scene1
                            img1.png
                            img2.png
                            ...
                        ...
                    outofframe
                        scene1
                            img1.png
                            img2.png
                            ...
                        ...

    Args:
        root (str or ``pathlib.Path``): Root directory where Sintel Stereo is located.
        pass_name (string): The name of the pass to use, either "final", "clean" or "both".
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    TNr   rI  r   r   c                    t         	|   ||       t        |dd       t        |      dz  }dgdgddgd|   }|D ]  }t	        |dz  | dz  d	z  d
z        }t	        |dz  | dz  d	z  d
z        }| xj
                  | j                  ||      z  c_        t	        |dz  dz  d	z  d
z        }| xj                  | j                  |d       z  c_         y )NrI  )rP  rO  r   r   SintelrP  rO  training_leftrd   r   _rightrm   )r   r   r   r   rZ   r   rB   r   )
r   r   rI  r   
pass_namesr   r   r   r   r    s
            r!   r   zSintelStereo.__init__  s   z*y+<VWDzH$YYg&
 	
  	KA"4*#4!E{#BS#H7#RS #D:$51#V$Ds$JW$T ULLD,,-=?PQQL #D:$5$E$Kg$U V!1!12CT!JJ	Kr"   r#   c                    t        |      }|j                  }|j                  }|j                  j                  }t        |dz  |j                  z  |z        }t        |dz  |j                  z  |z        }t        j
                  j                  |      st        d| d      t        j
                  j                  |      st        d| d      ||fS )N
occlusions
outofframezOcclusion mask z does not existzOut of frame mask )r   r   r   rZ   r   r   r   r;   )r   r#   fpathbasenamescenedir	sampledirocclusion_pathoutofframe_paths           r!   _get_occlussion_mask_pathsz'SintelStereo._get_occlussion_mask_paths  s     Y::<<OO**	Y5EPQi,6FQRww~~n-#on5E_$UVVww~~o.#&88I$YZZ..r"   r   c                    |yt        j                  t        j                  |      t         j                        }t        j
                  |dd      \  }}}|dz  |dz  z   |dz  z   }t        j                  |d	      }| j                  |      \  }}t        j                  t        j                  |            d
k(  }t        j                  t        j                  |            d
k(  }	t        j                  |	|      }||fS )Nr   r&     )axis   @   i @  )   r   r   r   )	rH   r   r   r&   r)  r~   	transposeri  logical_and)
r   r#   rs   r6  gbocclued_mask_pathout_of_frame_mask_pathrt   off_masks
             r!   rD   zSintelStereo._read_disparity  s     

5::i#8

K((=!"51aAT
*Q%[8]I>484S4ST]4^11ZZ

+< =>!C
::ejj)?@AQF^^Hj9
j((r"   rE   c                 >    t        t        t        |   |            S )a  Return example at given index.

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

        Returns:
            tuple: A 4-tuple with ``(img_left, img_right, disparity, valid_mask)`` is returned.
            The disparity is a numpy array of shape (1, H, W) and the images are PIL images whilst
            the valid_mask is a numpy array of shape (H, W).
        r  ry   s     r!   rS   zSintelStereo.__getitem__  r  r"   )rP  N)rV   rW   rX   rY   rG   r   rZ   r   r
   r   r   r   ri  rH   rI   rD   r[   r]   rS   r^   r_   s   @r!   rY  rY    s    *X $( KU39- K# KU]^fUg Ksw K(/C /E#s(O /*) )uZ7H%PRPZPZ\^\f\fPfJg7g1h )(4 4 4 4r"   rY  c            	            e Zd ZdZddeeef   dedee   ddf fdZ	dede
ej                  df   fd	Zd
edef fdZ xZS )
InStereo2ka  `InStereo2k <https://github.com/YuhuaXu/StereoDataset>`_ dataset.

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

        root
            InStereo2k
                train
                    scene1
                        left.png
                        right.png
                        left_disp.png
                        right_disp.png
                        ...
                    scene2
                    ...
                test
                    scene1
                        left.png
                        right.png
                        left_disp.png
                        right_disp.png
                        ...
                    scene2
                    ...

    Args:
        root (str or ``pathlib.Path``): Root directory where InStereo2k is located.
        split (string): Either "train" or "test".
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    Nr   r~   r   r   c                 H   t         |   ||       t        |      dz  |z  }t        |dd       t	        |dz  dz        }t	        |dz  dz        }| j                  ||      | _        t	        |dz  dz        }t	        |dz  d	z        }| j                  ||      | _        y )
Nrz  r~   r   r   rd   zleft.pngz	right.pngzleft_disp.pngzright_disp.png)r   r   r   r   rZ   rB   r   r   r   s	           r!   r   zInStereo2k.__init__A  s    z*DzL(50ug4EFtczJ67s
[ 89''(8:KL!$TCZ/%A!B"%dSj3C&C"D ,,-CE\]r"   r#   c                     t        j                  t        j                  |      t         j                        }|d d d d d f   dz  }d }||fS )Nr&  g      @r(  rr   s       r!   rD   zInStereo2k._read_disparityP  sD    

5::i#8

K%dAqj1F:
j((r"   rE   c                 >    t        t        t        |   |            S rw   rx   ry   s     r!   rS   zInStereo2k.__getitem__W  rz   r"   r   r{   r_   s   @r!   rz  rz  !  sx    >^U39- ^c ^QYZbQc ^os ^) )rzz47G1H )4 4 4 4r"   rz  c            	            e Zd ZdZdZddeeef   dedee	   ddf fdZ
d	edeed
   eej                  ej                  f   f   fdZdedef fdZ xZS )ETH3DStereoaf  ETH3D `Low-Res Two-View <https://www.eth3d.net/datasets>`_ dataset.

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

        root
            ETH3D
                two_view_training
                    scene1
                        im1.png
                        im0.png
                        images.txt
                        cameras.txt
                        calib.txt
                    scene2
                        im1.png
                        im0.png
                        images.txt
                        cameras.txt
                        calib.txt
                    ...
                two_view_training_gt
                    scene1
                        disp0GT.pfm
                        mask0nocc.png
                    scene2
                        disp0GT.pfm
                        mask0nocc.png
                    ...
                two_view_testing
                    scene1
                        im1.png
                        im0.png
                        images.txt
                        cameras.txt
                        calib.txt
                    scene2
                        im1.png
                        im0.png
                        images.txt
                        cameras.txt
                        calib.txt
                    ...

    Args:
        root (str or ``pathlib.Path``): Root directory of the ETH3D Dataset.
        split (string, optional): The dataset split of scenes, either "train" (default) or "test".
        transforms (callable, optional): A function/transform that takes in a sample and returns a transformed version.
    TNr   r~   r   r   c                    t         	|   ||       t        |dd       t        |      dz  }|dk(  rdnd}d}t	        ||z  d	z  d
z        }t	        ||z  d	z  dz        }| j                  ||      | _        |dk(  r"t        d | j                  D              | _        y t	        ||z  d	z  dz        }| j                  |d       | _        y )Nr~   r   r   ETH3Dr   two_view_trainingtwo_view_testtwo_view_training_gtrd   re   rf   r   c              3       K   | ]  }d   ywr   r   r0   s     r!   r3   z'ETH3DStereo.__init__.<locals>.<genexpr>  r   r4   rg   )	r   r   r   r   rZ   rB   r   r9   r   )
r   r   r~   r   img_diranot_dirr   r   r   r    s
            r!   r   zETH3DStereo.__init__  s    z*ug4EFDzG#).')9%)tg~3i?@w 4y @A''(8:KLF? $$H4<<$H HD #D8Oc$9M$I J $ 0 01BD IDr"   r#   r   c                     |yt        |      }t        j                  |      }t        |      j                  dz  }t        j                  |      }t        j                  |      j                  t              }||fS )Nr   zmask0nocc.png)
rp   rH   rq   r   r   r   r&   r   r>  r  )r   r#   rs   	mask_pathrt   s        r!   rD   zETH3DStereo._read_disparity  si    &y1}-O**_<	ZZ	*
ZZ
+2248
j((r"   rE   c                 >    t        t        t        |   |            S r   r  ry   s     r!   rS   zETH3DStereo.__getitem__  r   r"   r   )rV   rW   rX   rY   rG   r   rZ   r   r
   r   r   r   rH   rI   rD   r[   r]   rS   r^   r_   s   @r!   r  r  f  s    /b $( JU39- Jc JQYZbQc Jos J(
) 
)uZ7H%PRPZPZ\^\f\fPfJg7g1h 
)4 4 4 4r"   r  )-	functoolsr<  r   r   r  abcr   r   r   pathlibr   typingr   r   r	   r
   r   r   numpyrH   PILr   utilsr   r   r   visionr   rI   r\   r]   __all__partialrp   r   ra   r}   r   r   r  r,  rH  rY  rz  r  r   r"   r!   <module>r     sC     	   #   ? ?   J J !
5;;Xbjj%92::EF
5;;Xbjj%99:
"""9Q?n!C n!b=4' =4@R4+ R4jU4+ U4p}40 }4@U4% U4pe4/ e4Pm4+ m4`w4( w4tB4& B4Ja4' a4r"   