a
    h+                     @   s   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	 d dl
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)path)Path)AnyCallablecastOptionalUnion)urljoin   )default_loader)check_integritydownload_and_extract_archiveverify_str_arg)VisionDatasetc                
       s  e Zd ZdZdZdZdddZdZdd	d
ddZdddddddddZ	ddddde
feeef eeeee ee eegef dd fddZeeeef dddZeddd Zeedd!d"Zeedd#d$Zd7eeee eeef f d&d'd(Zd8eeeeeeedf f  eeedf  f d&d)d*Zddd+d,Zddd-d.Zedd/d0Z eed1d2d3Z!eeeed4d5d6Z"  Z#S )9	Places365a  `Places365 <http://places2.csail.mit.edu/index.html>`_ classification dataset.

    Args:
        root (str or ``pathlib.Path``): Root directory of the Places365 dataset.
        split (string, optional): The dataset split. Can be one of ``train-standard`` (default), ``train-challenge``,
            ``val``, ``test``.
        small (bool, optional): If ``True``, uses the small images, i.e. resized to 256 x 256 pixels, instead of the
            high resolution ones.
        download (bool, optional): If ``True``, downloads the dataset components and places them in ``root``. Already
            downloaded archives are not downloaded again.
        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.
        loader (callable, optional): A function to load an image given its path.

     Attributes:
        classes (list): List of the class names.
        class_to_idx (dict): Dict with items (class_name, class_index).
        imgs (list): List of (image path, class_index) tuples
        targets (list): The class_index value for each image in the dataset

    Raises:
        RuntimeError: If ``download is False`` and the meta files, i.e. the devkit, are not present or corrupted.
        RuntimeError: If ``download is True`` and the image archive is already extracted.
    )train-standardtrain-challengevaltestz+http://data.csail.mit.edu/places/places365/)zfilelist_places365-standard.tarZ 35a0585fee1fa656440f3ab298f8479c)z filelist_places365-challenge.tarZ 70a8307e459c3de41690a7c76c931734)standard	challenge)zcategories_places365.txtZ 06c963b85866bd0649f97cb43dd16673)zplaces365_train_standard.txtZ 30f37515461640559006b8329efbed1a)zplaces365_train_challenge.txtZ b2931dc997b8c33c27e7329c073a6b57)zplaces365_val.txtZ e9f2fd57bfd9d07630173f4e8708e4b1)zplaces365_test.txtZ 2fce8233fe493576d724142e45d93653)z!train_large_places365standard.tarZ 67e186b496a84c929568076ed01a8aa1)z"train_large_places365challenge.tarZ 605f18e68e510c82b958664ea134545f)zval_large.tarZ 9b71c4993ad89d2d8bcbdc4aef38042f)ztest_large.tarZ 41a4b6b724b1d2cd862fb3871ed59913)ztrain_256_places365standard.tarZ 53ca1c756c3d1e7809517cc47c5561c5)z train_256_places365challenge.tarZ 741915038a5e3471ec7332404dfb64ef)zval_256.tarZ e27b17d8d44f4af9a78502beb927f808)ztest_256.tarZ f532f6ad7b582262a2ec8009075e186b))r   F)r   F)r   F)r   F)r   T)r   T)r   T)r   Tr   FN)rootsplitsmalldownload	transformtarget_transformloaderreturnc                    s^   t  j|||d | || _|| _|| _| |\| _| _| 	|\| _
| _|rZ|   d S )N)r   r   )super__init___verify_splitr   r   r   load_categoriesclassesclass_to_idxload_file_listimgstargetsdownload_images)selfr   r   r   r   r   r   r   	__class__ L/var/www/auris/lib/python3.9/site-packages/torchvision/datasets/places365.pyr    D   s    
zPlaces365.__init__)indexr   c                 C   s:   | j | \}}| |}| jd ur2| ||\}}||fS N)r&   r   Z
transforms)r)   r.   filetargetimager,   r,   r-   __getitem__Z   s
    

