o
    hZ(                     @   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	m
Z
 d dlmZ ddlmZmZmZ ddlmZ G d	d
 d
eZdS )    N)
namedtuple)Path)AnyCallableOptionalUnion)Image   )extract_archiveiterable_to_strverify_str_arg)VisionDatasetc                       s  e Zd ZdZedg dZg eddddddd	d
eddddddd	d
eddddddd	d
eddddddd	d
eddddddd	d
eddddddd	deddddddd	deddddddddedddddddded d!ddddd	d"ed#d$ddddd	d%ed&d'dd(dddd)ed*d+dd(dddd,ed-d.dd(dddd/ed0d1dd(ddd	d2ed3d4dd(ddd	d5ed6d7dd(ddd	d8ed9d:dd;dddd<ed=d>dd;ddd	d<ed?d@dd;ddddAedBdCdd;ddddDedEdFddGddddHedIdJd!dGddddKedLdMd$dLddddNedOdPd'dQdd	ddRedSdTd+dQdd	ddUedVdWd.dXdd	ddYedZd[d1dXdd	dd\ed]d^d4dXdd	dd_ed`daddXdd	d	dbedcddddXdd	d	deedfdgd7dXdd	ddhedidjd:dXdd	ddkedldmd>dXdd	ddnedodpdpdXddd	dYZ	f	q	r	s	s	sddteee	f duedvedwee
e ef dxee dyee dzee d{dsf fd|d}Zd~ed{eeef fddZd{efddZd{efddZded{eeef fddZdvedwed{efddZ  ZS )
Cityscapesaw  `Cityscapes <http://www.cityscapes-dataset.com/>`_ Dataset.

    Args:
        root (str or ``pathlib.Path``): Root directory of dataset where directory ``leftImg8bit``
            and ``gtFine`` or ``gtCoarse`` are located.
        split (string, optional): The image split to use, ``train``, ``test`` or ``val`` if mode="fine"
            otherwise ``train``, ``train_extra`` or ``val``
        mode (string, optional): The quality mode to use, ``fine`` or ``coarse``
        target_type (string or list, optional): Type of target to use, ``instance``, ``semantic``, ``polygon``
            or ``color``. Can also be a list to output a tuple with all specified target types.
        transform (callable, optional): A function/transform that takes in a PIL image
            and returns a transformed version. E.g, ``transforms.RandomCrop``
        target_transform (callable, optional): A function/transform that takes in the
            target and transforms it.
        transforms (callable, optional): A function/transform that takes input sample and its target as entry
            and returns a transformed version.

    Examples:

        Get semantic segmentation target

        .. code-block:: python

            dataset = Cityscapes('./data/cityscapes', split='train', mode='fine',
                                 target_type='semantic')

            img, smnt = dataset[0]

        Get multiple targets

        .. code-block:: python

            dataset = Cityscapes('./data/cityscapes', split='train', mode='fine',
                                 target_type=['instance', 'color', 'polygon'])

            img, (inst, col, poly) = dataset[0]

        Validate on the "coarse" set

        .. code-block:: python

            dataset = Cityscapes('./data/cityscapes', split='val', mode='coarse',
                                 target_type='semantic')

            img, smnt = dataset[0]
    CityscapesClass)nameidZtrain_idcategoryZcategory_idZhas_instancesZignore_in_evalcolorZ	unlabeledr      voidFT)r   r   r   zego vehicler	   zrectification border   z
out of roi   Zstatic   Zdynamic   )o   J   r   Zground   )Q   r   r   Zroad   Zflat)   @   r   Zsidewalk   )   #      parking	   )         z
rail track
   )         Zbuilding   construction)F   r0   r0   Zwall   )f   r2      Zfence   )      r6   z
guard rail   )      r8   Zbridge   )r,   d   r;   Ztunnel   )r,   x   Z   Zpole   object)r6   r6   r6   Z	polegroup   ztraffic light   )r'   r(      ztraffic sign   )   rE   r   Z
vegetation   Znature)k      r#   Zterrain   )      rJ   Zsky   )r0      r8   Zperson   Zhuman)rE   rD   <   Zrider   )r   r   r   car   Zvehicle)r   r   rH   truck   )r   r   r0   bus   )r   rO   r;   Zcaravan   )r   r   r>   trailerrC   )r   r   n   train   )r   P   r;   
motorcycle    )r   r   r+   bicycle!   )w   r.   r^   zlicense platefineinstanceNrootsplitmodetarget_type	transformtarget_transform
transformsreturnc              
      s@  t  |||| |dkrdnd| _tj| jd|| _tj| j| j|| _|| _	|| _
