U
    ­Ê¹j'!  ã                   @   s&  d dl Z 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 d dlZddlmZ ddlmZmZmZ ddd	d
œZdZG dd„ deƒZdee
e eeeef e	e f dœdd„Zeeeddœdd„Zdee
e ddœdd„Zd ee
e eddœdd„Zd!ee
e e
e	e  eddœdd„ZdS )"é    N)Úcontextmanager)ÚAnyÚDictÚIteratorÚListÚOptionalÚTupleé   )ÚImageFolder)Úcheck_integrityÚextract_archiveÚverify_str_arg)zILSVRC2012_img_train.tarZ 1d675b47d978889d74fa0da5fadfb00e)zILSVRC2012_img_val.tarZ 29b22e2961454d5413ddabcf34fc5622)zILSVRC2012_devkit_t12.tar.gzZ fa75699e90414af021442c21a62c3abf)ÚtrainÚvalÚdevkitzmeta.binc                       s\   e Zd ZdZdeeeddœ‡ fdd„Zddœdd	„Zeedœd
d„ƒZ	edœdd„Z
‡  ZS )ÚImageNetaN  `ImageNet <http://image-net.org/>`_ 2012 Classification Dataset.

    .. note::
        Before using this class, it is required to download ImageNet 2012 dataset from
        `here <https://image-net.org/challenges/LSVRC/2012/2012-downloads.php>`_ and
        place the files ``ILSVRC2012_devkit_t12.tar.gz`` and ``ILSVRC2012_img_train.tar``
        or ``ILSVRC2012_img_val.tar`` based on ``split`` in the root directory.

    Args:
        root (string): Root directory of the ImageNet Dataset.
        split (string, optional): The dataset split, supports ``train``, or ``val``.
        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.
        loader (callable, optional): A function to load an image given its path.

     Attributes:
        classes (list): List of the class name tuples.
        class_to_idx (dict): Dict with items (class_name, class_index).
        wnids (list): List of the WordNet IDs.
        wnid_to_idx (dict): Dict with items (wordnet_id, class_index).
        imgs (list): List of (image path, class_index) tuples
        targets (list): The class_index value for each image in the dataset
    r   N)ÚrootÚsplitÚkwargsÚreturnc                    sŽ   t j |¡ }| _t|ddƒ| _|  ¡  t| jƒd ‰ tƒ j	| j
f|Ž || _| j| _| j| _‡ fdd„| jD ƒ| _dd„ t| jƒD ƒ| _d S )Nr   )r   r   r   c                    s   g | ]}ˆ | ‘qS © r   )Ú.0Úwnid©Úwnid_to_classesr   ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/datasets/imagenet.pyÚ
<listcomp><   s     z%ImageNet.__init__.<locals>.<listcomp>c                 S   s    i | ]\}}|D ]
}||“qqS r   r   )r   ÚidxÚclssÚclsr   r   r   Ú
<dictcomp>=   s
        z%ImageNet.__init__.<locals>.<dictcomp>)ÚosÚpathÚ
expanduserr   r   r   Úparse_archivesÚload_meta_fileÚsuperÚ__init__Úsplit_folderÚclassesÚwnidsZclass_to_idxZwnid_to_idxÚ	enumerate)Úselfr   r   r   ©Ú	__class__r   r   r'   0   s    zImageNet.__init__©r   c                 C   sZ   t tj | jt¡ƒst| jƒ tj | j¡sV| j	dkrBt
| jƒ n| j	dkrVt| jƒ d S )Nr   r   )r   r!   r"   Újoinr   Ú	META_FILEÚparse_devkit_archiveÚisdirr(   r   Úparse_train_archiveÚparse_val_archive©r,   r   r   r   r$   ?   s    


zImageNet.parse_archivesc                 C   s   t j | j| j¡S ©N)r!   r"   r0   r   r   r6   r   r   r   r(   I   s    zImageNet.split_folderc                 C   s   dj f | jŽS )NzSplit: {split})ÚformatÚ__dict__r6   r   r   r   Ú
extra_reprM   s    zImageNet.extra_repr)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   r'   r$   Úpropertyr(   r:   Ú__classcell__r   r   r-   r   r      s   
r   )r   Úfiler   c                 C   sD   |d krt }tj | |¡}t|ƒr,t |¡S d}t| || ¡ƒ‚d S )Nz‚The meta file {} is not present in the root directory or is corrupted. This file is automatically created by the ImageNet dataset.)	r1   r!   r"   r0   r   ÚtorchÚloadÚRuntimeErrorr8   )r   rB   Úmsgr   r   r   r%   Q   s    
ÿr%   )r   rB   Úmd5r   c                 C   s,   t tj | |¡|ƒs(d}t| || ¡ƒ‚d S )Nz{The archive {} is not present in the root directory or is corrupted. You need to download it externally and place it in {}.)r   r!   r"   r0   rE   r8   )r   rB   rG   rF   r   r   r   Ú_verify_archive`   s    ÿrH   c              	      s  ddl m‰ tttttf ttttdf f f dœ‡fdd„}ttt dœdd„}ttt d	œd
d„ƒ}t	d }|dkr‚|d }|d }t
| ||ƒ |ƒ �h}ttj | |¡|ƒ tj |d¡}||ƒ\‰ }	||ƒ}
‡ fdd„|
D ƒ}t |	|ftj | t¡¡ W 5 Q R X dS )a5  Parse the devkit archive of the ImageNet2012 classification dataset and save
    the meta information in a binary file.

    Args:
        root (str): Root directory containing the devkit archive
        file (str, optional): Name of devkit archive. Defaults to
            'ILSVRC2012_devkit_t12.tar.gz'
    r   N.)Údevkit_rootr   c                    s    t j | dd¡}ˆj|dd�d ‰ ttˆ Ž ƒd }‡ fdd„t|ƒD ƒ‰ ttˆ Ž ƒd d	… \}}}d
