a
    «º”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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ƒg#Zd…eee	f eeee
e ef ee ee ee dsdtœ‡ fdudv„Zeeeef dwœdxdy„Zedzœd{d|„Zedzœd}d~„Zeeeef dœd€d„Zeeed‚œdƒd„„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é   )éô   é#   éè   Zparkingé	   )éú   éª   é    z
rail tracké
   )éæ   é–   éŒ   Zbuildingé   Zconstruction)éF   r.   r.   Zwallé   )éf   r0   éœ   Zfenceé   )é¾   é™   r4   z
guard railé   )é´   é¥   r6   Zbridgeé   )r+   éd   r9   Ztunnelé   )r+   éx   éZ   Zpoleé   Úobject)r4   r4   r4   Z	polegroupé   ztraffic lighté   )r&   r'   é   ztraffic signé   )éÜ   rC   r   Z
vegetationé   Znature)ék   éŽ   r#   Zterrainé   )é˜   éû   rH   Zskyé   )r.   é‚   r6   Zpersoné   Zhuman)rC   rB   é<   Zrideré   )r   r   r   Zcaré   Zvehicle)r   r   rF   Ztrucké   )r   r   r.   Zbusé   )r   rM   r9   Zcaravané   )r   r   r<   ÚtrailerrA   )r   r   én   Útrainé   )r   éP   r9   Z
motorcycleé    )r   r   r*   Zbicycleé!   )éw   r-   rX   zlicense plateéÿÿÿÿÚfineÚinstanceN)ÚrootÚsplitÚmodeÚtarget_typeÚ	transformÚtarget_transformÚ
transformsÚreturnc              
      sR  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¡rètj | j¡s |dkrtj | jd¡}
ntj | jd¡}
| jdkr:tj | j| j› d¡}n$| jdkr^tj | j| j› d¡}tj |
¡r˜tj |¡r˜t|
| jd t|| jd ntdƒ‚t | j¡D ] }tj | j|¡}tj | j|¡}t |¡D ]n}g }| j	D ]:}d | 
d¡d |  | j|¡¡}| tj ||¡¡ qè| j tj ||¡¡ | j |¡ qÚq¬d S )Nr\   ZgtFineZgtCoarseZleftImg8bitr`   )r\   Zcoarse)rU   ÚtestÚval)rU   Útrain_extrarg   zOUnknown value '{}' for argument split if mode is '{}'. Valid values are {{{}}}.r_   c                 S   s   g | ]}t |d dƒ‘qS )ra   )r]   ÚsemanticÚpolygonr   )r   )Ú.0Úvalue© rm   úM/var/www/auris/lib/python3.9/site-packages/torchvision/datasets/cityscapes.pyÚ
<listcomp>‡   s   ÿz'Cityscapes.__init__.<locals>.<listcomp>rh   zleftImg8bit_trainextra.zipzleftImg8bit_trainvaltest.zipz_trainvaltest.zipz.zip)Ú	from_pathZto_pathz‹Dataset 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__r`   ÚosÚpathÚjoinr^   Z
images_dirZtargets_dirra   r_   ÚimagesÚtargetsr   Úformatr   Ú
isinstanceÚlistÚisdirÚisfiler
   ÚRuntimeErrorÚlistdirÚ_get_target_suffixÚappend)Úselfr^   r_   r`   ra   rb   rc   rd   Zvalid_modesÚmsgZimage_dir_zipZtarget_dir_zipZcityZimg_dirÚ
target_dirÚ	file_nameZtarget_typesÚtZtarget_name©Ú	__class__rm   rn   rr   i   s\    

þ
ÿ
ÿzCityscapes.__init__)Úindexre   c                 C   s¨   t  | j| ¡ d¡}g }t| jƒD ]D\}}|dkrJ|  | j| | ¡}nt  | j| | ¡}| |¡ q$t	|ƒdkr~t
|ƒn|d }| jdur |  ||¡\}}||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.
        ZRGBrj   r	   r   N)r   Úopenrv   ÚconvertÚ	enumeratera   Ú
_load_jsonrw   r€   ÚlenÚtuplerd   )r   rˆ   Úimagerw   Úir…   Útargetrm   rm   rn   Ú__getitem__¯   s    	
zCityscapes.__getitem__)re   c                 C   s
   t | jƒS ©N)r   rv   )r   rm   rm   rn   Ú__len__Ê   s    zCityscapes.__len__c                 C   s    g d¢}d  |¡jf i | j¤ŽS )N)zSplit: {split}zMode: {mode}zType: {target_type}Ú
)ru   rx   Ú__dict__)r   Úlinesrm   rm   rn   Ú
extra_reprÍ   s    zCityscapes.extra_repr)rt   re   c                 C   s6   t |ƒ}t |¡}W d   ƒ n1 s(0    Y  |S r“   )r‰   ÚjsonÚload)r   rt   ÚfileÚdatarm   rm   rn   rŒ   Ñ   s    
(zCityscapes._load_json)r`   ra   re   c                 C   sD   |dkr|› dS |dkr$|› dS |dkr6|› dS |› dS d S )Nr]   z_instanceIds.pngri   z_labelIds.pngr   z
_color.pngz_polygons.jsonrm   )r   r`   ra   rm   rm   rn   r   Ö   s    


zCityscapes._get_target_suffix)rU   r\   r]   NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úclassesr   Ústrr   rz   r   r   rr   ÚintrŽ   r   r’   r”   r˜   ÚdictrŒ   r   Ú__classcell__rm   rm   r†   rn   r      s|   0þÝ)      ø
÷Fr   )r™   rs   Úcollectionsr   Úpathlibr   Útypingr   r   r   r   ZPILr   Úutilsr
   r   r   Zvisionr   r   rm   rm   rm   rn   Ú<module>   s   