§
    ù²Åjƒ'  ã                   ó¶   — 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 g d¢Zd	d
dddddœZdddddddœZ G d„ de¦  «        ZdS )é    N)ÚPath)ÚAnyÚCallableÚDictÚListÚOptionalÚTupleÚUnion)ÚImageé   )Údownload_and_extract_archiveÚverify_str_arg)ÚVisionDataset)ÚkingdomÚphylumÚclassÚorderÚfamilyÚ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)Ú2017Ú2018Ú2019Ú
2021_trainÚ2021_train_miniÚ
2021_validÚ 7c784ea5e424efaec655bd392f87301fÚ b1c6952ce38f31868cc50ea72d066cc3Ú c60a6e2962c9b8ccbd458d12c8582644Ú e0526d53c7f7b2e3167b2b43bb2690edÚ db6ed8330e634445efc8fec83ae81442Ú f6f6e0e242e3d4c9569ba56400938afcc                   óô   ‡ — e Zd ZdZ	 	 	 	 	 ddeeef         dedeee         ef         d	ee	         d
ee	         de
ddfˆ fd„Zdd„Zdd„Zdedeeef         fd„Zdefd„Zdededefd„Zde
fd„Zdd„Zˆ x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                 óŒ  •— t          |dt                               ¦   «         ¦  «        | _        t	          ¦   «                              t          j                             ||¦  «        ||¬¦  «         t          j	        |d¬¦  «         |r|  
                    ¦   «          |                      ¦   «         st          d¦  «        ‚g | _        i | _        g | _        t!          |t"          ¦  «        s|g}| j        d d…         dk    r&d„ |D ¦   «         | _        |                      ¦   «          n%d	„ |D ¦   «         | _        |                      ¦   «          g | _        t-          | j        ¦  «        D ]]\  }}t          j        t          j                             | j        |¦  «        ¦  «        }	|	D ]}
| j                             ||
f¦  «         ŒŒ^d S )
Nr&   )r(   r)   T)Úexist_okzHDataset not found or corrupted. You can use download=True to download ité   Ú2021c                 óB   — g | ]}t          |d dgt          ¢R ¦  «        ‘ŒS )r'   r$   )r   ÚCATEGORIES_2021©Ú.0Úts     úQC:\Projects\Historical\venv\Lib\site-packages\torchvision/datasets/inaturalist.pyú
<listcomp>z(INaturalist.__init__.<locals>.<listcomp>b   s0   € ÐrÐrÐrÐab¥¨q°-À&ÐA[Í?ÐA[ÐA[Ñ \Ô \ÐrÐrÐró    c                 ó0   — g | ]}t          |d d¦  «        ‘ŒS )r'   )r$   Úsuper)r   r2   s     r5   r6   z(INaturalist.__init__.<locals>.<listcomp>e   s&   € ÐiÐiÐiÐXY¥¨q°-ÐARÑ SÔ SÐiÐiÐir7   )r   ÚDATASET_URLSÚkeysr&   r9   Ú__init__ÚosÚpathÚjoinÚmakedirsr*   Ú_check_existsÚ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__s              €r5   r<   zINaturalist.__init__C   sÅ  ø€ õ & g¨y½,×:KÒ:KÑ:MÔ:MÑNÔNˆŒå‰Œ×Ò�œŸš d¨GÑ4Ô4À	Ð\lÐÑmÔmÐmå
Œ�D 4Ð(Ñ(Ô(Ð(Øð 	Ø�MŠM‰OŒOˆOà×!Ò!Ñ#Ô#ð 	kÝÐiÑjÔjÐjà)+ˆÔð <>ˆÔð 57ˆÔå˜+¥tÑ,Ô,ð 	(Ø&˜-ˆKØŒ<˜˜˜Ô˜vÒ%Ð%ØrÐrÐfqÐrÑrÔrˆDÔØ�OŠOÑÔÐÐàiÐiÐ]hÐiÑiÔiˆDÔØ×ÒÑ Ô Ð ð -/ˆŒ
å#,¨TÔ-@Ñ#AÔ#Að 	6ð 	6ÑˆI�xÝ”J�rœwŸ|š|¨D¬I°xÑ@Ô@ÑAÔAˆEØð 6ð 6�Ø”
×!Ò! 9¨eÐ"4Ñ5Ô5Ð5Ð5ð6ð	6ð 	6r7   c                 ó¨  — t          t          j        | j        ¦  «        ¦  «        | _        d„ t
          D ¦   «         | _        t          | j        ¦  «        D ]û\  }}|                     d¦  «        }t          |¦  «        dk    rt          d|› d�¦  «        ‚|d         |d›k    rt          d|d         › d	|d›�¦  «        ‚i }t          t
          |d
