o
    Vhm(                     @   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
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DictListOptionalTuple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idtrain_idcategorycategory_idhas_instancesignore_in_evalcolor	unlabeledr      voidFT)r   r   r   zego vehicler   zrectification border   z
out of roi   static   dynamic   )o   J   r   ground   )Q   r   r(   road   flat)   @   r,   sidewalk   )   #      parking	   )         z
rail track
   )         building   construction)F   r?   r?   wall   )f   rB      fence   )      rG   z
guard rail   )      rI   bridge   )r:   d   rM   tunnel   )r:   x   Z   pole   object)rG   rG   rG   	polegroup   ztraffic light   )r5   r6      ztraffic sign   )   rZ   r   
vegetation   nature)k      r1   terrain   )      rb   sky   )r?      rI   person   human)rZ   rY   <   rider   )r   r   r   car   vehicle)r   r   r_   truck   )r   r   r?   bus   )r   rj   rM   caravan   )r   r   rQ   trailerrX   )r   r   n   train   )r   P   rM   
motorcycle    )r   r   r9   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 )Nr   gtFinegtCoarseleftImg8bitr   )r   coarse)rx   testval)rx   train_extrar   zOUnknown value '{}' for argument split if mode is '{}'. Valid values are {{{}}}.r   c                 S   s   g | ]}t |d dqS )r   )r   semanticpolygonr   )r   ).0value r   S/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/datasets/cityscapes.py
<listcomp>   s    
z'Cityscapes.__init__.<locals>.<listcomp>r   zleftImg8bit_trainextra.zipzleftImg8bit_trainvaltest.zipz_trainvaltest.zipz.zip)	from_pathto_pathzDataset not found or incomplete. Please make sure all required folders for the specified "split" and "mode" are inside the "root" directoryz{}_{}_leftImg8bitr   )super__init__r   ospathjoinr   
images_dirtargets_dirr   r   imagestargetsr   formatr   
isinstancelistisdirisfiler   RuntimeErrorlistdir_get_target_suffixappend)selfr   r   r   r   r   r   r   valid_modesmsgimage_dir_ziptarget_dir_zipcityimg_dir
target_dir	file_nametarget_typesttarget_name	__class__r   r   r   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.
        RGBr   r   r   N)r   openr   convert	enumerater   
_load_jsonr   r   lentupler   )r   r   imager   ir   targetr   r   r   __getitem__   s   	
zCityscapes.__getitem__c                 C   s
   t | jS N)r   r   )r   r   r   r   __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}
r   )r   r   __dict__)r   linesr   r   r   
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datar   r   r   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 )Nr   z_instanceIds.pngr   z_labelIds.pngr   z
_color.pngz_polygons.jsonr   )r   r   r   r   r   r   r      s   



zCityscapes._get_target_suffix)rx   r   r   NNN)__name__
__module____qualname____doc__r   r   classesr
   strr   r   r   r   r   intr	   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      s    0	
 !"#)
	Fr   )r   r   collectionsr   pathlibr   typingr   r   r   r   r   r	   r
   PILr   utilsr   r   r   visionr   r   r   r   r   r   <module>   s    $