U
    h'                     @   s   d dl Z d dl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 ddlmZ dd	d
dddgZdddddddZdddddddZG dd deZdS )    N)Path)AnyCallableDictListOptionalTupleUnion)Image   )download_and_extract_archiveverify_str_arg)VisionDatasetZkingdomZphylumclassorderfamilyZgenuszRhttps://ml-inat-competition-datasets.s3.amazonaws.com/2017/train_val_images.tar.gzzOhttps://ml-inat-competition-datasets.s3.amazonaws.com/2018/train_val2018.tar.gzzOhttps://ml-inat-competition-datasets.s3.amazonaws.com/2019/train_val2019.tar.gzzGhttps://ml-inat-competition-datasets.s3.amazonaws.com/2021/train.tar.gzzLhttps://ml-inat-competition-datasets.s3.amazonaws.com/2021/train_mini.tar.gzzEhttps://ml-inat-competition-datasets.s3.amazonaws.com/2021/val.tar.gz)2017Z2018Z2019
2021_trainZ2021_train_miniZ
2021_validZ 7c784ea5e424efaec655bd392f87301fZ b1c6952ce38f31868cc50ea72d066cc3Z c60a6e2962c9b8ccbd458d12c8582644Z e0526d53c7f7b2e3167b2b43bb2690edZ db6ed8330e634445efc8fec83ae81442Z f6f6e0e242e3d4c9569ba56400938afcc                	       s   e Zd ZdZdeeef eeee ef ee	 ee	 e
dd fddZdd	d
dZdd	ddZeeeef dddZed	ddZeeedddZe
d	ddZdd	ddZ  ZS )INaturalistaV  `iNaturalist <https://github.com/visipedia/inat_comp>`_ Dataset.

    Args:
        root (str or ``pathlib.Path``): Root directory of dataset where the image files are stored.
            This class does not require/use annotation files.
        version (string, optional): Which version of the dataset to download/use. One of
            '2017', '2018', '2019', '2021_train', '2021_train_mini', '2021_valid'.
            Default: `2021_train`.
        target_type (string or list, optional): Type of target to use, for 2021 versions, one of:

            - ``full``: the full category (species)
            - ``kingdom``: e.g. "Animalia"
            - ``phylum``: e.g. "Arthropoda"
            - ``class``: e.g. "Insecta"
            - ``order``: e.g. "Coleoptera"
            - ``family``: e.g. "Cleridae"
            - ``genus``: e.g. "Trichodes"

            for 2017-2019 versions, one of:

            - ``full``: the full (numeric) category
            - ``super``: the super category, e.g. "Amphibians"

            Can also be a list to output a tuple with all specified target types.
            Defaults to ``full``.
        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.
        download (bool, optional): If true, downloads the dataset from the internet and
            puts it in root directory. If dataset is already downloaded, it is not
            downloaded again.
    r   fullNF)rootversiontarget_type	transformtarget_transformdownloadreturnc                    s  t |dt | _t jtj||||d tj	|dd |rH| 
  |  sXtdg | _i | _g | _t|tsz|g}| jd d dkrdd	 |D | _|   nd
d	 |D | _|   g | _t| jD ]8\}}ttj| j|}	|	D ]}
| j||
f qqd S )Nr   )r   r   T)exist_okzHDataset not found or corrupted. You can use download=True to download it   Z2021c                 S   s   g | ]}t |d dtqS )r   r   )r   )r   CATEGORIES_2021.0t r#   R/var/www/html/venv/lib/python3.8/site-packages/torchvision/datasets/inaturalist.py
<listcomp>b   s     z(INaturalist.__init__.<locals>.<listcomp>c                 S   s   g | ]}t |d dqS )r   )r   super)r   r    r#   r#   r$   r%   e   s     )r   DATASET_URLSkeysr   r&   __init__ospathjoinmakedirsr   _check_integrityRuntimeErrorall_categoriescategories_indexcategories_map
isinstancelistr   
_init_2021_init_pre2021index	enumeratelistdirr   append)selfr   r   r   r   r   r   	dir_indexdir_namefilesfname	__class__r#   r$   r)   C   s,    	

