a
    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 d dl	m
Z
 ddlmZmZ ddlmZ g d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OptionalUnion)Image   )download_and_extract_archiveverify_str_arg)VisionDataset)Z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
ee	eeef gef  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 )INaturalistaX  `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.
        loader (callable, optional): A function to load an image given its path.
            By default, it uses PIL as its image loader, but users could also pass in
            ``torchvision.io.decode_image`` for decoding image data into tensors directly.
    r   fullNF)rootversiontarget_type	transformtarget_transformdownloadloader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 qq|| _d 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gtR qS )r   r   )r
   CATEGORIES_2021.0t r!   N/var/www/auris/lib/python3.9/site-packages/torchvision/datasets/inaturalist.py
<listcomp>f       z(INaturalist.__init__.<locals>.<listcomp>c                 S   s   g | ]}t |d dqS )r   )r   super)r
   r   r!   r!   r"   r#   i   r$   )r
   DATASET_URLSkeysr   r%   __init__ospathjoinmakedirsr   _check_existsRuntimeErrorall_categoriescategories_indexcategories_map
isinstancelistr   
_init_2021_init_pre2021index	enumeratelistdirr   appendr   )selfr   r   r   r   r   r   r   	dir_indexdir_namefilesfname	__class__r!   r"   r(   F   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| v 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>|   r$   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   v   s     

zINaturalist._init_2021c              
   C   s`  di i| _ d}tt| j}t|D ]\}}|| j d |< tttj| j|}|D ]}| jdkrx|}|d7 }n.zt	|}W n  t
y   td| Y n0 |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j| j| j| |}| jdur:| |nt|}g }| j	D ],}|dkrf|
| qN|
| j| |  qNt|dkrt|n|d }| jdur| |}| jdur| |}||fS )z
        Args:
            index (int): Index

        Returns:
            tuple: (image, target) where the type of target specified by target_type.
        Nr   r   r   )r6   r)   r*   r+   r   r/   r   r   openr   r9   r1   rH   tupler   r   )r:   r6   rM   r>   Z
image_path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v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_existsc                 C   s   |   rd S tj| j}tt| j || j dt| j d tj	|tj
t| j d}tj|sztd| t|| j d S )Nz.tgz)filenamemd5z.tar.gzz#Unable to find downloaded files at )r-   r)   r*   dirnamer   r	   r&   r   DATASET_MD5r+   basenamerstripr`   r.   rename)r:   Z	base_rootZorig_dir_namer!   r!   r"   r      s    "zINaturalist.download)r   r   NNFN)__name__
__module____qualname____doc__r   strr   r3   r   r   boolr   r(   r4   r5   rO   rT   rW   rY   r_   r-   r   __classcell__r!   r!   r?   r"   r       s0   (      
0#r   )r)   os.pathpathlibr   typingr   r   r   r   ZPILr   utilsr	   r
   Zvisionr   r   r&   rd   r   r!   r!   r!   r"   <module>   s,   

