o
    V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	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DictListOptionalTuple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deeef dedededee dee deegef ddf fd d!Zd"edeeef fd#d$Zdefd%d&Zedefd'd(Zedefd)d*Zd<dedeee eeef f fd,d-Z	+d<dedeeeeeedf f  eeedf  f fd.d/Zd=d0d1Zd=d2d3Zdefd4d5Z dedefd6d7Z!d8ed9ededefd:d;Z"  Z#S )>	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.tar 35a0585fee1fa656440f3ab298f8479c)z filelist_places365-challenge.tar 70a8307e459c3de41690a7c76c931734)standard	challenge)zcategories_places365.txt 06c963b85866bd0649f97cb43dd16673)zplaces365_train_standard.txt 30f37515461640559006b8329efbed1a)zplaces365_train_challenge.txt b2931dc997b8c33c27e7329c073a6b57)zplaces365_val.txt e9f2fd57bfd9d07630173f4e8708e4b1)zplaces365_test.txt 2fce8233fe493576d724142e45d93653)z!train_large_places365standard.tar 67e186b496a84c929568076ed01a8aa1)z"train_large_places365challenge.tar 605f18e68e510c82b958664ea134545f)zval_large.tar 9b71c4993ad89d2d8bcbdc4aef38042f)ztest_large.tar 41a4b6b724b1d2cd862fb3871ed59913)ztrain_256_places365standard.tar 53ca1c756c3d1e7809517cc47c5561c5)z train_256_places365challenge.tar 741915038a5e3471ec7332404dfb64ef)zval_256.tar e27b17d8d44f4af9a78502beb927f808)ztest_256.tar 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                    sb   t  j|||d | || _|| _|| _| |\| _| _| 	|\| _
| _|r/|   d S 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__ R/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/datasets/places365.pyr2   D   s   
zPlaces365.__init__indexc                 C   s:   | j | \}}| |}| jd ur| ||\}}||fS N)r8   r/   
transforms)r;   r@   filetargetimager>   r>   r?   __getitem__Z   s
   

zPlaces365.__getitem__c                 C   s
   t | jS rA   )lenr8   r;   r>   r>   r?   __len__c   s   
zPlaces365.__len__c                 C   s   d| j v rdS dS )Nr   r   )r*   rH   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 )N256largetraindata__)r+   r*   
startswithrJ   r   joinr)   )r;   sizedirr>   r>   r?   
images_dirj   s
   zPlaces365.images_dirTc                    s   dt dtt tf fdd | j\}}t| j|}| |||s$|   t	|}t
 fdd|D }W d    n1 s>w   Y  t| |fS )Nliner0   c                 S   s   |   \}}|t|fS rA   )r*   int)rU   clsidxr>   r>   r?   processt   s   z*Places365.load_categories.<locals>.processc                 3   s    | ]} |V  qd S rA   r>   .0rU   rY   r>   r?   	<genexpr>~   s    z,Places365.load_categories.<locals>.<genexpr>)strr
   rV   _CATEGORIES_METAr   rQ   r)   _check_integritydownload_devkitopendictsortedkeys)r;   r,   rC   md5fhr6   r>   r\   r?   r4   s   s   

zPlaces365.load_categoriesc              	      s   ddt dtt ttd f f ffdd jj \}}tj|}	|||s.
  t|} fdd|D }W d    n1 sFw   Y  t| \}}|t|fS )	N/rU   r0   c                    sZ   |   d g d d \}}tt|}|d urt|nd }t j|||t	j
|fS )N   )r*   r   r^   rV   r   rQ   rT   lstripreplaceossep)rU   rm   rE   rX   rH   r>   r?   rY      s   
"z)Places365.load_file_list.<locals>.processc                    s   g | ]} |qS r>   r>   rZ   r\   r>   r?   
<listcomp>   s    z,Places365.load_file_list.<locals>.<listcomp>)rh   )r^   r
   r   rV   _FILE_LIST_METAr*   r   rQ   r)   r`   ra   rb   ziplist)r;   r,   rC   rf   rg   imagesrO   r9   r>   )rY   r;   r?   r7      s   (
zPlaces365.load_file_listc                 C   s,   | j | j \}}tt| j|| j|d d S )Nrf   )_DEVKIT_METArJ   r   r   	_BASE_URLr)   r;   rC   rf   r>   r>   r?   ra      s   zPlaces365.download_devkitc                 C   sn   t | jrd S | j| j| jf \}}tt| j|| j	|d | j
dr5t| jddd | j d S d S )Nrs   rM   rO   r   r   )r   existsrT   _IMAGES_METAr*   r+   r   r   ru   r)   rP   rl   renamersplitrv   r>   r>   r?   r:      s    zPlaces365.download_imagesc                 C   s   d djdi | jS )N
)zSplit: {split}zSmall: {small}r>   )rQ   format__dict__rH   r>   r>   r?   
extra_repr   s   zPlaces365.extra_reprc                 C   s   t |d| jS )Nr*   )r   _SPLITS)r;   r*   r>   r>   r?   r3      s   zPlaces365._verify_splitrC   rf   c                 C   s(   t ||d}|s|std| d|S )Nrs   z	The file zJ does not exist or is corrupted. You can set download=True to download it.)r   RuntimeError)r;   rC   rf   r,   	integrityr>   r>   r?   r`      s   
zPlaces365._check_integrity)T)r0   N)$__name__
__module____qualname____doc__r   ru   rt   r_   ro   rx   r   r   r^   r   boolr	   r   r   r2   rV   r
   rF   rI   propertyrJ   rT   r   r   r4   r7   ra   r:   r~   r3   r`   __classcell__r>   r>   r<   r?   r      s~    
		(*



"r   )rl   r   pathlibr   typingr   r   r   r   r   r	   r
   r   urllib.parser   folderr   utilsr   r   r   visionr   r   r>   r>   r>   r?   <module>   s    (