zINaturalist.__init__)r   c                 C   s   t t| j| _dd tD | _t| jD ]\}}|d}t	|dkrZt
d| d|d |dkrt
d	|d  d
|di }tt|dd D ]J\}}|| j| kr| j| | }nt	| j| }|| j| |< |||< q| j| q,dS )zInitialize based on 2021 layoutc                 S   s   i | ]
}|i qS r#   r#   )r!   kr#   r#   r$   
<dictcomp>v   s      z*INaturalist._init_2021.<locals>.<dictcomp>_   zUnexpected category name z, wrong number of piecesr   Z05dzUnexpected category id z, expecting r      N)sortedr*   r9   r   r0   r   r1   r8   splitlenr/   zipr2   r:   )r;   r<   r=   piecesZcat_mapcatnamecat_idr#   r#   r$   r5   p   s     

zINaturalist._init_2021c              
   C   sb  di i| _ d}tt| j}t|D ]
\}}|| j d |< tttj| j|}|D ]}| jdkrx|}|d7 }n0zt	|}W n" t
k
r   td| Y nX |t| jkrt| j}| ji g|| d   | jdg|| d   | j| rtd| d|i| j|< tj||| j|< q\q&t| jD ]\}	}
|
s>td|	 q>d	S )
z$Initialize based on 2017-2019 layoutr&   r   r   r   z!Unexpected non-numeric dir name:  zDuplicate category zMissing category N)r1   rG   r*   r9   r   r8   r+   r,   r   int
ValueErrorr/   rI   r2   extendr0   )r;   Z	cat_indexZsuper_categoriesZsindexZscatZsubcategoriesZsubcatZsubcat_iZold_lenZcindexcr#   r#   r$   r6      s2    



zINaturalist._init_pre2021)r7   r   c                 C   s   | j | \}}ttj| j| j| |}g }| jD ],}|dkrN|	| q6|	| j
| |  q6t|dkrxt|n|d }| jdk	r| |}| jdk	r| |}||fS )z
        Args:
            index (int): Index

        Returns:
            tuple: (image, target) where the type of target specified by target_type.
        r   r   r   N)r7   r
   openr*   r+   r,   r   r0   r   r:   r2   rI   tupler   r   )r;   r7   rN   r?   Zimgtargetr"   r#   r#   r$   __getitem__   s    	




zINaturalist.__getitem__c                 C   s
   t | jS )N)rI   r7   r;   r#   r#   r$   __len__   s    zINaturalist.__len__)category_typecategory_idr   c                 C   sn   |dkr| j | S || jkr.td| dn<| j|  D ]\}}||kr<|  S q<td| d| dS )a  
        Args:
            category_type(str): one of "full", "kingdom", "phylum", "class", "order", "family", "genus" or "super"
            category_id(int): an index (class id) from this category

        Returns:
            the name of the category
        r   zInvalid category type ''zInvalid category id z for N)r0   r1   rQ   items)r;   rZ   r[   rM   idr#   r#   r$   category_name   s    	


zINaturalist.category_namec                 C   s"   t j| jo tt | jdkS )Nr   )r*   r+   existsr   rI   r9   rX   r#   r#   r$   r.      s    zINaturalist._check_integrityc                 C   s   |   rtd| j dtj| j}tt| j || j dt	| j d tj
|tjt| j d}tj|std| t|| j td| j d d S )	NzThe directory z[ already exists. If you want to re-download or re-extract the images, delete the directory.z.tgz)filenamemd5z.tar.gzz#Unable to find downloaded files at zDataset version 'z*' has been downloaded and prepared for use)r.   r/   r   r*   r+   dirnamer   r'   r   DATASET_MD5r,   basenamerstripr`   renameprint)r;   Z	base_rootZorig_dir_namer#   r#   r$   r      s       
 "zINaturalist.download)r   r   NNF)__name__
__module____qualname____doc__r	   strr   r   r   r   boolr)   r5   r6   rP   r   r   rW   rY   r_   r.   r   __classcell__r#   r#   r@   r$   r       s,   %     
-#r   )r*   os.pathpathlibr   typingr   r   r   r   r   r   r	   ZPILr
   utilsr   r   Zvisionr   r   r'   rd   r   r#   r#   r#   r$   <module>   s,   $

