U
    ­Ê¹j  ã                   @   s€   d dl Z d dl mZ d dlmZ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)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)Úurljoiné   )Údefault_loader)Úcheck_integrityÚdownload_and_extract_archiveÚverify_str_arg)ÚVisionDatasetc                
       sp  e Zd ZdZdZdZdddœZdZdd	d
dœZdddddddœZ	ddddde
fe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d4eeee eeef f d#œd$d%„Zd5eeeeeef  ee f d#œd&d'„Zddœd(d)„Zddœd*d+„Zedœd,d-„Zeed.œd/d0„Zeeeed1œd2d3„Z ‡  Z!S )6Ú	Places365aÒ  `Places365 <http://places2.csail.mit.edu/index.html>`_ classification dataset.

    Args:
        root (string): Root directory of the Places365 dataset.
        split (string, optional): The dataset split. Can be one of ``train-standard`` (default), ``train-challenge``,
            ``val``.
        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 an 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Úvalz+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!train_large_places365standard.tarZ 67e186b496a84c929568076ed01a8aa1)z"train_large_places365challenge.tarZ 605f18e68e510c82b958664ea134545f)zval_large.tarZ 9b71c4993ad89d2d8bcbdc4aef38042f)ztrain_256_places365standard.tarZ 53ca1c756c3d1e7809517cc47c5561c5)z train_256_places365challenge.tarZ 741915038a5e3471ec7332404dfb64ef)zval_256.tarZ e27b17d8d44f4af9a78502beb927f808))r   F)r   F)r   F)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__© ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/datasets/places365.pyr   ?   s    
zPlaces365.__init__)Úindexr   c                 C   s:   | j | \}}|  |¡}| jd k	r2|  ||¡\}}||fS ©N)r%   r   Z
transforms)r(   r-   ÚfileÚtargetÚimager+   r+   r,   Ú__getitem__U   s
    

zPlaces365.__getitem__)r   c                 C   s
   t | jƒS r.   )Úlenr%   ©r(   r+   r+   r,   Ú__len__^   s    zPlaces365.__len__c                 C   s   d| j krdS dS )Nr   r   )r   r4   r+   r+   r,   Úvarianta   s    zPlaces365.variantc                 C   sL   | j r
dnd}| j d¡r.d|› d| j› �}n| j› d|› �}t | j|¡S )NÚ256ZlargeÚtrainZdata_Ú_)r   r   Ú
startswithr6   r   Újoinr   )r(   ÚsizeÚdirr+   r+   r,   Ú
images_dire   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 5 Q R X t| ¡ ƒ|fS )N©Úliner   c                 S   s   |   ¡ \}}|t|ƒfS r.   )r   Úint)r@   ÚclsÚidxr+   r+   r,   Úprocesso   s    z*Places365.load_categories.<locals>.processc                 3   s   | ]}ˆ |ƒV  qd S r.   r+   ©Ú.0r@   ©rD   r+   r,   Ú	<genexpr>y   s     z,Places365.load_categories.<locals>.<genexpr>)Ústrr   rA   Ú_CATEGORIES_METAr   r;   r   Ú_check_integrityÚdownload_devkitÚopenÚdictÚsortedÚkeys)r(   r   r/   Úmd5Úfhr#   r+   rG   r,   r!   n   s    

 zPlaces365.load_categoriesc              	      s�   dt tt tf dœ‡fdd„‰ ˆjˆj \}}t ˆj|¡}ˆ |||¡sRˆ 	¡  t
|ƒ�}‡ fdd„|D ƒ}W 5 Q R X t|Ž \}}|t|ƒfS )Nú/r?   c                    s2   |   ¡ \}}t ˆ j| |¡ |tj¡¡t|ƒfS r.   )	r   r   r;   r>   ÚlstripÚreplaceÚosÚseprA   )r@   rW   r1   rC   r4   r+   r,   rD   ~   s    z)Places365.load_file_list.<locals>.processc                    s   g | ]}ˆ |ƒ‘qS r+   r+   rE   rG   r+   r,   Ú
<listcomp>ˆ   s     z,Places365.load_file_list.<locals>.<listcomp>)rS   )rI   r   rA   Ú_FILE_LIST_METAr   r   r;   r   rK   rL   rM   ÚzipÚlist)r(   r   r/   rQ   rR   Zimagesr9   r&   r+   )rD   r(   r,   r$   }   s    
zPlaces365.load_file_listc                 C   s,   | j | j \}}tt| j|ƒ| j|d� d S )N©rQ   )Ú_DEVKIT_METAr6   r   r	   Ú	_BASE_URLr   ©r(   r/   rQ   r+   r+   r,   rL   �   s    zPlaces365.download_devkitc                 C   sx   t  | j¡rtd| j› d�ƒ‚| j| j| jf \}}tt| j	|ƒ| j
|d� | j d¡rtt | j dd¡d | j¡ d S )NzThe directory z[ already exists. If you want to re-download or re-extract the images, delete the directory.r\   r8   r9   r
   r   )r   Úexistsr>   ÚRuntimeErrorÚ_IMAGES_METAr   r   r   r	   r^   r   r:   rV   ÚrenameÚrsplitr_   r+   r+   r,   r'   ‘   s    ÿzPlaces365.download_imagesc                 C   s   d  d¡jf | jŽS )NÚ
)zSplit: {split}zSmall: {small})r;   ÚformatÚ__dict__r4   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)r/   rQ   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   ra   )r(   r/   rQ   r   Z	integrityr+   r+   r,   rK   ¤   s    
ÿzPlaces365._check_integrity)T)T)"Ú__name__Ú
__module__Ú__qualname__Ú__doc__ri   r^   r]   rJ   rY   rb   r   rI   Úboolr   r   r   r   rA   r   r2   r5   Úpropertyr6   r>   r   r   r!   r$   rL   r'   rh   r    rK   Ú__classcell__r+   r+   r)   r,   r      s^   þýúø÷	&*r   )rV   r   Útypingr   r   r   r   r   r   Úurllib.parser	   Úfolderr   Úutilsr   r   r   Zvisionr   r   r+   r+   r+   r,   Ú<module>   s    