d„ |D ƒ}dd„ t||ƒD ƒ}dd„ t||ƒD ƒ}||fS )NÚdatazmeta.matT)Z
squeeze_meZsynsetsé   c                    s    g | ]\}}|d krˆ | ‘qS )r   r   )r   r   Znum_children©Úmetar   r   r   x   s      z@parse_devkit_archive.<locals>.parse_meta_mat.<locals>.<listcomp>é   c                 S   s   g | ]}t | d ¡ƒ‘qS )z, )Útupler   )r   r   r   r   r   r   z   s     c                 S   s   i | ]\}}||“qS r   r   )r   r   r   r   r   r   r    {   s      z@parse_devkit_archive.<locals>.parse_meta_mat.<locals>.<dictcomp>c                 S   s   i | ]\}}||“qS r   r   )r   r   r   r   r   r   r    |   s      )r!   r"   r0   ZloadmatÚlistÚzipr+   )rI   ZmetafileZnums_childrenZidcsr*   r)   Úidx_to_wnidr   )ÚsiorL   r   Úparse_meta_matt   s    z,parse_devkit_archive.<locals>.parse_meta_matc              	   S   s:   t j | dd¡}t|ƒ�}| ¡ }W 5 Q R X dd„ |D ƒS )NrJ   z&ILSVRC2012_validation_ground_truth.txtc                 S   s   g | ]}t |ƒ‘qS r   )Úint)r   Zval_idxr   r   r   r   ƒ   s     zKparse_devkit_archive.<locals>.parse_val_groundtruth_txt.<locals>.<listcomp>)r!   r"   r0   ÚopenÚ	readlines)rI   rB   ZtxtfhÚval_idcsr   r   r   Úparse_val_groundtruth_txt   s    
z7parse_devkit_archive.<locals>.parse_val_groundtruth_txtr/   c               	   s   s$   t  ¡ } z
| V  W 5 t | ¡ X d S r7   )ÚtempfileÚmkdtempÚshutilÚrmtree)Útmp_dirr   r   r   Úget_tmp_dir…   s    
z)parse_devkit_archive.<locals>.get_tmp_dirr   r	   ZILSVRC2012_devkit_t12c                    s   g | ]}ˆ | ‘qS r   r   )r   r   )rR   r   r   r   š   s     z(parse_devkit_archive.<locals>.<listcomp>)Zscipy.ioÚior?   r   r   rU   r   r   r   ÚARCHIVE_METArH   r   r!   r"   r0   rC   Úsaver1   )r   rB   rT   rY   r_   Úarchive_metarG   r^   rI   r   rX   Z	val_wnidsr   )rR   rS   r   r2   i   s"    	4r2   r   )r   rB   Úfolderr   c                    sŽ   t d }|dkr|d }|d }t| ||ƒ tj | |¡‰ ttj | |¡ˆ ƒ ‡ fdd„t ˆ ¡D ƒ}|D ]}t|tj |¡d dd� qjdS )	a®  Parse the train images archive of the ImageNet2012 classification dataset and
    prepare it for usage with the ImageNet dataset.

    Args:
        root (str): Root directory containing the train images archive
        file (str, optional): Name of train images archive. Defaults to
            'ILSVRC2012_img_train.tar'
        folder (str, optional): Optional name for train images folder. Defaults to
            'train'
    r   Nr   r	   c                    s   g | ]}t j ˆ |¡‘qS r   ©r!   r"   r0   )r   Úarchive©Z
train_rootr   r   r   ´   s     z'parse_train_archive.<locals>.<listcomp>T)Zremove_finished)ra   rH   r!   r"   r0   r   ÚlistdirÚsplitext)r   rB   rd   rc   rG   Zarchivesrf   r   rg   r   r4   Ÿ   s    r4   r   )r   rB   r*   rd   r   c           	         sØ   t d }|dkr|d }|d }|dkr4t| ƒd }t| ||ƒ tj | |¡‰ ttj | |¡ˆ ƒ t‡ fdd„t ˆ ¡D ƒƒ}t	|ƒD ]}t 
tj ˆ |¡¡ q†t||ƒD ](\}}t |tj ˆ |tj |¡¡¡ qªdS )af  Parse the validation images archive of the ImageNet2012 classification dataset
    and prepare it for usage with the ImageNet dataset.

    Args:
        root (str): Root directory containing the validation images archive
        file (str, optional): Name of validation images archive. Defaults to
            'ILSVRC2012_img_val.tar'
        wnids (list, optional): List of WordNet IDs of the validation images. If None
            is given, the IDs are loaded from the meta file in the root directory
        folder (str, optional): Optional name for validation images folder. Defaults to
            'val'
    r   Nr   r	   c                 3   s   | ]}t j ˆ |¡V  qd S r7   re   )r   Úimage©Zval_rootr   r   Ú	<genexpr>Ô   s     z$parse_val_archive.<locals>.<genexpr>)ra   r%   rH   r!   r"   r0   r   Úsortedrh   ÚsetÚmkdirrQ   r\   ÚmoveÚbasename)	r   rB   r*   rd   rc   rG   Zimagesr   Zimg_filer   rk   r   r5   ¹   s    r5   )N)N)Nr   )NNr   )r!   r\   rZ   Ú
contextlibr   Útypingr   r   r   r   r   r   rC   rd   r
   Úutilsr   r   r   ra   r1   r   r?   r%   rH   r2   r4   r5   r   r   r   r   Ú<module>   s6    ý<,	6     ÿ  
 þ