d…         ¦  «        D ]W\  }}|| j        |         v r| j        |         |         }n*t          | j        |         ¦  «        }|| j        |         |<   |||<   ŒX| j                             |¦  «         ŒüdS )zInitialize based on 2021 layoutc                 ó   — i | ]}|i “ŒS © rV   )r3   Úks     r5   ú
<dictcomp>z*INaturalist._init_2021.<locals>.<dictcomp>v   s   € Ð @Ð @Ð @¨1  BÐ @Ð @Ð @r7   Ú_é   zUnexpected category name z, wrong number of piecesr   Ú05dzUnexpected category id z, expecting r   é   N)Úsortedr=   rL   r%   rC   r1   rD   rK   ÚsplitÚlenrB   ÚziprE   rM   )rN   rO   rP   ÚpiecesÚcat_mapÚcatÚnameÚcat_ids           r5   rH   zINaturalist._init_2021p   sw  € õ %¥R¤Z°´	Ñ%:Ô%:Ñ;Ô;ˆÔð !AÐ @µÐ @Ñ @Ô @ˆÔå#,¨TÔ-@Ñ#AÔ#Að 	0ð 	0ÑˆI�xØ—^’^ CÑ(Ô(ˆFÝ�6‰{Œ{˜aÒÐÝ"Ð#a¸xÐ#aÐ#aÐ#aÑbÔbÐbØ�aŒy˜yÐ.Ð.Ò.Ð.Ý"Ð#c¸VÀA¼YÐ#cÐ#cÐT]Ð#cÐ#cÐ#cÑdÔdÐdØˆGÝ ¥°&¸¸1¸´+Ñ>Ô>ð &ð &‘	��TØ˜4Ô0°Ô5Ð5Ð5Ø!Ô2°3Ô7¸Ô=�F�Få  Ô!6°sÔ!;Ñ<Ô<�FØ7=�DÔ)¨#Ô.¨tÑ4Ø%�˜‘�ØÔ×&Ò& wÑ/Ô/Ð/Ð/ð	0ð 	0r7   c           	      ó¾  — di i| _         d}t          t          j        | j        ¦  «        ¦  «        }t          |¦  «        D �]l\  }}|| j         d         |<   t          t          j        t          j                             | j        |¦  «        ¦  «        ¦  «        }|D �]}| j        dk    r|}|dz  }n1	 t          |¦  «        }n # t          $ r t          d|› �¦  «        ‚w xY w|t          | j        ¦  «        k    r\t          | j        ¦  «        }| j                             i g||z
  dz   z  ¦  «         | j                             dg||z
  dz   z  ¦  «         | j        |         rt          d|› �¦  «        ‚d|i| j        |<   t          j                             ||¦  «        | j        |<   �Œ�Œnt          | j        ¦  «        D ]\  }	}
