U
    (d{'                     @   s   d dl Z d dl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)AnyCallableDictListOptionalUnionTuple)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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 )INaturalistaF  `iNaturalist <https://github.com/visipedia/inat_comp>`_ Dataset.

    Args:
        root (string): 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 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.
        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"   D/tmp/pip-unpacked-wheel-vx7f76es/torchvision/datasets/inaturalist.py
<listcomp>a   s     z(INaturalist.__init__.<locals>.<listcomp>c                 S   s   g | ]}t |d dqS )r   )r   super)r   r   r"   r"   r#   r$   d   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(   B   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>u   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)   r8   r   r/   r   r0   r7   splitlenr.   zipr1   r9   )r:   r;   r<   piecesZcat_mapcatnamecat_idr"   r"   r#   r4   o   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)r0   rF   r)   r8   r   r7   r*   r+   r   int
ValueErrorr.   rH   r1   extendr/   )r:   Z	cat_indexZsuper_categoriesZsindexZscatZsubcategoriesZsubcatZsubcat_iZold_lenZcindexcr"   r"   r#   r5      s2    



zINaturalist._init_pre2021)r6   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)r6   r	   openr)   r*   r+   r   r/   r   r9   r1   rH   tupler   r   )r:   r6   rM   r>   imgtargetr!   r"   r"   r#   __getitem__   s    	




zINaturalist.__getitem__c                 C   s
   t | jS )N)rH   r6   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)r/   r0   rP   items)r:   rZ   r[   rL   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   rH   r8   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__strr   r   r   r   boolr(   r4   r5   rO   r   r   rW   rY   r_   r-   r   __classcell__r"   r"   r?   r#   r      s,   %     -#r   )r)   os.pathtypingr   r   r   r   r   r   r   ZPILr	   utilsr   r   Zvisionr   r   r&   rd   r   r"   r"   r"   r#   <module>   s*   $