g | _g | _t|dd |dkr@d}nd}d	}	|	||t|}	t|d
||	 t|ts]|g| _	dd | j	D  tj| jrstj| js|dkrtj| jd}
ntj| jd}
| jdkrtj| j| j d}n| jdkrtj| j| j d}tj|
rtj|rt|
| jd t|| jd ntdt| jD ]M}tj| j|}tj| j|}t|D ]5}g }| j	D ]}d|
dd | | j|}|tj|| q| jtj|| | j| qqd S )Nrc   ZgtFineZgtCoarseZleftImg8bitrg   )rc   Zcoarse)rZ   testval)rZ   train_extrarn   zOUnknown value '{}' for argument split if mode is '{}'. Valid values are {{{}}}.rf   c                 S   s   g | ]}t |d dqS )rh   )rd   semanticpolygonr   )r   ).0value rt   e/home/www/facesmatcher.com/frenv_anti/lib/python3.10/site-packages/torchvision/datasets/cityscapes.py
<listcomp>   s    
z'Cityscapes.__init__.<locals>.<listcomp>ro   zleftImg8bit_trainextra.zipzleftImg8bit_trainvaltest.zipz_trainvaltest.zipz.zip)	from_pathZto_pathzDataset not found or incomplete. Please make sure all required folders for the specified "split" and "mode" are inside the "root" directoryz{}_{}Z_leftImg8bitr   )super__init__rg   ospathjoinre   Z
images_dirZtargets_dirrh   rf   imagestargetsr   formatr   
isinstancelistisdirisfiler
   RuntimeErrorlistdir_get_target_suffixappend)selfre   rf   rg   rh   ri   rj   rk   Zvalid_modesmsgZimage_dir_zipZtarget_dir_zipZcityZimg_dir
target_dir	file_nameZtarget_typesttarget_name	__class__rt   ru   ry   i   s`   




zCityscapes.__init__indexc                 C   s   t | j| d}g }t| jD ]"\}}|dkr%| | j| | }n
t | j| | }|| qt	|dkr?t
|n|d }| jdurP| ||\}}||fS )a.  
        Args:
            index (int): Index
        Returns:
            tuple: (image, target) where target is a tuple of all target types if target_type is a list with more
            than one item. Otherwise, target is a json object if target_type="polygon", else the image segmentation.
        RGBrq   r	   r   N)r   openr}   convert	enumeraterh   
_load_jsonr~   r   lentuplerk   )r   r   imager~   ir   targetrt   rt   ru   __getitem__   s   	
zCityscapes.__getitem__c                 C   s
   t | jS N)r   r}   )r   rt   rt   ru   __len__   s   
zCityscapes.__len__c                 C   s    g d}d |jdi | jS )N)zSplit: {split}zMode: {mode}zType: {target_type}
rt   )r|   r   __dict__)r   linesrt   rt   ru   
extra_repr   s   zCityscapes.extra_reprr{   c                 C   s8   t |}t|}W d    |S 1 sw   Y  |S r   )r   jsonload)r   r{   filedatart   rt   ru   r      s   

zCityscapes._load_jsonc                 C   s@   |dkr	| dS |dkr| dS |dkr| dS | dS )Nrd   z_instanceIds.pngrp   z_labelIds.pngr   z
_color.pngz_polygons.jsonrt   )r   rg   rh   rt   rt   ru   r      s   



zCityscapes._get_target_suffix)rZ   rc   rd   NNN)__name__
__module____qualname____doc__r   r   classesr   strr   r   r   r   ry   intr   r   r   r   r   dictr   r   __classcell__rt   rt   r   ru   r      s    0	
 !"#)
	Fr   )r   rz   collectionsr   pathlibr   typingr   r   r   r   ZPILr   utilsr
   r   r   Zvisionr   r   rt   rt   rt   ru   <module>   s    