|
st          d|	› �¦  «        ‚Œd	S )
z$Initialize based on 2017-2019 layoutr9   r   r   r   z!Unexpected non-numeric dir name: Ú zDuplicate category zMissing category N)rD   r]   r=   rL   r%   rK   r>   r?   r&   ÚintÚ
ValueErrorrB   r_   rE   ÚextendrC   )rN   Ú	cat_indexÚsuper_categoriesÚsindexÚscatÚsubcategoriesÚsubcatÚsubcat_iÚold_lenÚcindexÚcs              r5   rI   zINaturalist._init_pre2021ˆ   s)  € ð ")¨" ˆÔàˆ	Ý!¥"¤*¨T¬YÑ"7Ô"7Ñ8Ô8ÐÝ%Ð&6Ñ7Ô7ð 	Kñ 	K‰LˆF�DØ39ˆDÔ! 'Ô*¨4Ñ0Ý"¥2¤:­b¬g¯lªl¸4¼9ÀdÑ.KÔ.KÑ#LÔ#LÑMÔMˆMØ'ð Kñ K�Ø”< 6Ò)Ð)à(�HØ ‘N�I�IðYÝ#& v¡;¤;˜˜øÝ%ð Yð Yð YÝ*Ð+WÈvÐ+WÐ+WÑXÔXÐXðYøøøà�s 4Ô#6Ñ7Ô7Ò7Ð7Ý! $Ô"5Ñ6Ô6�GØÔ'×.Ò.°¨t°xÀ'Ñ7IÈAÑ7MÑ/NÑOÔOÐOØÔ'×.Ò.°¨t°xÀ'Ñ7IÈAÑ7MÑ/NÑOÔOÐOØÔ& xÔ0ð GÝ&Ð'E¸VÐ'EÐ'EÑFÔFÐFØ18¸&Ð0A�Ô# HÑ-Ý02´·²¸TÀ6Ñ0JÔ0J�Ô# HÑ-Ñ-ñ#Kõ( # 4Ô#6Ñ7Ô7ð 	Að 	A‰IˆF�AØð AÝ"Ð#?°vÐ#?Ð#?Ñ@Ô@Ð@ðAð	Að 	As   Â4CÃC!rJ   c                 ó  — | j         |         \  }}t          j        t          j                             | j        | j        |         |¦  «        ¦  «        }g }| j        D ]D}|dk    r| 	                    |¦  «         Œ| 	                    | j
        |         |         ¦  «         ŒEt          |¦  «        dk    rt          |¦  «        n|d         }| j        �|                      |¦  «        }| j        �|                      |¦  «        }||fS )zž
        Args:
            index (int): Index

        Returns:
            tuple: (image, target) where the type of target specified by target_type.
        r$   r   r   )rJ   r   Úopenr=   r>   r?   r%   rC   r'   rM   rE   r_   Útupler(   r)   )rN   rJ   re   rR   ÚimgÚtargetr4   s          r5   Ú__getitem__zINaturalist.__getitem__«   sö   € ð œ
 5Ô)‰ˆ�ÝŒj�œŸš d¤i°Ô1DÀVÔ1LÈeÑTÔTÑUÔUˆàˆØÔ!ð 	>ð 	>ˆAØ�FŠ{ˆ{Ø—’˜fÑ%Ô%Ð%Ð%à—’˜dÔ1°&Ô9¸!Ô<Ñ=Ô=Ð=Ð=Ý"% f¡+¤+°¢/ /•�v‘”�°v¸a´yˆàŒ>Ð%Ø—.’. Ñ%Ô%ˆCàÔ Ð,Ø×*Ò*¨6Ñ2Ô2ˆFà�Fˆ{Ðr7   c                 ó*   — t          | j        ¦  «        S )N)r_   rJ   ©rN   s    r5   Ú__len__zINaturalist.__len__Ç   s   € Ý�4”:‰ŒÐr7   Úcategory_typeÚcategory_idc                 óè   — |dk    r| j         |         S || j        vrt          d|› d�¦  «        ‚| j        |                              ¦   «         D ]\  }}||k    r|c S Œt          d|› d|› �¦  «        ‚)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 )rC   rD   ri   Úitems)rN   r~   r   rd   Úids        r5   Úcategory_namezINaturalist.category_nameÊ   s¤   € ð ˜FÒ"Ð"ØÔ& {Ô3Ð3à DÔ$9Ð9Ð9Ý Ð!K¸=Ð!KÐ!KÐ!KÑLÔLÐLà $Ô 5°mÔ D× JÒ JÑ LÔ Lð $ð $‘H�D˜"Ø˜[Ò(Ð(Ø#˜˜˜ð )å Ð!Y¸Ð!YÐ!YÈ-Ð!YÐ!YÑZÔZÐZr7   c                 óž   — t           j                             | j        ¦  «        o)t	          t          j        | j        ¦  «        ¦  «        dk    S )Nr   )r=   r>   Úexistsr%   r_   rL   r|   s    r5   rA   zINaturalist._check_existsÞ   s6   € ÝŒw�~Š~˜dœiÑ(Ô(ÐK­Sµ´¸D¼IÑ1FÔ1FÑ-GÔ-GÈ!Ò-KÐKr7   c                 óF  — |                       ¦   «         rd S t          j                             | j        ¦  «        }t          t          | j                 || j        › d�t          | j                 ¬¦  «         t          j         	                    |t          j         
                    t          | j                 ¦  «                             d¦  «        ¦  «        }t          j                             |¦  «        st          d|› �¦  «        ‚t          j        || j        ¦  «         d S )Nz.tgz)ÚfilenameÚmd5z.tar.gzz#Unable to find downloaded files at )rA   r=   r>   Údirnamer%   r   r:   r&   ÚDATASET_MD5r?   ÚbasenameÚrstripr†   rB   Úrename)rN   Ú	base_rootÚorig_dir_names      r5   r*   zINaturalist.downloadá   sñ   € Ø×ÒÑÔð 	ØˆFå”G—O’O D¤IÑ.Ô.ˆ	å$Ý˜œÔ&¨	¸t¼|Ð<QÐ<QÐ<QÕWbÐcgÔcoÔWpð	
ñ 	
ô 	
ð 	
õ œŸš Yµ´×0@Ò0@ÅÈdÌlÔA[Ñ0\Ô0\×0cÒ0cÐdmÑ0nÔ0nÑoÔoˆÝŒw�~Š~˜mÑ,Ô,ð 	VÝÐTÀ]ÐTÐTÑUÔUÐUÝ
Œ	�- ¤Ñ+Ô+Ð+Ð+Ð+r7   )r   r$   NNF)r+   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Ústrr   r   r   r   Úboolr<   rH   rI   rh   r	   r   rz   r}   r„   rA   r*   Ú__classcell__)rS   s   @r5   r#   r#       s™  ø€ € € € € ð ð  ðJ $Ø-3Ø(,Ø/3Øð+6ð +6à�C˜�IÔð+6ð ð+6ð ˜4 œ9 c˜>Ô*ð	+6ð
 ˜HÔ%ð+6ð # 8Ô,ð+6ð ð+6ð 
ð+6ð +6ð +6ð +6ð +6ð +6ðZ0ð 0ð 0ð 0ð0!Að !Að !Að !AðF ð ¨¨s°C¨x¬ð ð ð ð ð8˜ð ð ð ð ð[¨3ð [¸Sð [ÀSð [ð [ð [ð [ð(L˜tð Lð Lð Lð Lð,ð ,ð ,ð ,ð ,ð ,ð ,ð ,r7   r#   )r=   Úos.pathÚpathlibr   Útypingr   r   r   r   r   r	   r
   ÚPILr   Úutilsr   r   Úvisionr   r1   r:   r‹   r#   rV   r7   r5   ú<module>rž      s%  ðØ 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dà Ð Ð Ð Ð Ð à ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø !Ð !Ð !Ð !Ð !Ð !àLÐLÐL€ð aØ]Ø]Ø[ØeØYðð €ð /Ø.Ø.Ø4Ø9Ø4ðð €ðN,ð N,ð N,ð N,ð N,�-ñ N,ô N,ð N,ð N,ð N,r7   