zPlaces365.__getitem__)r   c                 C   s
   t | jS r/   )lenr&   r)   r,   r,   r-   __len__c   s    zPlaces365.__len__c                 C   s   d| j v rdS dS )Nr   r   )r   r5   r,   r,   r-   variantf   s    zPlaces365.variantc                 C   sL   | j r
dnd}| jdr.d| d| j }n| j d| }t| j|S )NZ256ZlargetrainZdata__)r   r   
startswithr7   r   joinr   )r)   sizedirr,   r,   r-   
images_dirj   s
    zPlaces365.images_dirT)r   r   c                    s   t tt tf ddd | j\}}t| j|}| |||sF|   t	|&}t
 fdd|D }W d    n1 sz0    Y  t| |fS )Nliner   c                 S   s   |   \}}|t|fS r/   )r   int)r@   clsidxr,   r,   r-   processt   s    z*Places365.load_categories.<locals>.processc                 3   s   | ]} |V  qd S r/   r,   .0r@   rD   r,   r-   	<genexpr>~       z,Places365.load_categories.<locals>.<genexpr>)strtuplerA   _CATEGORIES_METAr   r;   r   _check_integritydownload_devkitopendictsortedkeys)r)   r   r0   md5fhr$   r,   rG   r-   r"   s   s    

4zPlaces365.load_categoriesc                    s   dt tt ttd f f dfdd jj \}}tj|}	|||sZ
  t|"} fdd|D }W d    n1 s0    Y  t| \}}|t|fS )N/r?   c                    sZ   |   d g d d \}}tt|}|d ur4t|nd }t j|||t	j
|fS )N   )r   r   rJ   rA   r   r;   r>   lstripreplaceossep)r@   rZ   r2   rC   r5   r,   r-   rD      s    
z)Places365.load_file_list.<locals>.processc                    s   g | ]} |qS r,   r,   rE   rG   r,   r-   
<listcomp>   rI   z,Places365.load_file_list.<locals>.<listcomp>)rU   )rJ   rK   r   rA   _FILE_LIST_METAr   r   r;   r   rM   rN   rO   ziplist)r)   r   r0   rS   rT   Zimagesr9   r'   r,   )rD   r)   r-   r%      s    &
0zPlaces365.load_file_listc                 C   s,   | j | j \}}tt| j|| j|d d S )NrS   )_DEVKIT_METAr7   r   r	   	_BASE_URLr   r)   r0   rS   r,   r,   r-   rN      s    zPlaces365.download_devkitc                 C   sj   t | jrd S | j| j| jf \}}tt| j|| j	|d | j
drft| jddd | j d S )Nr_   r8   r9   r
   r   )r   existsr>   _IMAGES_METAr   r   r   r	   ra   r   r:   rY   renamersplitrb   r,   r,   r-   r(      s    zPlaces365.download_imagesc                 C   s   d djf i | jS )N
)zSplit: {split}zSmall: {small})r;   format__dict__r5   r,   r,   r-   
extra_repr   s    zPlaces365.extra_repr)r   r   c                 C   s   t |d| jS )Nr   )r   _SPLITS)r)   r   r,   r,   r-   r!      s    zPlaces365._verify_split)r0   rS   r   r   c                 C   s(   t ||d}|s$|s$td| d|S )Nr_   z	The file zJ does not exist or is corrupted. You can set download=True to download it.)r   RuntimeError)r)   r0   rS   r   Z	integrityr,   r,   r-   rM      s    
zPlaces365._check_integrity)T)T)$__name__
__module____qualname____doc__rk   ra   r`   rL   r\   rd   r   r   rJ   r   boolr   r   r   r    rA   rK   r3   r6   propertyr7   r>   r^   rP   r"   r%   rN   r(   rj   r!   rM   __classcell__r,   r,   r*   r-   r      sl   
	& *
r   )rY   r   pathlibr   typingr   r   r   r   r   urllib.parser	   folderr   utilsr   r   r   Zvisionr   r   r,   r,   r,   r-   <module>   s   